![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
События OnCreate, OnShow, OnActivate для формы [D6, Win95/98]
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.