gpt4 book ai didi

forms - Delphi - 新创建的表单上的表单创建和对象

转载 作者:行者123 更新时间:2023-12-03 19:13:12 25 4
gpt4 key购买 nike

动态表单创建主题已经讨论过很多次了,但是我找不到可以解决我的问题的东西,所以我在这里......再次...... :-)

我以前的问题让我认为,如果不是所有表单都是在启动时创建的,而是在需要时动态创建,我的应用程序会启动得更快。
这基本上是正确的,当我只创建主窗体和数据模块时,启动速度要快得多。

单击按钮时,这是我用来按需创建和自由表单的代码(主要受我在此处从 Jerry Dodge 和 Craig Young 的回答中找到的启发,感谢他们的帮助):

procedure TfrmWelcome.BtKeywordsClick(Sender: TObject);
var
F_Keywords : TfrmKeywords;
begin
F_Keywords := Tfrmkeywords.Create(nil);
try
F_Keywords.ShowModal;
finally
F_Keywords.Free;
end;
end;

同样,这工作正常,但在创建 frmKeywords 时,主 tablegrid 应该由显示表单时触发的 FDQuery 填充。
当然(或者我不会在这里),添加
frmKeywords.FDQuery1.Open;

在 FormShow 或 FormCreate 事件中以“访问冲突错误”结束。

所以我修改了我的创建代码,它现在看起来像:
procedure TfrmWelcome.BtKeywordsClick(Sender: TObject);
var
F_Keywords : TfrmKeywords;
begin
F_Keywords := Tfrmkeywords.Create(nil);
try
F_Keywords.FDQuery1.Open;
F_Keywords.ShowModal;
finally
F_Keywords.FDQuery1.Close;
F_Keywords.Free;
end;
end;

(我什至不确定 FDQUery1.Close 在 finally block 中是否有用)。

太好了,现在我的表单出现了,主数据网格中充满了数据。

问题是,当用户在 DBGrid1 中单击时,所选记录的数据库 id 作为参数传递给辅助 FDQuery,该辅助 FDQuery 作为返回用数据填充辅助 DBGrid(DBgrid1 中的主数据,DBGrid2 中的子数据)

这样做是这样的:
procedure TfrmKeywords.DBGridEh1CellClick(Column: TColumnEh);
var
kwid : Integer;
begin
frmKeywords.FDQuery2.Close; //Closing secondary query
kwid := FDQuery1.FieldByName('id').AsInteger; //Assigning kw_id according to selected row
frmKeywords.FDQuery2.ParamByName('kw_id').AsInteger := kwid; //Linking query2 parameter to kwid
frmKeywords.FDQuery2.Open; //Reopening query2 to display assets
end;

和以前一样,“访问冲突错误”。像 FDQuery 可能不存在?

所以我的问题是:当您动态创建表单时,该表单的所有可视和非可视组件是否都会自动创建? Dbgrids 出现在我的表单上并且似乎可以工作,因为显示了数据(至少在其中一个中),但是第二个 FDQuery 只是不想工作。
我显然在这里遗漏了一些东西。我排除了数据模块上的 FDConnection,因为 FDQuery1 有效,所以我没有想法......

提前致谢

数学

最佳答案

问题是您正在访问预先声明的全局变量 frm关键字这是在您尝试访问它时。相反,您正在实例化您的表单并将引用存储在局部变量中,这本身就很好,而不是访问那个未分配的变量。因此,只需像这样修改您的代码:

procedure TfrmKeywords.DBGridEh1CellClick(Column: TColumnEh);
var
kwid: Integer;
begin
{ do not access the frmKeywords variable here; if you want to explicitly
hint yourself about accessing the current form instance, you can write
Self.FDQuery2.Close; but that Self is not necessary, e.g. the following
lines refer to the current form instance as well }
FDQuery2.Close;
kwid := FDQuery1.FieldByName('id').AsInteger;
FDQuery2.ParamByName('kw_id').AsInteger := kwid;
FDQuery2.Open;
end;

关于在发布前显式关闭数据集,您无需显式 Close数据集发布之前。这发生在内部。

最后一点,您不必在更改参数值时重新打开数据集以刷新数据 View 。它实际上是不想要的。您设置一个 SQL 查询,在 DBMS 上打开准备查询的数据集,然后您只需修改参数并调用 Refresh刷新 View ,因此在您的情况下,代码可以简化为(不要忘记 Open FDQuery2 在此之前的某处,但只有一次):
procedure TfrmKeywords.DBGridEh1CellClick(Column: TColumnEh);
begin
{ dataset must be opened here, which means that FDQuery2.Open method has
been called before (but only once for the query) }
FDQuery2.ParamByName('kw_id').AsInteger := FDQuery1.FieldByName('id').AsInteger;
FDQuery2.Refresh;
end;

或者看看 Master-Detail Relationship (M/D)主题以查看如何在没有任何代码的情况下执行您想要的操作(它适用于您,因为您使用的是 DB 感知控制)。

关于forms - Delphi - 新创建的表单上的表单创建和对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44601577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com