如何在Delphi中创建动态事件:onCreate和onChange

如何在Delphi中创建动态事件:onCreate和onChange,delphi,Delphi,在创建动态组合框时,为其创建事件时遇到问题 当我点击按钮时,此时在滚动框中创建动态面板、标签、编辑和按钮来销毁面板 我会将事件onCreate和onChange添加到第一个组合框中。 第一个组合框将有第一个值类别,第二个-当选择第一个时的子类别 如何使工作事件onCreate和onChange 代码: 创建代码{dosent work add items}: procedure TfrmGenerateExam.setKategoria(Sender: TObject); var firstCo

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

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

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

如何使工作事件onCreate和onChange

代码:

创建代码{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;
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;
更改代码{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;
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;
TComboBox或任何其他控件没有OnCreate事件。创建控件后立即运行所需的代码。至于更新第二个组合框,请使用OnChange事件的Sender参数了解要更改的组合框。您可以使用其标记属性将其链接到第二个组合框

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;

我搞不懂你的问题是什么。你能编辑以提高问题的焦点吗?@DavidHeffernan doneth这太多代码了,无法筛选。请编辑您的问题,将代码替换为强调“最小”的代码,以演示您试图解决的问题。您还应删除所有SQL。因为我们没有您的数据库,所以它是不必要的,并且使代码执行无法重现。即使删除了SQL,问题本身也不是很清楚。你到底想完成什么?你到底有什么问题?请澄清这个问题。控件没有OnCreate事件,只有窗体有OnCreate事件。您已经知道如何分配OnChange事件处理程序。在我看来,您似乎不知道如何识别更改了哪个组合框提示,请查看Sender参数,或者更新提示的第二个组合框,使用TComboBox.Tag属性将两个TComboBox控件链接在一起。这样做很有效!非常感谢你!提示:应避免使用With语句。它会导致将来的bug,并且很难调试。