Текущий архив: 2004.04.04;
Скачать: CL | DM;
Вниз
OnActivate и один экземпляр программы. Найти похожие ветки
← →
venoel (2004-03-16 14:23) [0]Не запускается процедура FormActivate при передаче управления уже запущенному экземпляру программы.
В *.dpr такой кусок(для запуска одного экземпляра проги):
Handle1:=FindWindow("TForm1",nil);
if Handle1=0 then begin
Application.CreateForm(TForm1, Form1);
Application.Run;
end else SetForegroundWindow(Handle1);
У Form1 на событие OnActivate выполняется то, что мне надо.
При первом запуске все нормально отрабатывает и прога остается запущенной.
При повторном запуске управление передается проге, окно появляется, но, то что описано в событии OnActivate не происходит.
Что я не так делаю? И как мне быть?
С уважением, venoel.
← →
Reindeer Moss Eater © (2004-03-16 14:31) [1]TApplication.OnActivate
← →
venoel (2004-03-16 14:37) [2]>Reindeer Moss Eater
Будте так добры, чуть-чуть подробнее.
← →
Reindeer Moss Eater © (2004-03-16 14:40) [3]используй TApplication.OnActivate
← →
venoel (2004-03-16 14:59) [4]>используй TApplication.OnActivate
То что его надо использовать я понял. Но как?
...
Handle1:=FindWindow("TForm1",nil);
if Handle1=0 then begin
Application.CreateForm(TForm1, Form1);
Application.Run;
end
else begin
Application.OnActivate:=Form1.FormActivate;
SetForegroundWindow(Handle1); // Активизируем
ShowWindow(Handle1,SW_RESTORE);
end;
Если так, то не работает. Если строку Application.OnActivate:=Form1.FormActivate; переношу повыше, да работает.FormActivate выполняется, но при этом еще и выдает ошибку Access violation
Полный текст моего dpr-файла.
Application.Initialize;
if ParamStr(1)="/setup" then begin
Application.CreateForm(TForm2, Form2);
Application.Run;
end
else begin
Handle1:=FindWindow("TForm1",nil);
if Handle1=0 then begin
Application.CreateForm(TForm1, Form1);
Application.Run;
end
else begin
Application.OnActivate:=Form1.FormActivate;
SetForegroundWindow(Handle1); // Активизируем
ShowWindow(Handle1,SW_RESTORE);
end;
end;
← →
Reindeer Moss Eater © (2004-03-16 15:04) [5]Application.OnActivate:=Form1.FormActivate;
А Form1 уже существует?
← →
venoel (2004-03-16 15:19) [6]
Application.Initialize;
// Запустили с параметром.
if ParamStr(1)="/setup" then begin
// Выдаем форму для настройки опций.
Application.CreateForm(TForm2, Form2);
Application.Run;
end
else begin// Запустили без параметров.
Handle1:=FindWindow("TForm1",nil);
if Handle1=0 then begin // Если не нашли форму, то это первый // запуск
Application.CreateForm(TForm1, Form1);
Application.Run;
end
else begin // Уже есть запущенный экземпляр.
// Здесь или где должна быть эта строка? //
Application.OnActivate:=Form1.FormActivate;//
/////////////////////////////////////////////
SetForegroundWindow(Handle1); // Активизируем
ShowWindow(Handle1,SW_RESTORE);
end;
end;
Form1 в разделе Available forms
Form2 в разделе Auto-create forms, она же Main form
← →
Reindeer Moss Eater © (2004-03-16 15:23) [7]else begin // Уже есть запущенный экземпляр.
// Здесь или где должна быть эта строка? //
Application.OnActivate:=Form1.FormActivate;//
/////////////////////////////////////////////
SetForegroundWindow(Handle1); // Активизируем
ShowWindow(Handle1,SW_RESTORE);
end;
end;
А зачем в текущем экземпляре приложения при обнаружении другого экземпляра приложения назначать обработчик Application.OnActivate да еще и при этом читать свойство у несозданного экземпляра Form1
?
← →
venoel (2004-03-16 15:29) [8]Вот я и спрашиваю, как мне это сделать?
← →
Reindeer Moss Eater © (2004-03-16 15:31) [9]Парень, делать этого как раз не надо!
← →
venoel (2004-03-16 15:34) [10]Reindeer, ты наверное сидишь и прикалываешься? Если не в курсе дела, так отойди и не мешай.
← →
Reindeer Moss Eater © (2004-03-16 15:43) [11]Нет, я стоя прикалываюсь.
В твоей третьей ветке ифа, когда ты понял, что ЭТОМУ экземпляру приложения не надо запускаться, ЗАЧЕМ присваивать Application.OnActivate?
Ты решил наплевать на собственную логику и написанный под нее if ?
Кроме того, в третьей ветке ифа нет никакого FORM1 и обращаться к Form1.FormActivate - значит нарываться на AV
← →
Reindeer Moss Eater © (2004-03-16 15:48) [12]По поводу мешания.
Если хочешь разобраться в непонятном - слушай и отвечай на вопросы и думай, а не давай бесплатные советы.
А если ждешь готового кода - топай пешком в фак или кладовку. Там навалом готового добра по твоей теме.
← →
venoel (2004-03-16 15:53) [13]>В твоей третьей ветке ифа, когда ты понял, что ЭТОМУ экземпляру >приложения не надо запускаться, ЗАЧЕМ присваивать Application.>OnActivate?
Может мною не внятно задан вопрос?
Повторяю. При передаче фокуса запущенному экземпляру программы не происходит выполнение процедуры FormActivate.
Вопрос: где и что надо написать, что бы выполнялось задуманное?
← →
Reindeer Moss Eater © (2004-03-16 15:56) [14]Иди в фак
← →
venoel (2004-03-16 15:59) [15]>[12]
Ок. Объясни, где я не прав и что я упустил?
Application.Initialize;
if ParamStr(1)="/setup" then begin
Application.CreateForm(TForm2, Form2);
Application.Run;
end
else begin
Handle1:=FindWindow("TForm1",nil);
if Handle1=0 then begin
Application.CreateForm(TForm1, Form1);
Application.Run;
end
else begin
// III ветка ифа
SetForegroundWindow(Handle1); // Активизируем
ShowWindow(Handle1,SW_RESTORE);
end;
end;
Как сделать, что бы при попадании в третью ветку ифа происходило не только появление формы "на свет божий", но и вызов прцедуры Form1.FormActivate?
← →
venoel (2004-03-16 16:02) [16]Уже разобрался. Все работает. Спасибо за подсказку.
>[14]
Не посылай, да не посылаем будешь.
Страницы: 1 вся ветка
Текущий архив: 2004.04.04;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.044 c