Помощь - Поиск - Пользователи - Календарь
Полная версия: использование методов при наследовании
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
Rian
пробую сделать объект с наследованием от Tpanel
и передавать ссылку от одного объекта другому, по драг дроп
ток не срабатывает метод dragover почему-то


type Tperson= class (TPanel)
public
id:integer;
own:Tperson;

//vis components
head:TLabel;
img:TImage;
canv:TCanvas;
constructor Create(aowner:Tcomponent);
procedure setCanvas(const link:TCanvas);
procedure place();
procedure DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure DragDrop(Sender, Source: TObject; X, Y: Integer);

end;

implementation
constructor Tperson.Create(aowner: Tcomponent);
begin
inherited create(Aowner);
Height:=100;
head:=TLabel.Create(self);
head.Caption:='555';
head.Parent:=self;
DragMode:=dmAutomatic;

img:=TImage.Create(self);
img.Width:=40;
img.Height:=40;
img.Top:=40;
img.Parent:=self;
img.Canvas.LineTo(20,40);
end;

procedure Tperson.DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
inherited DragOver(source,x,y,state,accept);
Accept:=true;
end;



и как перемещать Tperson обрабатывая img.mousemove
ЗЫ это понял
procedure Tperson.imageMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
self.Left:=self.Left+1;
end;
IUnknown
На сообщения компилятора внимательно смотрел? То, что твой метод DragOver скрывает виртуальный метод предка - тебе по барабану? Вот компилятору, как видно, нет. Объяви его как override (для этого придется поставить правильную сигнатуру)...
Rian
Цитата(IUnknown @ 31.05.2011 19:35) *

На сообщения компилятора внимательно смотрел? То, что твой метод DragOver скрывает виртуальный метод предка - тебе по барабану? Вот компилятору, как видно, нет. Объяви его как override (для этого придется поставить правильную сигнатуру)...

ну создание это обходит...
как это правильную?
Rian
... сделал обходным путем

OnDragOver:=DragOver2;
OnDragDrop:=DragDrop2;

а как все таки по нормальному?
IUnknown
Цитата
ну создание это обходит...
И создание тоже, кстати, надо Override-ить. Смотри: ты наследуешься от чего? От TPanel, так? То есть, в наследнике должен быть такой же метод DragOver, как и в предке. Какой он в предке? Вот такой:

// ...
procedure DragOver(Source: TObject; X: Integer; Y: Integer;
State: TDragState; var Accept: Boolean); dynamic;
// ...
, то есть, Sender-ом там даже и не пахнет. Сендер появляется, когда ты начинаешь писать обработчик события OnDragOver. Чувствуешь, где ты путаешься?

Ты пишешь свой компонент. Напишешь, зарегистрируешь, положишь на форму - вот тогда при выборе в Инспекторе Объектов этого события у тебя первым параметром добавится Sender. А реализовывать сам метод DragOver в потомке, извини, придется без Sender-а.
Rian
Цитата(IUnknown @ 31.05.2011 20:26) *

Сендер появляется, когда ты начинаешь писать обработчик события OnDragOver. Чувствуешь, где ты путаешься?


не уверен...
а где я буду писать обратчик OnDragOver?

Когда я написал так пишет неизвестная директива
procedure DragOver(Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean); override;


куда-то не туда иду?

смотрел по ссылке
property OnDragOver: TDragOverEvent;
это куда?
IUnknown
Стоп... Что значит "неизвестная"? Вот так:

Нажмите для просмотра прикрепленного файла

очень даже известная, компилируется без вопросов...

Цитата
а где я буду писать обратчик OnDragOver?
Обработчик события - это не метод. Ты в классе реализуешь метод DragOver. Создаешь компонент. Пользователь хочет работать с Drag-n-Drop. Его устраивает от функционал, который ты заложил в компонент - ничего не надо делать, все работает по умолчанию (при наступлении события). Не устраивает - он дабл-кликает на нужное событие, и пишет обработчик OnDragOver...

Еще раз: не путай метод и событие. Когда наступает событие. Когда наступает событие OnSomething выстреливается метод Something. Вот тебе пример. Знаешь, что такое Interceptor-класс, да? Это тот класс, который пишется перед классом формы для "открытия" каких-то частных или защищенных свойств/методов. Очень частая практика. Вот смотри:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

// Вот это и есть Interceptor-класс
type
TButton = class(StdCtrls.TButton)
public
procedure Click; override; // переопределим метод Click у кнопки
end;

type
TForm1 = class(TForm)
Button1: TButton; // Положим на форму только одну кнопку
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

// Это то, что мы хотим сделать
procedure TButton.Click;
begin
ShowMessage('Oops! How it worked???')
end;

end.
И теперь, не назначая никаких обработчиков событий OnClick, ничего вообще не делаем, сразу запускаем код на выполнение и жмем кнопку. Что произошло? Ага!!! Событие OnClick наступило, и сработал метод Click... Чувствуешь разницу?
Rian
ну понятно...наверно...
я overrride в interface и implementation сразу написал, оно ругалось..
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.