Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.12.30;
Скачать: [xml.tar.bz2];

Вниз

TObject.FieldAddress():Pointer   Найти похожие ветки 

 
Delph   (2003-12-16 16:35) [0]

При выполнении следующего кода, указатель P всегда остается nil. Почему?

{$M+}
unit Unit1
...
type
MyType = class(TObject)
private
public
name:string;
number:integer;
end;
...

procedure Get;
var P:Pointer;
My:MyType;
begin
My:=MyType.Create;
P:=My.FieldAddress("name");
....
end;



 
Digitman   (2003-12-16 16:38) [1]

потому что член класса с именем "name" не является published


 
Ega23   (2003-12-16 16:39) [2]

Так FieldAddress на published поле указатель даёт. А если нет такого, то - nil.


 
Amoeba   (2003-12-16 16:40) [3]

Так и должно быть. Читаем Help:

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 .

Programs should access and manipulate fields by using properties instead of FieldAddress.


 
Delph   (2003-12-16 16:43) [4]

Как сделать так, чтобы член класса с именем "name" является published?


 
Тимохов   (2003-12-16 16:47) [5]

написать вместо public published


 
PVOzerski   (2003-12-16 16:47) [6]

Написать класс со свойством name, объявленным как published.


 
Digitman   (2003-12-16 16:48) [7]


> Delph


никак ... пока сам руки к этому не приложишь)


 
Amoeba   (2003-12-16 16:54) [8]


> Delph © (16.12.03 16:43) [4]
> Как сделать так, чтобы член класса с именем "name" является
> published?

Читай учебник


 
Delph   (2003-12-16 16:56) [9]

Хорошо, допустим вариант с published меня не устраивает:) Как еще я могу узнать сколько полей в классе, которому принадлежит объект, и получить доступ к каждому из них, не используя конструкцию My.name:="Something"; Я что-то слышал про таблицу RTTI. Указатель на нее я получил, что можно с ней делать?


 
Внук   (2003-12-16 17:01) [10]

>>Delph © (16.12.03 16:56) [9]
>>Указатель на нее я получил, что можно с ней делать?
Использовать для работы с published :))


 
Тимохов   (2003-12-16 17:02) [11]

Если тебя не удовлетворяет published, то у тебя должны быть весомые причины. Не расскажешь нам о них?


 
Digitman   (2003-12-16 17:02) [12]


> Я что-то слышал про таблицу RTTI


значит, ты должен знать , что RTTI хранит ран-тайм инф-цию о published-членах классов ... и ни о каких иных

отсюда - ответ на твой вопрос


 
Amoeba   (2003-12-16 17:09) [13]

Если член класса не-published, то увы...


 
Delph   (2003-12-16 17:11) [14]

>[11]
Зачем, объяснить довольно сложно, но это очень нужно:)
Конкретно, меня заинтересовал один вопрос. Допустим у меня есть модуль с описанием нескольких классов. Когда мы пишем программу и создаем объект класса, Delphi сам подсказывает какие в нем поля (и их типы), посредством всплывающих подсказок. Так почему я не могу получить эти же данные в ходе выполнения программы?:)


 
Тимохов   (2003-12-16 17:14) [15]

Потому, как дельфи, это целая среда, которая умеет разбирать дельфовый код на ходу, и помогать программеру.

В готовом exe исходного кода нет и инфы никакой кроме как о published нет...


 
Amoeba   (2003-12-16 17:14) [16]

Как это делает IDE Delphi, по-видимому есть "know how" Borland.


 
Delph   (2003-12-16 17:18) [17]

Хотите сказать, что получить эти данные никак нельзя?:(
Указатель, на поле с соотв. именем?


 
Amoeba   (2003-12-16 17:20) [18]

Доступными программисту средствами невозможно.


 
Delph   (2003-12-16 17:22) [19]

Очень, очень, очень жаль:(((((


 
Digitman   (2003-12-16 17:23) [20]


> Хотите сказать, что получить эти данные никак нельзя?:(
>


нельзя

был бы ObjectPacal в составе Делфи интерпретатором - тогда, возможно, и можно было бы


 
Amoeba   (2003-12-16 17:24) [21]

Так что ничего не попишешь...


 
Юрий Зотов   (2003-12-16 17:33) [22]

Не совсем так. В Exe есть VMT, а в ней - адреса виртуальных методов, включая public и даже protected. Кроме того, в RTTI есть информация о методах доступа к published-свойствам, хотя сами эти методы могут быть даже и private.

Поэтому кое-какая информация в run-time все же имеется.


 
Тимохов   (2003-12-16 17:35) [23]

Юрий Зотов © (16.12.03 17:33) [22]
Но имен методов там все-таки нет...


 
Delph   (2003-12-16 17:42) [24]

>Юрий Зотов © (16.12.03 17:33) [22]
Адреса виртуальных методов? А адреса public полей?


 
Amoeba   (2003-12-16 17:44) [25]

А вот этого-то там нет и не может быть.


 
Digitman   (2003-12-16 17:48) [26]


> Delph


ты пойми, что для преобразования имени члена класса в его "адрес" (для каких-то последующих действий над этим адресом) необходимо иметь в ран-тайм как минимум инф-цию об имени !

такая инф-ция имеется лишь для published-членов класса, об этом заботится компилятор, размещая эту инф-цию в RTTI


 
icWasya   (2003-12-16 18:31) [27]

>[14]
...Так почему я не могу получить эти же данные в ходе выполнения программы?:)
Эта информация находится внутри DCU файла. При линковке всё это выкидывается и см.выше



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.12.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.054 c
3-99453
Roman_kv
2003-12-05 15:58
2003.12.30
Как определить изменялись ли данные в гриде?


14-99715
Думкин
2003-12-08 08:43
2003.12.30
Встреча в Новосибирске. Отчет


1-99521
Виталя
2003-12-16 15:53
2003.12.30
Как откомпилировать приложение так чтобы оно работало с(без) dll


1-99566
Fast
2003-12-17 18:41
2003.12.30
MetaFile и PreView


1-99611
СержК
2003-12-17 10:16
2003.12.30
Количество вхождений подстроки в строку





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский