Delphi 将组件名称存储为字符串以供以后使用

Delphi 将组件名称存储为字符串以供以后使用,delphi,delphi-7,Delphi,Delphi 7,在我的表单上,我有许多TMyQuery组件。它们的名称标识它们使用的MySQL表。例如,COMPONENTSTABLE使用COMPONENTS表等 大约有30个表,但将来可能会改变 我还使用基本字符串列表从名为TIMESTAMPS的表中读取字段名。当发生更新、插入或删除时,此表通过触发器更新。时间戳表中的每个字段都表示修改了哪个表。表中只有一条记录!根据字段值,我可以看到哪个表已更改,因此我可以刷新它,而不是刷新所有表 我不想这样做 If fieldbyname['COMPONENTSTABLE

在我的表单上,我有许多TMyQuery组件。它们的名称标识它们使用的MySQL表。例如,COMPONENTSTABLE使用COMPONENTS表等

大约有30个表,但将来可能会改变

我还使用基本字符串列表从名为TIMESTAMPS的表中读取字段名。当发生更新、插入或删除时,此表通过触发器更新。时间戳表中的每个字段都表示修改了哪个表。表中只有一条记录!根据字段值,我可以看到哪个表已更改,因此我可以刷新它,而不是刷新所有表

我不想这样做

If fieldbyname['COMPONENTSTABLE'] <> CurrentTimeStamp
 then ComponentsTable.Refresh;

If fieldbyname['ORDERSTABLE'] <> CurrentTimeStamp
 then OrdersTable.Refresh;

{ and so on forever }
如果fieldbyname['COMPONENTSTABLE']CurrentTimeStamp
然后组件稳定。刷新;
如果fieldbyname['ORDERSTABLE']CurrentTimeStamp
然后是OrdersTable.Refresh;
{永远如此}
我想做的是

If fieldbyname['COMPONENTSTABLE'] <> CurrentTimeStamp
 then ComponentsTable.Refresh;

If fieldbyname['ORDERSTABLE'] <> CurrentTimeStamp
 then OrdersTable.Refresh;

{ and so on forever }
现在我有一个带有“名称/值”的字符串列表。每个“名称”是表中的字段名,“值”是MySQL触发器提供的时间戳

我有以下几点:

For Idx := 0 to MyStringList.Count -1 do
  Begin

    If MyStringlist.ValueFromIndex[Idx] <> SomethingElse then 
     Begin
        with (MyStringList.Names[Idx] as tMyQuery).Refresh;
     End;

  End;
对于Idx:=0到MyStringList.Count-1 do
开始
如果MyStringlist.ValueFromIndex[Idx]中的某些内容是
开始
使用(MyStringList.Names[Idx]作为tMyQuery).Refresh;
结束;
结束;
我已经让字符串列表运行,名称、值等都是正确的

我的问题是,

如果某个对象存在,是否可以使用字符串(“列表中的名称”列)引用该对象?

我已经有了一个函数,通过向它传递一个对象来刷新各个表,但这是一个对象,很容易使用。我想根据从字符串中检索到的名称传递“Object”


我希望这是有道理的,你可以理解我的意思。

我不确定你的问题到底是什么。在回答的第一部分中,我假设您并不真正关心对象的名称,而是希望通过某种自动化的方式,使所有可用的表引用另一个表中的字段。下面,我将回答你的问题,如果你知道某个对象的名称,我将引用该对象

自动处理所有表格的方式

这取决于对象是什么类

根据您的描述,我假设您的
TMyQuery
是表单拥有的
t组件
子体。然后解决方案非常简单,因为每个
t组件都有一个公共
名称
和一个拥有组件的列表
组件
。然后,您可以使用如下内容:

var
  i: integer;
  MyQuery: TMyQuery;
begin
  for i := 0 to Pred(MyForm.ComponentCount) do
    if MyForm.Components[i] <> TimeStampsTable then
      if MyForm.Components[i] is TMyQuery then
      begin
        MyQuery := TMyQuery(MyForm.Components[i]);
        if TimeStampsTable.FieldByName(MyQuery.Name).AsDateTime >= LastAccess then ...
      end;
end;

或者您可以简单地循环所有
组件
,并使用您自己的
名称
匹配。

我不确定您的问题实际上是什么。在回答的第一部分中,我假设您并不真正关心对象的名称,而是希望通过某种自动化的方式,使所有可用的表引用另一个表中的字段。下面,我将回答你的问题,如果你知道某个对象的名称,我将引用该对象

自动处理所有表格的方式

这取决于对象是什么类

根据您的描述,我假设您的
TMyQuery
是表单拥有的
t组件
子体。然后解决方案非常简单,因为每个
t组件都有一个公共
名称
和一个拥有组件的列表
组件
。然后,您可以使用如下内容:

var
  i: integer;
  MyQuery: TMyQuery;
begin
  for i := 0 to Pred(MyForm.ComponentCount) do
    if MyForm.Components[i] <> TimeStampsTable then
      if MyForm.Components[i] is TMyQuery then
      begin
        MyQuery := TMyQuery(MyForm.Components[i]);
        if TimeStampsTable.FieldByName(MyQuery.Name).AsDateTime >= LastAccess then ...
      end;
end;

或者你可以简单地循环所有
组件
并使用你自己的
名称
匹配。

虽然@pepak接受的答案的第一部分不是我想要的(我以前在应用程序中使用过类似的代码,但速度很慢),但答案的第二部分指出了我正确的方向

我(感谢Pepak)的最终解决方案是:

Function RefreshQueryByName(Const Name: String): Boolean;
   Var
      Obj: TComponent;
   Begin
      Result := False;
      Obj := Self.FindComponent(Name);
      If Obj <> nil Then
         If Obj Is TMyQuery Then
            With Obj As TMyQuery Do
               If Active Then
               Begin
                  Refresh;
                  Result := True;
               End;
   End;
函数RefreshQueryByName(Const Name:String):布尔值;
变量
对象:t组件;
开始
结果:=假;
对象:=Self.FindComponent(名称);
如果对象为零,则
如果Obj是TMyQuery,则
将Obj作为TMyQuery执行
如果激活,则
开始
刷新
结果:=真;
结束;
结束;
我通过传递从字段值中获取的字符串来使用它,该字段值标识要刷新的表

现在,我的数据库应用程序自动刷新其他用户更改的表。它现在将刷新其30个表中的任意一个表,而不刷新所有表


谢谢你的帮助,Pepak,我已经接受了你的答案,希望它对其他人有用。

虽然@Pepak接受的答案的第一部分不是我想要的(我以前在应用程序中使用过类似的代码,但速度很慢),但答案的第二部分为我指明了正确的方向

我(感谢Pepak)的最终解决方案是:

Function RefreshQueryByName(Const Name: String): Boolean;
   Var
      Obj: TComponent;
   Begin
      Result := False;
      Obj := Self.FindComponent(Name);
      If Obj <> nil Then
         If Obj Is TMyQuery Then
            With Obj As TMyQuery Do
               If Active Then
               Begin
                  Refresh;
                  Result := True;
               End;
   End;
函数RefreshQueryByName(Const Name:String):布尔值;
变量
对象:t组件;
开始
结果:=假;
对象:=Self.FindComponent(名称);
如果对象为零,则
如果Obj是TMyQuery,则
将Obj作为TMyQuery执行
如果激活,则
开始
刷新
结果:=真;
结束;
结束;
我通过传递从字段值中获取的字符串来使用它,该字段值标识要刷新的表

现在,我的数据库应用程序自动刷新其他用户更改的表。它现在将刷新其30个表中的任意一个表,而不刷新所有表


谢谢你的帮助,佩帕克,我已经接受了你的答案,希望它对其他人有用。

谢谢@Pepak,请查看我在下面发布的答案,谢谢你。:)谢谢@Pepak,请查看我在下面发布的答案,谢谢你。:)