|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
||||
|
||||
Цитата:
Пишу программы за еду. __________________ |
#17
|
||||
|
||||
Эту я понимаю:
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#18
|
||||
|
||||
а я про обработку OnMouseDown из http://www.delphisources.ru/forum/sh...05&postcount=6
Пишу программы за еду. __________________ |
#19
|
||||
|
||||
Тогда читаем у указанной ссылки первую строку.
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#20
|
||||
|
||||
ну так здесь я и показал как сделать и меню и обработать событие. поэтому мне не понятно при чем тут "ненужное усложнение"? одним только:
Код:
published property PopupMenu; Пишу программы за еду. __________________ |
#21
|
||||
|
||||
Ну так вроде ТС жаловался, что не может получить PopupMenu вот и начал мудрить с отловом нажатий мышки.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#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. Ты ведь не с нуля пишешь, ты наследуешься, а всё это имеется у "предка". Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось 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; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |