我有一个包含许多表的SQLite数据库,其中一个名为“tblAccounts” 我有一个带有TDBGrid的dlgCommon,它带有dbgridAccounts.DataSource:= srcAccounts
我还有其他几个Dialog,所有这些对话都需要点击一个按钮并显示Accounts Grid来选择一个Account。而不是有很多表单都有他们自己的TDBgrid.DataSource:= srcAccounts我这样做...
procedure TdlgFolders.btnAcctSelClick(Sender: TObject);
begin
dlgCommon.pnlAccounts.Parent:=Self;
dlgCommon.pnlAccounts.Left:=dbedAccount.Left;
dlgCommon.pnlAccounts.Top:=dbedAccount.Top+dbedAccount.Height+2;
dlgCommon.pnlAccounts.Width:=190;
end;
当用户激活dlgFolders并单击“btnAcctSel”时,它会按照我的需要执行并显示网格。但是,当用户单击Grid-Cell时我不知道在哪里/如何放置dbgridAccountsCellClick(Column:TColumn);处理程序。
我尝试将它放在dlgCommon中并进行编译,但不会被使用,因为当网格可见并且在其他一个对话框中单击单击时,它不再是父级。
我更喜欢继续使用单网格方法,因为用户可以设置列宽,行颜色等,而我宁愿不让它们在需要帐户网格的每个表单中都这样做。
如何重新分配dlgCommon.AccountsCellClick以便在dlgFolders和其他调用它的对话框中捕获并使用点击?
答案 0 :(得分:0)
我不确定我的结构和设计,但我会将显示帐户的网格放在TFrame
上。除了网格本身之外,此TFrame
将包含网格所需的所有事件处理程序。
然后,每当您需要显示网格时,您实例化框架,分配其父级,并且网格和事件处理程序已准备好使用。
在第二次和第三次阅读时,如果dlgCommon
是具有像
dlgCommon: TdlgCommon
pnlAccounts: TPanel
AccountsGrid: TDBGrid
您似乎试图“扯掉”(通过更改父级)来自该表单的pnlAccounts
,然后事件处理程序无法正常工作,就像您已经注意到的那样。
更改像这样的组件父组件的想法是一个非常糟糕的主意,因为当您将新的父组件分配给网格时,它将不再显示在dlgCommon中。它一次只能在一个对话框中显示。
如果您希望网格同时在各种表单上显示(至少)一段时间,我仍然会使用我已经建议的TFrame
。
在这种情况下,您可以手动将OnCellClick
事件添加到表单专用部分
procedure DBGridCellClick(Column: TColumn);
并以表格
实施procedure TForm1.DBGridCellClick(Column: TColumn);
begin
// whatever you want to do
end;
然后按如下方式实例化框架:
procedure TForm1.Button2Click(Sender: TObject);
begin
frame:= TFrame3.Create(self);
frame.Parent := self;
frame.Left := 8;
frame.Top := 75;
frame.DBGrid1.OnCellClick := DBGridCellClick;
end;
另一方面,如果用户只需要短暂地看到网格,选择一个帐户(并完成它),我只需要以模态方式显示dlgCommon。