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