Запретить закрытие формы диалога в приложении Smart Mobile Studio

У меня есть modalDialog с W3EditBox, где пользователь вводит строку, которая в конечном итоге добавляется в W3ListBox на главной форме

Я пытаюсь предотвратить закрытие modalDialog, если существует одно из этих условий

1.) Текст W3EditBox равен нулю

2.) если текст W3EditBox уже существует в списке W3ListBox

Вот код для вызова диалоговой формы (имеет только метку, поле редактирования, кнопки ОК и Отмена)

procedure TfrmMain.HandleAddClick(Sender: TObject);
begin
  Application.ShowModal('frmGoal', 'W3Panel1', 'edtTitle', InitDialog, OkResponse, nil);
end;

Вот код для обработки ответа ОК

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;

С другой стороны, я не понимаю, как работает метод IndexOf в W3ListBox. Я использую для поиска строки - и, похоже, он хочет контроль

Спасибо

Шейн

1 ответ

Решение

Допустим, у нас есть визуальный проект с основной формой MainForm и диалог 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;
Другие вопросы по тегам