powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Добавить элемент к динамическому массиву
25 сообщений из 35, страница 1 из 2
Добавить элемент к динамическому массиву
    #39460269
sql.ru/forum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот тебе задачка. Реализовать функцию, которая заменяла бы такой код:

Код: pascal
1.
2.
setlength(arr, length(arr) + 1);
arr[high(arr)] := item;



Сложная, не правда ли? Массив должен быть динамическим, а не открытым. Содержит элементы любого типа - от integer до record или ссылки на объект.
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39460289
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql.ru/forumВот тебе задачка. Реализовать функцию, которая заменяла бы такой код:

Код: pascal
1.
2.
setlength(arr, length(arr) + 1);
arr[high(arr)] := item;



Сложная, не правда ли? Массив должен быть динамическим, а не открытым. Содержит элементы любого типа - от integer до record или ссылки на объект.

Размер вознаграждения ?
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39460316
sql.ru/forum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
schi, возможность загружать анимированный аватар в профиль.
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39460408
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
594.
595.
596.
597.
598.
599.
600.
601.
602.
603.
604.
605.
606.
607.
608.
609.
610.
611.
612.
613.
614.
615.
616.
617.
618.
619.
620.
621.
622.
623.
unit ArrayEx;

interface

uses
  Generics.Defaults, Generics.Collections, System.SyncObjs, System.SysUtils;

type
  // Типы компаратора
  TCompareResult = (crLess,crEqual,crMore);
  TCompareMode = (cmAscending, cmDescending);
  // Типы функций пользовательского компаратора
  TCompareValue<T> = reference to function(const Item1,Item2: T): TCompareResult;

  // -------------------------------------------------------------------------
  // ------------------- TArrayEx (Расширенный массив) -----------------------
  // -------------------------------------------------------------------------

  {$REGION 'TArrayEx'}

  TArrayEx<T> = record
  public
    // Доступ к элементам напрямую (unsafe)
    Items      : array of T;
    // Пользовательский Тэг
    Tag        : integer;
    // Признак необходимости освобождать элементы при удалении
    DoFreeData : Boolean;
    FEnumInit  : string;
  private
    var
      FIndexMod     : integer;                      // Размер индекса
      FIndexArray   : array of array of integer;    // Элементы индекса
      FComparer     : IEqualityComparer<T>;         // Компаратор

    function GetItems(Index: integer): T; inline;
    procedure SetItems(Index: integer; const Value: T); inline;
    procedure QuickSortA(const Comparer: IComparer<T>; L, R: Integer);
    procedure QuickSortB(L, R: Integer; CompareEvt: TCompareValue<T>; Less, More: TCompareResult);
    function GetIndexMod: integer; inline;
    procedure SetIndexMod(Value: integer); inline;
    procedure HashClear(NewIndexMod: integer); inline;
    procedure HashAdd(const Value: T; Index: integer); inline;
    function GetHash(const Value: T): integer; inline;
    procedure SetIndex(Index: Integer; const Value: T); inline;
    procedure SetCount(const Value: integer); inline;
    function GetCount: integer; inline;
    function GetHigh: integer; inline;
    procedure SetHigh(const Value: integer); inline;
    function GetLow: integer; inline;
    procedure FreeElement(Num: integer); inline;
  public
    // Конструкторы
    constructor Create(DoFreeData: boolean);

    // Доступ к элементам по умолчанию
    property Elements[Index: integer]: T read GetItems write SetItems; default;

    // Очистка массива
    procedure Clear; overload;

    // Добавление элемента(ов) в конец
    function Add(Value: T): integer; overload; inline;
    function Add(Values: array of T): integer; overload;
    function AddUnique(Value: T): integer;

    // Вставка элемента по индексу
    procedure Insert(Index: integer; Value: T); overload; inline;
    procedure Insert(Index: integer; Values: array of T); overload;

    // Удаление элемента по индексу
    procedure Delete(Index: integer); inline;
    procedure DeleteRange(Index, Count: integer); inline;

    // Создание индекса по массиву
    procedure CreateIndex(IndexMod: integer = -1);
    // Уничтожение индекса по массиву
    procedure DropIndex;

    // Кол-во элементов массива
    property Count: integer read GetCount write SetCount;
    // Индекс нижнего элемента массива
    property Low: integer read GetLow;
    // Индекс верхнего элемента массива
    property High: integer read GetHigh write SetHigh;

    // Поиск значения(ий) в массиве
    function Exists(Value: T): boolean; overload;
    function Exists(Values: array of T; NeedAllValues: boolean = False): boolean; overload;
    // Индекс(ы) значения в массиве
    function IndexOf(Value: T): integer;
    function IndexesOf(Value: T): TArrayEx<integer>;

    // Сортировка
    procedure Sort(Comparer: IComparer<T> = nil); overload;
    procedure Sort(CompareEvt: TCompareValue<T>; Mode: TCompareMode = cmAscending); overload;

    // Сериализатор в строку
    function ToString: string; overload;
    function ToString(Delimeter : string): string; overload;

    class operator Add(const A,B: TArrayEx<T>): TArrayEx<T>; overload;
    class operator Add(const A: TArrayEx<T>; const B: array of T): TArrayEx<T>; overload;
    class operator Add(const A: array of T; const B: TArrayEx<T>): TArrayEx<T>; overload;
    class operator Implicit(const A: TArrayEx<T>): TArray<T>;
    class operator Equal(const A,B: TArrayEx<T>): Boolean;
    class operator NotEqual(const A,B: TArrayEx<T>): Boolean;
  end;
  {$ENDREGION}


implementation

uses TypInfo, Math, RTTI;

{ TArrayEx }

procedure TArrayEx<T>.SetCount(const Value: integer);
begin
  System.SetLength(Items,Value);
  if GetIndexMod>0 then begin
    CreateIndex(Value);
  end;
end;

procedure TArrayEx<T>.SetHigh(const Value: integer);
begin
  System.SetLength(Items,Value-1);
  if GetIndexMod>0 then begin
    CreateIndex(Value-1);
  end;
end;

procedure TArrayEx<T>.SetIndex(Index: Integer; const Value: T);
begin
  if GetIndexMod<=0 then Exit;

  if Index>=GetIndexMod then begin
    CreateIndex(Index*2);
  end else begin
    HashAdd(Value,Index);
  end;
end;

function TArrayEx<T>.GetIndexMod: integer;
begin
  if Length(FIndexArray)=0 then begin
    FIndexMod:=0;
    FComparer:=TEqualityComparer<T>.Default;
  end;
  Result:=FIndexMod;
end;

procedure TArrayEx<T>.SetIndexMod(Value: integer);
begin
  FIndexMod:=Value;
  SetLength(FIndexArray,FIndexMod);
end;

function TArrayEx<T>.Add(Value: T): integer;
begin
  Result:=Length(Items);
  System.SetLength(Items,Result+1);
  Items[Result]:=Value;

  SetIndex(Result,Value);
end;

function TArrayEx<T>.Add(Values: array of T): integer;
var
  i: Integer;
begin
  Result:=Length(Items);
  System.SetLength(Items,Result+Length(Values));
  for i:=0 to System.High(Values) do begin
    Items[Result]:=Values[i];
    SetIndex(Result,Values[i]);
  end;
end;

procedure TArrayEx<T>.Delete(Index: integer);
var
  i: Integer;
begin
  if (Index<0) or (Index>High) then Exit;

  if DoFreeData and (PTypeInfo(TypeInfo(TValue)).Kind=tkClass) then begin
    FreeElement(Index);
  end;

  for i:=Index+1 to High do begin
    Items[i-1]:=Items[i];
  end;
  System.SetLength(Items,Length(Items)-1);

  CreateIndex(GetIndexMod);
end;

procedure TArrayEx<T>.DeleteRange(Index, Count: integer);
var
  i: Integer;
begin
  if (Count<1) or (Index<0) or (Index+Count>High) then Exit;

  if DoFreeData and (PTypeInfo(TypeInfo(TValue)).Kind=tkClass) then begin
    for i:=Index to Index+Count-1 do begin
      FreeElement(i);
    end;
  end;

  for i:=Index+Count to High do begin
    Items[i-Count]:=Items[i];
  end;
  System.SetLength(Items,Length(Items)-Count);

  CreateIndex(GetIndexMod);
end;

procedure TArrayEx<T>.DropIndex;
begin
  HashClear(0);
end;

function TArrayEx<T>.IndexesOf(Value: T): TArrayEx<integer>;
var
  i,j,m    : integer;
begin
  m:=GetIndexMod;

  if m=0 then begin
    CreateIndex;
    m:=GetIndexMod;
  end;

  m:=Abs(GetHash(Value) mod m);

  Result.Clear;
  for i:=0 to System.High(FIndexArray[m]) do begin
    if FComparer.Equals(Items[FIndexArray[m,i]],Value) then begin
      Result.Add(FIndexArray[m,i]);
    end;
  end;
  Result.Sort;
end;

function TArrayEx<T>.IndexOf(Value: T): integer;
var
  i,j,m    : integer;
begin
  m:=GetIndexMod;

  if m=0 then begin
    CreateIndex;
    m:=GetIndexMod;
  end;

  m:=Abs(GetHash(Value) mod m);
  for i:=0 to System.High(FIndexArray[m]) do
    if FComparer.Equals(Items[FIndexArray[m,i]],Value) then begin
      Exit(FIndexArray[m,i]);
    end;
  Result:=-1;
end;


procedure TArrayEx<T>.Insert(Index: integer; Values: array of T);
var
  i: Integer;
begin
  if (Index<0) or (Index>Count) then Exit;

  System.SetLength(Items,Length(Items)+length(Values));
  for i:=High downto Index+length(Values) do begin
    Items[i]:=Items[i-length(Values)];
  end;

  for i:=Index to System.High(Values) do begin
    Items[Index+i]:=Values[i];
  end;

  CreateIndex(GetIndexMod);
end;

function TArrayEx<T>.GetItems(Index: integer): T;
begin
  Result:=Items[Index];
end;

function TArrayEx<T>.GetLow: integer;
begin
  Result:=0;
end;

procedure TArrayEx<T>.HashClear(NewIndexMod: integer);
begin
  System.SetLength(FIndexArray,0);
  SetIndexMod(NewIndexMod);
end;

function TArrayEx<T>.GetCount: integer;
begin
  Result:=Length(Items);
end;

function TArrayEx<T>.GetHash(const Value: T): integer;
begin
  Result:=TEqualityComparer<T>.Default.GetHashCode(Value);
end;

function TArrayEx<T>.GetHigh: integer;
begin
  Result:=System.High(Items);
end;

procedure TArrayEx<T>.HashAdd(const Value: T; Index: integer);
var
  n,m     : integer;
begin
  try
    m:=Abs(GetHash(Value) mod GetIndexMod);
    n:=length(FIndexArray[m]);
  except
  end;

  System.SetLength(FIndexArray[m],n+1);
  FIndexArray[m,n]:=Index;
end;

procedure TArrayEx<T>.FreeElement(Num: integer);
begin
  try
    PObject(@Items[num])^.Free;
    Items[num]:=Default(T);
  except
  end;
end;

procedure TArrayEx<T>.Clear;
var
  i: Integer;
begin
  if DoFreeData and (PTypeInfo(TypeInfo(TValue)).Kind=tkClass) then begin
    for i:=0 to High do begin
      FreeElement(i);
    end;
  end;
  System.SetLength(Items,0);
  HashClear(GetIndexMod);
end;

constructor TArrayEx<T>.Create(DoFreeData: boolean);
begin
  Clear;
  DoFreeData:=DoFreeData;
end;

procedure TArrayEx<T>.CreateIndex(IndexMod: integer = -1);
var
  i : integer;
const
  DefaultIndexSize = 64;
begin
  if IndexMod=-1 then begin
    IndexMod:=DefaultIndexSize;
    if Count=0 then begin
      IndexMod:=DefaultIndexSize;
    end else begin
      IndexMod:=Count;
    end;
  end;
  HashClear(IndexMod);

  if IndexMod>0 then begin
    for i:=Low to High do begin
      HashAdd(Items[i],i);
    end;
  end;
end;

procedure TArrayEx<T>.Insert(Index: integer; Value: T);
var
  i: Integer;
begin
  if (Index<0) or (Index>Count) then Exit;

  System.SetLength(Items,Length(Items)+1);
  for i:=High downto Index+1 do begin
    Items[i]:=Items[i-1];
  end;
  Items[Index]:=Value;

  CreateIndex(GetIndexMod);
end;

procedure TArrayEx<T>.SetItems(Index: integer; const Value: T);
begin
  if (Index<0) or (Index>High) then Exit;
  Items[Index]:=Value;
end;

procedure TArrayEx<T>.QuickSortA(const Comparer: IComparer<T>; L, R: Integer);
var
  I, J: Integer;
  pivot, temp: T;
begin
  if (Length(Items) = 0) or ((R - L) <= 0) then
    Exit;
  repeat
    I := L;
    J := R;
    pivot := Items[L + (R - L) shr 1];
    repeat
      while Comparer.Compare(Items[I], pivot) < 0 do
        Inc(I);
      while Comparer.Compare(Items[J], pivot) > 0 do
        Dec(J);
      if I <= J then
      begin
        if I <> J then
        begin
          temp := Items[I];
          Items[I] := Items[J];
          Items[J] := temp;
        end;
        Inc(I);
        Dec(J);
      end;
    until I > J;
    if L < J then
      QuickSortA(Comparer, L, J);
    L := I;
  until I >= R;
end;

procedure TArrayEx<T>.Sort(Comparer: IComparer<T> = nil);
var
  OIndexMod: integer;
begin
  OIndexMod:=GetIndexMod;
  if OIndexMod>0 then DropIndex;

  if Comparer=nil then Comparer:=TComparer<T>.Default;
  QuickSortA(Comparer, 0, High);

  if OIndexMod>0 then CreateIndex(OIndexMod);
end;

procedure TArrayEx<T>.QuickSortB(L, R: Integer; CompareEvt: TCompareValue<T>; Less, More: TCompareResult);
var
  I, J: Integer;
  pivot, temp: T;
begin
  if (Length(Items) = 0) or ((R - L) <= 0) then
    Exit;
  repeat
    I := L;
    J := R;
    pivot := Items[L + (R - L) shr 1];
    repeat
      while CompareEvt(Items[I], pivot) = crLess do
        Inc(I);
      while CompareEvt(Items[J], pivot) = crMore do
        Dec(J);
      if I <= J then
      begin
        if I <> J then
        begin
          temp := Items[I];
          Items[I] := Items[J];
          Items[J] := temp;
        end;
        Inc(I);
        Dec(J);
      end;
    until I > J;
    if L < J then
      QuickSortB(L, J, CompareEvt, Less, More);
    L := I;
  until I >= R;
end;

procedure TArrayEx<T>.Sort(CompareEvt: TCompareValue<T>; Mode: TCompareMode = cmAscending);
var
  OIndexMod: integer;
  Less,More: TCompareResult;
begin
  OIndexMod:=GetIndexMod;
  if OIndexMod>0 then DropIndex;

  if not Assigned(CompareEvt) then Exit;

  case Mode of
    cmAscending: begin
      Less:=crLess;
      More:=crMore;
    end;
    cmDescending: begin
      Less:=crMore;
      More:=crLess;
    end;
  end;

  QuickSortB(Low,High,CompareEvt,Less,More);

  if OIndexMod>0 then CreateIndex(OIndexMod);
end;

function TArrayEx<T>.ToString(Delimeter: string): string;
var
  i : Integer;
  n : integer;
  s : string;
begin
  Result:='';
  for i:=Low to High do begin
    if (Result<>'') then begin
      s:=Delimeter+TValue.From<T>(Items[i]).ToString;
    end else begin
      s:=TValue.From<T>(Items[i]).ToString;
    end;

    n:=Length(Result);
    SetLength(Result,n+length(s));
    Move(s[1],Result[n+1],Length(s)*SizeOf(Char));
  end;
end;

function TArrayEx<T>.ToString: string;
begin
  Result:=ToString(';');
end;

function TArrayEx<T>.Exists(Value: T): boolean;
begin
  Result:=IndexOf(Value)>=0;
end;

function TArrayEx<T>.Exists(Values: array of T; NeedAllValues: boolean = False): boolean;
var
  i: Integer;
begin
  Result:=NeedAllValues;

  for i:=0 to System.High(Values) do begin
    if NeedAllValues then begin
      if IndexOf(Values[i])<0 then Exit(False);
    end else begin
      if IndexOf(Values[i])>=0 then Exit(True);
    end;
  end;
end;

class operator TArrayEx<T>.Add(const A, B: TArrayEx<T>): TArrayEx<T>;
begin
  Result.Clear;

  SetLength(Result.Items,A.Count+B.Count);
  Move(A.Items[0],Result.Items[0],A.Count*SizeOf(T));
  Move(B.Items[0],Result.Items[A.Count],B.Count*SizeOf(T));
  if length(A.FIndexArray)>0 then begin
    Result.CreateIndex;
  end;
end;


class operator TArrayEx<T>.Add(const A: TArrayEx<T>; const B: array of T): TArrayEx<T>;
begin
  Result.Clear;

  SetLength(Result.Items,A.Count+length(B));
  Move(A.Items[0],Result.Items[0],A.Count*SizeOf(T));
  Move(B[0],Result.Items[A.Count],length(B)*SizeOf(T));
  if length(A.FIndexArray)>0 then begin
    Result.CreateIndex;
  end;
end;

class operator TArrayEx<T>.Add(const A: array of T; const B: TArrayEx<T>): TArrayEx<T>;
begin
  Result.Clear;

  SetLength(Result.Items,length(A)+B.Count);
  Move(A[0],Result.Items[0],length(A)*SizeOf(T));
  Move(B.Items[0],Result.Items[length(A)],B.Count*SizeOf(T));
  if length(B.FIndexArray)>0 then begin
    Result.CreateIndex;
  end;
end;

function TArrayEx<T>.AddUnique(Value: T): integer;
begin
  Result:=IndexOf(Value);
  if Result<0 then begin
    Result:=Add(Value);
  end;
end;

class operator TArrayEx<T>.Implicit(const A: TArrayEx<T>): TArray<T>;
begin
  SetLength(Result,A.Count);
  Move(A.Items[0],Result[0],A.Count*SizeOf(T));
end;

class operator TArrayEx<T>.Equal(const A, B: TArrayEx<T>): Boolean;
var
  i        : integer;
  Comparer : IEqualityComparer<T>;
begin
  if length(A.Items)<>length(B.Items) then Exit(False);
  Comparer:=TEqualityComparer<T>.Default;

  for i:=0 to System.High(A.Items) do begin
    if Comparer.Equals(A.Items[i],B.Items[i]) then Exit(False);
  end;
  Result:=True;
end;

class operator TArrayEx<T>.NotEqual(const A, B: TArrayEx<T>): Boolean;
begin
  Result:=not (A=B);
end;

end.

...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39460420
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
var
  Arr: TArrayEx<integer>;
begin
  Arr.Add(Item);
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39460424
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Код: pascal
1.
2.
3.
4.
var
  Arr: TArrayEx<integer>;
begin
  Arr.Add(Item);

а ларчик просто открывался!
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39460939
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И где награда?
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39460950
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чем стандартный TList<Integer> не устроил?
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39460951
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDi,

Дык это же не массив.
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39461006
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatJaDi,

Дык это же не массив.
ведёт себя как массив, выглядит как массив -> наверное и есть массив
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39461037
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что вы гоните

В новых версиях можно плюсовать массивы
А в старых (под дженерики) делается так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
type
  TArrayHeler = class helper for TArray
    class procedure Add<T>(var Items: TArray<T>; const Value: T); static;
  end;

class procedure TArrayHelper.Add<T>(var Items: TArray<T>; const Value: T);
var 
  Count: Integer;
begin
  Count := Length(Items);
  SetLength(Items, Count + 1);
  Items[Count] := Value;
end;



Для очень старых Delphi без дженериков есть целый модуль, принимающий в качестве параметра TypeInfo. Там и добавление, и вставка, и удаление. Но за дополнительную плату :)
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39461060
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

Что, и со
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39461061
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)rgreatJaDi,

Дык это же не массив.
ведёт себя как массив, выглядит как массив -> наверное и есть массивЧто, прямо таки без Create и Free работает? ;)
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39461064
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Это мелочи по сравнению с тем, что придется в проект тащить левый код на сотню строк кода.
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39461069
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUЧто вы гоните

В новых версиях можно плюсовать массивы
А в старых (под дженерики) делается так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
type
  TArrayHeler = class helper for TArray
    class procedure Add<T>(var Items: TArray<T>; const Value: T); static;
  end;

class procedure TArrayHelper.Add<T>(var Items: TArray<T>; const Value: T);
var 
  Count: Integer;
begin
  Count := Length(Items);
  SetLength(Items, Count + 1);
  Items[Count] := Value;
end;



Seattle.
Код: pascal
1.
2.
3.
4.
var
  x : TArray<integer>;
begin
  x.add(1);

- не работает.
[dcc32 Error] Unit12.pas(34): E2018 Record, object or class type required

Что я не так делаю?
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39461070
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDirgreat,

Это мелочи по сравнению с тем, что придется в проект тащить левый код на сотню строк кода.
А-ха-ха!
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39461075
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

TArray.Add<Integer>(x, 1)

uses Generics.Collections
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39461077
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUrgreat,

TArray.Add<Integer>(x, 1)

uses Generics.CollectionsА, вот что имелось в виду.
Ну, прямо скажем, это совсем не так удобно и наглядно как прямой x.add(1).
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39461079
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
  TBoxValue = array of TValue;



http://docwiki.embarcadero.com/Libraries/XE2/en/System.Rtti.TValue
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39461083
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

Уж лучше тогда variant.
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39461086
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Ну тогда подойдёт стандартный TList<T>
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39461089
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда пойдет, а когда и нет.

Я у себя в ПО вместо обычных массивов теперь TArrayEx пользую. Очень удобно, при сохранении плюсов обычного array.
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39461094
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

И это ты говоришь автору Rapid.Generics :)
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39461096
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

А у тебя там есть есть "неклассовые" контейнеры? :)
...
Рейтинг: 0 / 0
Добавить элемент к динамическому массиву
    #39461114
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUЧто вы гоните

В новых версиях можно плюсовать массивы

походу я что-то пропустил.
Плюсовать массивы - это как?
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Добавить элемент к динамическому массиву
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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