Delphi:如何在公共函数中使用 ComponentCount?

Posted

技术标签:

【中文标题】Delphi:如何在公共函数中使用 ComponentCount?【英文标题】:Delphi: how to use ComponentCount in a public function? 【发布时间】:2014-11-12 02:52:07 【问题描述】:

我下面有这个使用ComponetCount的函数,当我在另一个Form中使用这个函数时,它在一个Form1中,将Form2放在Form1中使用,它带来的是Form1的Componetes数量而不是Form2的数量,我该怎么做解决这个问题?跟随功能:

function Form1.getgridId(KeyField: String): string;
var
  i: Integer;
  id: string;

begin

  for i := 0 to ComponentCount -1 do
  begin
    if Components[i] is TCustomDBGrid then
    id:= TCustomDBGrid(Components[i]).DataSource.DataSet.FieldByName(KeyField).AsString;
  end;
  Result := id;

end;

ANS(在我的具体情况下)- 在所有人的帮助下:

function getgridId(KeyField: String): string;
var
  i: Integer;
  id: string;
begin
  for i := 0 to Screen.ActiveForm.ComponentCount -1 do
  begin
    if Screen.ActiveForm.Components[i] is TCustomDBGrid then
      id := TCustomDBGrid(Screen.ActiveForm.Components[i]).DataSource.DataSet.FieldByName(KeyField).AsString;
  end;
  Result := id;

end; 

【问题讨论】:

我不知道你在问什么。您要实例化什么类?此代码与您的问题有何关系?你说的是什么单位? 组件在一个表格或类似的地方,而不是在一个单元上。因此,将该表单(已经实例化?)传递给函数并迭代其组件。还是传递网格本身而不迭代? 您确定要找到 last TDBGrid 的值吗? 为了清楚起见,我编辑了这个问题。 @RobKennedy 你想说什么“UnitX 中的组件数量”? TComponent.ComponentCount 与单位无关 【参考方案1】:

您所要求的需要向函数添加一个参数以知道要迭代哪个表单:

function getgridId(Form: TForm; KeyField: String): string;
var
  i: Integer;
  id: string;
begin
  for i := 0 to Form.ComponentCount -1 do
  begin
    if Form.Components[i] is TCustomDBGrid then
      id := TCustomDBGrid(Form.Components[i]).DataSource.DataSet.FieldByName(KeyField).AsString;
  end;
  Result := id;
end;

然后,当每个Form需要调用该函数时,它可以将它的Self指针作为第一个参数传递。

【讨论】:

谢谢,我以为componentcount会自动识别调用函数的形式。我认为Delphi有一个getformname函数但不记得在哪里。 Screen.ActiveForm 获取 TForm 或 .name 获取字符串 :D @Artur_Indio:ComponentCount/Components[]识别他们被调用的形式。您使您的函数成为Form1 类的成员,并且您使用函数的Self 参数来访问ComponentCount/Components[],因此您总是使用Form1 对象指针调用该函数,因此遍历Form1 的组件,即使该函数实际上是从Form2 调用的。要迭代 Form2 的组件,您必须使用 Form2 对象指针来访问 ComponentCount/Components[],而您没有这样做。 谢谢你的解释,我会完善我的功能。

以上是关于Delphi:如何在公共函数中使用 ComponentCount?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 中公共和已发布的类成员有啥区别?

Delphi中如何实现模拟组合按键,如发送Ctrl+F的按键

如何使用Delphi在Win7防火墙中打开端口

如何在 Visual C++ 中使用 Delphi 的寄存器调用约定调用函数?

公共,私人 - 大写,小写:

如何使用 C++ 挂钩 Delphi 函数