Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

События OnCreate, OnShow, OnActivate для формы [D6, Win95/98]


Страницы:   1 2

MsGuns ©   (2002-11-04 19:17:00) 

Есть такой проект:

program ValBnk;

uses
Forms,
MainU in "MainU.pas" {MainForm},
DMVlBank in "..\DataMod\DMVlBank.pas" {dmBank: TDataModule},
SprsStat in "SprsStat.pas",
SprBxSch in "SprBxSch.pas" {frmSprSch},
GetPer in "GetPer.pas" {frmGetPeriod},
Setting in "Setting.pas" {frmComSet};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TdmBank, dmBank);
Application.CreateForm(TfrmSprSch, frmSprSch);
Application.CreateForm(TfrmGetPeriod, frmGetPeriod);
Application.CreateForm(TfrmComSet, frmComSet);
Application.Run;
end.


В событии MainForm.OnActivate происходит обращение к процедуре, определенной в модуле frmComSet для считывания стартовых опций из ini-файла. В этой процедуре происходит такая вещь:

procedure ReadComParams;
var
i: integer;
begin
ComIni := TIniFile.Create(ComLib+"VBCom.ini");
for i := 0 to frmComSet.Panel1.ControlCount-1 do
if frmComSet.Panel1.Controls[i].ClassType=TEdit then
TEdit(frmComSet.Panel1.Controls[i]).Text :=
ComIni.ReadString(VB_COMMONSECTIONID,frmComSet.Panel1.Controls[i].Name,"");
end;


При обращении к контролам панели вылетает по Access Violation..
Такое впечатление, что форма еще не создана или не завершен конструктор для всех ее контролов. Где я глючу и как проверить из главной формы полностью ли "построена" нужная дочерняя ?


MsGuns   (2002-11-04 21:45:00) [1]

>Alex4444444444

Еще раз большое спасибо за науку ! Надеюсь когда-нибудь ответить тем же.


Alex4444444444   (2002-11-04 20:55:00) [2]

Ya dumayu, chto tak (no ne testiroval):
MainForm.Visible := False (v ObjectInspector)


Application.Initialize;
Application.ShowMainForm := False;
Application.CreateForm(...)
...
MainForm.Initialize;
MainForm.Show;
Application.Run;


MsGuns   (2002-11-04 20:54:00) [3]

Савсэм плахой стал даа ?
Разобрался, блин. Просто в дизайне главной форме Visible:=false, а в конце Initialize в true.
Все нормальненько !!!


MsGuns   (2002-11-04 20:51:00) [4]

>Alex4444444444 (04.11.02 20:49)

Для полного счастья может все же подскажете как добиться того, чтобы форма моя ВОЗНИКАЛА на экране только после того, как все будет построено (т.е.после того самого Initialize) ?


Alex4444444444   (2002-11-04 20:49:00) [5]

Good luck!


MsGuns   (2002-11-04 20:46:00) [6]

>Alex4444444444 (04.11.02 20:36)

Вроде вышло ! По крайней мере не вылетает. Чтобы посмотреть полный результат, надо время. Но в любом случае спасибо огроменное ! Я уже хотел перестраивать концепцию динамики хранимых параметров, но, похоже, обойдется 8))


Sectey   (2002-11-04 20:36:00) [7]

Извени не понимаю проблему :)
Проверил на своем приложении

Application.Initialize;
На сколько я понимаю сначало необходимо
инициализировать Applicatio, а потом создавать формы.
Application.CreateForm(TfmRtOrder, fmRtOrder);
Application.CreateForm(TDM, DM);
Application.Run;


procedure TfmRtOrder.FormActivate(Sender: TObject);
begin
DM.cnTTN_BASE.ConnectPath := DirBaseTtnBase;
end;


Alex4444444444   (2002-11-04 20:36:00) [8]

Пардон, я привел куски двух разных модулей. Напишите процедуру TMainForm.Initialize в описании главной формы, вместо OnActivate, и вставьте в нее все то, что Вы хотели сказать в OnActivate. А в модуле программы, ПОСЛЕ того, как все формы созданы, вызовите ее.


Pat   (2002-11-04 20:34:00) [9]

>Мне надо из Гл.формы проверить, в полном ли объеме завершен
>конструктор формы frmComSet. Как это сделать ?
if frmComSet<>nil then создана


Pat   (2002-11-04 20:31:00) [10]

Сорри...не то.. :-((


MsGuns   (2002-11-04 20:29:00) [11]

>Pat © (04.11.02 20:27)

> В AutoCreated Forms попробуйте поставить MainForm в конец.

Но она у меня Главная и таковой должна быть, т.е. открываться первой !


Pat   (2002-11-04 20:27:00) [12]

В AutoCreated Forms попробуйте поставить MainForm в конец.


MsGuns   (2002-11-04 20:27:00) [13]

Простите, но я действительно не понимаю.
В верху приведенного Вами фрагмента идет описание моей формы. Но оно же в самой форме ! Мне что, повторять ее - у меня мозги уже едут 8(.
Следующий фрагмент вообще не понятен - что за процедура Initialize ? Что я там должен определять ? Гл.форма САМА ПО СЕБЕ все имеет, но мне надо ПРОВЕРИТЬ, СОЗДАНА ЛИ ДРУГАЯ ФОРМА. Простите еще раз за тупость и не посчитайте за труд пояснить поподробнее. Спасибо что возитесь со мной.


Alex4444444444   (2002-11-04 20:19:00) [14]

K stati, na skol"ko ya pomnyu, OnActivate proishodit KAZHDYJ raz, kogda Application (ili Form ?) poluchaet focus. Vu zhe ne hotite ee kazhdyj raz initializirovat" :)


Alex4444444444   (2002-11-04 20:15:00) [15]

Application.Initialize ne delaet nichego! (sm. Help).
Postav"te tam VASHU initializatiyu (e.g.,


type TMainForm = ...
...
procedure Initialize;
...
end;

procedure TMainForm.Initialize;
begin
// What used to be OnActivate
end;

Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TdmBank, dmBank);
Application.CreateForm(TfrmSprSch, frmSprSch);
Application.CreateForm(TfrmGetPeriod, frmGetPeriod);
Application.CreateForm(TfrmComSet, frmComSet);

MainForm.Initialize; //All forms created!!!

Application.Run;


MsGuns   (2002-11-04 20:06:00) [16]

Я сделал так:

begin
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TdmBank, dmBank);
Application.CreateForm(TfrmSprSch, frmSprSch);
Application.CreateForm(TfrmGetPeriod, frmGetPeriod);
Application.CreateForm(TfrmComSet, frmComSet);
Application.Initialize; //NEW !!!
Application.Run;
end.


Однако сабж глючит по-прежнему. Мне надо из Гл.формы проверить, в полном ли объеме завершен конструктор формы frmComSet. Как это сделать ?
Простите за тупость, я еще не Мастер, я только учусь :)))


Alex4444444444   (2002-11-04 19:58:00) [17]

Eshe raz: otredactirujte file proecta (chtoby ego otkryt", nazhmite F8, naprimer). Postav"te initializaciyu pered Run:

Application.CreateForm(...)
Application.CreateForm(...)

// Initialization goes here

Application.Run


MsGuns   (2002-11-04 19:49:00) [18]

Мастера ! Ну кто-нибудь ! Ведь для вас это вопрос плевый ! Я пока начал копать по хэлпу TApplication. Верной дорогой иду, товарищи ?


MsGuns   (2002-11-04 19:39:00) [19]

В событии MainForm.OnCreate поставил MainForm.Hide, а в конце MainForm.Activate MainForm.Show, но что-то мне подсказывает, что это в корне не верно (как может форма активизироваться, если она невидима ?).
Эффекта никакого. Да, кстати, к первому вопросу (сабж) это вообще никак не относится.


Alex4444444444   (2002-11-04 19:27:00) [20]

Poprobujte postavit" activaciyu pered Application.Run. Nuzhno, navernoe, eshe postavit" ShowMainForm := False, a posle activacii, MainForm.Show.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо