Текущий архив: 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.5 MB
Время: 0.033 c