Запретить закрытие формы диалога в приложении 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;