![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
А можно переписать метод у статического компонента ?
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 - виртуальный метод.
Может отсюда стоит плясать ?:)