3

我正在开发一个程序来计算不同数据的平均值,TStringGrid我想使用一个程序。它被称为calcola

procedure calcola(numero:ShortInt; StringGrid:TStringGrid; pbarprog:ShortInt);
var i,j,cont,num:shortint;
    avg,temp,numfl:double;
    a:string;
    Edit1:TEdit;
begin
if StringGrid.Colcount>1 then

 //other code

       avg:=temp/cont;
       TLabel(FindComponent('Label'+IntToStr(num))).Caption:=FloatToStrF(avg, ffGeneral, 1, 1);
       Edit1.Text:=FloatToStr(StrToFloat(TLabel(FindComponent('Label'+IntToStr(num))).Caption)*10);
       TProgressBar(FindComponent('ProgressBar'+IntToStr(i+pbarprog))).Position:=StrToInt(Edit1.Text);

       //other code

     end;
   end;
end; 

在这个过程中,Lazarus 告诉我“ Identifier not found FindComponent ”。然后我剪切/粘贴了相同的代码procedure TForm1.Button1Click(Sender: TObject);,我没有错误。

我需要使用FindComponent()inside calcola,我该怎么做?

4

1 回答 1

6

然后我在过程 TForm1.Button1Click(Sender: TObject); 中剪切/粘贴了相同的代码 我没有错误。

当您进行更改时,编译器停止抱怨的原因是,当 calcola 被声明为 TForm1 的方法时,编译器可以通过向后搜索 TForm1 的声明方法及其子对象的公共方法来解析标识符 FindComponent ( TForm ... TObject) 直到找到使用该名称声明的对象。FindComponent 在 TComponent 中声明。

编译器与您的原始版本抱怨的原因是 calcola 在您的程序的全局范围内被声明(我假设)为独立例程,对于那些,编译器仅搜索先前声明的独立过程/函数,而不是那些被声明为对象的方法。

如果出于某种原因,您的 calcola 程序绝对必须是一个独立程序,那么最好的办法是调整其参数,以便您可以将 TForm1 的特定实例作为参数传递给它,就像使用 StringGrid 一样。

于 2013-08-10T15:18:10.113 回答