Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.066 c
4-1118064267
Андрей Жук
2005-06-06 17:24
2005.08.07
Добавление строк в COMBOBOEX


14-1121418558
Андрей Жук
2005-07-15 13:09
2005.08.07
Интересно, теперь будут ли книги выпускать на такой бумаге?


14-1120635866
kyn66
2005-07-06 11:44
2005.08.07
Считыватель штрихкода


11-1103676436
Solo
2004-12-22 03:47
2005.08.07
Опять про подсветку в RichEdit


8-1112552568
seregka
2005-04-03 22:22
2005.08.07
MP3 tags





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский