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

Вниз

Обработать потерю фокуса   Найти похожие ветки 

 
Андрей Молчанов   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.009 c
15-1150263922
Ega23
2006-06-14 09:45
2006.07.16
С Днём рождения! 14 июня


2-1151336611
b.o.n.d.007
2006-06-26 19:43
2006.07.16
Не понимаю циклы. Помогите.


1-1149593869
tasha
2006-06-06 15:37
2006.07.16
WebBrowser


4-1144067736
Untermensch
2006-04-03 16:35
2006.07.16
Как получить MAC-адреса сетевых плат или другой способ


3-1147500946
Leshiy
2006-05-13 10:15
2006.07.16
Значение параметра xml документа





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский