"参数类型错误,超出可接受的范围,或彼此冲突" 。这是我尝试运行下面的代码时收到的运行时错误消息。我正在使用类clsReceipt以字符串的形式制定收据,以便我可以在丰富的编辑中输出它,供用户在继续购买产品之前查看(概述各种类型)。我找不到任何错误,因此我需要帮助。请记住,我是一名高中生,知识有限。我在Windows上使用Delphi XE3。
以下是btnPurchase的代码:
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函数的代码:
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.
如果有人能帮助我解决这个问题,那就太好了。
答案 0 :(得分:2)
(其他读者:显然这是一项正在进行的工作,因为OP 可能需要更多的指导而不是评论。无论如何......)
在这种情况下,正如之前评论中所述,该消息不是来自您的应用,而是来自您的应用调用的MS ADO数据访问层,通过操作您的代码 正在执行项目中的TADOxxx组件。
冒着说明问题的风险,通常会调试+修复这样的问题 多步骤过程:a)找出错误发生的位置,b)弄清楚是什么 导致它和c)固定或解决它。
a)可能比较困难,特别是对于找到自己脚的人而言,听起来可能比较糟糕 起初,但通过练习确实更容易,调试器在这方面非常有用 它与IDE和用户交互以将错误位置归零。
首先,让你的项目处于调试的最佳状态,这是你的第一站 项目|选项|编译器。关闭优化,打开堆栈帧,使用调试DCU 和(如果你的代码可以用它运行)范围检查。转到IDE中的Debugger Options (自Delphi 7等旧版本以来,它已经走动了)。在XE +版本中,转到工具|选项,向下滚动到Debugger Options | Embarcadero调试器并选中“通知语言异常”框。
接下来,执行项目的完整版本,然后运行它直到发生错误。如果错误显示为异常,则会使事情变得更容易 - 只需使用F9运行应用程序,调试器将在异常发生时从中获取控制权。此时,转到View |调试Windows,调用堆栈:发生异常的位置在窗口的顶部,通常是RTL或VCL源代码,而不是项目的源代码。在列表的下方,您应该在自己的代码中看到例程 - 如果那些是你所追求的那个例程,那么这个例程就是最重要的。在其入口点放置一个断点,关闭异常消息并通过动作 再次引发错误。这次,调试器应该停在你的断点上,并且 单步执行应该会带您到错误发生的地方。
通常情况下,问题的原因是显而易见的,您可以在现场修复它。如果你不能, 这是决定哪些代码应该在你的SO问题中的起点。
在对您的实际问题进行上述尝试之前,请通过这样做快速练习。在表单中添加一个按钮,在其Click事件中,添加“raise Exception.Create('我是一个错误');”。然后编译+运行应用程序并单击按钮。
对于你的真实错误,我首先在你的ToString函数中的“begin”下面的第一行放置一个断点,然后运行应用程序直到b.point跳转并从那里单步(F8)直到你到达发生异常的行。然后再试一次,这次追踪到(F7)那条线......
“参数”在某种意义上说,错误消息的意思是为参数“占位符”提供的值,例如,在您自己的代码中,或者它正在调用的东西,期望接收。
错误消息所指的参数是您的应用程序尝试通过ADO层发送到数据库的数据,通常是作为源自项目的ADO组件上的操作的参数或文本。因此,它只可能是一些语句,您可以使用其中一个可以设置错误的对象。一旦你发现了哪里,我们需要一些信息进入q,并且可能大多数现有代码都不相关。