Текущий архив: 2002.11.14;
Скачать: CL | DM;
Вниз
События OnCreate, OnShow, OnActivate для формы Найти похожие ветки
← →
MsGuns (2002-11-04 19:17) [0]Есть такой проект:
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 19:23) [1]Вопрос вдогонку:
Как вообще ничего не показывать на экране, кроме часиков, пока ПОЛНОСТЬЮ не завершится конструктор всех форм и контролов, да еще БД откроется (DataModule.OnCreate) ?
Есть способ проверки всех флажков в цикле, которые "поднимает" каждая форма в конце OnCreate, но это совсем уж деревянно и хочется "как у людей"
← →
Alex4444444444 (2002-11-04 19:27) [2]Poprobujte postavit" activaciyu pered Application.Run. Nuzhno, navernoe, eshe postavit" ShowMainForm := False, a posle activacii, MainForm.Show.
← →
MsGuns (2002-11-04 19:39) [3]В событии MainForm.OnCreate поставил MainForm.Hide, а в конце MainForm.Activate MainForm.Show, но что-то мне подсказывает, что это в корне не верно (как может форма активизироваться, если она невидима ?).
Эффекта никакого. Да, кстати, к первому вопросу (сабж) это вообще никак не относится.
← →
MsGuns (2002-11-04 19:49) [4]Мастера ! Ну кто-нибудь ! Ведь для вас это вопрос плевый ! Я пока начал копать по хэлпу TApplication. Верной дорогой иду, товарищи ?
← →
Alex4444444444 (2002-11-04 19:58) [5]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 20:06) [6]Я сделал так:
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 20:15) [7]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;
← →
Alex4444444444 (2002-11-04 20:19) [8]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" :)
← →
MsGuns (2002-11-04 20:27) [9]Простите, но я действительно не понимаю.
В верху приведенного Вами фрагмента идет описание моей формы. Но оно же в самой форме ! Мне что, повторять ее - у меня мозги уже едут 8(.
Следующий фрагмент вообще не понятен - что за процедура Initialize ? Что я там должен определять ? Гл.форма САМА ПО СЕБЕ все имеет, но мне надо ПРОВЕРИТЬ, СОЗДАНА ЛИ ДРУГАЯ ФОРМА. Простите еще раз за тупость и не посчитайте за труд пояснить поподробнее. Спасибо что возитесь со мной.
← →
Pat (2002-11-04 20:27) [10]В AutoCreated Forms попробуйте поставить MainForm в конец.
← →
MsGuns (2002-11-04 20:29) [11]>Pat © (04.11.02 20:27)
> В AutoCreated Forms попробуйте поставить MainForm в конец.
Но она у меня Главная и таковой должна быть, т.е. открываться первой !
← →
Pat (2002-11-04 20:31) [12]Сорри...не то.. :-((
← →
Pat (2002-11-04 20:34) [13]>Мне надо из Гл.формы проверить, в полном ли объеме завершен
>конструктор формы frmComSet. Как это сделать ?
if frmComSet<>nil then создана
← →
Alex4444444444 (2002-11-04 20:36) [14]Пардон, я привел куски двух разных модулей. Напишите процедуру TMainForm.Initialize в описании главной формы, вместо OnActivate, и вставьте в нее все то, что Вы хотели сказать в OnActivate. А в модуле программы, ПОСЛЕ того, как все формы созданы, вызовите ее.
← →
Sectey (2002-11-04 20:36) [15]Извени не понимаю проблему :)
Проверил на своем приложении
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;
← →
MsGuns (2002-11-04 20:46) [16]>Alex4444444444 (04.11.02 20:36)
Вроде вышло ! По крайней мере не вылетает. Чтобы посмотреть полный результат, надо время. Но в любом случае спасибо огроменное ! Я уже хотел перестраивать концепцию динамики хранимых параметров, но, похоже, обойдется 8))
← →
Alex4444444444 (2002-11-04 20:49) [17]Good luck!
← →
MsGuns (2002-11-04 20:51) [18]>Alex4444444444 (04.11.02 20:49)
Для полного счастья может все же подскажете как добиться того, чтобы форма моя ВОЗНИКАЛА на экране только после того, как все будет построено (т.е.после того самого Initialize) ?
← →
MsGuns (2002-11-04 20:54) [19]Савсэм плахой стал даа ?
Разобрался, блин. Просто в дизайне главной форме Visible:=false, а в конце Initialize в true.
Все нормальненько !!!
← →
Alex4444444444 (2002-11-04 20:55) [20]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 21:45) [21]>Alex4444444444
Еще раз большое спасибо за науку ! Надеюсь когда-нибудь ответить тем же.
Страницы: 1 вся ветка
Текущий архив: 2002.11.14;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.007 c