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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.09.2016, 11:24   #1
laslaslas
Новичок
Джуниор
 
Регистрация: 16.09.2016
Сообщений: 4
По умолчанию Управление фокусом

Добрый день, возникла проблема с управлением фокусом. Код программы такой:
Код:
procedure TForm3.FormShow(Sender: TObject);
var
  Form2: TForm;
begin
  Windows.setfocus(handle);
  Caption := 'MainForm';
  Form2:= TForm.Create(self);
  Form2.Caption := 'SubForm';
  form2.show ;
  form2.Close;
end;

Так вот мне надо чтобы после строчки form2.close фокус переключился обратно на MainForm. Причем надо сделать так чтобы это сделал windows. Windows.setfocus Не подойдет т.к не желательно чтобы данная программа мешала другим программам

Последний раз редактировалось laslaslas; 16.09.2016 в 12:04.
laslaslas вне форума Ответить с цитированием
Старый 16.09.2016, 11:32   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Код:
  form2.show ;
  form2.Close;
может быть и успеет показать(Show), НО тут же ЗАКРОЕТ(close) form2.

Код:
form2.showModal; // ДОЖДЕМСЯ пока пользователь САМ не закроет
form2.close; И без наших усилий (БЕЗ setfocus) "автоматом" вернемся к "нашей" форме
form2.Free; // УБЕРЕМ "мусор" за собой
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 16.09.2016 в 11:38.
evg_m вне форума Ответить с цитированием
Старый 16.09.2016, 11:41   #3
laslaslas
Новичок
Джуниор
 
Регистрация: 16.09.2016
Сообщений: 4
По умолчанию

Да, если показывать через showModal фокус вернется на главную форму. Но тут именно надо чтобы окно не было модальным(в нем будет отображаться прогресс программы)
laslaslas вне форума Ответить с цитированием
Старый 16.09.2016, 13:12   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
TForm3 =class(TForm)
private
  procedure Subformclosed(sender: TObject);
end;

procedure TForm3.Subformclosed(sender: TObject);
begin
  self.Show;// или что будем делать при закрытии form2
end;
Код:
form2:=TForm.Create(self);
form2.OnClose:=subformclosed;//закажем выполнение процедуры(метода) при закрытии
// P.S. можно взять и другое событие(event) DeActivate OnExit .... 
form2.show;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 16.09.2016 в 13:15.
evg_m вне форума Ответить с цитированием
Старый 16.09.2016, 14:18   #5
laslaslas
Новичок
Джуниор
 
Регистрация: 16.09.2016
Сообщений: 4
По умолчанию

Не совсем то что надо. проблема то вот в чем procedure

TForm3.FormShow(Sender: TObject);
var
Form2: TForm;
begin
Windows.setfocus(handle);
Caption := 'MainForm';
Form2:= TForm.Create(self);
Form2.Caption := 'SubForm';
form2.show ;
form2.Close;
Долгий код
end;

после form2.Close фокус сбрасывается в ноль. И во время долгого кода виндовс передает фокус совершенно левому окну, в результате оно всплывает поверх моей программы на время выполнения долгого цикла. Я скорее ищу вариант как открыть form2 так чтобы она по закрытию сама вернула фокус MainForm.
laslaslas вне форума Ответить с цитированием
Старый 16.09.2016, 14:36   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

попросим Form2 проинформировать НАС (главную форму) о своем (form2) закрытии
Цитата:
Код:
form2.OnClose:=subformclosed;//закажем выполнение процедуры(метода) при закрытии
и САМИ (form3) сделаем все что нам заблагорассудится
Цитата:
Код:
procedure TForm3.Subformclosed(sender: TObject);
begin
  self.Show;// или что будем делать при закрытии form2
end;
Цитата:
Код:
form2.Close;
Долгий код
если порядок именно таков, то ведь ВЫ сами захотели закрыть form2 ДО выполнения всей вашей тягомотины.

P.S. И да, если вы хотите
Цитата:
желательно чтобы данная программа мешала другим программам
то выкиньте
Код:
  Windows.setfocus(handle);
или можете это попробовать поставить это вместо этого
Цитата:
Код:
  self.Show;// или что будем делать при закрытии form2
или ВМЕСТЕ с этим.

P.P.S. чем дальше, тем больше напоминает X-Y-Z
поэтому дальнейшее обсуждение подразумевает постановку ИСХОДНОЙ задачи.

телепатия ON
Цитата:
чтобы после строчки form2.close фокус переключился обратно на MainForm.
а может всего-то надо
Код:
Form2.Close;
self.BridgToFront;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 16.09.2016 в 14:54.
evg_m вне форума Ответить с цитированием
Старый 16.09.2016, 15:26   #7
laslaslas
Новичок
Джуниор
 
Регистрация: 16.09.2016
Сообщений: 4
По умолчанию

Evg_m спс что подсказываешь, последний способ вроде бы работает без побочных эфектов. Но вопрос такой: возможно ли открыть form2 так(но не модально) чтобы она сама(без всяких setfocus и BridgToFront) вернула фокус mainForm если активна она и не мешала другим программам(не переводила фокус на mainform) если пользователь захотел на время длинного цикла поработать с другой программой. Чирбы такой алгоритм закладывался во время открытия form2. Вообще не совсем понятно как попадает левое окно(которое всплывает во время длинного цикла) в веpшину стека пеpекpывающихся окон.
laslaslas вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Hendle поля с фокусом ввода maks5 Win Api 3 14.10.2011 09:56
проблема с фокусом Andrey& JavaScript, Ajax 1 09.09.2010 08:30
Странный глюк с фокусом Marsel737 Общие вопросы Delphi 5 12.04.2010 18:43
Управление фокусом JOHNKZ1 Общие вопросы Delphi 9 17.04.2009 17:03