powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получение внутреннего массива TList<T>
21 сообщений из 21, страница 1 из 1
Получение внутреннего массива TList<T>
    #39884376
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У TList<T> есть такое объявление
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  TList<T> = class(TEnumerable<T>)
  private
  type
    arrayofT = array of T;
  var
    FItems: arrayofT;
 ............
  public
    property List: arrayofT read FItems;
end;

теперь я хочу этот FItems сохранить себе в переменную. Пишу
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var
  LList: TList<Integer>;
  LArr1: TArray<Integer>;
  LArr2: array of Integer;
begin
  ..........
  LArr1 := LList.List;  // Incompatible types: 'System.TArray<System.Integer>' and 'System.Generics.Collections.TList<System.Integer>.arrayofT'
  LArr2 := LList.List;  // Incompatible types: 'Dynamic array' and 'System.Generics.Collections.TList<System.Integer>.arrayofT'
  .....
end;

Что можно придумать? TList<T>.ToArray не предлагать. Хочется избежать копирования данных

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Получение внутреннего массива TList<T>
    #39884377
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вот нахрена?
взрослый же человек...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Получение внутреннего массива TList<T>
    #39884379
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UPD

Вот так

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
var
  LList: TList<Integer>;
  LArr1: TArray<Integer>;
begin
  ..........
  LArr1 := TList<Integer>(LList.List);  
  .....
end;

работает.

Никакие грабли я так не подложил?
...
Рейтинг: 0 / 0
Получение внутреннего массива TList<T>
    #39884381
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийну вот нахрена?Чтобы не лепить самому саморасширяющийся массив. Код использования такой

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
function GetList: TArray<Integer>;
var
  LList: TList<Integer>;
  LCnt: Integer;
begin
  LList := TList<Integer>.Create;
  try
    .........
    while (....) do
      LList.Add(......)
    ........
    Result :=TArray<Integer>(LList.List);
    LCnt := LList.Count;
  finally
    LList.Free;
  end;
  SetLength(Result, LCnt);
end;

Т.е. насобирали значений, потом отдали и забыли. А массив потом самоуничтожился
...
Рейтинг: 0 / 0
Получение внутреннего массива TList<T>
    #39884387
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это всё от лукавого.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Получение внутреннего массива TList<T>
    #39884396
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Единственный адекватный вариант
Код: pascal
1.
Result := LList.ToArray();



Не нарушайте инкапсуляцию...
...
Рейтинг: 0 / 0
Получение внутреннего массива TList<T>
    #39884398
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteНе нарушайте инкапсуляцию..Проперти TList.List публичное. Где нарушение инкапсуляции?

Все заработало, только SetLength нужно вызывать до уничтожения списка. Иначе данные массива обнуляются

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  LList := TList<Integer>.Create;
  try
    .........
    while (....) do
      LList.Add(......)
    ........
    Result :=TArray<Integer>(LList.List);
    SetLength(Result, LList.Count);
  finally
    LList.Free;
  end;
...
Рейтинг: 0 / 0
Получение внутреннего массива TList<T>
    #39884400
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_X-CiteНе нарушайте инкапсуляцию..Проперти TList.List публичное. Где нарушение инкапсуляции?

Все заработало, только SetLength нужно вызывать до уничтожения списка. Иначе данные массива обнуляются

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  LList := TList<Integer>.Create;
  try
    .........
    while (....) do
      LList.Add(......)
    ........
    Result :=TArray<Integer>(LList.List);
    SetLength(Result, LList.Count);
  finally
    LList.Free;
  end;


А это их косяк... Нельзя его делать публичным... Внутреннее устройство должно оставаться внутри...
...
Рейтинг: 0 / 0
Получение внутреннего массива TList<T>
    #39884430
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
type
  // Ex.: TSomeClass<T>.GetItemPtr: Ptr<T>.P
  Ptr<T> = class
  public
  type
    P = ^T;
  end;

  TArrHelper<T> = class
  public
    class procedure Delete(var Arr: TArray<T>; Index: Integer);
    class procedure Insert(var Arr: TArray<T>; Index: Integer; const Item: T);
    class procedure Grow(var Arr: TArray<T>); inline;
    class procedure Trunc(var Arr: TArray<T>); inline;
    class procedure Add(var Arr: TArray<T>; const Item: T); overload; inline;
    class procedure Add(var Arr: TArray<T>; const ArrToAdd: TArray<T>); overload;
    class function Add(var Arr: TArray<T>): Ptr<T>.P; overload;
    class function First(var Arr: TArray<T>): T; inline;
    class function FirstPtr(var Arr: TArray<T>): Ptr<T>.P; inline;
    class function Last(var Arr: TArray<T>): T; inline;
    class function LastPtr(var Arr: TArray<T>): Ptr<T>.P; inline;
  end;

{$REGION 'TArrHelper'}

// Удалить из массива Arr элемент с индексом Index и уменьшить длину массива
class procedure TArrHelper<T>.Delete(var Arr: TArray<T>; Index: Integer);
var Tail: Integer;
begin
  Finalize(Arr[Index]); // обязательно для управляемых типов (строки, динмассивы, интерфейсы)
  // Теоретически, для Index = High(Arr) (последний элемент) проверка не обязательна,
  // т.к. (High(Arr)-Index) = 0 и никакого копирования не выполнится, но при включенной
  // проверке границ FArr[Index+1] вызовет ошибку
  Tail := High(Arr) - Index;
  if Tail > 0 then
  begin
    Move(Arr[Index+1], Arr[Index], Tail*SizeOf(T));
    // В случае ссылочных типов (строки, динмассивы, интерфейсы) теперь две последних ячейки
    // ссылаются на один и тот же объект, но счетчик не увеличился. Затираем последнюю ячейку.
    ZeroMem(Arr[High(Arr)], SizeOf(T));
  end;
  Trunc(Arr);
end;

// Вставить элемент Item в массив Arr по индексу Index
class procedure TArrHelper<T>.Insert(var Arr: TArray<T>; Index: Integer; const Item: T);
var Tail: Integer;
begin
  Grow(Arr);

  // Вычисляем кол-во сдвигаемых элементов, избегая range check и лишнего захода
  // при вставке в конец.
  Tail := High(Arr) - Index;
  if Tail > 0 then
  begin
    Move(Arr[Index], Arr[Index+1], Tail*SizeOf(T));
    // В случае ссылочных типов (строки, динмассивы, интерфейсы) теперь две ячейки
    // ссылаются на один и тот же объект, но счетчик не увеличился. Затираем лишнюю ячейку.
    ZeroMem(Arr[Index], SizeOf(T));
  end;
  Arr[Index] := Item;
end;

// Увеличить длину массива на 1
class procedure TArrHelper<T>.Grow(var Arr: TArray<T>);
begin
  SetLength(Arr, Length(Arr) + 1);
end;

// Уменьшить длину массива на 1
class procedure TArrHelper<T>.Trunc(var Arr: TArray<T>);
begin
  SetLength(Arr, Length(Arr) - 1);
end;

// Добавить в конец массива Arr элемент Item
class procedure TArrHelper<T>.Add(var Arr: TArray<T>; const Item: T);
var
  Len: Integer;
begin
  Len := Length(Arr);
  SetLength(Arr, Len + 1);
  Arr[Len] := Item;
end;

// Добавить в конец массива Arr все элементы из массива ArrToAdd
class procedure TArrHelper<T>.Add(var Arr: TArray<T>; const ArrToAdd: TArray<T>);
var
  Len, i: Integer;
begin
  Len := Length(Arr);
  SetLength(Arr, Len + Length(ArrToAdd));
  for i := Low(ArrToAdd) to High(ArrToAdd) do
    Arr[Len + i] := ArrToAdd[i];
end;

// Увеличить массив Arr на 1 и вернуть указатель на последний элемент
// Варианты применения:
//   1) pItem := TArrHelper<TItem>.Add(ItemArray);
//      pItem.Field := ...
//   2) TArrHelper<TItem>.Add(ItemArray).Field := ...
class function TArrHelper<T>.Add(var Arr: TArray<T>): Ptr<T>.P;
var
  Len: Integer;
begin
  Len := Length(Arr);
  SetLength(Arr, Len + 1);
  Result := @Arr[Len];
end;

// Получить копию первого элемента
class function TArrHelper<T>.First(var Arr: TArray<T>): T;
begin
  Result := Arr[Low(Arr)];
end;

// Получить указатель на первый элемент
class function TArrHelper<T>.FirstPtr(var Arr: TArray<T>): Ptr<T>.P;
begin
  Result := @Arr[Low(Arr)];
end;

// Получить копию последнего элемента
class function TArrHelper<T>.Last(var Arr: TArray<T>): T;
begin
  Result := Arr[High(Arr)];
end;

// Получить указатель на последний элемент
class function TArrHelper<T>.LastPtr(var Arr: TArray<T>): Ptr<T>.P;
begin
  Result := @Arr[High(Arr)];
end;
{$ENDREGION}
...
Рейтинг: 0 / 0
Получение внутреннего массива TList<T>
    #39884498
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_X-CiteНе нарушайте инкапсуляцию..Проперти TList.List публичное. Где нарушение инкапсуляции?

Все заработало, только SetLength нужно вызывать до уничтожения списка. Иначе данные массива обнуляются

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  LList := TList<Integer>.Create;
  try
    .........
    while (....) do
      LList.Add(......)
    ........
    Result :=TArray<Integer>(LList.List);
    SetLength(Result, LList.Count);
  finally
    LList.Free;
  end;



_Vasilisk_...Что можно придумать? TList<T>.ToArray не предлагать. Хочется избежать копирования данных

С уважением, Vasiliskну-ну
...
Рейтинг: 0 / 0
Получение внутреннего массива TList<T>
    #39884503
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)ну-ну
Можно достать костыль и увеличить счётчик ссылок на массив вручную
...
Рейтинг: 0 / 0
Получение внутреннего массива TList<T>
    #39884504
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

там какой-то недописанный COW
по идее он без SetLength должен работать правильно, но врят ли этот баг будут править
...
Рейтинг: 0 / 0
Получение внутреннего массива TList<T>
    #39884506
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)ну-нуТы сравни возможный Move с этим
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
function TList<T>.ToArray: TArray<T>;
var
  i: Integer;
begin
  SetLength(Result, Count);
  for i := 0 to Count - 1 do
    Result[i] := Items[i];
end;
...
Рейтинг: 0 / 0
Получение внутреннего массива TList<T>
    #39884508
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)alekcvp,
там какой-то недописанный COW
по идее он без SetLength должен работать правильно, но врят ли этот баг будут править
Там приведение типов используется, поэтому и не работает, скорее всего.
...
Рейтинг: 0 / 0
Получение внутреннего массива TList<T>
    #39884513
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_kealon(Ruslan)ну-нуТы сравни возможный Move с этим
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
function TList<T>.ToArray: TArray<T>;
var
  i: Integer;
begin
  SetLength(Result, Count);
  for i := 0 to Count - 1 do
    Result[i] := Items[i];
end;


Это было давным-давно ...
...
Рейтинг: 0 / 0
Получение внутреннего массива TList<T>
    #39884515
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
var
  LArr1: TList<Integer>.arrayofT;
...
Рейтинг: 0 / 0
Получение внутреннего массива TList<T>
    #39884517
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Arefiev
Код: pascal
1.
2.
var
  LArr1: TList<Integer>.arrayofT;

_Vasilisk_
Код: pascal
1.
2.
3.
4.
  TList<T> = class(TEnumerable<T>)
  private
  type
    arrayofT = array of T;

Cannot access private symbol TList`1.arrayofT
...
Рейтинг: 0 / 0
Получение внутреннего массива TList<T>
    #39884519
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry ArefievЭто было давным-давно ...Да. XE3

В Rio так

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
function TList<T>.ToArray: TArray<T>;
begin
  if IsManagedType(T) then
    FListHelper.InternalToArrayManaged(Pointer(Result))
  else
    FListHelper.InternalToArray(Pointer(Result));
end;

procedure TListHelper.InternalToArray(var Dest: Pointer);
var
  LSize: NativeInt;
begin
  LSize := FCount;
  DynArraySetLength(Dest, FTypeInfo, 1, @LSize);
  Move(PByte(FItems)[0], PByte(Dest)[0], LSize * ElSize);
end;

procedure TListHelper.InternalToArrayManaged(var Dest: Pointer);
var
  LSize: NativeInt;
begin
  LSize := FCount;
  DynArraySetLength(Dest, FTypeInfo, 1, @LSize);
  System.CopyArray(Dest, @PByte(FItems)[0], ElType, LSize);
end;
...
Рейтинг: 0 / 0
Получение внутреннего массива TList<T>
    #39884521
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Dmitry ArefievЭто было давным-давно ...Да. XE3
Что же не любимый Delphi 7 :)
Там в 10.2/10.3 было переписано пол Generics.Collections.
...
Рейтинг: 0 / 0
Получение внутреннего массива TList<T>
    #39884968
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal,
благодарю, интересный код. дописал слегка:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
type
  // Ex.: TSomeClass<T>.GetItemPtr: Ptr<T>.P
  Ptr<T> = class
  public
  type
    P = ^T;
  end;

  TArrHelper<T> = class
  public
    class procedure Delete(var Arr: TArray<T>; Index: Integer);
    class procedure Insert(var Arr: TArray<T>; Index: Integer; const Item: T);
    class procedure Add(var Arr: TArray<T>; const Item: T); overload; inline;
    class procedure Add(var Arr: TArray<T>; const ArrToAdd: TArray<T>); overload;
    class procedure Grow(var Arr: TArray<T>; GrowSize: integer = 1); inline;
    class procedure Trunc(var Arr: TArray<T>; TruncSize: Integer = 1); inline;
    class function Add(var Arr: TArray<T>): Ptr<T>.P; overload;
    class function SetLength1(var Arr: TArray<T>): Ptr<T>.P; overload;
    class function GrowR(var Arr: TArray<T>; GrowSize: integer = 1): integer; inline;
    class function TruncR(var Arr: TArray<T>; TruncSize: Integer = 1): integer; inline;
    class function First(var Arr: TArray<T>): T; inline;
    class function FirstPtr(var Arr: TArray<T>): Ptr<T>.P; inline;
    class function Last(var Arr: TArray<T>): T; inline;
    class function LastPtr(var Arr: TArray<T>): Ptr<T>.P; inline;
    class function InArray(var Arr: TArray<T>; const Item: T; DelItem: boolean = False): boolean;
  end;


{ TArrHelper<T> }

// Удалить из массива Arr элемент с индексом Index и уменьшить длину массива
class procedure TArrHelper<T>.Delete(var Arr: TArray<T>; Index: Integer);
var Tail: Integer;
begin
  Finalize(Arr[Index]); // обязательно для управляемых типов (строки, динмассивы, интерфейсы)
  // Теоретически, для Index = High(Arr) (последний элемент) проверка не обязательна,
  // т.к. (High(Arr)-Index) = 0 и никакого копирования не выполнится, но при включенной
  // проверке границ FArr[Index+1] вызовет ошибку
  Tail := High(Arr) - Index;
  if Tail > 0 then
  begin
    Move(Arr[Index+1], Arr[Index], Tail*SizeOf(T));
    // В случае ссылочных типов (строки, динмассивы, интерфейсы) теперь две последних ячейки
    // ссылаются на один и тот же объект, но счетчик не увеличился. Затираем последнюю ячейку.
    FillChar(Arr[High(Arr)], SizeOf(T), 0);
  end;
  Trunc(Arr);
end;

// Проверить наличие элемента в массиве, дополнительно можно его сразу же удалить
class function TArrHelper<T>.InArray(var Arr: TArray<T>; const Item: T; DelItem: boolean = False): boolean;
var
 i: integer;
begin
 Result := False;
 for i := 0 to High(Arr) do
  if TComparer<T>.Default.Compare(Arr[i], Item) = 0 then
  begin
   if DelItem then
    Delete(Arr, i);
   Exit(True);
  end;
end;

class procedure TArrHelper<T>.Insert(var Arr: TArray<T>; Index: Integer; const Item: T);
var Tail: Integer;
begin
  Grow(Arr);
  // Вычисляем кол-во сдвигаемых элементов, избегая range check и лишнего захода
  // при вставке в конец.
  Tail := High(Arr) - Index;
  if Tail > 0 then
  begin
    Move(Arr[Index], Arr[Index+1], Tail*SizeOf(T));
    // В случае ссылочных типов (строки, динмассивы, интерфейсы) теперь две ячейки
    // ссылаются на один и тот же объект, но счетчик не увеличился. Затираем лишнюю ячейку.
    FillChar(Arr[Index], SizeOf(T), 0);
  end;
  Arr[Index] := Item;
end;

// Увеличить длину массива
class procedure TArrHelper<T>.Grow(var Arr: TArray<T>; GrowSize: integer = 1);
begin
  SetLength(Arr, Length(Arr) + GrowSize);
end;

// Увеличить длину массива и вернуть индекс последнего элмента
class function TArrHelper<T>.GrowR(var Arr: TArray<T>; GrowSize: integer): integer;
begin
  SetLength(Arr, Length(Arr) + GrowSize);
  Result := High(Arr);
end;

// Уменьшить длину массива
class procedure TArrHelper<T>.Trunc(var Arr: TArray<T>; TruncSize: Integer = 1);
begin
  SetLength(Arr, Length(Arr) - TruncSize);
end;

// Уменьшьть длину массива и вернуть индекс последнего элмента
class function TArrHelper<T>.TruncR(var Arr: TArray<T>; TruncSize: Integer): integer;
begin
  SetLength(Arr, Length(Arr) - TruncSize);
  Result := High(Arr);
end;

// Добавить в конец массива Arr элемент Item
class procedure TArrHelper<T>.Add(var Arr: TArray<T>; const Item: T);
var
  Len: Integer;
begin
  Len := Length(Arr);
  SetLength(Arr, Len + 1);
  Arr[Len] := Item;
end;

// Добавить в конец массива Arr все элементы из массива ArrToAdd
class procedure TArrHelper<T>.Add(var Arr: TArray<T>; const ArrToAdd: TArray<T>);
var
  Len, i: Integer;
begin
  Len := Length(Arr);
  SetLength(Arr, Len + Length(ArrToAdd));
  for i := Low(ArrToAdd) to High(ArrToAdd) do
    Arr[Len + i] := ArrToAdd[i];
end;

// Увеличить массив Arr на 1 и вернуть указатель на последний элемент
// Варианты применения:
//   1) pItem := TArrHelper<TItem>.Add(ItemArray);
//      pItem.Field := ...
//   2) TArrHelper<TItem>.Add(ItemArray).Field := ...
class function TArrHelper<T>.Add(var Arr: TArray<T>): Ptr<T>.P;
var
  Len: Integer;
begin
  Len := Length(Arr);
  SetLength(Arr, Len + 1);
  Result := @Arr[Len];
end;

// Получить копию первого элемента
class function TArrHelper<T>.First(var Arr: TArray<T>): T;
begin
  Result := Arr[Low(Arr)];
end;

// Получить указатель на первый элемент
class function TArrHelper<T>.FirstPtr(var Arr: TArray<T>): Ptr<T>.P;
begin
  Result := @Arr[Low(Arr)];
end;

// Получить копию последнего элемента
class function TArrHelper<T>.Last(var Arr: TArray<T>): T;
begin
  Result := Arr[High(Arr)];
end;

// Получить указатель на последний элемент
class function TArrHelper<T>.LastPtr(var Arr: TArray<T>): Ptr<T>.P;
begin
  Result := @Arr[High(Arr)];
end;

// Установить размер массива в 1 и вернуть указатель на единственный элемент
class function TArrHelper<T>.SetLength1(var Arr: TArray<T>): Ptr<T>.P;
begin
  SetLength(Arr, 1);
  Result := @Arr[0];
end;



Пример использования. Было/стало:

Код: pascal
1.
2.
3.
 SetLength(FCurrOvl.VectArr, Length(FCurrOvl.VectArr) + 1);
 FCurrOvl.VectArr[High(FCurrOvl.VectArr)].X := Point.X;
 FCurrOvl.VectArr[High(FCurrOvl.VectArr)].Y := Point.Y;



Код: pascal
1.
2.
3.
4.
5.
 with TArrHelper<TFVector>.Add(FCurrOvl.VectArr)^ do
 begin
  X := Point.X;
  Y := Point.Y;
 end;
...
Рейтинг: 0 / 0
Получение внутреннего массива TList<T>
    #39884976
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry ArefievЧто же не любимый Delphi 7 :)Все нет времени доставить компоненты и перетащить основные проекты на Rio. Разгребусь и буду переползать
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получение внутреннего массива TList<T>
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]