169 похожих чатов

Коллеги, добрый вечер! А никто не знает как модальная форма может

себя закрыть? Ну допустим модальная форма определила, что смысла ей работать нет и хочет вернуть modalResult := mrCancel

Но в каком событии это можно сделать? OnShow и OnActivate не подходят, после их обработки VCL выставляет ModalResult в ноль...

не могу найти подходящего события.

неужели самому себе WM_CLOSE слать? ))

83 ответов

74 просмотра

ModalResult установи и всё

Михаил- Автор вопроса
Iluha Companets
ModalResult установи и всё

я же описал вчем проблема

Михаил- Автор вопроса
Михаил- Автор вопроса
Iluha Companets
должно

как объяснить дельфи, что должно?

А на каком событии она это определила? Я бы выставил какой-нибудь флаг и в таймере определял, сброшен он или нет

Михаил- Автор вопроса
Iluha Companets
должно

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

Михаил- Автор вопроса
Ed Doc
А на каком событии она это определила? Я бы выстав...

да могу на любом определить. Вопрос в том, что никакое событие по умолчанию не подходит получается??

Михаил- Автор вопроса
Ed Doc
А на каком событии она это определила? Я бы выстав...

ну как то глупо... Форма покажется, потом таймер, а потом закроется... неужели нет способа сразу модальную форму схлопнуть

Михаил
как объяснить дельфи, что должно?

не знаю, у меня всё работает (сейчас в лазаре, раньше в дельфи) procedure TChildForm.KeyDownHandler(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_ESCAPE then begin ModalResult:= mrCancel; Close; end; end;

Михаил
ну как то глупо... Форма покажется, потом таймер, ...

Так тебе ее по определённому условию НЕ показывать надо?

Михаил- Автор вопроса
Iluha Companets
не знаю, у меня всё работает (сейчас в лазаре, ран...

спасибо за помощь, если ты и с третьего раза не хочешь прочитать вопрос до конца - то пожалуй не стоит продолжать )

Михаил- Автор вопроса
Ed Doc
Так тебе ее по определённому условию НЕ показывать...

по определенному условию нужно вернуть mrCancel потребителю, даже не показывая форму

Михаил
спасибо за помощь, если ты и с третьего раза не хо...

слушай, ну перечитал я первый месыдж, и чот не пойму, у тебя форма на этапе инициализации уже не хочет себя показывать штоль? так нахрена её вообще ShowModal делать?

Михаил
по определенному условию нужно вернуть mrCancel по...

Я делал что-то подобное (удачно), у меня созданная форма не успевала показываться даже после создания. Позже полезу в код, гляну

Михаил
по определенному условию нужно вернуть mrCancel по...

есть стойкое подозрение что надо что-то в консерватории исправлять

Михаил- Автор вопроса
Iluha Companets
слушай, ну перечитал я первый месыдж, и чот не пой...

верно, на этапе инициализации. "На хрена" - а потребитель не знает, он вызывает ShowModal и анализирует результат

Iluha Companets
нафик такие извраты

Там логика такая. Технически это возможно

Ed Doc
Там логика такая. Технически это возможно

да я понимаю, что всё возможно, но лучше избегать такого

Михаил- Автор вопроса

да, у формы есть внутренняя логика черного ящика. И что?

Михаил
зачем?

чтобы не прибегать к извращениям

Михаил- Автор вопроса
Михаил
зачем?

А зачем форму показывать, если её не нужно показывать?

Михаил- Автор вопроса
Жека Жека
А зачем форму показывать, если её не нужно показыв...

потребитель не знает - надо ли показывать форму

Михаил
потребитель не знает - надо ли показывать форму

Ты можешь при создании формы сразу ей сделать modalresult:= mrcancel. Тогда на момент уничтожения без показа ты получишь этот результат

Михаил- Автор вопроса
Ed Doc
Ты можешь при создании формы сразу ей сделать moda...

так а как форма объяснит что ее показывать не надо?

Михаил
так а как форма объяснит что ее показывать не надо...

Не вызывай ShowModal, ты же можешь проанализировать, надо ли ее показывать на этапе создания? Или этот процесс принятия решения уже внутри показанной формы будет происходить? Тогда у тебя проблемы с логикой 😊

Михаил- Автор вопроса
Ed Doc
Не вызывай ShowModal, ты же можешь проанализироват...

я уже писал выше, но хотелось бы событие, в котором выставленный modalresult будет принят во внимание. Меня удивило, что такого подходящего события нет

Михаил
я уже писал выше, но хотелось бы событие, в которо...

Без минимального тестового проекта трудно понять, о чем ты

Ed Doc
Без минимального тестового проекта трудно понять, ...

я так понимаю что хочется ему что бы формочка в случае mr <> mrok вообще не отображалась. типа, mr уже установлен, нафига его дополнительно менять? и так всё понятно 😂

Handatros
я так понимаю что хочется ему что бы формочка в сл...

Я обычно в случае непонятных хотелок на гитхаб проект делаю и сюда кидаю

unit Unit2; interface uses Forms,Unit1,Messages; const CMD_PROCESS = WM_USER + 100; type TForm2 = class(TForm1) private procedure CMDProcess(var Mess: TMessage); message CMD_PROCESS; protected procedure DoShow; override; end; implementation uses Windows,SysUtils,Controls; procedure TForm2.CMDProcess(var Mess: TMessage); begin ModalResult := MrCancel; end; procedure TForm2.DoShow; begin if ModalResult=MrCancel then begin PostMessage(Handle, CMD_PROCESS, 0, 0); exit; end; inherited; end;

Михаил
так а как форма объяснит что ее показывать не надо...

А это не задача формы, принимать решение для отображения должен внешний код. Если форма создалась, значит она должна быть отображена

Александр (Rouse_) Багель
А это не задача формы, принимать решение для отобр...

А как насчет главной формы? Не в проект же вставлять запрос пароля)

Катерина Свиридова
А как насчет главной формы? Не в проект же вставля...

У меня заставка и запрос пароля идёт до создания главной формы

Михаил
я уже писал выше, но хотелось бы событие, в которо...

Почему нет. Конечно есть. вызываешь формы приложения через свою прокладку которая мучительно думает и принимает решение показывать или не. Если все хотелки реализовать в вцл/лцл нам делать вообще ничего не останется))

Катерина Свиридова
А как насчет главной формы? Не в проект же вставля...

Решение принимается там где отображается диалог с вводом пароля

Александр (Rouse_) Багель
Решение принимается там где отображается диалог с ...

При вызове первой формы (тут это пароль) она и становиться главной. Т.е. решение показа главной формы принимается в главной форме (пароля) :)

Катерина Свиридова
При вызове первой формы (тут это пароль) она и ста...

а ты делай TForm.Create(nil?) вместо Application.CreateForm, и она не будет главной автоматом по памяти пишу.. может, и owner надо в nil

Михаил- Автор вопроса
Александр (Rouse_) Багель
А это не задача формы, принимать решение для отобр...

Сомнительно, но ок . А принимать решение о закрытии формы кто должен?

Михаил
так а как форма объяснит что ее показывать не надо...

Попробуй спроектировать так, чтобы форма была чисто тупой контрол для отображения и редактирования данных, без бизнес-логики. Как диалог выбора файла или выбора принтера.

Михаил- Автор вопроса

Ещё посмотрим кто кого 💪

Михаил
Сомнительно, но ок . А принимать решение о закрыт...

Форма есесно, там все события для этого есть

Михаил- Автор вопроса
Александр (Rouse_) Багель
Форма есесно, там все события для этого есть

Ну вот модальная форма приняла решение на OnCreate закрыться Как ей это сделать?

Михаил
Ну вот модальная форма приняла решение на OnCreate...

Зачем для принятия такого решен в ее создавать

Михаил
Ещё посмотрим кто кого 💪

такая непонятная упёртость... если считаешь, что ты прав - то делай свой костыль и не спрашивай как

Михаил- Автор вопроса
Iluha Companets
такая непонятная упёртость... если считаешь, что т...

Да да,а если в интернете дают советы - то ты должен им непременно воспользоваться

Михаил
Да да,а если в интернете дают советы - то ты долже...

тебе умные люди советы дают... учись, пока дают )

Михаил- Автор вопроса
Михаил
Ну вот модальная форма приняла решение на OnCreate...

Выбросить raise. Вызов ShowModal обернуть в try .. except.

Александр (Rouse_) Багель
На OnCreate она еще не модальная форма :)

но "слиться" в OnCreate низя, штатным способом

Михаил
Лаааадно.. На OnShow )

OnShow это создание хэндла которое вызовется при каждом RecreateWnd, принимать там решение такое себе.

Михаил- Автор вопроса
Михаил- Автор вопроса
Iluha Companets
но "слиться" в OnCreate низя, штатным способом

И видимо ни в одном событии формы нельзя

Михаил
И видимо ни в одном событии формы нельзя

тебе тут уже предлагали пару костылей... короче, делай свой уже, "правильный", потом можешь похвастаться

Михаил- Автор вопроса
Iluha Companets
тебе тут уже предлагали пару костылей... короче, д...

Костыли я знаю, интересен хороший способ

Михаил
Костыли я знаю, интересен хороший способ

Хорошего способа нет, т.к. сам подход не верный.

Михаил- Автор вопроса
Александр (Rouse_) Багель
OnShow это создание хэндла которое вызовется при к...

Короче, Саш, ты знаешь способ вернуть результат в showmodal без показа формы или нет?)

Михаил- Автор вопроса
Александр (Rouse_) Багель
Хорошего способа нет, т.к. сам подход не верный.

Я не считаю это плохим подходом. Модальная форма обеспечивает взаимодействие с пользователем, ну вот решила она что в данном случае взаимодействовать смысла нет и результат сразу понятен

Михаил
Короче, Саш, ты знаешь способ вернуть результат в ...

Лучший способ устранить проблему - это не создавать ее =)

Михаил
А вот кстати тоже нельзя

В чем ограничение? Все деструкторы (и OnDestroy так же) отрабатываю,

Михаил- Автор вопроса
b_semych
В чем ограничение? Все деструкторы (и OnDestroy та...

А потому что генерирование исключения в onshow не повлияет на отображение формы

Михаил
Я не считаю это плохим подходом. Модальная форма ...

Проблема в том, что в логике программы функционал вызывается не командой, событием или процедурой, а показом формы.

Коллеги, хватит трахать мозг :) ShowModal виртуальный метод. Если его перекрыть и не делать inherited, то ничего на экране не появится. А результат можно любой вернуть, даже mrOk.

вот так тебе подойдет? :) https://i.imgur.com/7fSjCPb.mp4

Михаил- Автор вопроса
Ed Doc
вот так тебе подойдет? :) https://i.imgur.com/7fS...

Да, но интересна же реализация, а не видео )

Михаил
Да, но интересна же реализация, а не видео )

во второй форме по кнопке присваиваешь mrOk

Михаил- Автор вопроса
Ed Doc
screenshot во второй форме по кнопке присваиваешь mrOk

Ну это другое. Речь шла о том, что модальная форма знает, что ее не надо показывать. А ты переложил это знание на вызывающего. Если вызывающий знает что не надо показывать - то и вопросов нет, просто не вызывать ShowModal, это и так очевидно

Михаил
Ну это другое. Речь шла о том, что модальная форм...

умение ясно формулировать свои мысли в половине случаев наталкивает на досрочное решение самим вопрошающим. По моим наблюдениям :) Давайте замнем :)

Iluha Companets
а ты делай TForm.Create(nil?) вместо Application.C...

Не делаю Application.CreateForm, а Create хоть с nil, хоть с Application не устанавливает Application.MainForm

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта