![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Class Functions
SPeller © (2004-07-06 07:12:00)Всем доброго времени суток.
Я вот что-то не могу понять чем отличаются функции, объявленные какclass function FuncName ()? Буду очень благодарен за разъяснение что это такое и с чем его едят.
Анонимщик (2004-07-07 11:11:00) [1]Почитав справку по VMT, ты поймешь, где находятся поля и методы по отношению к адресу класса или объекта, а из PE формата нужно только знать, как вытащить адрес сегмента кода и сегмента данных. После этого сам можешь построиь, например, дерево классов с адресами полей и т.д. С абсолютного нуля разберешься со всем за неделю, это точно.
Тимохов (2004-07-07 08:54:00) [2]
> АСМ код не покажет структуру сласса и расположение в ней
> элементов различных.
это как смотреть: в свое время я именно так и понял много вещей.
SPeller (2004-07-07 03:27:00) [3]
> А также структуру PE-файла.
Ой, мне ли вы это будете рассказывать? :-)))
> ничего нет лучше, чем часто вызвать окно cpu (главное меню\view\debug
> windows) и см. асм код.
АСМ код не покажет структуру сласса и расположение в ней элементов различных. А то что смотреть в окошко cpu полезно — я сам знаю :)
Анонимщик (2004-07-06 18:33:00) [4]Под отладчиком лучше всего и смотреть. Оно все в SysInit.pas
Тимохов (2004-07-06 18:10:00) [5]
> Анонимщик © (06.07.04 18:07) [26]
> InitExe, StartExe.
Где это можно посмотреть?
Анонимщик (2004-07-06 18:07:00) [6]Speller
Хелп на слово VMT. Остальное несложно сообразить. Полезно также посмотреть, что происходит при запуске программы, в частности,
InitExe, StartExe.
А также структуру PE-файла.
Тимохов (2004-07-06 17:20:00) [7]
> SPeller © (06.07.04 17:00) [23]
ничего нет лучше, чем часто вызвать окно cpu (главное меню\view\debug windows) и см. асм код.
ЗЫ
я асм не знаю (совсем), но часто мне кажется, что что-то понимаю :))) Иногда ошибаюсь правда, но все же польза от изучения cpu есть
Amoeba (2004-07-06 17:02:00) [8]На сайте Анатолия Подгорецкого полно литературы.
SPeller (2004-07-06 17:00:00) [9]Большое всем спасибо за столь подробные разъяснения! Чтобы не докучать вопросами, было бы очень интересно самому почитать про внутреннюю организацию классов и объектов (object). Если кто подскажет где можно почитать буду очень благодарен. )
GuAV (2004-07-06 14:07:00) [10]
> Очень похоже, что Delphi с Вами не согласна.
Извините, ошибся, хелп не правильно перевел :-(
Юрий Зотов (2004-07-06 14:01:00) [11]> GuAV © (06.07.04 12:51) [19]
Очень похоже, что Delphi с Вами не согласна.
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
public
class procedure A;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
class procedure TForm1.A;
begin
if Self = TForm1 then
ShowMessage('класс')
else
ShowMessage('не класс')
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.A // И получаем сообщение 'класс'
end;
А вот что показывает ассемблерный код Button1Click:
mov eax, [Form1] ; в eax - ссылка на экземпляр
mov eax, [eax] ; в eax - ссылка на класс
call TForm1.A ; и только теперь - вызов
Я полагаю, что компилятору верить можно...
:о)
MBo (2004-07-06 13:50:00) [12]>GuAV © (06.07.04 12:51) [19]
>Но если классовый метд вызван как обычный через экземпляр, то у него и self как у обычного.
Да ну? ;))
TC=class
class function ClassMe:Pointer;
function Me:Pointer;
end;
class function TC.ClassMe: Pointer;
begin
Result:=Self;
end;
function TC.Me: Pointer;
begin
Result:=Self;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
c:TC;
begin
c:=TC.Create;
Caption:=Format('%p %p %p',[TC.ClassMe,c.ClassMe,c.Me]);
c.Free;
end;
GuAV (2004-07-06 12:51:00) [13]
> В классовых методах неявный параметро Self - это ссылка
> на класс (в обычных - на экземпляр класса)
Но если классовый метд вызван как обычный через экземпляр, то у него и self как у обычного.
Юрий Зотов (2004-07-06 12:14:00) [14]> SPeller © (06.07.04 08:56) [10]
> А можно по указателю, который передается на эту структуру,
> определить размер этой структуры, т.е. если бы мы вручную
> выделяли память под класс, то можно ли и как узнать сколько
> памяти надо?
Можно: Self.InstanceSize.
В классовых методах неявный параметро Self - это ссылка на класс (в обычных - на экземпляр класса). InstanceSize - тоже классовый метод, поэтому его можно вызывать и через ссылку не класс.
GuAV (2004-07-06 11:57:00) [15]
> TClass или какойто ещё class of
> в self будет class
я имел ввдиу class-reference или metaclass.
Без этой фичи в Delphi они были бы бесполезны.
GuAV (2004-07-06 11:48:00) [16]SPeller © (06.07.04 09:02) [13]
да. но чтобы не путать методы, которые не работают с полями и могут работать для несозданных классов с обычными вели класовые методы. и потом есть функции которым передается TClass или какойто ещё class of. и потом, у классового self'ом при вызове как классового в self будет class
GuAV (2004-07-06 11:43:00) [17]короче, напиши
var
C: TComponent
begin
C. {задумайся, всплывет подсказка, в ней все методы}
TComponent. {задумайся, всплывет подсказка, в ней только классовые методы}
TUser (2004-07-06 09:06:00) [18]Да, правда. Невнимателен был, прошу пардона.
SPeller (2004-07-06 09:02:00) [19]
> А то, что "живой пример" работает - я склонен списать на
> случайности
Нет, это не случайность. Я могу вам гарантировать что любой метод класса будет нормально работать в таких условиях только в том случае, если он не обращается к полям класса. Потому что при обращении к полям используется значение Self, которое содержит мусор, что и вызывает AV. Нет обращений к полям - нет обращений к Self - нет никаких AV.
SPeller (2004-07-06 08:58:00) [20]
> TUser © (06.07.04 08:47) [9]
Посмотрите внимательно на этот кусок кода:
var
F: TForm1;
begin
Caption := IntToStr(F.SomeFunc);
Где здесь что-либо создается?