Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как не закрывать диалог по нажатию на кнопку OK? / 17 сообщений из 17, страница 1 из 1
15.01.2021, 14:21
    #40036103
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не закрывать диалог по нажатию на кнопку OK?
Имеется обычный диалог с кнопкой OK с ModalResult = mrOk
Необходимо по нажатию на эту кнопку сделать проверку данных в диалоге и если проверка не прошла, то вывести сообщение и не закрывать диалог, т.е. не выпускать из него пока правильно всё не введут.
Если в обработчике события onClick этой кнопки делать Exit, то диалог всё равно закроется. Как быть?
...
Рейтинг: 0 / 0
15.01.2021, 14:24
    #40036105
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не закрывать диалог по нажатию на кнопку OK?
verter,

OnCloseQuery
...
Рейтинг: 0 / 0
15.01.2021, 14:31
    #40036110
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не закрывать диалог по нажатию на кнопку OK?
Или снять ModalResult и выставлять его вручную
...
Рейтинг: 0 / 0
15.01.2021, 14:32
    #40036112
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не закрывать диалог по нажатию на кнопку OK?
Gerasimenko
verter,

OnCloseQuery


Спасибо!
Извините за такой глупый вопрос.
...
Рейтинг: 0 / 0
15.01.2021, 15:22
    #40036129
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не закрывать диалог по нажатию на кнопку OK?
verter
Gerasimenko
verter,
OnCloseQuery

Спасибо!
Извините за такой глупый вопрос.

Плохое решение, потому что оно будет отрабатывать и при нажатии кнопки "отмена" и при закрытии окна через Alt-F4 и при завершении работы системы. Правильнее убрать ModalResult у кнопки Ok и назначать его по результатам проверки в OnClick.
...
Рейтинг: 0 / 0
15.01.2021, 15:40
    #40036131
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не закрывать диалог по нажатию на кнопку OK?
alekcvp
verter
пропущено...

Спасибо!
Извините за такой глупый вопрос.

Плохое решение, потому что оно будет отрабатывать и при нажатии кнопки "отмена" и при закрытии окна через Alt-F4 и при завершении работы системы. Правильнее убрать ModalResult у кнопки Ok и назначать его по результатам проверки в OnClick.

Если мозги отключены, то да.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
Tag:=mrOk;
...

if Tag...

else begin
  ...
  Tag:=mrNone; 
      end;
...
Рейтинг: 0 / 0
15.01.2021, 15:50
    #40036133
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не закрывать диалог по нажатию на кнопку OK?
YouTube Video
...
Рейтинг: 0 / 0
15.01.2021, 18:50
    #40036241
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не закрывать диалог по нажатию на кнопку OK?
Gerasimenko,

Зачем городить костыли, если есть OkButton.OnClick?..
...
Рейтинг: 0 / 0
16.01.2021, 08:26
    #40036321
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не закрывать диалог по нажатию на кнопку OK?
alekcvp
Gerasimenko,

Зачем городить костыли, если есть OkButton.OnClick?..


По хорошему, до нажатия кнопки не должно доходить вообще, от слова совсем.

Код: pascal
1.
2.
3.
4.
myForm.Verification:Boolean;
...
//при изменении параметров
myButtonOk.Enabled:=Verification;
...
Рейтинг: 0 / 0
16.01.2021, 09:05
    #40036322
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не закрывать диалог по нажатию на кнопку OK?
Свойство ModalResult у твоей кнопки должно быть mrNone, тогда по её нажатию окно закрываться не будет. В OnClick этой кнопки, когда наши проверки показали нам, что можно закрывать окно с определенным modalresult, назначаем self.modalresult := mrOk (или какой-то другой, кроме mrNone), и окно закроется "само собой" по выходу из процедуры, никаких дополнительных действий для его закрытия предпринимать не надо, а ShowModal, которым мы открывали эту форму, вернёт mrOk (или что мы там выбрали). Товарищи уже сказали то же самое выше дважды, я немного развернул.
...
Рейтинг: 0 / 0
16.01.2021, 09:07
    #40036323
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не закрывать диалог по нажатию на кнопку OK?
del
...
Рейтинг: 0 / 0
16.01.2021, 10:37
    #40036327
LocksmithPC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не закрывать диалог по нажатию на кнопку OK?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
function CheckTextEmpty(Sender: TObject; ATag: Longint;
  AIsNumber: Boolean): Boolean;
var
  iCount: Integer;

begin
  Result := True;

  with Sender as TComponent do
    for iCount := 0 to ComponentCount - 1 do
      if Components[iCount].Tag = ATag then
        with Components[iCount] as TWinControl do
          if GetTextLen = 0 then
            begin
              Result := False;
              SetFocus;
              Break;
            end;
end;



Код: pascal
1.
2.
  if CheckTextEmpty(Self, 1, False) then
    ModalResult := mrOk;
...
Рейтинг: 0 / 0
16.01.2021, 12:54
    #40036330
Gluck99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не закрывать диалог по нажатию на кнопку OK?
alekcvp
Плохое решение, потому что оно будет отрабатывать и при нажатии кнопки "отмена" и при закрытии окна через Alt-F4 и при завершении работы системы. Правильнее убрать ModalResult у кнопки Ok и назначать его по результатам проверки в OnClick.
До завершения работы системы надо сначала закрыть модальное окно. OnCloseQuery самый адекватный вариант, без костылей с переназначением ModalResult для кнопок, что может привести к лишней обработке ошибок между проверкой введенных данных и обратным назначением кнопке ModalResult. Я уже не говорю о ситуации, когда кнопок больше двух и нужны многочисленные разнообразные проверки.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
...OnCloseQuery... { Модальная форма с двумя кнопками = mrOk, mrCancel }
begin
       if ModalResult = mrCancel then begin // если кнопок много: if ModalResult in [mrNone, mrCancel, mrAbort, mrSomethingElse] then begin
             CanClose := true;   // Заодно в этом месте можно задать дополнительный вопрос пользователю, уверен ли он, что хочет закрыть форму с отменой введенных данных
             exit;
       end;

{ Проверка введенных пользователем данных
   if проверка = Ок then CanClose := true 
   else CanClose := false т.е. форма не закроется }

end;
...
Рейтинг: 0 / 0
16.01.2021, 18:47
    #40036438
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не закрывать диалог по нажатию на кнопку OK?
Gerasimenko
По хорошему, до нажатия кнопки не должно доходить вообще, от слова совсем.
Иногда бывает что для валидации надо запрос в БД делать, вешать такие вещи на OnChange ИМХО не очень.
Gluck99
До завершения работы системы надо сначала закрыть модальное окно. OnCloseQuery самый адекватный вариант, без костылей с переназначением ModalResult для кнопок, что может привести к лишней обработке ошибок между проверкой введенных данных и обратным назначением кнопке ModalResult. Я уже не говорю о ситуации, когда кнопок больше двух и нужны многочисленные разнообразные проверки.
Вот именно обработка всего подряд в OnCloseQuery - это костыль. Нормально - это отдельная общая процедура, которая вызывается на OnChange() различных контролов и включает/отключает кнопки в зависимости от различных условий и все дополнительные проверки в OnClick() каждой кнопки.
...
Рейтинг: 0 / 0
16.01.2021, 19:11
    #40036441
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не закрывать диалог по нажатию на кнопку OK?
alekcvpИногда бывает что для валидации надо запрос в БД делать, вешать такие вещи на OnChange
ИМХО не очень.

Это становится особенно "не очень", когда проверяется значение изменяемого поля в
зависимости от других полей. Простейший пример - двойное введение пароля при такой
проверке становится вообще невозможно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.01.2021, 22:29
    #40036467
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не закрывать диалог по нажатию на кнопку OK?
Dimitry Sibiryakov
Простейший пример - двойное введение пароля при такой
проверке становится вообще невозможно.
Почему? Если в результате проверки просто включается или выключается кнопка, то возможно. Или что ты подразумеваешь под двойной проверкой пароля?
У меня обычно в диалогах есть процедура ValidateInput(), которая вызывается из всех OnChange() или OnClick() и проверяет значение всех введённых данных на форме. Очень удобно.
...
Рейтинг: 0 / 0
16.01.2021, 23:29
    #40036474
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как не закрывать диалог по нажатию на кнопку OK?
alekcvpЕсли в результате проверки просто включается или выключается кнопка, то возможно.

Ну да, если просто поле с неверными данными просто подсвечивается и сообщение что именно с
ним не так торчит ненавязчиво, то это будет работать. Просто некоторые при проверке
вываливают сообщение ShowMessage('что-то неправильно')...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как не закрывать диалог по нажатию на кнопку OK? / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]