Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.30;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.014 c
11-99509
DrFaust
2003-04-16 11:24
2003.12.30
Additional visual components (in other packages):


8-99650
Kaylang
2003-08-20 14:20
2003.12.30
Где можно найти нормальную информацию по TChart?


1-99593
Tumcoat
2003-12-16 03:03
2003.12.30
Как программно в Word-е добавить таблицу?


3-99500
Ru
2003-12-04 11:35
2003.12.30
Об SQL


11-99512
Ал
2003-04-08 14:34
2003.12.30
Где поучиться использовать MHToolTip?