Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 01.08.2011, 14:45
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от angvelem
Про это:
Код:
  published
    { Published declarations }
    property PopupMenu;
больше ничего добавлять не требуется.
ну это смотря какую проблему решать.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #17  
Старый 01.08.2011, 14:52
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Эту я понимаю:
Цитата:
Fox Mulder
создаю компонент...
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #18  
Старый 01.08.2011, 14:54
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

а я про обработку OnMouseDown из http://www.delphisources.ru/forum/sh...05&postcount=6
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #19  
Старый 01.08.2011, 15:03
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Тогда читаем у указанной ссылки первую строку.
Цитата:
Сообщение от Fox Mulder
Конечно мне этот TCustomControl решив проблемы с фокусом создал много других проблем. Ему нельзя задать Popumenu. Как создать это свойство у него?...
дальше ТС попытался удалить гланды через з...цу.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #20  
Старый 01.08.2011, 15:29
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ну так здесь я и показал как сделать и меню и обработать событие. поэтому мне не понятно при чем тут "ненужное усложнение"? одним только:
Код:
  published
    property PopupMenu;
нажатия мышки не поймаете!
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #21  
Старый 01.08.2011, 21:04
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ну так вроде ТС жаловался, что не может получить PopupMenu вот и начал мудрить с отловом нажатий мышки.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #22  
Старый 04.08.2011, 03:07
Fox Mulder Fox Mulder вне форума
Прохожий
 
Регистрация: 19.01.2011
Сообщения: 16
Репутация: 10
По умолчанию

мне нужно было решить две проблемы
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;
во время проектирования программы, выполняется ДО кода выполняемого в событие OnMouseDown который прописан внутри компонента

тоесть допустим я пишу внутри компонента:

первый код
Код:
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  
Старый 04.08.2011, 11:04
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ох и мудрите, вы дорогой.
Код:
  ...
  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  
Старый 04.08.2011, 11:12
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Цитата:
Сообщение от Fox Mulder
мне нужно было решить две проблемы
1 - чтобы в инспекторе объектов можно было задать popupmenu. эта проблема решилась благодаря angvelem

2 - прописать реакцию на нажатия кнопки мыши. но тут чет так и не пашет.
... поскипано много букафф...

тоесть нету ни x, ни y, ни button.

Ну OnMouseDown должно быть не TNotifyEvent а TMouseEvent

Цитата:
Сообщение от Fox Mulder
по листингу http://www.delphisources.ru/forum/sh...6&postcount=12
у меня тоже чтото не получается.

в метод DoMouseDown нужно добавить override;


Цитата:
Сообщение от Fox Mulder
сейчас всплыла и вовсе любопытная и неприятная вещь

как я понял код прописаный в
Код:
procedure TForm1.MyComponent1MouseDown(Sender: TObject);
begin
end;
во время проектирования программы, выполняется ДО кода выполняемого в событие OnMouseDown который прописан внутри компонента

тоесть допустим я пишу внутри компонента:

первый код
Код:
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 появляется единица только после повторного нажатия на компонент

ну сам же пишешь

Код:
  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  
Старый 04.08.2011, 11:59
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
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  
Старый 07.08.2011, 13:28
Fox Mulder Fox Mulder вне форума
Прохожий
 
Регистрация: 19.01.2011
Сообщения: 16
Репутация: 10
По умолчанию

всем спасибо, заработала как надо. многое оказывается проще чем я думал. ( только знать надо ).
а вот событие
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  
Старый 07.08.2011, 13:46
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
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  
Старый 07.08.2011, 13:55
Fox Mulder Fox Mulder вне форума
Прохожий
 
Регистрация: 19.01.2011
Сообщения: 16
Репутация: 10
По умолчанию

работает. хотя почему то пятно после меню не сразу исчезает, с задержкой в секунду. Не думаю что это связано с моим кодом отрисовки. так как на прокрутку колесиком мышки тот же код перерисовывается без задержек
Ответить с цитированием
  #29  
Старый 08.12.2011, 15:08
Fox Mulder Fox Mulder вне форума
Прохожий
 
Регистрация: 19.01.2011
Сообщения: 16
Репутация: 10
По умолчанию

Очередная загвостка. Не могу своему компоненту ( создан на основе 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  
Старый 08.12.2011, 22:06
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

А как ты его объявлял? Достаточно было написать:
Код:
type
  MyClass = class(TCustomControl)
...
  published
    property OnKeyDown;
    property OnKeyPress;
    property OnKeyUp;
  end;
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:17.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter