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

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

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

Osmiy
новенький
Сообщения: 46
Зарегистрирован: 07.05.2016 20:18:39

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

Сообщение Osmiy »

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

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

Сообщение Лекс Айрин »

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

А вообще, надо посмотреть внимательно настройки окна.
Osmiy
новенький
Сообщения: 46
Зарегистрирован: 07.05.2016 20:18:39

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

Сообщение Osmiy »

Вроде бы нет таких настроек, которые могли заставить так вести себя главное окно. Я думаю это глюк LCL. И лучше бы обойтись без ручного подъема окна.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

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

Сообщение Снег Север »

У меня такое и на делфи случалось. Причем абсолютно одинаковые компиляции и версии винды, но на разных машинах - на большинстве нормально но на одной из десятков вылазит подобный глюк. В конце концов плюнул на попытки разобраться в причине и вставил именно ручное выставление окна в топ.
Osmiy
новенький
Сообщения: 46
Зарегистрирован: 07.05.2016 20:18:39

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

Сообщение Osmiy »

Ну ладно я подумаю (у меня около 20 окон).
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

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

Сообщение Снег Север »

Чаще всего этот глюк провоцировал вызов модальных окон из другого модального окна.
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

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

Сообщение pupsik »

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

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

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

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

Сообщение Лекс Айрин »

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


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

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

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

Сообщение pupsik »

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

п.с.
Кстати:
Так подыми его MainForm.Focused:=true;
как бы хм... попытка брить "под корень"? :)
Osmiy
новенький
Сообщения: 46
Зарегистрирован: 07.05.2016 20:18:39

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

Сообщение Osmiy »

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

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

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

Сообщение Лекс Айрин »

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


А тебе хочется сверкать щетиной? Брить надо стараться до синевы. Тем более, что все эти сверхсложные способы, если дойти до конца, будут делать абсолютно то же самое. Т. е. либо выставлять focused, либо использовать SetFocus, что, по сути, одно и тоже.
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

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

Сообщение pupsik »

Тем более, что все эти сверхсложные способы
установить пакеты - это сверхсложные способы? А вот залезть в сорцы лазаря и оттдебажить баг - весьма просто и по времени займёт пяток минут (в принципе может повезти)?
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

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

Сообщение Снег Север »

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

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

Сообщение Лекс Айрин »

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 секунд:
Если уж хочется подправить, то придется переопределить процедуру закрытия окна назначая тот же самый фокус окну из которого было открыто закрываемое окно... т. е. возвращаемся к тому, что я и говорил(((
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

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

Сообщение pupsik »

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


п.с.
Хотя, судя по времени сообщений, более 2-х часов убили на прояснение. Вам его не жалко? Учитывая что вы возможно нашли причину. По опыту: не всё то гладко что наверху. Но, в принципе: ваше дело.
Ответить