2014-07-26 3 views
0

"인수의 형식이 잘못되었거나 허용 범위를 벗어 났거나 서로 충돌했습니다.". 다음 코드를 실행하려고하면받는 런타임 오류 메시지입니다. 클래스 (clsReceipt)를 사용하여 영수증을 문자열 형식으로 공식화하므로 제품을 구매하기 전에 사용자가 볼 수있는 풍부한 편집 내용 (정렬 개요)을 출력 할 수 있습니다. 나는 어떤 오류도 찾을 수 없으므로 도움이 필요하다. 나는 고등학생이며 약간의 지식이 있음을 명심하십시오. Windows에서 Delphi XE3을 사용하고 있습니다. 누구든지이 문제를 해결 나를 도와 수 있다면ToString 함수 출력에 오류가 발생했습니다.

function TReceipt.ToString: string; 
var 
k:integer; 
begin 
result := ''; 
result := 'Reciept' + #13 + '===============================================' + #13; 
result := result + 'Order ID: ' + fOrderID + #13; 
result := result + 'Item Name' + #9 + 'Quantity' + 'Cost' + #13; 
for k := 1 to length(arrItemNo) do 
begin 
dm.ADOtbl.RecNo := arritemno[k]; 
result := result + dm.ADOtbl['Item Name'] + #9 + inttostr(arrQuantity[k]) + #9 +  floattostrf((arrQuantity[k] * dm.ADOtbl['Price']),ffcurrency,5,2) + #13; 

end; 
result := result + #13 + #13 + 'Subtotal: ' + floattostrf(getsubtotal,ffcurrency,5,2) + #13; 
result := result + 'VAT: ' + floattostrf(getVat,ffcurrency,5,2) + #13; 
result := result + 'Grand Total: ' + floattostrf(ftotal,ffcurrency,5,2) + #13 + '==============================================='; 


end; 
end. 

하는 것이 좋을 것 : 아래

procedure TfrmBuy.btnPurchaseClick(Sender: TObject); 
var 
    i, n, itemNumber, quant : integer; 
    found: boolean; 
begin 
    repeat 
    i := strtoint(inputbox('Purchase','Enter the number of items you wish to buy or enter 0    to cancel','')); 
    until i>=0; 
    if i <> 0 then 
    begin 
    for n := 1 to i do 
    begin 
     found := false; 
     repeat 
     itemnumber := strtoint(inputbox('Item selection','Enter the Item number of purchase no. ' + inttostr(n),'')); 
     if dm.ADOtbl.Locate('Item number',itemnumber,[]) then 
      found := true 
     else 
      showmessage('The item number you enteres was not found. Please try again.'); 
     until found = true; 
     repeat 
     quant := strtoint(inputbox('Quantity selection','Please enter the quantity of the item you wish to purchase','>0')); 
     until quant >0; 
     Myreciept := TReceipt.create(itemnumber,quant,n,i); 
    end; 

    richedit1.Lines.Clear; 
    richedit1.Lines.Add(myreciept.tostring); 
    btnCheckout.Visible := true; 
    showmessage('Below is the reciept of your purchase. If you are satisfied, proceed to checkoutby selecting "Confirm" or restart by selecting "Reset"'); 
    end; 
    repeat 
    i := strtoint(inputbox('Purchase','Enter the number of items you wish to buy or enter 0    to cancel','')); 
    until i>=0; 
    if i <> 0 then 
    begin 
    for n := 1 to i do 
    begin 
     found := false; 
     repeat 
     itemnumber := strtoint(inputbox('Item selection','Enter the Item number of purchase no. ' + inttostr(n),'')); 
     if dm.ADOtbl.Locate('Item number',itemnumber,[]) then 
      found := true 
     else 
      showmessage('The item number you enteres was not found. Please try again.'); 
     until found = true; 
     repeat 
     quant := strtoint(inputbox('Quantity selection','Please enter the quantity of the item you wish to purchase','>0')); 
     until quant >0; 
     Myreciept := TReceipt.create(itemnumber,quant,n,i); 
    end; 

    richedit1.Lines.Clear; 
    richedit1.Lines.Add(myreciept.tostring); 
    btnCheckout.Visible := true; 
    showmessage('Below is the reciept of your purchase. If you are satisfied, proceed to checkoutby selecting "Confirm" or restart by selecting "Reset"'); 
    end; 
end; 

클래스에서의 toString 함수에 대한 코드입니다 : 아래

는 btnPurchase 코드입니다 .

+0

오류가 발생한 위치를 알려 주시면보다 쉽게 ​​도움을 드릴 수 있습니다. 또한 컴파일러 힌트 및 경고를 활성화합니다. 당신이 처리해야 할 몇 가지가 있습니다. –

+0

컴파일 할 때 아무런 오류나 경고가 표시되지 않기 때문에 가능하면 할 수 있습니다. 나는 단순히 프로그램을 실행하는 동안 위의 굵게 표시된 메시지를받습니다. ToString 코드에서 for-loop에 도달 할 때 가장 자주 발생하는 ToString 함수가 Richedit에 입력되면 나타납니다. 상황을 명확히하는 데 도움이되는 희망 – user3501568

+0

정확히 무슨 일이 일어나는지 기술하십시오. IDE가 코드 줄을 찾아 내지 못하는 경우 매우 놀랍습니다. 디버거를 단계별로 실행하십시오. –

답변

2

(다른 독자 :. 영업 가능성이 의견에 맞는 것보다 더 많은 지침이 필요하기 때문에 분명히이 진행중인 작품의 비트입니다 어쨌든 ...)이 경우

, 이전에 언급 한 바와 같이 메모 메시지가 귀하의 응용 프로그램에서 오지는 않지만 귀하의 코드 이 프로젝트의 TADOxxx 구성 요소에서 수행 중임에 따라 귀하의 응용 프로그램이 호출중인 MS ADO 데이터 액세스 계층에서 발생합니다. 명백한 디버깅을 알리는 + 이와 같은 문제를 해결의 위험

보통 인의 다단 과정) 에러가 발생한 경우, b) 그 원인을 파악하고 찾는 c) 고정 또는 그 일을 해결하려고.

는) 누군가가 처음에 를 들리는 것보다, 자신의 발을 발견하지만 연습을 더 쉽게 않으며, 디버거는 방법으로 많은 도움이 될 것입니다 특히 위해, 난이도가 될 수 그것은 IDE와 상호 작용하는

사용자가 오류 위치를 제로로 설정하십시오.

첫 번째 문제는 디버깅을위한 최상의 모양으로 프로젝트를 얻는 것입니다. 첫 번째 중단 점은 입니다. 옵션 | 컴파일러. 최적화 끄기, 프레임 스택 켜기, 에서 디버그 DCUs 사용 (코드 실행 가능) 범위 검사 켜기. IDE 의 디버거 옵션 (Delphi 7과 같은 이전 버전 이후로 이동했습니다)으로 이동하십시오. XE + 버전에서 도구 | 옵션, 아래로 스크롤하여 디버거 옵션 | Embarcadero Debugger를 선택하고 "언어 예외에 대한 알림"상자를 선택하십시오.

다음으로 프로젝트의 전체 빌드를 수행 한 다음 오류가 발생할 때까지 실행하십시오. 오류가 예외로 나타나면 작업이 더 쉬워집니다. F9를 사용하여 앱을 실행하면 예외가 발생하면 디버거가 제어 도구를 제어합니다. 이 시점에서보기 | 디버그 윈도우, 콜 스택 (Call Stack) : 예외가 발생한 곳은 윈도우 상단에 있으며 보통 프로젝트보다는 RTL 또는 VCL 소스 코드에 있습니다. 목록을 더 내려 보면 자신의 코드에서 루틴을 볼 수 있습니다. 진입 점에 중단 점을 넣고 예외 메시지를 닫은 다음 오류를 다시 발생 시키십시오. 이번에는 디버거가 중단 점에서 멈추어야하며 단일 단계 만 수행하면 오류가 발생한 위치로 이동해야합니다.

종종 문제의 원인이 분명하고 그 자리에서 해결할 수 있습니다. 당신이 할 수 없다면 그 코드는 귀하의 질문에 있어야 결정하기위한거야.

실제 문제를 해결하기 전에 위의 작업을 수행해보십시오. 폼에 버튼을 추가하고 Click 이벤트에 "raise Exception.Create ('I am an error');"를 추가합니다. 그런 다음 앱을 컴파일하고 실행 한 다음 버튼을 클릭하십시오.

실제 오류 때문에 ToString 함수에서 "begin"아래의 첫 번째 줄에 중단 점을 배치하고 b.point 이동과 거기에서 단일 단계 (F8)까지 응용 프로그램을 실행하면됩니다. 예외가 발생한 행에 도달하게됩니다. 그런 다음 다시 시도하고 이번에는 그 줄에 (F7) 줄을 ...

"인수"는 오류 메시지 란 매개 변수 "place holder"에 대해 제공되는 값을 의미합니다. 코드 또는 호출 대상이 수신 대기 중입니다.

오류 msg가 참조하는 인수는 응용 프로그램이 데이터베이스에 ADO 계층을 통해 보내려고하는 데이터입니다. 대개 매개 변수 또는 프로젝트의 ADO 구성 요소 작업에서 비롯된 텍스트입니다. 따라서 오류를 설정할 수있는 개체 중 하나를 사용하여 작업을 수행하는 문이 될 가능성이 큽니다. 어디를 찾았는지 알기 위해서는 몇 가지 정보가 필요하며 아마 대부분의 기존 코드가 관련이없는 것으로 나타날 수 있습니다.

+0

"On ..."이벤트를 설명하는 "raise ..."문으로 프로젝트에 단추를 추가 한 경우 런타임에이 단추를 클릭 할 때 예외를 얻을 수 없습니다. – MartynA

+0

+1이 게시물은 매우 유용합니다. –

+0

@David Heffernan, 내 날을 보낸 당신에게서 왔습니다. – MartynA

관련 문제