Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
14-1078655373
Sniper-Max
2004-03-07 13:29
2004.04.04
Мышь - как руль с пидалями...


7-1075127727
zamkom
2004-01-26 17:35
2004.04.04
Работа с СОМ портом


14-1078687616
Proz
2004-03-07 22:26
2004.04.04
Тупая ошибка


11-1059449741
Юля
2003-07-29 07:35
2004.04.04
TaskBar


14-1078751910
Undert
2004-03-08 16:18
2004.04.04
Весна ...