Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.02;
Скачать: CL | DM;

Вниз

Как узнать предыдущий активный контрол?   Найти похожие ветки 

 
oldman ©   (2009-06-03 12:22) [0]

Поставлена задача, решаю.

Как узнать, на каком контроле стоял фокус непосредственно ПЕРЕД нажатия на button, открывающий другую форму модально.
Надо для того, чтобы после закрытия модальной формы передать фокус тому контролу, где он и находился.

Можно, конечно, при получении фокуса любым контролом менять какую-либо переменную(флаг), но очень уж по детски как-то...

Может можно красиво решить?


 
oldman ©   (2009-06-03 12:26) [1]

Вопрос снят. Я тупой.
Использовать не button, a speedbutton, конечно...

Но сам вопрос продолжает вызывать интерес.


 
brother ©   (2009-06-03 12:28) [2]

по логике - нет, тк:
1.
как только кликнули на баттон, то фокус отдается ему, значит надо ловить до этого.
кто знает где фокус сейчас? контрол!
контрол должен создать состояние (переменная), что именно на нем фокус, дабы не потерять при клике на баттон.
2. таймер ловит активный контрол, и запоминает его, как только фокус на баттоне... ;)
пока идей более нет(


 
Юрий Зотов ©   (2009-06-03 12:30) [3]

Запоминать ActiveControl?


 
oldman ©   (2009-06-03 12:43) [4]


> brother ©   (03.06.09 12:28) [2]
> Юрий Зотов ©   (03.06.09 12:30) [3]


Я и написал, что по-детски как-то...
Но, видимо, иного пути нет.


 
sniknik ©   (2009-06-03 12:48) [5]

> пока идей более нет(
событие смены контрола у screen.

> Но, видимо, иного пути нет.
если посмотреть в процедуру SetActiveControl то видно, что истории "фокусов" даже в 1 элемент нет...


 
boa_kaa ©   (2009-06-03 12:49) [6]

WM_SETFOCUS

   WPARAM wParam
   LPARAM lParam;
   
Parameters

wParam
Handle to the window that has lost the keyboard focus. This parameter can be NULL.

lParam
This parameter is not used.


 
Юрий Зотов ©   (2009-06-03 13:30) [7]

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   Button1: TButton;
 private
   FPrevActiveControl: TWinControl;
 public
   function SetFocusedControl(Control: TWinControl): Boolean; override;
 end;

function TForm1.SetFocusedControl(Control: TWinControl): Boolean;
begin
 FPrevActiveControl := ActiveControl;
 if FPrevActiveControl = nil then
   Caption := "nil"
 else
   Caption := FPrevActiveControl.Name;
 Result := inherited SetFocusedControl(Control)
end;


 
Юрий Зотов ©   (2009-06-03 13:33) [8]

Причем это правильно работает при переключении фокуса мышью, но неверно работает при переключении фокуса по Tab.

В общем, надо поглубже копнуть сырцы TCustomForm, решение должно быть там.


 
sniknik ©   (2009-06-03 13:44) [9]

> но неверно работает при переключении фокуса по Tab.
работает и по таб

TForm1 = class(TForm)
   ...
 private
   FPrevActiveControl, ActControl: TWinControl;
   procedure ActiveControlChange(Sender: TObject);
 end;

procedure TForm1.ActiveControlChange(Sender: TObject);
begin
 FPrevActiveControl:= ActControl;
 ActControl:= Screen.ActiveControl;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Screen.OnActiveControlChange:= ActiveControlChange;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Screen.OnActiveControlChange:= nil;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 FPrevActiveControl.SetFocus;
end;


 
Игорь Шевченко ©   (2009-06-03 14:23) [10]

sniknik ©   (03.06.09 13:44) [9]

Не будет работать.


 
Игорь Шевченко ©   (2009-06-03 14:27) [11]

Не проще ли ?

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
 LastActive: TWinControl;
begin
 LastActive := ActiveControl;
 with TForm2.Create(Self) do
   try
     ShowModal
   finally
     Free;
   end;
 ActiveControl := LastActive;
end;


 
sniknik ©   (2009-06-03 16:13) [12]

> Не будет работать.
а ты проверь.

> Не проще ли ?
вопрос интереса (см. [1])
не для
procedure TForm1.SpeedButton1Click(Sender: TObject);


 
Игорь Шевченко ©   (2009-06-03 16:17) [13]

sniknik ©   (03.06.09 16:13) [12]


> а ты проверь.


А я проверил. Screen.OnActiveControlChange работает для всех форм, в том числе и для вызванной по кнопке. Соответственно, после выхода из вызванной формы каким будет FPrevActiveControl ?


 
sniknik ©   (2009-06-03 16:21) [14]

открывая другую форму, нужно конечно либо сохранять контрол как у тебя в [11] либо отключать OnActiveControlChange, чтобы в новой не перетерли.
ну это как бы естественно, не думал, что нужно расписывать все буквально.



Страницы: 1 вся ветка

Текущий архив: 2009.08.02;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
15-1243584571
Клерк
2009-05-29 12:09
2009.08.02
Дизайн пользовательского интерфейса 2


15-1243888204
Юрий
2009-06-02 00:30
2009.08.02
С днем рождения ! 2 июня 2009 вторник


2-1244237871
Цукор5
2009-06-06 01:37
2009.08.02
TWebBrowser получение элементов формы


2-1244141574
berezne
2009-06-04 22:52
2009.08.02
Как програмно обработать OnClick&


4-1213199504
Dmitry S
2008-06-11 19:51
2009.08.02
Рисование в окне из другого потока