Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Что с методом TObject.FieldAdress?

1.9K
02 апреля 2009 года
Borland_prog
149 / / 25.01.2006
Всем здравствуйте. уважаемые программисты.

Вопрос относится в частноси к 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]
5
02 апреля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Borland_prog
Всем здравствуйте. уважаемые программисты.

Вопрос относится в частноси к Delphi 7 Enterprise.
такой вопрос: кто-нибудь использовал на практике метод объекта ТObject FieldAdress?

Этот метод используется такими инструментами, как Object Inspector для поддержки визуального проектирования.
Сейчас уже не помню (на делфи черте сколько не программировал), но он несколько бесполезен - доступ к полям совсем не нужен, так как это небезопасно, свойства надежнее.

3.7K
02 апреля 2009 года
0nni
326 / / 24.06.2008
Может быть вам RTTI нужно? Тоже позволяет обращяться к Published полям по имени.
14
03 апреля 2009 года
Phodopus
3.3K / / 19.06.2008
А мне чего-то вспомнилось что лоадер форм из ресурсов через эту штуку выставляет Properties, не вызывая их метода Set (write). Но точно не уверен - умной книжки нет под рукой.

Да. Как показало исследование, метод выдает ссылки только на потомков TComponent (те что в Object Inspector-е о котором говорит hardcase) или что-то подобное. ClientHeight у формы не прокатывает.
303
03 апреля 2009 года
makbeth
1.0K / / 25.11.2004
По моему, это должно работать, только если для класса сгенерена RTTI (у TComponent и наследников это так). Можно попробовать включить для класса генерацию RTTI (есть спец. директива компилятора, правда, не помню, какая).
14
03 апреля 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: makbeth
По моему, это должно работать, только если для класса сгенерена RTTI (у TComponent и наследников это так). Можно попробовать включить для класса генерацию RTTI (есть спец. директива компилятора, правда, не помню, какая).


хм. я директиву генерения RTTI только у билдера видел. кажется у дельфи всегда ON..
и тем не менее для потомка TComponent, а именно TForm можно получить адрес только свойства-компонента. Адрес published свойства ClientHeight получить не удается..

 
Код:
TfrmMain = class(TForm)
    ActionList: TActionList; <-- вот этих
    MainMenu: TMainMenu; <-- можно
303
06 апреля 2009 года
makbeth
1.0K / / 25.11.2004
Цитата: Phodopus
кажется у дельфи всегда ON..


Нет.

Цитата: Phodopus
Адрес published свойства ClientHeight получить не удается..


Что-то я себе мало представляю field address свойства ClientHeight...

44K
07 апреля 2009 года
OCTAGRAM
30 / / 11.03.2009
Цитата: Phodopus
и тем не менее для потомка TComponent, а именно TForm можно получить адрес только свойства-компонента.

Потому что адрес есть только у компонента.

Цитата: Phodopus
Адрес published свойства ClientHeight получить не удается..

А его и нету. Свойство можно считывать и устанавливать. Брать адрес можно только у published компонент.


Цитата: Phodopus
 
Код:
TfrmMain = class(TForm)
    ActionList: TActionList; <-- вот этих
    MainMenu: TMainMenu; <-- можно



Это, кстати, не свойства. Это просто компоненты.

14
07 апреля 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: makbeth
Нет.
Что-то я себе мало представляю field address свойства ClientHeight...


не могли бы вы поискать эту опцию.. (интересно)
согласен, с ClientHeight плохой пример привел, оно походу вычисляемое. .DoubleBuffered лучше (там поле FDoubleBuffered есть).

44K
07 апреля 2009 года
OCTAGRAM
30 / / 11.03.2009
Цитата: Phodopus
там поле FDoubleBuffered есть.



Поле–то есть, вот только published ли оно? Я думаю, свойство published, а поле — нет.

А что за опция? Если для управления RTTI, так это {$M+} или {$TYPEINFO ON}

14
07 апреля 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: OCTAGRAM
Поле–то есть, вот только published ли оно? Я думаю, свойство published, а поле — нет.


конечно нет, но я это и имел ввиду. Впрочем, ладно, и так отвлеклись от темы.
За опцию спасибо. Кстати я когда говорил "кажется у дельфи всегда ON.." я имел ввиду что совсем OFF ее не сделать - published-секции будут невозможны, а следовательно и вся VCL. Тоесть отключается-то RTTI только частично, на уровне классов. Да видимо и в билдере так, хотя та опция может отвечать за C++/RTTI.
Более в тему:

Цитата:
FieldAddress is used internally by the component streaming system to access a specified published field of an object.


Тоесть они говорят о published полях вообще, не оговариваясь про поля-компоненты.

И еще:

Код:
TfrmMain = class(TForm)
    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. Или ктулху захавал мой моцк и я уже совсем что-то не так делаю? :)
44K
07 апреля 2009 года
OCTAGRAM
30 / / 11.03.2009
Цитата: Phodopus
FieldAddress is used internally by the component streaming system to access a specified published field of an object.

Тоесть они говорят о published полях вообще, не оговариваясь про поля-компоненты.



Ну да. Поле, а не свойство. Одна и та же сущность в VCL, кстати, никогда не бывает одновременно published полем и published свойством. Я такого не видел.

Цитата: Phodopus
И еще:
Код:
TfrmMain = class(TForm)
    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. Свойство есть, а поля нет.

14
07 апреля 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: OCTAGRAM
Так тут же свойство, а не поле. Нету такого поля CoolBtn. Свойство есть, а поля нет.


А у вас получается объявить published-поле? У меня на D7 нет.
Гм. Что-то я сглючил. (Упорно писал property) Сейчас все объявляет и находит :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог