Что с методом TObject.FieldAdress?
Вопрос относится в частноси к Delphi 7 Enterprise.
такой вопрос: кто-нибудь использовал на практике метод объекта ТObject FieldAdress?
:confused:
В доках делфы следующая инфа:
Returns the address of a published object field.
Delphi syntax:
function FieldAddress(const Name: ShortString): Pointer;
C++ syntax:
void * __fastcall FieldAddress(const ShortString &Name);
Description
FieldAddress is used internally by the component streaming system to access a specified published field of an object. FieldAddress returns a pointer to the field if it exists. If the object has no published field by that name, FieldAddress returns nil (Delphi) or NULL (C++).
Programs should access and manipulate fields by using properties instead of FieldAddress.
Также в инете нашел что:
FieldAdress (const Name: ShortString): Pointer — возвращает адрес published-поля, имя которого задается параметром Name.
создал pusblished поле - на выходе метода всё равно(как и в случае не с паблишед полем) получаю полный 0.
метод описан в модуле System - там на ассемблере не очень ясно - что происходит (думаю если ни кто не ответит придется разбираться в реализации кода на ассемблере).
Может кто реально сталкивался? Подскажите что не так?
[COLOR=#f7f7f7]аыраметром Name.го задаетсяметром Name.[/COLOR]
Вопрос относится в частноси к Delphi 7 Enterprise.
такой вопрос: кто-нибудь использовал на практике метод объекта ТObject FieldAdress?
Этот метод используется такими инструментами, как Object Inspector для поддержки визуального проектирования.
Сейчас уже не помню (на делфи черте сколько не программировал), но он несколько бесполезен - доступ к полям совсем не нужен, так как это небезопасно, свойства надежнее.
Да. Как показало исследование, метод выдает ссылки только на потомков TComponent (те что в Object Inspector-е о котором говорит hardcase) или что-то подобное. ClientHeight у формы не прокатывает.
хм. я директиву генерения RTTI только у билдера видел. кажется у дельфи всегда ON..
и тем не менее для потомка TComponent, а именно TForm можно получить адрес только свойства-компонента. Адрес published свойства ClientHeight получить не удается..
ActionList: TActionList; <-- вот этих
MainMenu: TMainMenu; <-- можно
Потому что адрес есть только у компонента.
А его и нету. Свойство можно считывать и устанавливать. Брать адрес можно только у published компонент.
ActionList: TActionList; <-- вот этих
MainMenu: TMainMenu; <-- можно
Это, кстати, не свойства. Это просто компоненты.
Что-то я себе мало представляю field address свойства ClientHeight...
не могли бы вы поискать эту опцию.. (интересно)
согласен, с ClientHeight плохой пример привел, оно походу вычисляемое. .DoubleBuffered лучше (там поле FDoubleBuffered есть).
Поле–то есть, вот только published ли оно? Я думаю, свойство published, а поле — нет.
А что за опция? Если для управления RTTI, так это {$M+} или {$TYPEINFO ON}
конечно нет, но я это и имел ввиду. Впрочем, ладно, и так отвлеклись от темы.
За опцию спасибо. Кстати я когда говорил "кажется у дельфи всегда ON.." я имел ввиду что совсем OFF ее не сделать - published-секции будут невозможны, а следовательно и вся VCL. Тоесть отключается-то RTTI только частично, на уровне классов. Да видимо и в билдере так, хотя та опция может отвечать за C++/RTTI.
Более в тему:
Тоесть они говорят о published полях вообще, не оговариваясь про поля-компоненты.
И еще:
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FBtn: TButton;
public
{ Public declarations }
published
property CoolBtn: TButton read FBtn write FBtn;
end;
procedure TfrmMain.FormCreate(Sender: TObject);
begin
FBtn := TButton.Create(Self);
ShowMessage(IntToStr(Cardinal(FieldAddress('CoolBtn'))));
end;
также 0. Или ктулху захавал мой моцк и я уже совсем что-то не так делаю? :)
Тоесть они говорят о published полях вообще, не оговариваясь про поля-компоненты.
Ну да. Поле, а не свойство. Одна и та же сущность в VCL, кстати, никогда не бывает одновременно published полем и published свойством. Я такого не видел.
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FBtn: TButton;
public
{ Public declarations }
published
property CoolBtn: TButton read FBtn write FBtn;
end;
procedure TfrmMain.FormCreate(Sender: TObject);
begin
FBtn := TButton.Create(Self);
ShowMessage(IntToStr(Cardinal(FieldAddress('CoolBtn'))));
end;
также 0. Или ктулху захавал мой моцк и я уже совсем что-то не так делаю? :)
Так тут же свойство, а не поле. Нету такого поля CoolBtn. Свойство есть, а поля нет.
А у вас получается объявить published-поле? У меня на D7 нет.
Гм. Что-то я сглючил. (Упорно писал property) Сейчас все объявляет и находит :)