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