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

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

OnCloseQuery


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

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

Плохое решение, потому что оно будет отрабатывать и при нажатии кнопки "отмена" и при закрытии окна через Alt-F4 и при завершении работы системы. Правильнее убрать ModalResult у кнопки Ok и назначать его по результатам проверки в OnClick.
...
Рейтинг: 0 / 0
Как не закрывать диалог по нажатию на кнопку OK?
    #40036131
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как не закрывать диалог по нажатию на кнопку OK?
    #40036133
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YouTube Video
...
Рейтинг: 0 / 0
Как не закрывать диалог по нажатию на кнопку OK?
    #40036241
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerasimenko,

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

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


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

Код: pascal
1.
2.
3.
4.
myForm.Verification:Boolean;
...
//при изменении параметров
myButtonOk.Enabled:=Verification;
...
Рейтинг: 0 / 0
Как не закрывать диалог по нажатию на кнопку OK?
    #40036322
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Свойство ModalResult у твоей кнопки должно быть mrNone, тогда по её нажатию окно закрываться не будет. В OnClick этой кнопки, когда наши проверки показали нам, что можно закрывать окно с определенным modalresult, назначаем self.modalresult := mrOk (или какой-то другой, кроме mrNone), и окно закроется "само собой" по выходу из процедуры, никаких дополнительных действий для его закрытия предпринимать не надо, а ShowModal, которым мы открывали эту форму, вернёт mrOk (или что мы там выбрали). Товарищи уже сказали то же самое выше дважды, я немного развернул.
...
Рейтинг: 0 / 0
Как не закрывать диалог по нажатию на кнопку OK?
    #40036323
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
del
...
Рейтинг: 0 / 0
Как не закрывать диалог по нажатию на кнопку OK?
    #40036327
Фотография LocksmithPC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Как не закрывать диалог по нажатию на кнопку OK?
    #40036330
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как не закрывать диалог по нажатию на кнопку OK?
    #40036438
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerasimenko
По хорошему, до нажатия кнопки не должно доходить вообще, от слова совсем.
Иногда бывает что для валидации надо запрос в БД делать, вешать такие вещи на OnChange ИМХО не очень.
Gluck99
До завершения работы системы надо сначала закрыть модальное окно. OnCloseQuery самый адекватный вариант, без костылей с переназначением ModalResult для кнопок, что может привести к лишней обработке ошибок между проверкой введенных данных и обратным назначением кнопке ModalResult. Я уже не говорю о ситуации, когда кнопок больше двух и нужны многочисленные разнообразные проверки.
Вот именно обработка всего подряд в OnCloseQuery - это костыль. Нормально - это отдельная общая процедура, которая вызывается на OnChange() различных контролов и включает/отключает кнопки в зависимости от различных условий и все дополнительные проверки в OnClick() каждой кнопки.
...
Рейтинг: 0 / 0
Как не закрывать диалог по нажатию на кнопку OK?
    #40036441
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpИногда бывает что для валидации надо запрос в БД делать, вешать такие вещи на OnChange
ИМХО не очень.

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

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


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