Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

События в компоненте [D7, XP]


mfender ©   (2006-04-27 17:12:00) 

Есть компонент:


type
 {TpicOne}
 TpicOne = class(TPanel)
   public
   PicRecord: PPicRecord;
   InternalOID: Integer;
   FImage: TImage;
   constructor Create(AOwner: TComponent); override;
   procedure LoadPicture;
 end;
........

constructor TpicOne.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 Parent := TWinControl(AOwner);
 New(PicRecord);
 FImage := TImage.Create(Self);
 FImage.Parent := Self;
..........
end;


В цикле создаю его объекты (вобщем, они потом складываются в TObjectList):

 
for i:=0 to CalculatePicCount(Query.RecordCount, FPicsOnRow)-1 do
 begin
   Pic := TpicOne.Create(GroupPics);
   Pic.InternalOID := i;
   Pic.FImage.OnClick := PicClick;
   Pic.FImage.OnDblClick := DblPicClick;
   Pic.FImage.OnMouseDown := Self.MouseDown;
   Pic.FCloseButton.OnClick := CloseButtonClick;
....
 end;


Так вот, события OnClick и OnDblClick назначил, а вот OnMouseDown - никак не получается... Догадываюсь, что с OnDragOver и OnDragDrop будет такая же беда. Что делать?

И ещё вопрос: как перетащить (DragDrop) файл (точнее, его имя - путь с именем) в свой компонент из "Проводника"?


mfender   (2006-04-27 21:05:00) [1]


> Юрий Зотов ©   (27.04.06 19:18) [5]

Спасибо большое. Я уже так и сделал. Всё получилось. Спасибо.


Юрий Зотов   (2006-04-27 19:18:00) [2]

А что, справку и исходники уже отменили? Заглянуть не судьба?

Из справки по методам TControl:
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); dynamic;

Так что никаких Sender'ов там нет и быть не должно. А вот для события OnMouseDown как раз нужен обработчик с Sender'ом:
type
TMouseEvent = procedure (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object;

Так что сначала Вы пытались назначить событию обработчик не того типа, а потом пытались перекрыть метод, изменив его параметры. Переименуйте свой метод MouseDown во что-то другое, уберите у него override и укажите в нем правильный список параметров.

И так - со всеми событиями. И все назначится.


mfender   (2006-04-27 19:04:00) [3]


> прости,ты не написал где именно находится этот цикл по созданию,
> поэтому было не понятно кто такой self который Self.MouseDown

Прошу прощения, не подумал, что это может понадобиться...
Self в данном случае - TpicGroup. Он тоже создаётся в цикле.

Действительно, как-то странно я написал... без Sender'а...

Но всё-равно:
procedure MouseDown(Sender:TObject; Button: TMouseButton; Shift:          TShiftState;X, Y: Integer); override;

Но компилятор пишет "Declaration of 'MouseDown' differs from previous declaration". Отчего-почему - ничего не пойму... :(((


SuperBUG   (2006-04-27 18:42:00) [4]

прости,ты не написал где именно находится этот цикл по созданию,поэтому было не понятно кто такой self который Self.MouseDown,а на вскидку ты похоже перевираешь описание процедуры, вместо
  procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
                                        X, Y: Integer); override; должно быть
  procedure MouseDown(Sender:TObject;Button: TMouseButton; Shift:          TShiftState;X, Y: Integer); override;


mfender   (2006-04-27 17:59:00) [5]


> а что у тебя Self.MouseDown?? вроде у TpicOne = class(TPanel)
> никаких методов типа MouseDown не описано...???? или я ошибаюсь?
> ??

Она в другом компоненте:


 TpicGroup = class(TPanel)
 private
   function GetPicList(Query: TzQuery): TList;
   function CalculatePicCount(RecCount, PicsInRowCount: Integer): Integer;
   procedure PicClick(Sender: TObject);
   procedure DblPicClick(Sender: Tobject);
   procedure SetSelect(var Internal: TpicOne);
 public
   constructor Create(AOwner: TComponent); override;
   procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
   procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
                                         X, Y: Integer); override;    
 end;


SuperBUG   (2006-04-27 17:35:00) [6]

а что у тебя Self.MouseDown?? вроде у TpicOne = class(TPanel) никаких методов типа MouseDown не описано...???? или я ошибаюсь???


Наверх

Титульная страница Поиск, карта сайта Написать письмо