假设我们有一个带有 main formMainForm
和 dialog的可视化项目AddDialog
。主窗体包含一个列表框lbItems
,对话框包含一个W3Panel1
带有三个子对象的包装面板 - 一个编辑框inpItem
和两个按钮 -btnOK
和btnCancel
. AddDialog 对话框使用名称注册AddDialog
。
FAddDialog := TAddDialog.Create(Display.View);
FAddDialog.Name := 'AddDialog';
RegisterFormInstance(FAddDialog, False);
ShowModal
然后通过一个简单的调用显示该对话框。
btnAdd.OnClick := lambda
Application.ShowModal('AddDialog', 'W3Panel1', 'inpItem', InitDialog, OkResponse);
end;
从对话框访问主窗体列表框的最简单方法是为对话框提供对主窗体组件的引用。为此,向对话框添加一个属性
property Items: TW3ListBox;
然后在InitDialog
.
procedure TMainForm.InitDialog(dialog: TW3CustomForm);
begin
(dialog as TAddDialog).Items := lbItems;
end;
然后,您可以在对话框本身中设置按钮单击处理程序。
btnCancel.OnClick := lambda Application.HideModal(mrCancel); end;
btnOK.OnClick := lambda CloseDialog; end;
该CloseDialog
方法将检查编辑框是否为空或等于列表框中已存在的项目。您是正确的 IndexOf 方法在这种情况下没有用,所以只需使用for
循环来检查所有列表框项目。
procedure TAddDialog.CloseDialog;
begin
if inpItem.Text = '' then
Exit;
for var i := 0 to Items.Count - 1 do
if Items.Text[i] = inpItem.Text then
Exit;
Application.HideModal(mrOK);
end;
顺便说一句,从主窗体访问对话框编辑框的最佳方法是通过对话框对象中的属性公开它:
property ItemText: string read (inpItem.Text) write (inpItem.Text);
然后主程序中的代码可以访问此属性。
procedure TMainForm.OkResponse(dialog: TW3CustomForm);
begin
lbItems.Add((dialog as TAddDialog).ItemText);
end;