Во-первых, если вы хотите объединить классический TList с записями, вам необходимо:
- Распределить записи в куче, а не в стеке.Используйте GetMem, как сделал Реми.
- Возьмите адрес записи и добавьте его в TList.
- При удалении элемента из списка и использовании его разыменовывайте его:
- Не забудьте освободить иочистите, потом.
Для объединения списков с записями требуется так много работы по управлению указателями и кучей, что такая техника будет только в пределах возможностей эксперта.
Альтернативы тому, о чем вы просили, все еще используют что-то, называемое «TList», включая использование TList в стиле generics.collections с типами Record, которые будут иметь все преимущества TList, но потребуют от вас много-record-копии, чтобы получить данные в него.
Наиболее идиоматические способы Delphi, чтобы сделать то, что вы просите, это:
использование TList или TObjectList с классомТипы вместо записи.Обычно в этом случае вы создаете подклассы TList или TObjectList.
Используйте динамический массив типов записей, но имейте в виду, что сортировать тип массива труднее, и что при расширении массиваТип во время выполнения не такой быстрый, как с TList.
Используйте generics.Collections TList с вашими классами.Это позволяет избежать создания подклассов TList или TObjectList каждый раз, когда вы хотите использовать список с другим классом.
Пример кода с динамическими массивами:
TMyRec = record
///
end;
TMyRecArray = array of TMyRec;
procedure Demo;
var
myRecArray:TMyRecArray;
begin
SetLength(myRecArray,10);
end;
сейчасДля получения некоторой справочной информации о том, почему TList нелегко использовать с типами записей:
TList лучше подходит для использования с типами классов, поскольку переменная типа 'TMyClass', где 'тип TMyClass = class .... конец;'может быть легко «упомянута» как значение указателя, которое и хранит TList.
Переменные типа Record являются типами-значениями в Delphi, в то время как значения классов неявно являются ссылочными значениями.Вы можете думать о ссылочных значениях как о невидимых указателях.Вам не нужно разыменовывать их, чтобы получить их содержимое, но когда вы добавляете его в TList, вы фактически просто добавляете указатель на TList, а не делаете копию или выделяете какую-либо новую память.
Ответ Реми буквально показывает вам, как сделать точно то, что вы хотите, и я пишу свой ответ только потому, что хочу предупредить вас о деталях того, что вы спрашиваете,и предложить вам рассмотреть альтернативы тоже.