Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.028 c
2-1151404087
iamdanil
2006-06-27 14:28
2006.07.16
Need help: помогите среди всех окон найти окно


2-1151683104
resuS
2006-06-30 19:58
2006.07.16
консоль и TStrings;


6-1141933155
хочу все знать
2006-03-09 22:39
2006.07.16
IIS FTP и русская буква Я


1-1149523008
Valerio
2006-06-05 19:56
2006.07.16
Как правильно описать свойство класса?


2-1151412468
Neket
2006-06-27 16:47
2006.07.16
И вновь DBGrid