重新分配OnCellClick事件

时间:2016-05-02 15:48:04

标签: delphi onclick delphi-6

我有一个包含许多表的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和其他调用它的对话框中捕获并使用点击?

1 个答案:

答案 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。