ToString函数输出出错

时间:2014-07-26 14:28:06

标签: function delphi output

"参数类型错误,超出可接受的范围,或彼此冲突" 。这是我尝试运行下面的代码时收到的运行时错误消息。我正在使用类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.

如果有人能帮助我解决这个问题,那就太好了。

1 个答案:

答案 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,并且可能大多数现有代码都不相关。