Главная страница
    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.49 MB
Время: 0.04 c
14-80277
Леха
2004-02-03 21:07
2004.02.25
---|Ветка была без названия|---


1-79817
Edik86
2004-02-13 22:25
2004.02.25
Программа дала сбой


14-80161
F-man
2004-02-01 15:26
2004.02.25
Создание Wizard-a


1-79845
KOSTIK
2004-02-10 19:20
2004.02.25
Рисунок из TImageList в TImage


14-80137
SergP
2004-02-01 23:36
2004.02.25
Вопрос про кеширование





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский