пробую сделать объект с наследованием от 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;
procedure Tperson.imageMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
self.Left:=self.Left+1;
end;
На сообщения компилятора внимательно смотрел? То, что твой метод DragOver скрывает виртуальный метод предка - тебе по барабану? Вот компилятору, как видно, нет. Объяви его как override (для этого придется поставить правильную сигнатуру)...
... сделал обходным путем
OnDragOver:=DragOver2;
OnDragDrop:=DragDrop2;
а как все таки по нормальному?
, то есть, Sender-ом там даже и не пахнет. Сендер появляется, когда ты начинаешь писать обработчик события OnDragOver. Чувствуешь, где ты путаешься?
// ...
procedure DragOver(Source: TObject; X: Integer; Y: Integer;
State: TDragState; var Accept: Boolean); dynamic;
// ...
procedure DragOver(Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean); override;
Стоп... Что значит "неизвестная"? Вот так:
очень даже известная, компилируется без вопросов...
unit Unit1;И теперь, не назначая никаких обработчиков событий OnClick, ничего вообще не делаем, сразу запускаем код на выполнение и жмем кнопку. Что произошло? Ага!!! Событие OnClick наступило, и сработал метод Click... Чувствуешь разницу?
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.
ну понятно...наверно...
я overrride в interface и implementation сразу написал, оно ругалось..