3

我有一个带有 W3EditBox 的 modalDialog ,用户在其中输入一个字符串,该字符串最终被添加到主窗体上的 W3ListBox

如果存在这些条件之一,我试图阻止 modalDialog 关闭

1.) W3EditBox 文本为零

2.) 如果 W3ListBox 列表中已经存在 W3EditBox 文本

这是调用对话框表单的代码(只有一个标签、编辑框以及确定和取消按钮)

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 方法是如何工作的。我习惯于搜索字符串——看起来它想要一个控件

谢谢

谢恩

4

1 回答 1

3

假设我们有一个带有 main formMainForm和 dialog的可视化项目AddDialog。主窗体包含一个列表框lbItems,对话框包含一个W3Panel1带有三个子对象的包装面板 - 一个编辑框inpItem和两个按钮 -btnOKbtnCancel. 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;
于 2013-08-05T11:11:22.820 回答