【问题标题】:How to make dynamic events : onCreate and onChange in Delphi [closed]如何制作动态事件:Delphi中的onCreate和onChange [关闭]
【发布时间】:2020-10-18 07:20:31
【问题描述】:

我在为动态组合框创建事件时遇到问题。

当我点击按钮时,此时在滚动框、标签、编辑和按钮中创建动态面板以销毁面板。

我会将事件 onCreate 和 onChange 添加到第一个组合框。 第一个组合框将具有第一个值(类别),第二个 - 子类别(选择第一个时)。

如何使工作事件 onCreate 和 onChange?

代码:


procedure TfrmGenerateExam.aAnulujExecute(Sender: TObject);
begin
  ModalResult := mrCancel;
end;

procedure TfrmGenerateExam.aDodajNoweSzczegolyExecute(Sender: TObject);
var
  dynPanel: TPanel;
  dyncbKategoria: TComboBox;
  dyncbPodkategoria: TComboBox;
begin
  dynPanel := TPanel.Create(ScrollBox);
  try
    with dynPanel do
    begin
     {Panel properties} 
   end;
    dyncbKategoria := TComboBox.Create(dynPanel);
    with dyncbKategoria do
    begin
      Parent := dynPanel;
      Top := 29;
      Left := 5;
      Width := 245;
      Height := 21;
      OnCreate := setKategoria;
      OnChange := setPodkategoria;
    end;
    end;
    Panel.Add(dynPanel);
    cbKategoria.Add(dyncbKategoria);
    cbPodkategoria.Add(dyncbPodkategoria);
  except
    dynPanel.Free;
    raise;
  end;
end;

代码 onCreate {dosent work add items}:

procedure TfrmGenerateExam.setKategoria(Sender: TObject);
var
firstComboBox : TComboBox;
begin
 with Query do begin
   SQL.Text :={SQL script}
    Open;
    try
      while not Eof do
      begin
        first.Items.Add(Fields[0].AsString);
        Next;
      end;
    finally
      Close;
    end;
 end;

代码 onChange {dosent 工作添加项目}:

procedure TfrmGenerateExam.setPodKategoria(Sender: TObject);
var
firstComboBox : TComboBox;
secondComboBox : TComboBox;
begin
 with Query do begin
   SQL.Text :={SQL script using value from first combobox}
    Open;
    try
      while not Eof do
      begin
        secondComboBox.Items.Add(Fields[0].AsString);
        Next;
      end;
    finally
      Close;
    end;
 end;

【问题讨论】:

  • 我不知道你的问题是什么。您能否进行编辑以提高问题的重点。
  • 这是太多无法筛选的代码。请编辑您的问题,将代码替换为 minimal reproducible example(强调“最小”),以展示您要解决的问题。
  • @RemyLebeau 好的,我编辑了
  • 您还应该删除所有 SQL。这是不必要的,并且由于我们没有您的数据库,因此代码执行无法重现。
  • 即使删除了SQL,问题本身也不是很清楚。您到底想完成什么,您遇到的问题到底是什么?请澄清问题。控件没有 OnCreate 事件,只有 Forms 有。而且您已经知道如何分配 OnChange 事件处理程序。在我看来,您似乎不知道如何识别更改了哪个 ComboBox(提示,查看 Sender 参数),或者要更新哪个第二个 ComboBox(提示,使用 TComboBox.Tag 属性将 2 个 TComboBox 控件链接在一起)。

标签: delphi


【解决方案1】:

TComboBox(或任何其他控件)没有 OnCreate 事件。只需在创建控件后立即运行所需的代码。至于更新第 2 个 ComboBox,请使用 OnChange 事件的 Sender 参数来了解正在更改哪个 ComboBox。您可以使用其Tag 属性将其链接到第二个 ComboBox。

procedure TfrmGenerateExam.aDodajNoweSzczegolyExecute(Sender: TObject);
var
  dynPanel: TPanel;
  dyncbKategoria: TComboBox;
  dyncbPodkategoria: TComboBox;
begin
  dynPanel := TPanel.Create(ScrollBox);
  try
    with dynPanel do
    begin
     {Panel properties} 
    end;

    dyncbKategoria := TComboBox.Create(dynPanel);
    with dyncbKategoria do
    begin
      Parent := dynPanel;
      Top := 29;
      Left := 5;
      Width := 245;
      Height := 21;
    end;

    dyncbPodKategoria := TComboBox.Create(dynPanel);
    with dyncbPodKategoria do
    begin
      Parent := dynPanel;
      {ComboBox properties}
    end;

    dyncbKategoria.Items.BeginUpdate;
    try
      with Query do
      begin
        SQL.Text := {SQL script}
        Open;
        try
          while not Eof do
          begin
            dyncbKategoria.Items.Add(Fields[0].AsString);
            Next;
          end;
        finally
          Close;
        end;
      end;
    finally
      dyncbKategoria.Items.EndUpdate;
    end;

    dyncbKategoria.Tag := NativeInt(dyncbPodkategoria);
    dyncbKategoria.OnChange := setPodkategoria;

    Panel.Add(dynPanel);
    cbKategoria.Add(dyncbKategoria);
    cbPodkategoria.Add(dyncbPodkategoria);
  except
    dynPanel.Free;
    raise;
  end;
end;

procedure TfrmGenerateExam.setPodKategoria(Sender: TObject);
var
  firstComboBox : TComboBox;
  secondComboBox : TComboBox;
begin
  firstComboBox := TComboBox(Sender);
  secondComboBox := TComboBox(firstComboBox.Tag);
  secondComboBox.Items.BeginUpdate;
  try
    secondComboBox.Items.Clear;
    with Query do
    begin
      SQL.Text := {SQL script using value from first combobox}
      Open;
      try
        while not Eof do
        begin
          secondComboBox.Items.Add(Fields[0].AsString);
          Next;
        end;
      finally
        Close;
      end;
    end;
  finally
    secondComboBox.Items.EndUpdate;
  end;
end;

【讨论】:

  • 提示:应避免使用“With”语句。它会导致未来的错误并且难以调试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 2011-01-11
  • 1970-01-01
  • 2013-07-28
  • 2021-09-16
相关资源
最近更新 更多