Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.07;
Скачать: CL | DM;

Вниз

Выполнение до отображения главной формы приложения   Найти похожие ветки 

 
vers ©   (2005-07-21 14:01) [0]

Нужно выполнить некоторые операторы и отобразить модальную форму до того, как главная форма приложения появится на экране. Все операторы должны выполняться в потоке VCL, то есть после запуска Application.Run, а не до него, иначе Access violation. Есть идеи как реализовать?


 
Гаврила ©   (2005-07-21 14:05) [1]

Можно поместить этот код в конструктор главной формы


 
Гаврила ©   (2005-07-21 14:06) [2]


> то есть после запуска Application.Run


> иначе Access violation


И что приводит к этому печальному факту?


 
Digitman ©   (2005-07-21 14:10) [3]


> Все операторы должны выполняться в потоке VCL, то есть после
> запуска Application.Run


не вижу никакой связи между "до" или "после" и "потоком VCL"


 
vers ©   (2005-07-21 14:36) [4]

Проблема такая: есть приложение, которое динамически загружает DLL. В приложении есть форма для ввода пароля, которая должна отображаться до появления на экране главной формы приложения. При нажатии на кнопку на форме ввода пароля грузится DLL и запускается процедура из этой DLL. В этой процедуре создается компонент TIdTCPClient. Далее, после ввода пароля, форма ввода пароля исчезает, появляется главная форма приложения, оттуда вызывается вторая процедура из этой DLL, в которой происходит обращение к компоненту TIdTCPClient. При обращении к любому его полю - Access violation.
Если поместить форму ввода пароля в autocreate forms и сделать ее главной, то таких проблем не возникает, но так как в этом случае, основная форма, с которой работает программа, не главная, она сворачивается не в панель задач, а над кнопкой Пуск. Следовательно нужно сделать ее главной формой приложения.
Помещение кода в конструктор главной формы ничего не дает, так как Application.Run еще не сработал.
Или может я чего-то не допонимаю?


 
Digitman ©   (2005-07-21 14:47) [5]

главная форма VCL-аппликации - она и есть главная.

никакую иную форму сделать главной (без выкрутасов) ты не сможешь : св-во TApplication.MainForm только для чтения

но ничто не мешает не показывать гл.форму сразу же после ее создания - на то есть св-во TApplication.ShowMainForm

исходя из этого напрашивается простейшее решение :

Application.Initialize;
Application.ShowMainForm := False;
Application.CreateForm(MainForm, TMainForm); //гл.форма
Application.CreateForm(LoginForm, TLoginForm); //форма логина
Application.Run;


 
ANB ©   (2005-07-21 14:54) [6]

Если запихать в OnShow главной формы fmLogin.ShowModal, то как раз получишь нужный результат.

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


 
vers ©   (2005-07-21 14:56) [7]

о! спасибо огромное, просвятил :)
а я и не знал, что у TApplication есть такое свойство.


 
Digitman ©   (2005-07-21 15:00) [8]


> как сделать, чтобы форма логина появилась, когда главная
> уже нарисовалась


пусть гл.форма в OnCreate посылает сама себе же PostMessage()

при получении сообщения в его обработчике выводи что-угодно, хоть модально хоть немодально


 
vers ©   (2005-07-21 15:01) [9]

Хм, я тоже запихивал в OnShow, но все равно access violation. Может я неправильно создаю форму?

procedure TForm3.FormShow(Sender: TObject);
begin
Form1:=TForm1.Create(Application);
Form1.ShowModal;
end;


 
Digitman ©   (2005-07-21 15:29) [10]


> но все равно access violation


нет не "все равно" !!

ЛЮБОЕ сообщение о нарушении доступа, выдаваемое в ран-тайм Делфи-приложением, сопровождается последующими деталями : кто, что и где нарушил !

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


 
vers ©   (2005-07-21 15:35) [11]

:))
Прошу прощения за беспокойство. Нашел я в чем глюк: компонент, насчет которого вылезало access violation, создавался в DLL, а через некоторое время из другой DLL удалялся :) Забыл закомментарить.
А насчет того, откуда запускать - только что проверил: без разницы, где его вызывать в OnCreate, в OnShow или в обработчике собственного сообщения - ошибки разделения доступа не происходит.
Еще раз сорри за беспокойство...


 
vers ©   (2005-07-21 15:37) [12]

Насчет комментариев, которые выдает Access violation: что мне дает этот адрес? Разве что только дизассемблировать свою программу полезу...


 
Digitman ©   (2005-07-21 15:40) [13]

ОЧЕНЬ многое дает !!

и дизассемблировать свою программу в ПОДАВЛЯЮЩЕМ большинстве случаев не требуется  - чуть ли не всю исчерпывающую инф-цию о "проблемной точке" даст все тот же встроенный отладчик

см. меню Search -> Find Error ...

это тоже не для Пушкина, кстати)


 
vers ©   (2005-07-21 16:04) [14]

Клева :)
Сколько бы проблем решилось, если б раньше знал, как этим пользоваться...
Только в этом случае отладка затрудняется тем, что DLL-ка грузится по сети, сохраняется в локальный файл и потом загружается ее копия. Приходится отлаживать assert-ами и выводами во всякие memo и др. Может какое-то более оптимальное средство отладки для такого случая есть? А то у меня этих DLL-ок целая куча...


 
Digitman ©   (2005-07-21 16:14) [15]


> Клева :)


Не то слово !!)

Путева ! Кульна-рульна ! Прикольна ! По кайфу ! Ништяк ! Зашибись ! Атасна ! Атпад ! И тд. и т.п.)..


> DLL-ка грузится по сети


да по горизонту откуда она грузится !
принципы отладки встр.средствами - те же самые


 
vers ©   (2005-07-21 16:30) [16]

Хм... И как к примеру встроенными средствами отладки мне посмотреть значения переменных DLL-ки, которая динамически подключается к приложению? Или, чего мне больше всего не хватает, как в подгружаемую DLL брэкпоинты поставить, чтоб они переключали среду Delphi в режим отладки, а там дальше делать Trace итд? Delphi-то ничего знать не знает, откуда и какую DLL-ку будет загружать мое приложение. DLL-ка вообще не на Delphi может быть написана...
Я думаю, здесь можно только информационные сообщения как-нибудь выводить. Я в каждую DLL передаю адрес процедуры с входным параметром типа shortstring, которая выводит строку в специально созданное Memo для отладки.


 
Digitman ©   (2005-07-21 16:44) [17]

а если бы ДЛЛ грузилась статически с лок.пути - в этом случае у тебя проблем бы с трассировкой его кода не возникло ? так надо понимать ? судя по "в этом случае отладка затрудняется тем, что DLL-ка грузится по сети" ?


 
vers ©   (2005-07-21 17:40) [18]

По сети - означает не с UNC-пути. DLL грузится с IdTCPServer"а и сохраняется в локальном файле, после чего подключается приложением. Если б подключалась она сама, а не ее копия, можно было бы указать host appication и отлаживать ее средствами Delphi, а моем случае Delphi "не знает" исходника DLL и ничем мне помочь не может :(



Страницы: 1 вся ветка

Текущий архив: 2005.08.07;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.06 c
8-1112617676
Kevin Brown
2005-04-04 16:27
2005.08.07
Конвертация из Gif в Bmp.


3-1119893189
Jungle Forever!
2005-06-27 21:26
2005.08.07
mysql group


14-1121643366
Мутамба
2005-07-18 03:36
2005.08.07
Правда ли что на Украине какой-то батюшка предал анафиме модерато


1-1121768733
Виталька2005
2005-07-19 14:25
2005.08.07
Пустая дата в DateTimePicker


1-1121508981
286
2005-07-16 14:16
2005.08.07
Проблема с кодировкой