Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.12.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.008 c
14-99305
Дмитрий К.К.
2002-12-08 22:16
2002.12.30
Рональдо разыгрался


7-99368
Snake
2002-10-22 11:38
2002.12.30
Установки видеокарты. Посоветуйте, как?


4-99404
Yuri Btr
2002-11-12 15:54
2002.12.30
LowLevelKeyboardProc


6-99240
anmak
2002-10-30 17:21
2002.12.30
UDP + WinXP%(


1-99178
Zipper
2002-12-19 02:40
2002.12.30
Как открыть документ Word в RichEdit e?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский