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