Форум: "Основная";
Текущий архив: 2003.09.29;
Скачать: [xml.tar.bz2];
ВнизКласс Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.016 c