我有一个带有W3EditBox的modalDialog,用户输入的字符串最终会被添加到主窗体上的W3ListBox
如果存在其中一个条件,我试图阻止modalDialog关闭
1。)W3EditBox文本为nil
2。)如果W3EditBox文本已存在于W3ListBox列表中
以下是调用对话框表单的代码(只有标签,编辑框,以及确定和取消按钮)
procedure TfrmMain.HandleAddClick(Sender: TObject);
begin
Application.ShowModal('frmGoal', 'W3Panel1', 'edtTitle', InitDialog, OkResponse, nil);
end;
以下是处理OK响应的代码
procedure TfrmMain.OkResponse(AForm: TW3CustomForm);
begin
//code here to prevent if title is nil or already exists in listbox
W3Listbox1.Add(TfrmGoal(AForm).Title);
end;
另一方面,我不明白W3ListBox的IndexOf方法是如何工作的。 我用来搜索一个字符串 - 看起来它想要一个控件
由于
沙恩
答案 0 :(得分:3)
假设我们有一个主要表单MainForm
和对话框AddDialog
的可视化项目。主窗体包含一个列表框lbItems
,对话框包含一个包含三个子对象的包装器面板W3Panel1
- 一个编辑框inpItem
和两个按钮 - btnOK
和{{1} }。 AddDialog对话框注册了名称btnCancel
。
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;
方法将检查编辑框是否为空或等于列表框中已存在的项目。你是正确的,在这种情况下IndexOf方法是没用的,所以只需使用CloseDialog
循环来检查所有列表框项。
for
BTW,从主窗体访问对话框编辑框的最佳方法是通过对话框对象中的属性公开它:
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);