Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


sg78 ©   (2002-12-17 16:58:00) 

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

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


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

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


Fantasist   (2002-12-17 19:45:00) [2]


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


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


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

>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:15:00) [4]


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


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

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

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


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


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

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


sg78   (2002-12-17 17:55:00) [6]

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


Skier   (2002-12-17 17:54:00) [7]

>sg78

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

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


sg78   (2002-12-17 17:36:00) [8]

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

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


Skier   (2002-12-17 17:32:00) [9]

>sg78

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

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


sg78   (2002-12-17 17:29:00) [10]

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


Anatoly Podgoretsky   (2002-12-17 17:26:00) [11]

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


Skier   (2002-12-17 17:24:00) [12]

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


sg78   (2002-12-17 17:21:00) [13]

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

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


Skier   (2002-12-17 17:09:00) [14]

Ну, примерно так :
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:04:00) [15]

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


Skier   (2002-12-17 17:02:00) [16]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо