Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.29;
Скачать: CL | DM;

Вниз

Класс   Найти похожие ветки 

 
First_May ©   (2003-09-16 10:26) [0]

Здравствуйте, подскажите пожалуйста, можно ли внутри класса объявить переменную, которая будет хранить этот же класс, то есть что то типа такого:
TAdvLabel = class(TLabel)
private
FTemp: TAdvLabel;


 
Юрий Зотов ©   (2003-09-16 10:27) [1]

Можно, без проблем. Вот прямо так, как Вы и написали.


 
First_May ©   (2003-09-16 10:34) [2]

позже я пишу в конструкторе FTemp:=Self; и еще объявлен метод
published
procedure NewEnter(Sender: TObject);

при вызове которого вылетает ошибка:

procedure TAdvLabel.NewEnter(Sender: TObject);
begin
FTemp.Font.Color:=clBlue;
end;
а в чем дело не пойму.


 
Skier ©   (2003-09-16 10:39) [3]


> при вызове которого вылетает ошибка:

Какая ошибка ?


 
zaporshivets   (2003-09-16 10:41) [4]


procedure TAdvLabel.NewEnter(Sender: TObject);
begin

// Накой тебе FTEMP если есть SELF - указатель на твой объект
доступный в любом его методе
SELF.Font.Color:=clBlue;
end;


 
First_May ©   (2003-09-16 10:44) [5]

Хорошая, "Access violation ..." :), ну а еще при просмотре значения переменной FTemp, она говорит, что FTemp=inaccessible...


 
Skier ©   (2003-09-16 10:45) [6]

>First_May © (16.09.03 10:44)
А ты объект-то создаёшь ?
Код покажи...


 
HolACost! ©   (2003-09-16 10:46) [7]

Вот в этом и проблема - скорее всего компилятор пропускает присвоение и всё! Гы! Оптимизация!


 
First_May ©   (2003-09-16 10:51) [8]

может быть дело в том, что метод NewEnter добавлен в "старый" метод следующим способом:

TmpMeth:=GetMethodProp(FWinControl,"OnEnter");
FOldEnter:=TNotifyEvent(TmpMeth);
TmpMeth.Code:=MethodAddress("NewEnter");
SetMethodProp(FWinControl,"OnEnter",TmpMeth);


 
First_May ©   (2003-09-16 11:08) [9]

Если интересует код, то вот он:

TAdvLabel = class(TLabel)
private
FWinControl: TWinControl;
FTemp: TAdvLabel;
procedure SetWinControl(Value: TWinControl);
public
constructor Create(AOwner: TComponent); override;
published
property WinControl: TWinControl read FWinControl write SetWinControl;
procedure NewEnter(Sender: TObject);
end;

constructor TAdvLabel.Create;
begin
inherited Create(AOwner);
FWinControl:=Nil;
FTemp:=Self;
end;

procedure TAdvLabel.SetWinControl(Value: TWinControl);
var TmpMeth: TMethod;
begin
FWinControl:=Value;
if FWinControl<>Nil then
begin
TmpMeth:=GetMethodProp(FWinControl,"OnEnter");
FOldEnter:=TNotifyEvent(TmpMeth);
TmpMeth.Code:=MethodAddress("NewEnter");
SetMethodProp(FWinControl,"OnEnter",TmpMeth);
end;
end;

procedure TAdvLabel.NewEnter(Sender: TObject);
begin
FTemp.Font.Color:=clBlue; // ЗДЕСЬ ОШИБКА
if Addr(FOldEnter)<>Nil
then TNotifyEvent(FOldEnter)(FWinControl);
end;

Кто нибудь может подсказать, как ее избежать?


 
Юрий Федоров ©   (2003-09-16 11:19) [10]

1. Не понятно, зачем тебе FTemp, если self всегда доступен.
2. Не понятно, зачем тебе такие навороты в SetWinControl, не проще просто присвоить событие без вызова GetMethodProp?
Не говоря о том, что перед FWinControl:=Value; неплохо проверить, не был ли FWinControl уже присвоен до этого, и в этом случае перед присвоением нового вернуть старому значению первоначальное состояние по OnEnter ?


 
First_May ©   (2003-09-16 11:26) [11]

1. Что Self всегда доступен я знаю, но при входе в NewEnter он равен или Nil, или родителю компонента.
2. А если у компонента FWinControl в проекте был свой обработчик на OnEnter? Тут я делаю то, что перед выполнением "родного" метода компонента FWinControl, выполняю то, что мне нужно.

А вот по поводу возврата метода, это верно! :) Но пока вопрос совсем в другом.


 
First_May ©   (2003-09-16 11:26) [12]

1. Что Self всегда доступен я знаю, но при входе в NewEnter он равен или Nil, или родителю компонента.
2. А если у компонента FWinControl в проекте был свой обработчик на OnEnter? Тут я делаю то, что перед выполнением "родного" метода компонента FWinControl, выполняю то, что мне нужно.

А вот по поводу возврата метода, это верно! :) Но пока вопрос совсем в другом.


 
Юрий Федоров ©   (2003-09-16 11:47) [13]

>>но при входе в NewEnter он равен или Nil, или родителю >>компонента.
Чудеса ! Как ты этого достиг? Либо ты куда-то не туда посмотрел, либо ты где-то выбил память так, что дальнейшая борьба уже бессмысленна :-))
Кстати, почему NewEnter в published ?


 
First_May ©   (2003-09-16 11:54) [14]

NewEnter в published что бы воспользоваться MethodAddress... Хорошо, а как выйти из этой ситуации? :)


 
First_May ©   (2003-09-16 12:19) [15]

Вот почему то везде можно воспользоваться Self, а в NewEnter он совсем имеет другое значение.


 
Владислав ©   (2003-09-16 12:21) [16]

Вот объявление:

TMethod = record
Code, Data: Pointer;
end;


Вот твой код:

TmpMeth:=GetMethodProp(FWinControl,"OnEnter");
FOldEnter:=TNotifyEvent(TmpMeth);
TmpMeth.Code:=MethodAddress("NewEnter");
SetMethodProp(FWinControl,"OnEnter",TmpMeth);


В нем я не вижу инициализации поля Data. Вот тебе и AV.


 
Владислав ©   (2003-09-16 12:23) [17]

> First_May © (16.09.03 12:19) [15]

Потому и имеет, что ты его не инициализируешь.


 
First_May ©   (2003-09-16 12:40) [18]

Спасибо всем, действительно, надо написать вот так:

TmpMeth:=GetMethodProp(FWinControl,"OnEnter");
FOldEnter:=TNotifyEvent(TmpMeth);
TmpMeth.Data:=Self;
TmpMeth.Code:=MethodAddress("NewEnter");
SetMethodProp(FWinControl,"OnEnter",TmpMeth);

и тогда вот здесь

procedure TAdvLabel.NewEnter(Sender: TObject);
begin
Self.Font.Color:=clBlue;
if Addr(FOldEnter)<>Nil
then TNotifyEvent(FOldEnter)(FWinControl);
end;

Self именно тот, который нужен...


 
icWasya ©   (2003-09-16 13:51) [19]

а проще нельзя было ?
...
FOldEnter:TNotifyEvent;
...

var
TmpMeth :TNotifyEvent;

FOldEnter:=FWinControl.OnEnter;
FWinControl.OnEnter:=NewEnter;

....

procedure TAdvLabel.NewEnter(Sender: TObject);
begin
Self.Font.Color:=clBlue;
if Assigned(FOldEnter)
then FOldEnter(FWinControl);
end

??????????????



Страницы: 1 вся ветка

Текущий архив: 2003.09.29;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.018 c
3-96067
Nestor
2003-09-10 10:48
2003.09.29
Как добавить в runtime в Dataset поле


8-96300
Still Swamp
2003-05-17 17:38
2003.09.29
Закончилось ли воспроизведени


1-96213
fender
2003-09-18 08:03
2003.09.29
regedit


7-96457
Prov
2003-07-17 14:42
2003.09.29
Разрешение экрана


14-96444
Hatchy
2003-09-09 15:30
2003.09.29
Посоветуйте винчестер...