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 ()? Буду очень благодарен за разъяснение что это такое и с чем его едят.


KSergey   (2004-07-06 08:57:00) [21]

> [9] TUser ©   (06.07.04 08:47)

Вы в код из [4] SPeller ©   (06.07.04 07:36)внимательно вчитаетесь наконец?
А то, что "живой пример" работает - я склонен списать на случайности. В общем случае не любой указатель является заведомо таким, что обязтельно будет AV.


SPeller   (2004-07-06 08:56:00) [22]


> Да, можно так сказать.

А можно по указателю, который передается на эту структуру, определить размер этой структуры, т.е. если бы мы вручную выделяли память под класс, то можно ли и как узнать сколько памяти надо?


TUser   (2004-07-06 08:47:00) [23]

procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
var
 Instance: TComponent;
begin
 Instance := TComponent(InstanceClass.NewInstance);
 TComponent(Reference) := Instance;
 try
   Instance. Create(Self);
 except
   TComponent(Reference) := nil;
   raise;
 end;
 if (FMainForm = nil) and (Instance is TForm) then
 begin
   TForm(Instance).HandleNeeded;
   FMainForm := TForm(Instance);
 end;
end;


ЗЫ. Объект Форма не может возникнуть сам собой - без конструктора.


MBo   (2004-07-06 08:46:00) [24]

>То есть, на саму структуру класса, по которой создаются все экземпляры класса?
Да, можно так сказать.


SPeller   (2004-07-06 08:32:00) [25]


> TUser ©   (06.07.04 07:52) [5]
> В живом примере тоже вызывается конструктор, просто Борланд
> освободил тебя от этих забот.

Нет, ничего там не вызывается. Проверьте сами, если не верите.


> MBo ©   (06.07.04 08:06) [6]
> в классовом - на сам класс

То есть, на саму структуру класса, по которой создаются все экземпляры класса?


MBo   (2004-07-06 08:06:00) [26]

обычный метод представляет собой структуру TMethod, содержащую указатели на адрес данной функции в классе (Code), и указатель на сам объект (Data), по этому адресу хранятся данные конкретного экземпляра (выделение памяти осуществляется при вызове конструктора классовой функцией NewInstance). Self в обычно методе - указатель на экземпляр объекта, в классовом - на сам класс.


TUser   (2004-07-06 07:52:00) [27]

В живом примере тоже вызывается конструктор, просто Борланд освободил тебя от этих забот.
А отличаются они примерно так. Возьмем объект 'программист Delphi'. Его можно просклонять (один программист, много программисток), это - мотод класса. А вот напоить пивом можно только конкретный экземпляр программиста.


SPeller   (2004-07-06 07:36:00) [28]

А то что метод обращается к полям - это уже его проблема. Вызывается ведь. И в чем тогда отличие в запрете обращений к полям классовых функций и необходимости отсутствия обращений к полям класса простых методов чтобы небыло ошибки?

Вот живой пример:

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   function SomeFunc: Integer;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

function TForm1.SomeFunc: Integer;
begin
 Result := 5;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 F: TForm1;
begin
 Caption := IntToStr(F.SomeFunc);
end;


Отработает и ни на что не ругнётся, потому что к полям объекта нет обращений внутри функции. Ей абсолютно пофиг что в EAX мусор, она всё-равно туда результат запишет.


MBo   (2004-07-06 07:26:00) [29]

>обычный метод класса вызвать без создания объекта без проблем.
????

И что будет:

s:TStringList;
begin
s.add('a');


SPeller   (2004-07-06 07:23:00) [30]

Это я тоже читал, что с классами работают. Вот только не могу понять, как это?

На счет того что не требуют создания класса - дык, можно и обычный метод класса вызвать без создания объекта без проблем.


MBo   (2004-07-06 07:19:00) [31]

Хелп по Class methods.
Они работают не с экземпляром объекта, а с самим классом, так что не требуют создания объекта, но в них нельзя использовать поля и т.д. Пример - TObject.ClassName


Страницы:   1 2

Наверх

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