Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.52 MB
Время: 0.218 c
1-79852
siriusP
2004-02-10 17:17
2004.02.25
Помогите найти ошибку в классе


1-79874
Andrey007
2004-02-10 12:56
2004.02.25
Как отсортировать TComboBox?


1-79855
Well
2004-02-10 17:25
2004.02.25
Убрать программу из


1-79833
VitGun
2004-02-10 21:12
2004.02.25
Delphi+Access+Word(OLE)+Excel(OLE)


1-79937
Leech
2004-02-09 16:52
2004.02.25
Открыть существующий документ в приложении Microsoft Word...