себя закрыть? Ну допустим модальная форма определила, что смысла ей работать нет и хочет вернуть modalResult := mrCancel
Но в каком событии это можно сделать? OnShow и OnActivate не подходят, после их обработки VCL выставляет ModalResult в ноль...
не могу найти подходящего события.
неужели самому себе WM_CLOSE слать? ))
ModalResult установи и всё
я же описал вчем проблема
а, ну Close надо вызвать
тоже не работает
как объяснить дельфи, что должно?
А на каком событии она это определила? Я бы выставил какой-нибудь флаг и в таймере определял, сброшен он или нет
да могу на любом определить. Вопрос в том, что никакое событие по умолчанию не подходит получается??
ну как то глупо... Форма покажется, потом таймер, а потом закроется... неужели нет способа сразу модальную форму схлопнуть
не знаю, у меня всё работает (сейчас в лазаре, раньше в дельфи) procedure TChildForm.KeyDownHandler(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_ESCAPE then begin ModalResult:= mrCancel; Close; end; end;
Так тебе ее по определённому условию НЕ показывать надо?
спасибо за помощь, если ты и с третьего раза не хочешь прочитать вопрос до конца - то пожалуй не стоит продолжать )
по определенному условию нужно вернуть mrCancel потребителю, даже не показывая форму
слушай, ну перечитал я первый месыдж, и чот не пойму, у тебя форма на этапе инициализации уже не хочет себя показывать штоль? так нахрена её вообще ShowModal делать?
Я делал что-то подобное (удачно), у меня созданная форма не успевала показываться даже после создания. Позже полезу в код, гляну
есть стойкое подозрение что надо что-то в консерватории исправлять
нафик такие извраты
верно, на этапе инициализации. "На хрена" - а потребитель не знает, он вызывает ShowModal и анализирует результат
Там логика такая. Технически это возможно
да я понимаю, что всё возможно, но лучше избегать такого
да, у формы есть внутренняя логика черного ящика. И что?
выдели логику в отдельную процедуру
чтобы не прибегать к извращениям
спасибо за помощь
А зачем форму показывать, если её не нужно показывать?
потребитель не знает - надо ли показывать форму
Ты можешь при создании формы сразу ей сделать modalresult:= mrcancel. Тогда на момент уничтожения без показа ты получишь этот результат
так а как форма объяснит что ее показывать не надо?
Не вызывай ShowModal, ты же можешь проанализировать, надо ли ее показывать на этапе создания? Или этот процесс принятия решения уже внутри показанной формы будет происходить? Тогда у тебя проблемы с логикой 😊
я уже писал выше, но хотелось бы событие, в котором выставленный modalresult будет принят во внимание. Меня удивило, что такого подходящего события нет
Без минимального тестового проекта трудно понять, о чем ты
я так понимаю что хочется ему что бы формочка в случае mr <> mrok вообще не отображалась. типа, mr уже установлен, нафига его дополнительно менять? и так всё понятно 😂
Я обычно в случае непонятных хотелок на гитхаб проект делаю и сюда кидаю
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;
А это не задача формы, принимать решение для отображения должен внешний код. Если форма создалась, значит она должна быть отображена
А как насчет главной формы? Не в проект же вставлять запрос пароля)
У меня заставка и запрос пароля идёт до создания главной формы
Почему нет. Конечно есть. вызываешь формы приложения через свою прокладку которая мучительно думает и принимает решение показывать или не. Если все хотелки реализовать в вцл/лцл нам делать вообще ничего не останется))
Решение принимается там где отображается диалог с вводом пароля
При вызове первой формы (тут это пароль) она и становиться главной. Т.е. решение показа главной формы принимается в главной форме (пароля) :)
Сомнительный подход, все в одну кучу свалить
а ты делай TForm.Create(nil?) вместо Application.CreateForm, и она не будет главной автоматом по памяти пишу.. может, и owner надо в nil
Сомнительно, но ок . А принимать решение о закрытии формы кто должен?
Попробуй спроектировать так, чтобы форма была чисто тупой контрол для отображения и редактирования данных, без бизнес-логики. Как диалог выбора файла или выбора принтера.
Ещё посмотрим кто кого 💪
Форма есесно, там все события для этого есть
Ну вот модальная форма приняла решение на OnCreate закрыться Как ей это сделать?
Зачем для принятия такого решен в ее создавать
такая непонятная упёртость... если считаешь, что ты прав - то делай свой костыль и не спрашивай как
Да да,а если в интернете дают советы - то ты должен им непременно воспользоваться
тебе умные люди советы дают... учись, пока дают )
На OnCreate она еще не модальная форма :)
Лаааадно.. На OnShow )
Выбросить raise. Вызов ShowModal обернуть в try .. except.
но "слиться" в OnCreate низя, штатным способом
OnShow это создание хэндла которое вызовется при каждом RecreateWnd, принимать там решение такое себе.
А вот кстати тоже нельзя
И видимо ни в одном событии формы нельзя
тебе тут уже предлагали пару костылей... короче, делай свой уже, "правильный", потом можешь похвастаться
Костыли я знаю, интересен хороший способ
Хорошего способа нет, т.к. сам подход не верный.
Короче, Саш, ты знаешь способ вернуть результат в showmodal без показа формы или нет?)
тебе же "хороший" надо )))
Нет такого способа
Я не считаю это плохим подходом. Модальная форма обеспечивает взаимодействие с пользователем, ну вот решила она что в данном случае взаимодействовать смысла нет и результат сразу понятен
Лучший способ устранить проблему - это не создавать ее =)
В чем ограничение? Все деструкторы (и OnDestroy так же) отрабатываю,
А потому что генерирование исключения в onshow не повлияет на отображение формы
Проблема в том, что в логике программы функционал вызывается не командой, событием или процедурой, а показом формы.
Коллеги, хватит трахать мозг :) ShowModal виртуальный метод. Если его перекрыть и не делать inherited, то ничего на экране не появится. А результат можно любой вернуть, даже mrOk.
вот так тебе подойдет? :) https://i.imgur.com/7fSjCPb.mp4
Да, но интересна же реализация, а не видео )
Ну это другое. Речь шла о том, что модальная форма знает, что ее не надо показывать. А ты переложил это знание на вызывающего. Если вызывающий знает что не надо показывать - то и вопросов нет, просто не вызывать ShowModal, это и так очевидно
умение ясно формулировать свои мысли в половине случаев наталкивает на досрочное решение самим вопрошающим. По моим наблюдениям :) Давайте замнем :)
Не делаю Application.CreateForm, а Create хоть с nil, хоть с Application не устанавливает Application.MainForm
Обсуждают сегодня