动态表单创建主题已经被多次讨论过了,但是我找不到解决我的问题的东西,所以在这里我再次...... :-)德尔福 - 在新创建的表单上创建表单并创建对象
我之前的问题让我认为,如果不是所有表单都是在启动时创建的,而是在需要时动态创建的,那么我的应用程序的启动速度会更快。 大多数情况都是如此,当我只创建了我的主Form和Datamodule时,启动速度要快得多。
在按一下按钮,下面是我用它来创建的代码,并免费点播形式(主要是由什么我发现这里从杰里·道奇和克雷格·杨的回答启发,感谢他们的帮助):
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时,主表格应该由显示表单时触发的FDQuery填充。 当然,(否则我就不会在这里),在FormShow或FORMCREATE事件添加
frmKeywords.FDQuery1.Open;
与“访问冲突错误”结束。
所以我修改了创建代码,它现在的样子:
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块中是非常有用的)。
太棒了,现在我的表单显示出来了,主数据网格中充满了数据。
问题是,当用户在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不存在也许?
所以我的问题是:当你动态地创建一个窗体,窗体的所有视觉和非可视化组件都会自动创建? Dbgrid出现在我的表单上,似乎工作,因为数据显示(至少在其中一个),但第二个FDQuery只是不想工作。 我明显错过了这里的东西。我排除了FDConnection是在数据模块,因为FDQuery1的作品,所以我的想法......提前
感谢
数学
这么简单,但离我所能想到的还很远。感谢十亿次,作品,我明白为什么:-) – Mathmathou
不客气! :)我已经添加了一些关于控制数据集的注释。 – Victoria
删除所有这些全局变量,它们是撒旦的产物。他们只存在模仿VB编码风格。你想编程,就好像你在写VB一样。 –