Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.08.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.004 c
15-1243701028
Медвежонок Пятачок
2009-05-30 20:30
2009.08.02
раздача торрента через аппаратного клиента


15-1243963640
Сергей М.
2009-06-02 21:27
2009.08.02
Google Chrome и сертификаты подлинности


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


15-1243606985
Пит
2009-05-29 18:23
2009.08.02
Сертификация ПО


3-1225096677
dolmat
2008-10-27 11:37
2009.08.02
Количество месяцев





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский