IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> использование методов при наследовании
сообщение
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 396
Пол: Мужской

Репутация: -  9  +


пробую сделать объект с наследованием от 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 -


--------------------
Objective-C, Unity3d
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


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


Знаток
****

Группа: Пользователи
Сообщений: 396
Пол: Мужской

Репутация: -  9  +


Цитата(IUnknown @ 31.05.2011 19:35) *

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

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


--------------------
Objective-C, Unity3d
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Знаток
****

Группа: Пользователи
Сообщений: 396
Пол: Мужской

Репутация: -  9  +


... сделал обходным путем

OnDragOver:=DragOver2;
OnDragDrop:=DragDrop2;

а как все таки по нормальному?


--------------------
Objective-C, Unity3d
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


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

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

Ты пишешь свой компонент. Напишешь, зарегистрируешь, положишь на форму - вот тогда при выборе в Инспекторе Объектов этого события у тебя первым параметром добавится Sender. А реализовывать сам метод DragOver в потомке, извини, придется без Sender-а.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Знаток
****

Группа: Пользователи
Сообщений: 396
Пол: Мужской

Репутация: -  9  +


Цитата(IUnknown @ 31.05.2011 20:26) *

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


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

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


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

смотрел по ссылке
property OnDragOver: TDragOverEvent;
это куда?


--------------------
Objective-C, Unity3d
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Стоп... Что значит "неизвестная"? Вот так:

Прикрепленное изображение

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

Цитата
а где я буду писать обратчик 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... Чувствуешь разницу?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Знаток
****

Группа: Пользователи
Сообщений: 396
Пол: Мужской

Репутация: -  9  +


ну понятно...наверно...
я overrride в interface и implementation сразу написал, оно ругалось..


--------------------
Objective-C, Unity3d
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 9.05.2024 8:35
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name