![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#16
|
||||
|
||||
|
Цитата:
|
|
#17
|
||||
|
||||
|
Эту я понимаю:
Цитата:
|
|
#18
|
||||
|
||||
|
а я про обработку OnMouseDown из http://www.delphisources.ru/forum/sh...05&postcount=6
![]() |
|
#19
|
||||
|
||||
|
Тогда читаем у указанной ссылки первую строку.
Цитата:
![]() |
|
#20
|
||||
|
||||
|
ну так здесь я и показал как сделать и меню и обработать событие. поэтому мне не понятно при чем тут "ненужное усложнение"? одним только:
Код:
published
property PopupMenu; |
|
#21
|
||||
|
||||
|
Ну так вроде ТС жаловался, что не может получить PopupMenu вот и начал мудрить с отловом нажатий мышки.
|
|
#22
|
|||
|
|||
|
мне нужно было решить две проблемы
1 - чтобы в инспекторе объектов можно было задать popupmenu. эта проблема решилась благодаря angvelem 2 - прописать реакцию на нажатия кнопки мыши. но тут чет так и не пашет. сейчас у меня прописано так Код:
private
{ Private declarations }
FOnMouseDown: TNotifyEvent;
...
protected
{ Protected declarations }
procedure WMMouseDown(var Msg : TMessage); message WM_LBUTTONDOWN;
...
published
{ Published declarations }
property OnMouseDown: TNotifyEvent read FOnMouseDown write FOnMouseDown;
...
procedure TMyComponent.WMMouseDown(var msg: TMessage);
begin
inherited;
if Assigned (FOnMouseDown) then FOnMouseDown(Self);
x - Msg.LParamLo
y - Msg.LParamHi
end;но проблема в том что при таком коде, во время создания программы с моим компонентом, если шелкнуть в инспекторе по событию OnMouseDown то появляется следующие: Код:
procedure TForm1.MyComponent1MouseDown(Sender: TObject); begin end; тоесть нету ни x, ни y, ни button. по листингу http://www.delphisources.ru/forum/sh...6&postcount=12 у меня тоже чтото не получается. сейчас всплыла и вовсе любопытная и неприятная вещь как я понял код прописаный в Код:
procedure TForm1.MyComponent1MouseDown(Sender: TObject); begin end; тоесть допустим я пишу внутри компонента: первый код Код:
procedure TMyComponent.WMMouseDown(var msg: TMessage); var int1:integer; begin inherited; if Assigned (FOnMouseDown) then FOnMouseDown(Self); int1:=1; end; во время создания программы с моим компонентом пишу: второй код Код:
procedure TForm1.MyComponent1MouseDown(Sender: TObject); begin Edit1.Text:=strtoint(int1);// на самом деле я конечно передаю это значение подругому, тут я так написал для простоты end; и ожидаю увидить в Edit1 значение "1", но это не происходит как я понимаю потому что второй код выполняется ДО первого. в итоге в Edit появляется единица только после повторного нажатия на компонент |
|
#23
|
||||
|
||||
|
Ох и мудрите, вы дорогой.
Код:
...
published
{ Published declarations }
property PopupMenu;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
end;P.S. Ты ведь не с нуля пишешь, ты наследуешься, а всё это имеется у "предка". Последний раз редактировалось angvelem, 04.08.2011 в 11:16. |
|
#24
|
|||
|
|||
|
Цитата:
Ну OnMouseDown должно быть не TNotifyEvent а TMouseEvent Цитата:
в метод DoMouseDown нужно добавить override; Цитата:
ну сам же пишешь Код:
inherited; if Assigned (FOnMouseDown) then FOnMouseDown(Self); // сначала вызвать обработчик int1:=1; // затем присвоить единицу а вообще, нужно только, как и советовал angvelem, добавить в секцию published свойство OnMouseDown и всё. А если нужна специфическая реакция, то сделай так Код:
...
protected
procedure DoMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);override;
published
property OnMowseDown; //только это
end;
implementation
procedure TMyComponent.DoMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
(*
тут код который выполнится до стандартного например
*)
Int1 := 1;
inherited; // затем стандартный обработчик, он же вызовет OnMowseDown
(*
тут код который выполнится после стандартного например
*)
if Int1 <> 1 then ShowMessage(' Int1<>1');
end; |
|
#25
|
||||
|
||||
|
Код:
unit MyCustomControl;
{$DEBUGINFO OFF}
interface
uses
Classes, Controls;
type
TMyCustomControl = class(TCustomControl)
protected
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
published
property Align;
property Anchors;
property Color;
property PopupMenu;
property ShowHint;
property TabOrder;
property TabStop;
property Visible;
property OnClick;
property OnEnter;
property OnExit;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnResize;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TMyCustomControl]);
end;
{ TMyCustomControl }
procedure TMyCustomControl.MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
// обработка нажатия мыши внутри компонента до OnMouseDown
inherited;
// обработка нажатия мыши внутри компонента после OnMouseDown
end;
procedure TMyCustomControl.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
// обработка перемещения мыши внутри компонента до OnMouseMove
inherited;
// обработка перемещения мыши внутри компонента после OnMouseMove
end;
procedure TMyCustomControl.MouseUp(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
// обработка отпускания мыши внутри компонента до OnMouseUp
inherited;
// обработка отпускания мыши внутри компонента после OnMouseUp
end;
end.published свойства: property Align; property Anchors; property Color; property PopupMenu; property ShowHint; property TabOrder; property TabStop; property Visible; published события: property OnClick; property OnEnter; property OnExit; property OnMouseDown; property OnMouseMove; property OnMouseUp; property OnResize; помимо этого можно внутри компонента обрабатывать мышку до или после внешних событий (методов формы). |
|
#26
|
|||
|
|||
|
всем спасибо, заработала как надо. многое оказывается проще чем я думал. ( только знать надо
).а вот событие property OnPaint; так просто не прописать. пишет: "property OnPaint does not exist in base class". Это значит что у предка нет этого события? как тогда решить проблему что после например popupmenu которое было открыто поверх моего компонента, после закрытия меню на компоненте остается след, пятно. Вроде бы этом можно решить через OnPaint. Но как его прописать? Код:
protected
{ Protected declarations }
procedure WMOnPaint(var Msg : TMessage); message WM_paint;
property
property OnPaint: TNotifyEvent read FOnPaint write FOnPaint;
procedure TTexXEditor.WMOnPaint(var Msg : TMessage);// message WM_paint;
begin
//вызываю свою процедуру перерисовки
end;Но вы скажете что я опять гланды через одно место делаю. Кроме того, в этом случае, когда открываеш в Дельфи форму с моим компонентом, то он мерцает, ощущение что он перерисовывается постоянно. Откомпилировать в этот мемент не получается и через минуту Дельфи вылетает с ошибкой.Последний раз редактировалось Fox Mulder, 07.08.2011 в 13:50. |
|
#27
|
||||
|
||||
|
Код:
unit MyCustomControl;
{$DEBUGINFO OFF}
interface
uses
Graphics, Classes, Controls;
type
TMyCustomControl = class(TCustomControl)
protected
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure Paint; override;
published
property Align;
property Anchors;
property Color;
property PopupMenu;
property ShowHint;
property TabOrder;
property TabStop;
property Visible;
property OnClick;
property OnEnter;
property OnExit;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnResize;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TMyCustomControl]);
end;
{ TMyCustomControl }
procedure TMyCustomControl.MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
// обработка нажатия мыши внутри компонента до OnMouseDown
inherited;
// обработка нажатия мыши внутри компонента после OnMouseDown
end;
procedure TMyCustomControl.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
// обработка перемещения мыши внутри компонента до OnMouseMove
inherited;
// обработка перемещения мыши внутри компонента после OnMouseMove
end;
procedure TMyCustomControl.MouseUp(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
// обработка отпускания мыши внутри компонента до OnMouseUp
inherited;
// обработка отпускания мыши внутри компонента после OnMouseUp
end;
procedure TMyCustomControl.Paint;
begin
Canvas.Brush.Color:=Color;
Canvas.FillRect(ClientRect);
Canvas.Pen.Color:=clBlack;
Canvas.MoveTo(0, 0);
Canvas.LineTo(Width, Height);
Canvas.MoveTo(Width, 0);
Canvas.LineTo(0, Height);
end;
end. |
|
#28
|
|||
|
|||
|
работает. хотя почему то пятно после меню не сразу исчезает, с задержкой в секунду. Не думаю что это связано с моим кодом отрисовки. так как на прокрутку колесиком мышки тот же код перерисовывается без задержек
|
|
#29
|
|||
|
|||
|
Очередная загвостка. Не могу своему компоненту ( создан на основе TCustomControl ) дать событие KeyDown и KeyPress
просто обяъвить его Код:
property OnKeyDown; UPD: отлично, коечто сделал: Код:
protected
procedure KeyDown(var Msg : TMessage); message WM_KeyDown;
procedure KeyUp(var Msg : TMessage); message WM_KeyUp;
published
property OnKeyDown;
property OnKeyUp;
procedure TTexXEditor.KeyDown(var Msg : TMessage);
begin
if Msg.WParam = 17 then begin
ctrlpress:=True;
end;
end;
procedure TTexXEditor.KeyUp(var Msg : TMessage);
begin
if Msg.WParam=17 then begin
ctrlpress:=False;
end;
end;но как его заставить теперь появится в инспекторе? Последний раз редактировалось Fox Mulder, 08.12.2011 в 15:21. |
|
#30
|
||||
|
||||
|
А как ты его объявлял? Достаточно было написать:
Код:
type
MyClass = class(TCustomControl)
...
published
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
end; |