![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TCustomControl?
NaRuTo © (2009-06-16 17:32:00)Здраствуйте, Мастера! Помогите пожалуйста разобраться. У меня на форме есть два компонента - один дочерний класс родителя TCustomControl, второй просто TEdit. Как заставить дочерний класс родителя TCustomControl быть постоянно в фокусе? Т.е TEdit должен быть не активен до тех пор пока я на него не нажму. Заранее спасиб.
Naruto (2009-06-16 19:32:00) [1]Странно как-то получилось onKeyDown не хотел обрабатывать VK_UP и VK_DOWN попробовал через API WM_KEYDOWN всё получилось. Всем большое спасибо особенно DVM ;)
Leonid Troyanovsky (2009-06-16 19:22:00) [2]
> DVM © (16.06.09 18:50) [9]
> Так TCustomControl и есть наследник TWinControl
Может и спутал, бо давненько не брал в руки шашек.
А может для него фокус, по-умолчанию, и не передается.
Нет охоты ради этого дельфи ставить,
да и не найти оный во время ремонта :)
--
Regards, LVT.
DVM (2009-06-16 19:08:00) [3]Вот все нормально, фокус потомку TCustomControl передается:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TMyControl = class(TCustomControl)
private
procedure WMSetFocus(var Message: TMessage); message WM_SETFOCUS;
procedure WMKillFocus(var Message: TMessage); message WM_KILLFOCUS;
protected
procedure Paint; override;
end;
TForm1 = class(TForm)
edt1: TEdit;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
MyControl: TMyControl;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//------------------------------------------------------------------------------
procedure TMyControl.WMSetFocus(var Message: TMessage);
begin
Repaint;
inherited;
end;
//------------------------------------------------------------------------------
procedure TMyControl.WMKillFocus(var Message: TMessage);
begin
Repaint;
inherited;
end;
//------------------------------------------------------------------------------
procedure TMyControl.Paint;
begin
if Self.Focused then
Canvas.Brush.Color := clRed
else
Canvas.Brush.Color := clYellow;
Canvas.FillRect(ClientRect);
end;
//------------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
MyControl := TMyControl.Create(self);
MyControl.Parent := Self;
MyControl.Width := 100;
MyControl.Height := 100;
MyControl.TabStop := True;
end;
end.
DVM (2009-06-16 18:54:00) [4]
> Naruto © (16.06.09 18:49) [7]
TabStop := true; для него сделал?
Ну и + [4] такого (там у меня со стрелками)
procedure TMyControl.WMGetDlgCode(var Message: TMessage);
begin
Message.Result := DLGC_WANTMESSAGE or DLGC_WANTARROWS;
end;
Leonid Troyanovsky (2009-06-16 18:50:00) [5]
> Naruto © (16.06.09 17:33) [1]
> Да забыл сказать мне нужно, чтобы класс TCustomControl смог
> обрабатывать события onKeyDown, onKeyPress.
Установи у формы KeyPreview = true и выбирай контрол, который
должен на них реагировать.
--
Regards, LVT.
DVM (2009-06-16 18:50:00) [6]
> Leonid Troyanovsky ©
> > дочерний класс родителя TCustomControl быть постоянно
> в
> > фокусе?
>
> Фокус бывает у наследников TWinControl.
>
Так TCustomControl и есть наследник TWinControl
> TCustomControl не обязан знать про WM_.
Еще как обязан.
C TGraphicControl случаем не спутали?
Naruto (2009-06-16 18:49:00) [7]Нет не получает. Как только форма стоновится активна фокус переходит к TEdit.
oldman (2009-06-16 18:43:00) [8]
> Т.е TEdit должен быть не активен до тех пор пока я на него
> не нажму.
А он без твоего участия получает фокус??????????????????
Leonid Troyanovsky (2009-06-16 18:32:00) [9]
> Юрий Зотов © (16.06.09 18:20) [4]
> > нужно, чтобы класс TCustomControl смог обрабатывать события
> Обработайте в наследнике сообщение WM_GETDLGCODE.
TCustomControl не обязан знать про WM_.
На худой конец CM_.
> NaRuTo © (16.06.09 17:32)
> дочерний класс родителя TCustomControl быть постоянно в
> фокусе?
Фокус бывает у наследников TWinControl.
--
Regards, LVT.
Юрий Зотов (2009-06-16 18:20:00) [10]> нужно, чтобы класс TCustomControl смог обрабатывать события
> onKeyDown, onKeyPress.
Обработайте в наследнике сообщение WM_GETDLGCODE.
Детали см. в справке API.
oldman (2009-06-16 18:03:00) [11]Сделай у TEdit Visible=False и поставь SpeedButton "Ввести данные", при нажатии на который откроется твой TЕdit.
SpeedButton фокус не получит никогда.
DVM (2009-06-16 17:35:00) [12]Т.е. фактически тебе надо чтобы фокус не передавался с помощью TAB? Или что другое? Объясни зачем такое нужно.
Naruto (2009-06-16 17:33:00) [13]Да забыл сказать мне нужно, чтобы класс TCustomControl смог обрабатывать события onKeyDown, onKeyPress.