Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.48 MB
Время: 0.01 c
1-96231
Term
2003-09-17 17:47
2003.09.29
как удалить сом-объект


3-96143
SergBBS
2003-09-08 12:13
2003.09.29
FibPlus


1-96235
Qwerr
2003-09-17 17:28
2003.09.29
Мышька !


1-96271
Dolla
2003-09-16 14:19
2003.09.29
а можно так сделать?


1-96192
Леонид
2003-09-16 03:26
2003.09.29
Нужен бесплатный компонент архивирования...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский