Текущий архив: 2006.07.16;
Скачать: CL | DM;
ВнизОбработать потерю фокуса Найти похожие ветки
← →
Андрей Молчанов (2006-05-22 21:56) [0]Необходимо обработать потерю фокуса у элемента непосредственно до потери. OnExit не помогает - событие вызывается уже после потери фокуса. Пожалуйста, помогите. Заранее спасибо.
← →
TUser © (2006-05-22 22:04) [1]Для окон верхнего уровня можно ловить WM_ACTIVATE.
← →
Андрей Молчанов (2006-05-22 22:10) [2]Комбобокс находится на TGroupBox, находящемся на форме. WM_ACTIVATE не ловится. :(
← →
Leonid Troyanovsky © (2006-05-22 22:15) [3]
> Андрей Молчанов (22.05.06 21:56)
> Необходимо обработать потерю фокуса у элемента непосредственно
> до потери.
WM_KILLFOCUS
--
Regards, LVT.
← →
Андрей Молчанов (2006-05-22 22:22) [4]WM_KILLFOCUS для TComboBox вызывается почему то только при установке фокуса (?!), при потере не вызывается :(
← →
Андрей Молчанов (2006-05-22 22:33) [5]Пожалуйста, посмотрите пример на http://www.doublesafety.com/files/focus.zip (2 килобайта). Там я ловлю WM_KILLFOCUS и ничего не приходит :(
← →
Leonid Troyanovsky © (2006-05-23 06:51) [6]
> Андрей Молчанов (22.05.06 22:22) [4]
> WM_KILLFOCUS для TComboBox вызывается почему то только при
> установке фокуса
У COMBOBOX, вообще-то, два окна.
Сабклассируй нужное. RTFM: msdn.
--
Regards, LVT.
← →
@Lex © (2006-05-23 11:57) [7]Попробуй EN_KILLFOCUS
← →
Андрей Молчанов (2006-05-24 23:46) [8]Извините, что так поздно отвечаю, только добрался до компьютера.
> У COMBOBOX, вообще-то, два окна.
> Сабклассируй нужное. RTFM: msdn.
А-а, вот оно в чем дело... Спасибо, буду читать MSDN.
Можно вопрос? Как я понял, одно окно - это поле ввода, а другое - выпадающий список? Пожалуйста, подскажите, как отлавливать потерю фокуса у поля ввода. Спасибо.
← →
Leonid Troyanovsky © (2006-05-25 20:07) [9]
> Андрей Молчанов (24.05.06 23:46) [8]
> другое - выпадающий список? Пожалуйста, подскажите, как
> отлавливать потерю фокуса у поля ввода. Спасибо.
Примерно так:
type
TMyComboBox = class(TComboBox)
protected
np: Pointer;
op: Pointer;
procedure NWndProc(var msg: TMessage);
public
procedure CreateWnd; override;
constructor Create(AOwner: TComponent);override;
destructor Destroy; override;
end;
procedure TMyComboBox.nwndproc;
begin
if msg.Msg = WM_KILLFOCUS then
Windows.Beep(1000,100);
with msg do
Result := CallWindowProc(op, EditHandle, msg, wparam, lparam);
end;
procedure TMyCombobox.CreateWnd;
begin
inherited;
op := Pointer(SetWindowLong(EditHandle, GWL_WNDPROC, LParam(np)));
end;
constructor TMyCombobox.Create;
begin
inherited;
np := MakeObjectInstance(NWndProc);
end;
destructor TMyCombobox.Destroy;
begin
FreeObjectInstance(np);
inherited;
end;
--
Regards, LVT.
← →
Андрей Молчанов (2006-05-25 20:59) [10]Не хотелось писать наследника, сделал вот так:
var
NP, OP: Pointer;
EditHandle: THandle;
...
procedure TfrmTimestampsSettings.FormCreate(Sender: TObject);
begin
EditHandle := FindWindowEx(cbTimestampFormat.Handle, 0, nil, nil);
NP := MakeObjectInstance(NewWndProc);
OP := Pointer(SetWindowLong(EditHandle, GWL_WNDPROC, LParam(NP)));
end;
procedure TfrmTimestampsSettings.FormDestroy(Sender: TObject);
begin
FreeObjectInstance(NP);
{ Вот эту строку я добавил сам - иначе при закрытии формы,
возникало AV, я думаю, что это из-за того, что я обнуляю NP
при уничтожении формы, а не комбо-бокса }
SetWindowLong(EditHandle, GWL_WNDPROC, LParam(OP));
end;
procedure TfrmTimestampsSettings.NewWndProc(var Msg: TMessage);
begin
if Msg.Msg = WM_KILLFOCUS then begin
Beep(1000,100);
end;
Msg.Result := CallWindowProc(OP, EditHandle, Msg.Msg, Msg.WParam, Msg.LParam);
end;
Большое спасибо!
← →
Leonid Troyanovsky © (2006-05-25 22:01) [11]
> Андрей Молчанов (25.05.06 20:59) [10]
> Не хотелось писать наследника, сделал вот так:
Если без наследика, то лучше CBN_KILLFOCUS, IMHO.
Бо, оно уведомляет парента CB о потере им фокуса.
Кроме того, могу от всей души посоветовать не
пользовать var, как глобальные по сути, а,
на худой конец, поля формы.
--
Regards, LVT.
← →
Андрей Молчанов (2006-05-25 23:23) [12]
> Если без наследика, то лучше CBN_KILLFOCUS, IMHO.
> Бо, оно уведомляет парента CB о потере им фокуса.
То есть, если CBN_KILLFOCUS получено окном редактирования, то родитель ComboBox-а (в моем случае, панель, на которой он лежит) тоже получит сообщение о потере фокуса, а с WM_KILLFOCUS - не обязательно?
> Кроме того, могу от всей души посоветовать не
> пользовать var, как глобальные по сути, а,
> на худой конец, поля формы.
То есть, переменные в секциях private и public формы лучше использовать, чем в общей секции var? А почему?
← →
Жуков Олег (2006-05-26 01:31) [13]
type
TForm1 = class(TForm)
...
public
{ Public declarations }
function SetFocusedControl(Control: TWinControl): Boolean; override;
end;
implementation
function TForm1.SetFocusedControl(Control: TWinControl): Boolean;
begin
if (ActiveControl = ComboBox1) and (Control <> ComboBox1) then
begin
Result := False;
ShowMessage("ComboBox1 не может потерять фокус")
end
else
Result := inherited SetFocusedControl(Control);
end;
← →
Leonid Troyanovsky © (2006-05-28 23:07) [14]
> Андрей Молчанов (25.05.06 23:23) [12]
> То есть, если CBN_KILLFOCUS получено окном редактирования,
> то родитель ComboBox-а (в моем случае, панель, на которой
> он лежит) тоже получит сообщение о потере фокуса, а с WM_KILLFOCUS
> - не обязательно?
WM_KILLFOCUS получает сам контрол, как ты мог убедиться.
А CBN_KILLFOCUS - его парент.
> То есть, переменные в секциях private и public формы лучше
> использовать, чем в общей секции var? А почему?
Потому, что глобальные переменные - зло.
--
Regards, LVT.
← →
Андрей Молчанов (2006-06-01 18:20) [15]Все, понял. Спасибо!
Страницы: 1 вся ветка
Текущий архив: 2006.07.16;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.007 c