Форум: "Прочее";
Текущий архив: 2008.03.23;
Скачать: [xml.tar.bz2];
Вниз
Можно ли у произвольного рекорда узнать названия полей и их типы? Найти похожие ветки
← →
Land (2008-02-11 02:23) [0]То есть хочу написать функцию, чтобы я ей произвольный рекорд, а она мне текстом расписывает все его поля и их значения. Такое возможно?
← →
ketmar © (2008-02-11 02:28) [1]используй классы.
---
Understanding is not required. Only obedience.
← →
Land (2008-02-11 02:30) [2]Так всем и передам. Пусть все используют классы.
← →
ketmar © (2008-02-11 02:32) [3]>[2] Land (2008-02-11 02:30:00)
молодец. так и передай.
---
Understanding is not required. Only obedience.
← →
Германн © (2008-02-11 02:39) [4]
> Land (11.02.08 02:23)
Ещё передай, что те кто "хочет написать функцию, чтобы они ей произвольный рекорд, а она им текстом расписывает все его поля и их значения" - полные идиоты.
При передаче можешь сослаться на меня. :)))
← →
Land (2008-02-11 03:02) [5]Передавайте всё сами, а вопрос остаётся стоять.
← →
wicked © (2008-02-11 03:05) [6]в делфи так напрямую нельзя
говорят, что так можно делать в точкаНЕТ, джаве и обероне...
← →
Германн © (2008-02-11 03:12) [7]
> Land (11.02.08 03:02) [5]
>
> Передавайте всё сами, а вопрос остаётся стоять.
>
Ну и пусть стоит вопрос. А кому он мешает? Мне лично - не мешает.
P.S. Мало ли что, где стоит. :)
P.P.S. Хочешь написать функцию - напиши, если "такой умный" :)
← →
boa_kaa © (2008-02-11 03:19) [8]
> wicked © (11.02.08 03:05) [6]
(облизываясь) можно... еще как... :)
← →
ferr (2008-02-11 04:05) [9]интроспекцией и рефлексией славятся скриптовые языки..
← →
Произвольный рекорд (2008-02-11 09:06) [10]Удачи ;)
TVarData = packed record
VType: Word;
Reserved1, Reserved2, Reserved3: Word;
case Integer of
varSmallint: (VSmallint: Smallint);
varInteger: (VInteger: Integer);
varSingle: (VSingle: Single);
varDouble: (VDouble: Double);
varCurrency: (VCurrency: Currency);
varDate: (VDate: Double);
varOleStr: (VOleStr: PWideChar);
varDispatch: (VDispatch: Pointer);
varError: (VError: LongWord);
varBoolean: (VBoolean: WordBool);
varUnknown: (VUnknown: Pointer);
varByte: (VByte: Byte);
varString: (VString: Pointer);
varAny: (VAny: Pointer);
varArray: (VArray: PVarArray);
varByRef: (VPointer: Pointer);
end;
← →
@!!ex © (2008-02-11 09:20) [11]Автор, я отвечу на твой вопрос после того, как ты мне расскажешь, как собираешься в функцию передавать проивзольный рекорд.
← →
MsGuns © (2008-02-11 09:21) [12]>wicked © (11.02.08 03:05) [6]
>в делфи так напрямую нельзя
Хоть прямо, хоть криво узнать нельзя в любом компилляторе. А вот в интерпретаторе можно.
Автору сабжа контрвопрос: можно ли по купленной в маркете свиной вырезке узнать имя кабанчика, из которого ее "вырезали" ?
И вдогонку - а зачем собственно ?
← →
Anatoly Podgoretsky © (2008-02-11 10:18) [13]> Германн (11.02.2008 03:12:07) [7]
Когда стоит то не мешает.
← →
Dmitry S © (2008-02-11 10:32) [14]
> @!!ex © (11.02.08 09:20) [11]
расскажи мне:
function GetRecordInfo(ARecord: Pointer; ARecordSize: Integer):string;
Передавать так:
GetRecordInfo(@SomeRecord, SizeOf(SomeRecord));
← →
Игорь Шевченко © (2008-02-11 10:34) [15]
> Автор, я отвечу на твой вопрос после того, как ты мне расскажешь,
> как собираешься в функцию передавать проивзольный рекорд.
>
через var ?
← →
Dib@zol © (2008-02-11 10:36) [16]> [14] Dmitry S © (11.02.08 10:32)
Нет, это-то понятно. Только как трактовать эти данные? Какие байты из этого куска памяти должны "сложиться" в WORD"ы, а какие - в DWORD"ы, или в знаковые типы?
← →
Dib@zol © (2008-02-11 10:37) [17]Ах да. Можно стоп-битами :)
← →
Dmitry S © (2008-02-11 10:38) [18]
> Нет, это-то понятно. Только как трактовать эти данные? Какие
> байты из этого куска памяти должны "сложиться" в WORD"ы,
> а какие - в DWORD"ы, или в знаковые типы?
@!!ex сейчас покажет как :)
← →
Skyle © (2008-02-11 10:47) [19]Удалено модератором
← →
Dib@zol © (2008-02-11 10:48) [20]> [0] Land (11.02.08 02:23)
Вощем так. Каждый RECORD в памяти хранится как цепочка байтов без всяких условных обозначений. "Разбивает" её на отдельные значения сама программа. И если не влезать в программный код и не искать дизассемблером что-то типа MOVZX EAX, WORD PTR [EBP+2], то задача в общем случае не решаема. Хотя в принципе, если уж так надо, то можно в эту цепочку действительно добавить по два стоп-бита после каждого байта: первый отвечает за знаковость типа, второй - за необходимость отделения, то есть ...1010 1101 11... означает, что это один байт знакового типа (shortInt).
← →
Dmitry S © (2008-02-11 10:50) [21]
> Dib@zol © (11.02.08 10:48) [20]
А как же строки?
← →
Skyle © (2008-02-11 10:50) [22]
> Dib@zol © (11.02.08 10:48) [20]
По-моему правильнее будет не заниматься хиромантией, а использовать наследников TPersistent (или свои классы с M+).
← →
Dib@zol © (2008-02-11 10:52) [23]> [21] Dmitry S © (11.02.08 10:50)
А так же. Строки - суть указатели. А они - типа DWORD. Признаком указателя может быть, напр, включённый стоп-бит в третьем по счёту байте. Это будет указанием, что надо-таки прочесть не три а четыре байта, но что это не просто число, а пойнтер.
← →
Dib@zol © (2008-02-11 10:54) [24]> [22] Skyle © (11.02.08 10:50)
Ну, задача была поставлена именно для записей, я и привёл пример того, что можно сотворить конкретно для записей. Не нравится - не пользуйте :) Я вот лично низашто не буду так делать :)
← →
Игорь Шевченко © (2008-02-11 11:19) [25]Кулибин в гробу от зависти перевернулся
← →
Dib@zol © (2008-02-11 11:20) [26]> [25] Игорь Шевченко © (11.02.08 11:19)
Откуда столько злобы в мой адрес?
← →
Palladin © (2008-02-11 11:24) [27]программирование не терпит предположений понимашь...
← →
Palladin © (2008-02-11 11:24) [28]иначе лучшими программистами будут гадалки...
← →
Dib@zol © (2008-02-11 11:29) [29]А тут и не предположения будут. А точные данные :)
Правда придёца всю систему работы с RECORD-ами перекраивать... Однако меня это уже не касаецо. Моё дело предложить =)
← →
Marser © (2008-02-11 11:47) [30]
> Однако меня это уже не касаецо. Моё дело предложить =)
Это как в анекдоте про ёжиков и дядю Филина, как, мол, нам сделать так, чтобы нас лиса не кушала? - Вы, ёжики, себе крылья отрастите и лиса вым будет нестрашна. - Ура, классно! Пошли ёжики довой и на полпути их осенило, пришлось вернуться: - дядя Филин, а как же нам их отрастить-то? - Э-э, ёжики, это уж вам думать, как, а моё дело стратегия.
← →
Skyle © (2008-02-11 11:48) [31]Ну тогда я тоже предложу....
В любом входящем рекорде первое поле - длина описание, второе - указатель на него. То есть все рекорды начинаются с
TMyBaseRecord = record
DescLen : Word;
Desc : String;
......
а все проблемы с памятью - за счёт заведения.
← →
Kerk © (2008-02-11 11:50) [32]
> Dib@zol © (11.02.08 11:20) [26]
> > [25] Игорь Шевченко © (11.02.08 11:19)
>
> Откуда столько злобы в мой адрес?
Это все от зависти
← →
Palladin © (2008-02-11 11:51) [33]...вот так слово за слово и пршли они к RTTI...
← →
Palladin © (2008-02-11 11:56) [34]
> Можно ли у произвольного рекорда узнать названия полей и
> их типы?
понимаешь... записи оно на то сделаны, дабы компилятор имел некое логическое представление о физическом наполнении... усе, а остальные задачи решаются при помощи других инструментов и возможностей компилятора... нефиг ложкой консерву открывать... она не для того сделана...
← →
DiamondShark © (2008-02-11 12:11) [35]
> MsGuns © (11.02.08 09:21) [12]
>
> Хоть прямо, хоть криво узнать нельзя в любом компилляторе.
> А вот в интерпретаторе можно.
Поражающее глубиной невежества заявление.
← →
Anatoly Podgoretsky © (2008-02-11 12:14) [36]> Dib@zol (11.02.2008 11:29:29) [29]
Твоя задача наложить кучу в углу и убежать.
← →
Ins © (2008-02-11 12:20) [37]Автору:
Для того, чтобы решить вашу задачу, доджны соблюдаться два условия:
1. Для рекордов должна генерироваться RTTI, содержащая информацию о ее полях и их типах.
2. Должна существовать возможность, имея ссылку на рекорд в памяти, получить ссылку на соответствующую ей RTTI.
Для рекордов в Delphi ни одно из этих условий не выполняется, зато для классов:
1. Для всех классов, скомпилированными с директивой $M+ или их потомков (в VCL - это все потомки класса TPersistent) генерируется RTTI об опубликованных свойствах.
2. У класса TObject, а соответствено у всех его потомков, есть метод ClassInfo, позволяющий по объектной ссылке получить указатель на RTTI.
← →
Sandman25 (2008-02-11 12:25) [38]DiamondShark © (11.02.08 12:11) [35]
Формально он прав.
Потому как "компилЛяторов" не существует :)
← →
Dib@zol © (2008-02-11 12:55) [39]> Твоя задача наложить кучу в углу и убежать.
Высказывание, достойное убелённого сединами старца :\
Вот одного не понимаю: чего ж я такого сказал, что это подняло волну ненависти?
← →
Kerk © (2008-02-11 13:07) [40]
> DiamondShark © (11.02.08 12:11) [35]
> Sandman25 (11.02.08 12:25) [38]
Осторожнее, сейчас он вам про люмпенов расскажет :))
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2008.03.23;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.008 c