Форум: "Основная";
Текущий архив: 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