Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1203529658
voe
2008-02-20 20:47
2008.03.23
работа с координатами.


3-1193576969
alexche
2007-10-28 16:09
2008.03.23
Проблемы с ADO Connection


2-1203592121
Евгений Т.
2008-02-21 14:08
2008.03.23
Искать похожие слова


3-1191587246
BlackCat
2007-10-05 16:27
2008.03.23
Разграничение полномочий в приложении, работающем с БД


4-1184732548
Alx2k
2007-07-18 08:22
2008.03.23
Как отобразить свойства файла (как в проводнике), для нескольких файлов?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский