Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получение внутреннего массива TList<T> / 21 сообщений из 21, страница 1 из 1
01.11.2019, 16:23
    #39884376
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение внутреннего массива TList<T>
У 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
01.11.2019, 16:25
    #39884377
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение внутреннего массива TList<T>
ну вот нахрена?
взрослый же человек...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
01.11.2019, 16:26
    #39884379
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение внутреннего массива TList<T>
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
01.11.2019, 16:33
    #39884381
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение внутреннего массива TList<T>
Мимопроходящийну вот нахрена?Чтобы не лепить самому саморасширяющийся массив. Код использования такой

Код: 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
01.11.2019, 16:38
    #39884387
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение внутреннего массива TList<T>
это всё от лукавого.

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



Не нарушайте инкапсуляцию...
...
Рейтинг: 0 / 0
01.11.2019, 16:57
    #39884398
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение внутреннего массива TList<T>
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
01.11.2019, 16:59
    #39884400
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение внутреннего массива TList<T>
_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
01.11.2019, 18:18
    #39884430
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение внутреннего массива TList<T>
Код: 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
01.11.2019, 20:33
    #39884498
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение внутреннего массива TList<T>
_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
01.11.2019, 20:39
    #39884503
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение внутреннего массива TList<T>
kealon(Ruslan)ну-ну
Можно достать костыль и увеличить счётчик ссылок на массив вручную
...
Рейтинг: 0 / 0
01.11.2019, 20:44
    #39884504
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение внутреннего массива TList<T>
alekcvp,

там какой-то недописанный COW
по идее он без SetLength должен работать правильно, но врят ли этот баг будут править
...
Рейтинг: 0 / 0
01.11.2019, 20:48
    #39884506
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение внутреннего массива TList<T>
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
01.11.2019, 20:52
    #39884508
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение внутреннего массива TList<T>
kealon(Ruslan)alekcvp,
там какой-то недописанный COW
по идее он без SetLength должен работать правильно, но врят ли этот баг будут править
Там приведение типов используется, поэтому и не работает, скорее всего.
...
Рейтинг: 0 / 0
01.11.2019, 21:10
    #39884513
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение внутреннего массива TList<T>
_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
01.11.2019, 21:11
    #39884515
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение внутреннего массива TList<T>
Код: pascal
1.
2.
var
  LArr1: TList<Integer>.arrayofT;
...
Рейтинг: 0 / 0
01.11.2019, 21:14
    #39884517
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение внутреннего массива TList<T>
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
01.11.2019, 21:18
    #39884519
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение внутреннего массива TList<T>
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
01.11.2019, 21:31
    #39884521
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение внутреннего массива TList<T>
_Vasilisk_Dmitry ArefievЭто было давным-давно ...Да. XE3
Что же не любимый Delphi 7 :)
Там в 10.2/10.3 было переписано пол Generics.Collections.
...
Рейтинг: 0 / 0
04.11.2019, 15:00
    #39884968
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение внутреннего массива TList<T>
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
04.11.2019, 15:19
    #39884976
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение внутреннего массива TList<T>
Dmitry ArefievЧто же не любимый Delphi 7 :)Все нет времени доставить компоненты и перетащить основные проекты на Rio. Разгребусь и буду переползать
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получение внутреннего массива TList<T> / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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