Перебор полей записи
От: OlegProv  
Дата: 15.04.05 09:58
Оценка:
Здраствуй, All!

Есть запись:
type
TEmployee = record
cNo: integer;
cName: string;
...... // еще 20 полей разных типов
end;

Как сделать сабж в цикле ?

С уважением, news.rsdn.ru.
Posted via RSDN NNTP Server 1.9
Re: Перебор полей записи
От: Dimonka Верблюд  
Дата: 15.04.05 10:34
Оценка:
Здравствуйте, OlegProv, Вы писали:

Есть запись:

type
  TEmployee = record 
    cNo: integer; 
    cName: string;
 ...... // еще 20 полей разных типов 
  end;


OP>Как сделать сабж в цикле ?


Скорее всего никак, хотя может кто поправит?..
Короче, проблема в том, что для записей нет никакой рантайм информации, поэтому максимум, что можно вытащить, так это смещение переменных. Не знаю, как это можно делать прямо на Дельфи, а из ассемблера точно можно. А вот с типом облом.
Re[2]: Перебор полей записи
От: Dimonka Верблюд  
Дата: 15.04.05 10:37
Оценка:
D>Скорее всего никак, хотя может кто поправит?..
D>Короче, проблема в том, что для записей нет никакой рантайм информации, поэтому максимум, что можно вытащить, так это смещение переменных. Не знаю, как это можно делать прямо на Дельфи, а из ассемблера точно можно. А вот с типом облом.

+ забыл сказать, что смещения переменных доступны только на этапе компиляции (впрочем как и тип). Короче — описываешь свой рекорд в массиве (смещение/тип) и обходишь его в цикле
Re: Перебор полей записи
От: Danchik Украина  
Дата: 15.04.05 11:09
Оценка:
Здравствуйте, OlegProv, Вы писали:

OP>Здраствуй, All!


OP>Есть запись:

OP>type
OP> TEmployee = record
OP> cNo: integer;
OP> cName: string;
OP> ...... // еще 20 полей разных типов
OP> end;

OP>Как сделать сабж в цикле ?


OP>С уважением, news.rsdn.ru.


Это невозможно. Delphi не вкомпиливает в исходный EXE модуль название полей записи. Это можеш проверить сам. Соответствующую строку в EXE ты не найдеш. Единственное что можно узнать это количество и тип стринговых, динамических массивов или других записей которые требуют финализации.

Вывод: нереально.
Вопрос: зачем это нужно?
Re[2]: Перебор полей записи
От: Alex.Che  
Дата: 15.04.05 11:29
Оценка:
Привет, Danchik!
Вы пишешь 15 апреля 2005:

OP>> Как сделать сабж в цикле ?

D> Это невозможно.
D> Вопрос: зачем это нужно?

Можно попытаться "наложить" одну структуру на другую...
Типа, Variant parts in records.
Но у него там не ShortString, так что, не прокатит.
А вообще, имхо, задача — чистая блажь...
Если уж так сильно неймётся, можно создать класс
и реализовать в нём всё чё нужно.

--
With best regards, Alex Cherednichenko.
Posted via RSDN NNTP Server 1.9
Re: Перебор полей записи
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 16.04.05 00:18
Оценка:
Hello OlegProv, you wrote:

> Есть запись:

> type
> TEmployee = record
> cNo: integer;
> cName: string;
> ...... // еще 20 полей разных типов
> end;
>
> Как сделать сабж в цикле ?

Отказаться от record в пользу class. Для них можно сгенерировать RTTI информацию, что позволит добится желаемого результата — перебор полей.

--
Всего хорошего, Слава
Posted via RSDN NNTP Server 1.9
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.