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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2009, 20:46   #1
Nester
Форумчанин
 
Аватар для Nester
 
Регистрация: 22.10.2008
Сообщений: 129
Радость StayOnTop

У меня две формы Form1 и Form2
у обоих FormsStyle=fsStayOnTop
если установить фокус на Form1 (active=true)
то обе формы выводятся поверх всех
но если установить фокус на Form2 то поверх всех остаётся только Form1
как это исправить?
мне необходимо чтобы обе формы всегда были поверх всех
Никто не знает больше чем не знаю я
Nester вне форума Ответить с цитированием
Старый 17.09.2009, 21:01   #2
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Попробуй закинуть это в он крейт каждой формы:
with form1 do
SetWindowPos(Handle, HWND_TOPMOST, Left, Top, Width, Height, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
Для форм 2 соответственно form2
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 17.09.2009, 21:14   #3
Nester
Форумчанин
 
Аватар для Nester
 
Регистрация: 22.10.2008
Сообщений: 129
По умолчанию

не спасает эффект тот же
получается эффект родительской и дочерней формы
пока родительская Form1 active то оба окна StayOnTop
если Form1 не активна то родительское Form2 уже не StayOnTop

PS (выражение родительская и дочерняя формы приведено условно)

данная проблема решена в плеере AIMP там есть окно плеера и окно плейлиста и оба StayOnTop перекрывают все окна
я так понял нужно в Z-последовательности установить в самый верх Form1 и Form2 (последовательно) и ниже по списку все остальные формы
но как это сделать?
Никто не знает больше чем не знаю я

Последний раз редактировалось Stilet; 18.09.2009 в 08:30.
Nester вне форума Ответить с цитированием
Старый 18.09.2009, 08:13   #4
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

В Application.OnDeactivate переносите фокус на главную форму.
В Application.OnActivate восстанавливайте нужный фокус.
( У меня сработало )
s.Creator вне форума Ответить с цитированием
Старый 18.09.2009, 08:21   #5
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Очень даже всё работает:
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
 SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
end;
для второй формы тоже самое
SERG1980 вне форума Ответить с цитированием
Старый 18.09.2009, 13:22   #6
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Цитата:
Сообщение от SERG1980 Посмотреть сообщение
Очень даже всё работает:
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
 SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
end;
для второй формы тоже самое
Проверил Результат:
Выделил Form2
перешел к другой программе - обе формы сверху
перешел к третьей программе - Form2 скрылась за ней
перешел к тестовой программе (кнопкой в низу) обе формы всплыли, выделенной стала Form1
не трогая формы переключисля на другую программу - Form2 скрылась.

Если же перед всеми действиями выделена Form1 - то все попрежнему нормально.

Кстати посмотрел в Forms.pas
в методе
Код:
TCustomForm.CreateWnd;
//...........
    case FormStyle of
//...........
      fsStayOnTop:
        SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or
          SWP_NOSIZE or SWP_NOACTIVATE);

Последний раз редактировалось s.Creator; 18.09.2009 в 13:28.
s.Creator вне форума Ответить с цитированием
Старый 18.09.2009, 20:04   #7
Nester
Форумчанин
 
Аватар для Nester
 
Регистрация: 22.10.2008
Сообщений: 129
По умолчанию

Вобщем что выяснилось если я кликаю на окно не моего проекта и при этом было активно первое окно моего проекта (Form1) то все окна моего проекта остаются StayOnTop (если у форм это св-во установлено)

если же было активно любое другое окно моего проекта (не Form1) и я кликнул на окно не моего проекта то остаётся StayOnTop только окно Form1 все остальные окна моего проекта уже не StayOnTop


выход нашёл пока только один он кривой но работает

в таймере
if not form2.active then setforegroundwindow(form1.Handle)

если я кликаю по чужому окну и при этом активна Form2 то устанавливаем фокус на form1

пробовал установить этот же код на событие Form2.FormDeactivate
но оно не срабатывает если я кликаю по чужому окну

как выполнить этот код при потере фокуса Form2?

сделал так:
Код:
Procedure TForm1.AppDeactivate(Sender: TObject);
  Begin
   //При потере фокуса приложенем установить фокус на Form1
   SetForegroundWindow(Form1.Handle)
 End;

 Procedure TForm1.FormCreate(Sender: TObject);
  Begin
   //Определяем метод для обработки события OnDeactivate
   Application.OnDeactivate :=AppDeactivate;
   //StayOnTop для Form1
   SetWindowPos(Form1.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOACTIVATE)
 End;
но при выполнении SetForegroundWindow(Form1.Handle)
появляется это

решил проблему

Код:
Procedure TForm1.AppDeactivate(Sender: TObject);
  Begin
   //При потере фокуса приложенем установить фокус на Form1
   SetForegroundWindow(Form1.Handle)
 End;
теперь все работает правильно
думаю в aimpe так и сделано увидеть потерю фокуса форм не возможно так как все компоненты не имеют визуального фокуса и пользователь этого не замечает

ой старый код вставил вот новый
Код:
Procedure TForm1.AppDeactivate(Sender: TObject);
  Begin
   //При потере фокуса приложенем установить фокус на Form1
   Form1.SetFocus
 End;
Спасибо всем кто толкнул в нужном направлении
Изображения
Тип файла: jpg Безымянный.JPG (2.2 Кб, 196 просмотров)
Вложения
Тип файла: rar StayOnTop.rar (8.3 Кб, 17 просмотров)
Никто не знает больше чем не знаю я

Последний раз редактировалось Stilet; 21.09.2009 в 09:45.
Nester вне форума Ответить с цитированием
Старый 18.09.2009, 22:45   #8
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Цитата:
Сообщение от Nester Посмотреть сообщение
ой старый код вставил вот новый
Код:
Procedure TForm1.AppDeactivate(Sender: TObject);
  Begin
   //При потере фокуса приложенем установить фокус на Form1
   Form1.SetFocus
 End;
Извини, даже не подумал что "установить фокус" Ты воспримешь как SetForegroundWindow.

Вторая фраза ( В Application.OnActivate восстанавливайте нужный фокус )
Мне пока неудалась.
Пробовал:
Код:
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure AppDeactivate(Sender: TObject);
    procedure AppActivate(Sender: TObject);
  private
    { Private declarations }
    OldActiveForm: TForm;
  end;
var
  Form1: TForm1;
implementation
uses Unit3;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
  OldActiveForm := nil; // на всякий случай
  Application.OnDeactivate := AppDeactivate;
  Application.OnActivate := AppActivate;
end;
procedure TForm1.AppDeactivate(Sender: TObject);
begin
  OldActiveForm := Screen.ActiveForm;
  SetFocus();
end;
procedure TForm1.AppActivate(Sender: TObject);
begin
  if OldActiveForm <> nil then
    OldActiveForm.SetFocus;
end;
Оказалось при обратном переходе все равно фокус на основной форме.
s.Creator вне форума Ответить с цитированием
Старый 19.09.2009, 07:53   #9
Nester
Форумчанин
 
Аватар для Nester
 
Регистрация: 22.10.2008
Сообщений: 129
Радость

s.Creator ваш способ работает но возвращать активность приложения нужно не по клику на однно из окон проекта (в этом случае игнорируется восстановление ранее активного окна) восстанавливать нужно по Alt-Tab

Вот пример:
Вложения
Тип файла: rar StayOnTop.rar (8.9 Кб, 10 просмотров)
Никто не знает больше чем не знаю я
Nester вне форума Ответить с цитированием
Старый 19.09.2009, 08:05   #10
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Цитата:
Сообщение от Nester Посмотреть сообщение
s.Creator ваш способ работает но возвращать активность приложения нужно не по клику на однно из окон проекта (в этом случае игнорируется восстановление ранее активного окна) восстанавливать нужно по Alt-Tab
Вот пример:
Ваш пример от моего не отличается. Только не пойму зачем Вы пишете
Код:
Procedure TForm2.FormCreate(Sender: TObject);
  Begin
   //StayOnTop для Form2
   SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOACTIVATE)
 End;
Как я уже писал, если у формы выставлено FormStyle = fsStayOnTop
то Delphi выполняет этот код в Forms.pas.
И в обоих примерах восстановление фокуса работает при использовании Alt-Tab, а вот если кнопочками на панеле задач, то не всегда.
s.Creator вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
StayOnTop RIO Общие вопросы Delphi 6 17.01.2008 15:19