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

Вниз

А можно переписать метод у статического компонента ?   Найти похожие ветки 

 
sg78   (2002-12-17 16:58) [0]

например у мя:

TForm1 = class(TForm)
Label1: TLabel;
end;
а я хочу переписать метод Refresh у Label1
Это как подменить адрес метода в таблице методов, если это вообще возможно ?


 
Skier ©   (2002-12-17 17:02) [1]

>sg78
Refresh вызывает Repaint,
а Repaint - виртуальный метод.
Может отсюда стоит плясать ?:)


 
sg78   (2002-12-17 17:04) [2]

Ну я это и имел ввиду
А как, конкретно ?


 
Skier ©   (2002-12-17 17:09) [3]

Ну, примерно так :
TYourLabel = class(TLabel);
public
procedure Repaint; override;
end; //TYourLabel

//............

TYourLabel.Repaint;
begin
//your code goes here...
inherited Repaint; //
//and your code goes here...
end;

Это имелось в виду ?


 
sg78   (2002-12-17 17:21) [4]

Угу это, но у моего Label класс: (Label1: TLabel) и моя Label вызовет стандартный Repaint, а как аго заменить на TYourLabel.Repaint ? Вот это непонятно.

Label.repaint:=TYourLabel().Repaint, бррр, бред так ведь нельзя


 
Skier ©   (2002-12-17 17:24) [5]

>sg78
А зачем тебе всё это ?
Цель какая ?
Может быть есть более удобный способ...


 
Anatoly Podgoretsky ©   (2002-12-17 17:26) [6]

А TLabel заменить на TMyLabel религия не позволяет?
И действительно расскажи о цели, а то может быть ты как нормальный герой идешь в обход.


 
sg78   (2002-12-17 17:29) [7]

Цель обучение, честно.
Просто я тута у Вас узнал что так можно свойства "переоткрывать", например:
TYourLabel(Label1).СкрытоеСвойствоРодителя.
А вот с методами такого не знаю. А такие случаи появляются и почти всегда обходятся другими решениями, но я подумал а вдруг можно сделать проще ? (как со свойствами).


 
Skier ©   (2002-12-17 17:32) [8]

>sg78

> TYourLabel(Label1).СкрытоеСвойствоРодителя

Это ты всё правильно понял, (только не Скрытое, а Защищённое - protected, и кстати с методами всё тоже самое...), НО...ни Refresh, ни Repaint не являются Защищёнными,поэтому, всё что ты хочешь сделать - алогично ! :))


 
sg78   (2002-12-17 17:36) [9]

алогично - это здорово, но не совсем логично. Я просто не усек конструкцию, как конструкцию в таком случае записать ?

TYourLabel(Label1).Refresh:=КакойтоМойМетод ?


 
Skier ©   (2002-12-17 17:54) [10]

>sg78

> TYourLabel(Label1).Refresh:=КакойтоМойМетод

Никак.
Разве что... только такую штуку провернуть с WndProc(...);


 
sg78   (2002-12-17 17:55) [11]

Ау. Я конечно понимаю, что это не мультик: "Мишки Гамми спешат на помощь", но может кто-нить доподскажет ? А то вопрос утонет.


 
sg78   (2002-12-17 18:17) [12]

А ведь существует таблица виртуальных методов. По идее может "просто" подменяется адрес метода (где его взять), а может ...
А ладно, спасибо за ответы.
Skier © персональное спасибо.


 
Fantasist ©   (2002-12-17 19:15) [13]


> А ведь существует таблица виртуальных методов. По идее может
> "просто" подменяется адрес метода (где его взять), а может
> ...


Можно конечно, и подменить адрес метода, а точнее лучше переписать указатель на таблицу - извлечь его место положение можно воспользовавшись констанотой System.vmtMethodTable(смещение до указателя на vmt). Но делать это крайне не реккомендуется, разве только что с целью обучения.

Кстати, вызвать метод своего класса с экземпляром чужого можно взятием статического адреса:

var
m:procedure of object;
begin
TMethod(m).Code:=@TMyLabel.Repaint;
TMethod(m).Data:=Lable1;
m;
end;


но это тоже не стоит делать в реальных программах.


 
Бурундук   (2002-12-17 19:36) [14]

>Fantasist © (17.12.02 19:15
...System.vmtMethodTable(смещение до указателя на vmt)

Вообще-то сия константа указывает на смещение указателя
на RTTI-таблицу published методов относительно VMT.
Указатель же на VMT - просто ClassType.


>sg78 (17.12.02 18:17)
Рекомендую почитать чего-нибудь по ООП, в
частности, про виртуальные методы -
поскольку у тебя в голове сейчас полный сумбур.

Это не наезд, просто объяснять что-либо
человеку, не владеющему терминологией, очень трудно.


 
Fantasist ©   (2002-12-17 19:45) [15]


> Указатель же на VMT - просто ClassType.


Хорошо. Имеется ввиду TObject.ClassType.


 
sg78   (2002-12-18 14:38) [16]

У мя в голове мысли, а объять все ..., и потом, н-р, дети включают телевизор, совершенно ничего не зная о принципах его функционирования - это им и не нужно, а так еще раз спасибо.



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

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

Наверх




Память: 0.5 MB
Время: 0.013 c
1-99195
Nikolai_S
2002-12-18 15:19
2002.12.30
MapX! Кто-нибудь тесно работал с MapX? Как изменить стиль объекта


6-99237
Zolen
2002-11-01 19:24
2002.12.30
создание HTML страницы


6-99238
megatrend
2002-10-31 15:20
2002.12.30
twebbrowser


14-99255
Yury
2002-12-11 08:49
2002.12.30
PDF -> Word


3-99016
Karbo
2002-12-11 03:15
2002.12.30
Простой вопрос по SQL