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

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

Class Functions


Страницы:   1 2

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);


Где здесь что-либо создается?


Страницы:   1 2

Наверх

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