Странное поведение главного окна

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Странное поведение главного окна

Сообщение Osmiy » 29.07.2017 10:19:25

При закрытии дочерних окон главное окно деактивируется и уходит на задний план. Если имеются открытые окна других программ, оно прячется за ними, что создает огромные неудобства.
Что это такое и как с этим бороться?
Компиляция win64, ОС Семёрка.
Osmiy
новенький
 
Сообщения: 36
Зарегистрирован: 07.05.2016 21:18:39

Re: Странное поведение главного окна

Сообщение Лекс Айрин » 29.07.2017 10:40:42

Так подыми его MainForm.Focused:=true;

А вообще, надо посмотреть внимательно настройки окна.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Странное поведение главного окна

Сообщение Osmiy » 29.07.2017 10:49:59

Вроде бы нет таких настроек, которые могли заставить так вести себя главное окно. Я думаю это глюк LCL. И лучше бы обойтись без ручного подъема окна.
Osmiy
новенький
 
Сообщения: 36
Зарегистрирован: 07.05.2016 21:18:39

Re: Странное поведение главного окна

Сообщение Снег Север » 29.07.2017 10:57:46

У меня такое и на делфи случалось. Причем абсолютно одинаковые компиляции и версии винды, но на разных машинах - на большинстве нормально но на одной из десятков вылазит подобный глюк. В конце концов плюнул на попытки разобраться в причине и вставил именно ручное выставление окна в топ.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2990
Зарегистрирован: 27.11.2007 16:14:47

Re: Странное поведение главного окна

Сообщение Osmiy » 29.07.2017 11:04:26

Ну ладно я подумаю (у меня около 20 окон).
Osmiy
новенький
 
Сообщения: 36
Зарегистрирован: 07.05.2016 21:18:39

Re: Странное поведение главного окна

Сообщение Снег Север » 29.07.2017 11:51:28

Чаще всего этот глюк провоцировал вызов модальных окон из другого модального окна.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2990
Зарегистрирован: 27.11.2007 16:14:47

Re: Странное поведение главного окна

Сообщение pupsik » 29.07.2017 14:03:31

Osmiy попробуйте связку anchordocking + sparta. Или без sparta. Всё это лежит в components лазаря.

Я думаю это глюк LCL.
врядли. Возможно это глюк взаимодействия с пользователем.

п.с.
Компиляция win64, ОС Семёрка.
версия лазаря и фпс какая?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Странное поведение главного окна

Сообщение Лекс Айрин » 29.07.2017 14:29:45

Снег Север писал(а):В конце концов плюнул на попытки разобраться в причине и вставил именно ручное выставление окна в топ.


Причина, скорее всего простая -- система не понимает, что фокус должен перейти к главному окну программы. А то, что на каких-то системах срабатывает, а на каких-то нет скорее всего зависит от конкретных сборок Explorer-а.

pupsik, бриться мультитулом, конечно, тоже удобно, но бритвой сподручнее. Зачем использовать сложные методы, когда достаточно простых?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Странное поведение главного окна

Сообщение pupsik » 29.07.2017 15:38:53

Лекс Айрин учитывая неизвестность вида бритвы (может он топориком решил бриться) дальнейшее обсуждение - сродни шаманству и предпочтениям.

п.с.
Кстати:
Так подыми его MainForm.Focused:=true;
как бы хм... попытка брить "под корень"? :)
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Странное поведение главного окна

Сообщение Osmiy » 29.07.2017 16:00:49

pupsik писал(а):версия лазаря и фпс какая?

1.6.4 и 3.0.2.
Но у меня этот глюк еще на две версии Лазаря ранее появился.
Osmiy
новенький
 
Сообщения: 36
Зарегистрирован: 07.05.2016 21:18:39

Re: Странное поведение главного окна

Сообщение Лекс Айрин » 29.07.2017 17:36:56

pupsik писал(а):как бы хм... попытка брить "под корень"?


А тебе хочется сверкать щетиной? Брить надо стараться до синевы. Тем более, что все эти сверхсложные способы, если дойти до конца, будут делать абсолютно то же самое. Т. е. либо выставлять focused, либо использовать SetFocus, что, по сути, одно и тоже.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Странное поведение главного окна

Сообщение pupsik » 29.07.2017 20:42:04

Тем более, что все эти сверхсложные способы
установить пакеты - это сверхсложные способы? А вот залезть в сорцы лазаря и оттдебажить баг - весьма просто и по времени займёт пяток минут (в принципе может повезти)?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Странное поведение главного окна

Сообщение Снег Север » 31.07.2017 07:06:03

Это глюк винды, а не лазаря или делфи. Поэтому никакое лазание по сырцам ничего не даст в принципе. Надо выставлять самому переход фокуса к проблемным окнам и не парить себе мозги.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2990
Зарегистрирован: 27.11.2007 16:14:47

Re: Странное поведение главного окна

Сообщение Лекс Айрин » 31.07.2017 10:25:11

pupsik писал(а):установить пакеты - это сверхсложные способы?


Да, только реализованные другим программистом.

Добавлено спустя 1 час 56 минут 4 секунды:
чисто для инфы поискал реализацию SetFocus
шаг 1.
Код: Выделить всё
procedure TCustomForm.SetFocus;

  procedure RaiseCannotFocus;
  var
    s: String;
  begin
    s:='[TCustomForm.SetFocus] '+Name+':'+ClassName+' '+rsCanNotFocus;
    {$IFDEF VerboseFocus}
    RaiseGDBException(s);
    {$ELSE}
    raise EInvalidOperation.Create(s);
    {$ENDIF}
  end;

begin
  {$IFDEF VerboseFocus}
  DebugLn('TCustomForm.SetFocus ',Name,':',ClassName,' ActiveControl=',DbgSName(ActiveControl));
  {$ENDIF}
  if not FActive then
  begin
    if not (IsControlVisible and Enabled) then
      RaiseCannotFocus;
    SetWindowFocus; //смотрим что это!
  end;
end;   


Код: Выделить всё
procedure TCustomForm.SetWindowFocus;
var
  NewFocusControl: TWinControl;
begin
  if [csLoading,csDestroying]*ComponentState<>[] then exit;
  if Assigned(FActiveControl) and not Assigned(FDesigner) then
    NewFocusControl := ActiveControl
  else
    NewFocusControl := Self;
  {$IFDEF VerboseFocus}
  DebugLn('TCustomForm.SetWindowFocus ',Name,':',Classname ,
    ' NewFocusControl=',NewFocusControl.Name,':',NewFocusControl.ClassName,
    ' HndAlloc=',dbgs(NewFocusControl.HandleAllocated));
  {$ENDIF}
  if not NewFocusControl.HandleAllocated or
     not NewFocusControl.CanFocus then
    exit;
  //DebugLn(['TCustomForm.SetWindowFocus ',DbgSName(Self),' NewFocusControl',DbgSName(NewFocusControl)]);
  LCLIntf.SetFocus(NewFocusControl.Handle); // а теперь это!
  if GetFocus = NewFocusControl.Handle then
    NewFocusControl.Perform(CM_UIACTIVATE, 0, 0); // судя по всему, это сообщение посылается для перерисовки окон
  end;

Код: Выделить всё
function SetFocus(hWnd: HWND): HWND; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF}


Добавлено спустя 12 минут 29 секунд:
ну и, процедура закрытия окна
Код: Выделить всё
procedure TCustomForm.Hide;
begin
  Visible := False;
end;
....
property Visible stored VisibleIsStored default false; 

....
function TCustomForm.VisibleIsStored: boolean;
begin
  Result := Visible;
end;



Код: Выделить всё
procedure TObject.Free;

        begin
           // the call via self avoids a warning
           if self<>nil then
             self.destroy;
        end;   


Как видно из этого, никакой фокус не меняется, т. е. активное окно скрыто. Все дальнейшее действие отдано на откуп системе. Поэтому, если требуется определенная реакция, то фокус надо выставлять самому.

Добавлено спустя 5 минут 18 секунд:
Если уж хочется подправить, то придется переопределить процедуру закрытия окна назначая тот же самый фокус окну из которого было открыто закрываемое окно... т. е. возвращаемся к тому, что я и говорил(((
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Странное поведение главного окна

Сообщение pupsik » 31.07.2017 19:10:20

Лекс Айрин сколько времени вы убили на поиски и написание? Сколько времени займёт установка однооконного режима?


п.с.
Хотя, судя по времени сообщений, более 2-х часов убили на прояснение. Вам его не жалко? Учитывая что вы возможно нашли причину. По опыту: не всё то гладко что наверху. Но, в принципе: ваше дело.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 15

Рейтинг@Mail.ru