![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
Rian |
![]()
Сообщение
#1
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 394 Пол: Мужской Репутация: ![]() ![]() ![]() |
пробую сделать объект с наследованием от 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;
Сообщение отредактировано: Rian - 31.05.2011 19:22 -------------------- Objective-C, Unity3d
|
IUnknown |
![]()
Сообщение
#2
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
На сообщения компилятора внимательно смотрел? То, что твой метод DragOver скрывает виртуальный метод предка - тебе по барабану? Вот компилятору, как видно, нет. Объяви его как override (для этого придется поставить правильную сигнатуру)...
|
Rian |
![]()
Сообщение
#3
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 394 Пол: Мужской Репутация: ![]() ![]() ![]() |
На сообщения компилятора внимательно смотрел? То, что твой метод DragOver скрывает виртуальный метод предка - тебе по барабану? Вот компилятору, как видно, нет. Объяви его как override (для этого придется поставить правильную сигнатуру)... ну создание это обходит... как это правильную? -------------------- Objective-C, Unity3d
|
Rian |
![]()
Сообщение
#4
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 394 Пол: Мужской Репутация: ![]() ![]() ![]() |
... сделал обходным путем
OnDragOver:=DragOver2; OnDragDrop:=DragDrop2; а как все таки по нормальному? -------------------- Objective-C, Unity3d
|
IUnknown |
![]()
Сообщение
#5
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата ну создание это обходит... И создание тоже, кстати, надо Override-ить. Смотри: ты наследуешься от чего? От TPanel, так? То есть, в наследнике должен быть такой же метод DragOver, как и в предке. Какой он в предке? Вот такой:
// ...
procedure DragOver(Source: TObject; X: Integer; Y: Integer;
State: TDragState; var Accept: Boolean); dynamic;
// ...
, то есть, Sender-ом там даже и не пахнет. Сендер появляется, когда ты начинаешь писать обработчик события OnDragOver. Чувствуешь, где ты путаешься?Ты пишешь свой компонент. Напишешь, зарегистрируешь, положишь на форму - вот тогда при выборе в Инспекторе Объектов этого события у тебя первым параметром добавится Sender. А реализовывать сам метод DragOver в потомке, извини, придется без Sender-а. |
Rian |
![]()
Сообщение
#6
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 394 Пол: Мужской Репутация: ![]() ![]() ![]() |
Сендер появляется, когда ты начинаешь писать обработчик события OnDragOver. Чувствуешь, где ты путаешься? не уверен... а где я буду писать обратчик OnDragOver? Когда я написал так пишет неизвестная директива procedure DragOver(Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean); override;
куда-то не туда иду? смотрел по ссылке property OnDragOver: TDragOverEvent; это куда? -------------------- Objective-C, Unity3d
|
IUnknown |
![]()
Сообщение
#7
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Стоп... Что значит "неизвестная"? Вот так:
![]() очень даже известная, компилируется без вопросов... Цитата а где я буду писать обратчик 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 |
![]()
Сообщение
#8
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 394 Пол: Мужской Репутация: ![]() ![]() ![]() |
ну понятно...наверно...
я overrride в interface и implementation сразу написал, оно ругалось.. -------------------- Objective-C, Unity3d
|
![]() ![]() |
![]() |
Текстовая версия | 27.07.2025 23:09 |