Странное поведение главного окна
Модератор: Модераторы
Странное поведение главного окна
При закрытии дочерних окон главное окно деактивируется и уходит на задний план. Если имеются открытые окна других программ, оно прячется за ними, что создает огромные неудобства.
Что это такое и как с этим бороться?
Компиляция win64, ОС Семёрка.
Что это такое и как с этим бороться?
Компиляция win64, ОС Семёрка.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Re: Странное поведение главного окна
Так подыми его MainForm.Focused:=true;
А вообще, надо посмотреть внимательно настройки окна.
А вообще, надо посмотреть внимательно настройки окна.
Re: Странное поведение главного окна
Вроде бы нет таких настроек, которые могли заставить так вести себя главное окно. Я думаю это глюк LCL. И лучше бы обойтись без ручного подъема окна.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Re: Странное поведение главного окна
У меня такое и на делфи случалось. Причем абсолютно одинаковые компиляции и версии винды, но на разных машинах - на большинстве нормально но на одной из десятков вылазит подобный глюк. В конце концов плюнул на попытки разобраться в причине и вставил именно ручное выставление окна в топ.
Re: Странное поведение главного окна
Ну ладно я подумаю (у меня около 20 окон).
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Re: Странное поведение главного окна
Чаще всего этот глюк провоцировал вызов модальных окон из другого модального окна.
Re: Странное поведение главного окна
Osmiy попробуйте связку anchordocking + sparta. Или без sparta. Всё это лежит в components лазаря.
п.с.
врядли. Возможно это глюк взаимодействия с пользователем.Я думаю это глюк LCL.
п.с.
версия лазаря и фпс какая?Компиляция win64, ОС Семёрка.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Re: Странное поведение главного окна
Снег Север писал(а):В конце концов плюнул на попытки разобраться в причине и вставил именно ручное выставление окна в топ.
Причина, скорее всего простая -- система не понимает, что фокус должен перейти к главному окну программы. А то, что на каких-то системах срабатывает, а на каких-то нет скорее всего зависит от конкретных сборок Explorer-а.
pupsik, бриться мультитулом, конечно, тоже удобно, но бритвой сподручнее. Зачем использовать сложные методы, когда достаточно простых?
Re: Странное поведение главного окна
Лекс Айрин учитывая неизвестность вида бритвы (может он топориком решил бриться) дальнейшее обсуждение - сродни шаманству и предпочтениям.
п.с.
Кстати:
п.с.
Кстати:
как бы хм... попытка брить "под корень"?Так подыми его MainForm.Focused:=true;
Re: Странное поведение главного окна
pupsik писал(а):версия лазаря и фпс какая?
1.6.4 и 3.0.2.
Но у меня этот глюк еще на две версии Лазаря ранее появился.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Re: Странное поведение главного окна
pupsik писал(а):как бы хм... попытка брить "под корень"?
А тебе хочется сверкать щетиной? Брить надо стараться до синевы. Тем более, что все эти сверхсложные способы, если дойти до конца, будут делать абсолютно то же самое. Т. е. либо выставлять focused, либо использовать SetFocus, что, по сути, одно и тоже.
Re: Странное поведение главного окна
установить пакеты - это сверхсложные способы? А вот залезть в сорцы лазаря и оттдебажить баг - весьма просто и по времени займёт пяток минут (в принципе может повезти)?Тем более, что все эти сверхсложные способы
- Снег Север
- долгожитель
- Сообщения: 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 секунд:
Если уж хочется подправить, то придется переопределить процедуру закрытия окна назначая тот же самый фокус окну из которого было открыто закрываемое окно... т. е. возвращаемся к тому, что я и говорил(((
Re: Странное поведение главного окна
Лекс Айрин сколько времени вы убили на поиски и написание? Сколько времени займёт установка однооконного режима?
п.с.
Хотя, судя по времени сообщений, более 2-х часов убили на прояснение. Вам его не жалко? Учитывая что вы возможно нашли причину. По опыту: не всё то гладко что наверху. Но, в принципе: ваше дело.
п.с.
Хотя, судя по времени сообщений, более 2-х часов убили на прояснение. Вам его не жалко? Учитывая что вы возможно нашли причину. По опыту: не всё то гладко что наверху. Но, в принципе: ваше дело.
