Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2014, 14:47   #1
Сергей Горбач
 
Регистрация: 06.01.2012
Сообщений: 8
По умолчанию Передача фокуса нужному окну

В программе использую механизм запрета запуска второй копии программы. При запуске второй копии передаю фокус ранее запущеной копии, а последнюю копию просто закрываю. Если окно работающей копии свернуто, то разворачиваю на экран. Все вроде работает. Проблема возникает, если в момент запуска второй копии работающая копия имеет открытое дочернее окно (например окно с сообщением об ошибке). Главное окно приложения виснет, не реагируя на клавиатуру и мышь. Понимаю, что перед передачей фокуса нужно сначала проверить наличие открытого дочернего окна и только после этого передать фокус и не главному окну, а дочернему (с сообщением об ошибке). Помогите разрулить ситуацию. Заранее благодарен
Сергей Горбач вне форума Ответить с цитированием
Старый 30.03.2014, 16:15   #2
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Сообщение от Сергей Горбач Посмотреть сообщение
В программе использую механизм запрета запуска второй копии программы. При запуске второй копии передаю фокус ранее запущеной копии, а последнюю копию просто закрываю. Если окно работающей копии свернуто, то разворачиваю на экран. Все вроде работает. Проблема возникает, если в момент запуска второй копии работающая копия имеет открытое дочернее окно (например окно с сообщением об ошибке). Главное окно приложения виснет, не реагируя на клавиатуру и мышь. Понимаю, что перед передачей фокуса нужно сначала проверить наличие открытого дочернего окна и только после этого передать фокус и не главному окну, а дочернему (с сообщением об ошибке). Помогите разрулить ситуацию. Заранее благодарен
1. Надо установить CnWizards_1.0.1.655.exe это для табуляция на всех визуальные компонентов и для подсветка кода ... табуляция это TabOrder у делфи есть такой свойства ! На каком компоненте стоит 0 ! При открытое форму там стоит курсор !

2. Вам надо не "Передача" А переход на другом визуальные компонентов ! Это будет Edit или кнопка Button ! Не забиваем что переход из одного компонента на второго зависеть на TabOrder

3. Для примера на простои форму выложим 3 Edita и 1 Button и переход фокуса делаем при нажатие Enter .
На форму есть такой события OnShortCut
Код:
procedure TForm1.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
 if Msg.CharCode = 13 then
  begin
     if Edit1.Focused then
     begin
        Edit2.SetFocus;
        Handled := True;
     end
     else
     if Edit2.Focused then
      begin
         Edit3.SetFocus;
         Handled := True;
      end
      else
      if Edit3.Focused then
      begin
        Button1.Click;
        Handled := True;
      
      end

  end;

  end;
4. (с сообщением об ошибке) на пример если Edit пустой ! то выводим сообщение что это Edit пустой и возвращаем курсор на пустой пустой Edit-е

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
 
   if Edit1.Text = '' then
    begin
      Beep();
      MessageDlg('Edit1 нельзя оставить пустой, mtError,[mbOK],0);
      if Edit1.CanFocus then Edit1.SetFocus;
      Abort;
    end
     else
    if Edit2.Text = '' then
    begin
      Beep();
      MessageDlg('Edit2 нельзя оставить пустой', mtError,[mbOK],0);
      if Edit2.CanFocus then Edit2.SetFocus;
      Abort;
      end
      else
    if Edit3.Text = '' then
    begin
      Beep();
      MessageDlg('Edit3 нельзя оставить пустой', mtError,[mbOK],0);
      if Edit3.CanFocus then Edit3.SetFocus;
      Abort;
      end
      else
      begin
         ShowMessage('Привет!');
      end;
end;
Я думаю что принцип работы понятно и переделать код на ваши программу не будет трудно
Вложения
Тип файла: rar Focus.rar (171.9 Кб, 9 просмотров)
xxbesoxx вне форума Ответить с цитированием
Старый 30.03.2014, 16:49   #3
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

Сергей Горбач Не понимаю, зачем передавать фокус? Не проще запущенной копии проверить наличие запущенной программы, и в случае присутствия таковой закрываться? Без всяких фокусов.
XE5 вне форума Ответить с цитированием
Старый 30.03.2014, 17:02   #4
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию

XE5, он так и делает, а фокус передает на 1-й экземпляр для того что бы пользователь видел, что программа запущена. (Актуально если открыто больше 2 окон с чем бы то ни было)
Сергей Горбач, как реализован механизм проверки и передачи?
kta87 вне форума Ответить с цитированием
Старый 30.03.2014, 17:19   #5
HTTqp
Форумчанин
 
Регистрация: 20.12.2013
Сообщений: 164
По умолчанию

Не проще реализовать это так?
Код:
var
CheckEvent:TEvent;
begin
CheckEvent:=TEvent.Create(nil,false,true,'PROGRAM_CHECKEXIST');
If CheckEvent.WaitFor(10)<>wrSignaled then halt;
end;
HTTqp вне форума Ответить с цитированием
Старый 31.03.2014, 14:18   #6
Сергей Горбач
 
Регистрация: 06.01.2012
Сообщений: 8
По умолчанию

KTA87 меня правильно понял.

Сейчас реализовано так:

Код:
Program VDB_Lab;
  ...

var
  Handle1, Handle2 :LongInt;

begin
  Handle1 :=FindWindow('TFormMAINvdb', nil); {ИЩУ ОКНО С НУЖНЫМ ИМЕНЕМ}
  if Handle1 =0 then {ЕСЛИ ТАКОЕ ОКНО НЕ НАЙДЕНО, ЗНАЧИТ НЕТ РАНЕЕ ЗАПУЩЕНОЙ КОПИИ}
  begin
    Application.Initialize;
    Application.CreateForm(TFormMAINvdb, FormMAINvdb);
    Application.Run
  end
  else {ОКНО НАЙДЕНО}
  begin
    Handle2 :=GetWindow(Handle1, GW_OWNER);
    ShowWindow(Handle2, SW_RESTORE); {ВЫВОЖУ КНОПКУ НА ПАНЕЛЬ ЗАДАЧ}
    ShowWindow(Handle1, SW_RESTORE); {ВОССТАНАВЛИВАЮ ОКНО НА РАБОЧЕМ СТОЛЕ}
    SetForegroundWindow(Handle1) {ПЕРЕДАЮ ФОКУС ОКНУ РАБОТАЮЩЕЙ КОПИИ}
  end;
end.

Последний раз редактировалось Сергей Горбач; 31.03.2014 в 14:31.
Сергей Горбач вне форума Ответить с цитированием
Старый 31.03.2014, 15:31   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А так
Код:
  h:=FindWindow('TForm1','Заголовок окна');
  if h<>0 then begin
    h:=GetWindow(h,GW_OWNER);
    OpenIcon(h);
    ShowWindow(h,SW_RESTORE);
    BringWindowToTop(h);
    SetForegroundWindow(h);
    Exit;
  end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.04.2014, 16:09   #8
HTTqp
Форумчанин
 
Регистрация: 20.12.2013
Сообщений: 164
По умолчанию

Аватар, так не получается

Код:
procedure TForm1.FormCreate(Sender: TObject);
var
  h: HWND;
  h := findwindow(nil,'PROGRAM_CHECKEXIST');
  if h <> 0 then
    begin
h:=GetWindow(h,GW_OWNER);
    OpenIcon(h);
    ShowWindow(h,SW_RESTORE);
    BringWindowToTop(h);
    SetForegroundWindow(h);
    end;
end;
HTTqp вне форума Ответить с цитированием
Старый 01.04.2014, 16:27   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну не в OnCreate формы это же делать. Это в dpr до Application.Initialize
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.04.2014, 16:31   #10
HTTqp
Форумчанин
 
Регистрация: 20.12.2013
Сообщений: 164
По умолчанию

ок, делаю так

Код:
program Project1;

uses
  windows,Vcl.Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}
var
  h: HWND;

begin
  h := findwindow(nil,'PROGRAM_CHECKEXIST');
  if h <> 0 then
    begin
h:=GetWindow(h,GW_OWNER);
    OpenIcon(h);
    ShowWindow(h,SW_RESTORE);
    BringWindowToTop(h);
    SetForegroundWindow(h);
    exit;
    end;

  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
но все равно запускается копия
программа
HTTqp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача фокуса родительскому окну rootv JavaScript, Ajax 0 13.10.2011 04:05
передача параметров окну DinamoBrynsk Помощь студентам 5 28.01.2011 14:08
Передача информации спрятанному окну. Andreyy Общие вопросы Delphi 4 03.08.2010 15:42
Передача символа другому окну dimonbest Общие вопросы Delphi 15 28.05.2009 16:30
Передача фокуса по нажатию кнопки Ch00kan0ff Общие вопросы C/C++ 2 27.03.2009 20:53