Текущий архив: 2004.02.25;
Скачать: CL | DM;
ВнизПоказ модальной формы из DLL Найти похожие ветки
← →
NailMan (2004-02-09 11:33) [0]Есть не VCL приложение, которое должно вызвать показ модальной формы из DLL, передав в нее строчку(форма - это еррор репорт). На форме соотвественно TMemo и BitButton(у этой в Onclick прописано только Close).
Проблема заключается в том что при вызове функции создания/показа формы она промигивает и закрывается. На быстрой машине увидеть ее вообще не удается. Т.е. проходит Showmodal как еслиб это был простой show.
Вот как оформлена функция вызова этой формы(экспортируемая процедура):
Procedure ShowErrorReport(st:strng);
var ErrorRep:TErrorRep;
begin
ErrorRep:=TErrorRep.Create(nil);
try
ErrorRep.Memo1.Lines.Add(st);
ErrorRep.ShowModal;
finally
ErrorRep.Free;
end;
end;
Чую что сие связано с onIdle, которого в неVCL-приложениях нет.
Как быть? Очень нужно чтобы эта форма нормально отображалась на экране и воспринимала нажатия на ней кнопки и без подключения всяких левых VCL модулей(aka Forms и т.д) в вызывающую программу.
← →
Digitman (2004-02-09 11:55) [1]
> без подключения всяких левых VCL модулей(aka Forms и т.д)
с каких пор они стали "левыми" ?
твой код без подключения этих "левых" модулей не то что работать (правильно или неправильно - другой вопрос) - даже скомпилирован не будет !
сие заявление выглядит как "хочу ездить на самокате, который по наворотам круче Кадиллака, но выглядит и стоит как велосипед, и при этом рулить и педали крутить не нужно"
← →
Verg (2004-02-09 11:58) [2]Из приведенного кода никаких причин такого поведения формы я не вижу. Все должно работать.
Нюанс где-то в другом месте.
А по шагам пройти ShowModal?
← →
Digitman (2004-02-09 12:00) [3]
> Verg © (09.02.04 11:58) [2]
да у него наверняка консоль выступает в роли хост-приложения
← →
Verg (2004-02-09 12:02) [4]
> Digitman © (09.02.04 12:00) [3]
Ну и прекрасно, и что?.
У меня такие конструкции работали "на ура".
← →
Verg (2004-02-09 12:07) [5]Сомнение может вызвать только передача String как параметра процедуры в DLL. Опять там разговоры про share mem, RTP и проч...
Но, здесь, в этом случае, на старт модального цикла формы это не должно повлиять никак.
← →
Digitman (2004-02-09 12:09) [6]
> Verg © (09.02.04 12:07) [5]
пока dpr хост-приложения и фрагмент кода вызова он не покажет, рассуждать тут, думаю, бессмысленно
← →
Verg (2004-02-09 12:11) [7]
> Digitman © (09.02.04 12:09) [6]
>
> > Verg © (09.02.04 12:07) [5]
>
>
> пока dpr хост-приложения и фрагмент кода вызова он не покажет,
> рассуждать тут, думаю, бессмысленно
Однозначно...
← →
NailMan (2004-02-09 12:18) [8]Digitman ©
Приложение является Direct3D-приложением в котором все создается посредством WinAPI. Во избежание засёра экзеки лишним грузом я и вынес форму в DLL.
Форма вызывается до создания главного окна приложения(форма - это эррор-репорт "фатальной" ошибки).
Самое смешное что в начале приложения(первой строчкой) аналогичной процедурой(только без передачи параметров) вызывается форма-селектор с несколькими кнопками из которой уже можно запустить другую форму(настройки игры) или запустить саму игру(просто выйти продолжив выполнение программы).
Именно эта форма тоже вызывается как showmodal и прекрасно работает, а если дальше в программе вызвать ее же или вышеприведенную форму, то она проскакивает без всяких модальностей, практически не показываясь на экране.
Verg ©
Это как? В самой программе или при отладке в DLL?
← →
Digitman (2004-02-09 12:25) [9]
> NailMan © (09.02.04 12:18) [8]
у тебя скорей всего при или после визуализации этой формы (при обработке какого-то асинхр.сообщения, посылаемого ей), происходит какое-то неконтролируемое тобой исключение, что и приводит к таким последствиям
> Во избежание засёра экзеки лишним грузом
угу ... а "засёр" DLL тем же самым "лишним грузом" ты как бы "засёром" не считаешь
← →
Verg (2004-02-09 12:27) [10]Ну конечно в отладке в DLL. Где ж еще.
← →
NailMan (2004-02-09 12:32) [11]Ну с DLL проще, так как она динамически подключаемая и перекомпиливать ядро не надо.
← →
Verg (2004-02-09 12:35) [12]Стоит модальному циклы формы в DLL принять WM_QUIT, ни одна модальная форма из этой DLL-ки больше модалиться не будет, например.
← →
Digitman (2004-02-09 12:37) [13]
> NailMan © (09.02.04 12:32) [11]
> Ну с DLL проще
ну так и займись отладкой, коль проще ! проблема-то выеденного яйца не стоит)
← →
NailMan (2004-02-09 12:45) [14]Verg ©
Тааак, а как же тогда поступить? Яже эту форму использую только в начале программы и то неопределенное число раз. Типа сначала создать, а вызов(с передачей параметров) сделать просто как Lines.add() и Showmodal? Хм...а обойти эту фичу с WM_QUIT нельзя(если формы в одной DLL)?
Или все таки формы распихивать по разным DLL-кам. :-((
С чем это связано(поведение с WM_QUIT)?
← →
Verg (2004-02-09 12:52) [15]
> NailMan © (09.02.04 12:45) [14]
Я же сказал - "например".
> С чем это связано(поведение с WM_QUIT)?
А с тем, что получение этого сообщения устанавливает флаг FTerminate у объекта Application в этой самой DLL , а модальный цикл постоянно проверяет этот флажок.
Ты бы хоть в исходники Forms заглянул, что ли...
Так что показывает отладчик?
Что приводит к выходу из модалного цикла?
← →
NailMan (2004-02-09 13:03) [16]Verg ©
А с тем, что получение этого сообщения устанавливает флаг FTerminate у объекта Application в этой самой DLL , а модальный цикл постоянно проверяет этот флажок.
Ага понятно.
Так что показывает отладчик?
Что приводит к выходу из модалного цикла?
Это я смогу только вечером проверить, т.к. на работе Delphi ставить нельзя. Оттуда и отвечу.
← →
Verg (2004-02-09 13:33) [17]Вот сценарий (из жизни):
Приложение обнаружило какую-то фатальную ошибку.
Жить с этим оно не может, поэтому делает postquitmessage(1) и вызывает некую проц-у из dll-ки, котрая по-жизни просто складывала эти сообщения в log-файл, отсылала e-mail-ом разработчикам и т.п..... И все нормально работало.
Но до тех пор, пока юзверь не заказал каким-то разработчикам заменить эту DLL-ку, чтобы она заодно с LOG-ом и проч. ф-циям еще и показывала эту общибку на формочке....
← →
NailMan (2004-02-11 23:29) [18]Verg ©
Так что показывает отладчик?
Что приводит к выходу из модалного цикла?
Ну вот наконец-то добрался до проги и проверил - выходит с результатом modal result = 2;
поставил брейкпоинт вForms->function TCustomForm.ShowModal: Integer;
А он ставит зеленый маркер и в него не заходит как будто ShowModal не вызывается ни разу(!).
Вобщем вынес эту форму в отдельный DLL. В начале программы с создаю форму(экспортируемой процедурой), далее если надо вызываю процедуру показа:
Procedure ShowErrorReport(st:string);
begin
ErrorRep.Memo1.Lines.add(st);
ErrorRep.Showmodal;
end;
на кнопке виситHide;
в конце приложения убиваю форму(также экспортируемой функцией).
Таким образом вопрос остался открытым. Как показать?
← →
Verg (2004-02-13 08:42) [19]То, что он у тебя не заходит отладчиком в ShowModal говорит о том, что может быть ты неверно настрил отладчик.
UseDebug DCUs, например, установлен?
← →
Verg (2004-02-13 08:46) [20]
> ErrorRep.Showmodal;
Отлаживая DLL, поставь ТО на этой строке и запускай. Посля "бряка" нажми StepInto и, если не зайдет в TCustomForm.ShowModal, то точно неверно настроен отладчик.
Страницы: 1 вся ветка
Текущий архив: 2004.02.25;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.034 c