Форум: "Прочее";
Текущий архив: 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