powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Передача массива параметром
44 сообщений из 44, показаны все 2 страниц
Передача массива параметром
    #39472074
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понадобилось написать процедуру для добавления элемента в массива. Как по феншую правильнее, передать параметром переменную-массив или пойнтер на него?
=================
Док.

Win7 Ultim x64/Deb 8.7 i386:
FB 3.0.2.32703, диалект 3, SS(win)/SC(Deb),
Lazarus 1.9(r.55042); FPC 3.1.1 (r.36290), IBX by -Rik-; IBE 2017.4.19.2
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472084
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док, по феншую переменная-массив и есть пойнтер на него.
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472091
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeM,

я не зря заострил внимание на слове феншуй
Я знаю, что это одно и то же. Как настоящие пац программисты пишут?
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472097
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокКак настоящие пац программисты пишут?
От задачи зависит. Задача же не в том, чтобы передать массив, это лишь вариант её реализации.
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472100
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Док,
Зависит от того, что хочешь получить.

Есть открытые массивы, как параметр. Можно фиксированной длинны, но целиком в стек запихать. А можно и поинтер, можно и динамический.
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472101
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

т.е. с пойнтерами проще ошибиться и кода больше. Тогда предпочту переменную :)
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472108
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DesWind,

у меня динамический
Код: pascal
1.
2.
3.
4.
5.
6.
7.
type
  TMyRec = packed record
    FInt: Integer;
    FBool: Boolean;
  end;

  TRecArr = Array of TMyRec;


Вообщем-то реализовал и так, и так. Оба способа рабочие. Но поинтересовался на всякий, что моветону не случилось :)
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472130
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док, packed record, сделай так:
Код: pascal
1.
2.
3.
4.
5.
6.
type TMyData = record
 Inta : array of Integer;
 Bola : array of Boolean;
 function Add...
 function Get...
end;
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472134
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокDesWind,

у меня динамический
Код: pascal
1.
2.
3.
4.
5.
6.
7.
type
  TMyRec = packed record
    FInt: Integer;
    FBool: Boolean;
  end;

  TRecArr = Array of TMyRec;


Вообщем-то реализовал и так, и так. Оба способа рабочие. Но поинтересовался на всякий, что моветону не случилось :)

Упаковать можно так, всё это дело весит 9 байт ... Поинтер на Int64 и Extended обязательны! Эти типы очень медленно работают при выравнивании

Код: 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.
  TSPHPValue = packed record
    _Type: Byte;
    case Byte of
      0:
        (TByte: Byte);
      1:
        (TWord: WORD);
      2:
        (TCardinal: Cardinal);
      3:
        (TUInt64: UInt64);
      4:
        (TShortInt: ShortInt);
      5:
        (TSmallInt: SmallInt);
      6:
        (TInteger: NativeInt);
      7:
        (TInt64: PInt64);
      8:
        (TSingle: Single);
      9:
        (TDouble: Double);
      10:
        (TExtended: PExtended);
      11:
        (TCurrency: Currency);
      12:
        (TPointer: Pointer);
      13:
        (TBoxArray: PBoxArray);
  end;




А дальше можно написать уже функции по работе
Код: 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.
type
  PBoxArray = ^TBoxArray;
  TBoxArray = array of Byte;

  TSPHPValue = packed record
    _Type: Byte;

    procedure StringAdd(const value: string); inline;
    procedure StringSet(const value: string); inline;

    // Вернёт длину и строку только для строки
    function StringLen(): integer; inline;
    function StringGet(): UnicodeString; inline;

    // Вернёт длину и строку для каждого типа
    function GetValueLen(): integer; inline;
    function GetValueString(): UnicodeString; inline;

    // Set
    procedure SetInteger(value: IntPtr); inline;
    procedure SetInt64(value: Int64); inline;
    procedure SetSingle(value: Single); inline;
    procedure SetDouble(value: Double); inline;
    procedure SetExtended(value: Extended); inline;
    procedure SetCurrency(value: Currency); inline;
    procedure SetPointer(value: Pointer); inline;

    // Set + Plus
    procedure SetIntegerPlus(value: IntPtr); inline;
    procedure SetInt64Plus(value: Int64); inline;
    procedure SetSinglePlus(value: Single); inline;
    procedure SetDoublePlus(value: Double); inline;
    procedure SetExtendedPlus(value: Extended); inline;
    procedure SetCurrencyPlus(value: Currency); inline;
    procedure SetPointerPlus(value: Pointer); inline;

    // Set + Minus
    procedure SetIntegerMinus(value: IntPtr); inline;
    procedure SetInt64Minus(value: Int64); inline;
    procedure SetSingleMinus(value: Single); inline;
    procedure SetDoubleMinus(value: Double); inline;
    procedure SetExtendedMinus(value: Extended); inline;
    procedure SetCurrencyMinus(value: Currency); inline;
    procedure SetPointerMinus(value: Pointer); inline;

    // Set + DIV
    procedure SetIntegerDIV(value: IntPtr); inline;
    procedure SetInt64DIV(value: Int64); inline;
    procedure SetSingleDIV(value: Single); inline;
    procedure SetDoubleDIV(value: Double); inline;
    procedure SetExtendedDIV(value: Extended); inline;
    procedure SetCurrencyDIV(value: Currency); inline;
    procedure SetPointerDIV(value: Pointer); inline;

    // Set + MUL
    procedure SetIntegerMUL(value: IntPtr); inline;
    procedure SetInt64MUL(value: Int64); inline;
    procedure SetSingleMUL(value: Single); inline;
    procedure SetDoubleMUL(value: Double); inline;
    procedure SetExtendedMUL(value: Extended); inline;
    procedure SetCurrencyMUL(value: Currency); inline;
    procedure SetPointerMUL(value: Pointer); inline;

    // Set + MOD
    procedure SetIntegerMOD(value: IntPtr); inline;
    procedure SetInt64MOD(value: Int64); inline;
    procedure SetSingleMOD(value: Single); inline;
    procedure SetDoubleMOD(value: Double); inline;
    procedure SetExtendedMOD(value: Extended); inline;
    procedure SetCurrencyMOD(value: Currency); inline;
    procedure SetPointerMOD(value: Pointer); inline;

    // Set + POW
    procedure SetIntegerPOW(value: IntPtr); inline;
    procedure SetInt64POW(value: Int64); inline;
    procedure SetSinglePOW(value: Single); inline;
    procedure SetDoublePOW(value: Double); inline;
    procedure SetExtendedPOW(value: Extended); inline;
    procedure SetCurrencyPOW(value: Currency); inline;
    procedure SetPointerPOW(value: Pointer); inline;


    // SetValue

    procedure SetValue(const value: string); overload; inline;

    procedure SetValue(value: IntPtr); overload; inline;
    procedure SetValue(value: Int64); overload; inline;
    procedure SetValue(value: Single); overload; inline;
    procedure SetValue(value: Double); overload; inline;
    procedure SetValue(value: Extended); overload; inline;
    procedure SetValue(value: Currency); overload; inline;
    procedure SetValue(value: Pointer); overload; inline;

    // SetValue + Plus

    procedure SetValuePlus(value: IntPtr); overload; inline;
    procedure SetValuePlus(value: Int64); overload; inline;
    procedure SetValuePlus(value: Single); overload; inline;
    procedure SetValuePlus(value: Double); overload; inline;
    procedure SetValuePlus(value: Extended); overload; inline;
    procedure SetValuePlus(value: Currency); overload; inline;
    procedure SetValuePlus(value: Pointer); overload; inline;

    // SetValue + Minus

    procedure SetValueMinus(value: IntPtr); overload; inline;
    procedure SetValueMinus(value: Int64); overload; inline;
    procedure SetValueMinus(value: Single); overload; inline;
    procedure SetValueMinus(value: Double); overload; inline;
    procedure SetValueMinus(value: Extended); overload; inline;
    procedure SetValueMinus(value: Currency); overload; inline;
    procedure SetValueMinus(value: Pointer); overload; inline;

    // SetValue + DIV

    procedure SetValueDIV(value: IntPtr); overload; inline;
    procedure SetValueDIV(value: Int64); overload; inline;
    procedure SetValueDIV(value: Single); overload; inline;
    procedure SetValueDIV(value: Double); overload; inline;
    procedure SetValueDIV(value: Extended); overload; inline;
    procedure SetValueDIV(value: Currency); overload; inline;
    procedure SetValueDIV(value: Pointer); overload; inline;

    // SetValue + MUL
    procedure SetValueMUL(value: IntPtr); overload; inline;
    procedure SetValueMUL(value: Int64); overload; inline;
    procedure SetValueMUL(value: Single); overload; inline;
    procedure SetValueMUL(value: Double); overload; inline;
    procedure SetValueMUL(value: Extended); overload; inline;
    procedure SetValueMUL(value: Currency); overload; inline;
    procedure SetValueMUL(value: Pointer); overload; inline;

    // SetValue + MOD

    procedure SetValueMOD(value: IntPtr); overload; inline;
    procedure SetValueMOD(value: Int64); overload; inline;
    procedure SetValueMOD(value: Single); overload; inline;
    procedure SetValueMOD(value: Double); overload; inline;
    procedure SetValueMOD(value: Extended); overload; inline;
    procedure SetValueMOD(value: Currency); overload; inline;
    procedure SetValueMOD(value: Pointer); overload; inline;

    // SetValue + POW

    procedure SetValuePOW(value: IntPtr); overload; inline;
    procedure SetValuePOW(value: Int64); overload; inline;
    procedure SetValuePOW(value: Single); overload; inline;
    procedure SetValuePOW(value: Double); overload; inline;
    procedure SetValuePOW(value: Extended); overload; inline;
    procedure SetValuePOW(value: Currency); overload; inline;
    procedure SetValuePOW(value: Pointer); overload; inline;

    function GetByte: UInt8; inline;
    function GetWord: UInt16; inline;
    function GetInteger: IntPtr; inline;
    function GetInt64: Int64; inline;
    function GetShortInt: Int8; inline;
    function GetSmallInt: Int16; inline;

    function GetSingle: Single; inline;
    function GetDouble: Double; inline;
    function GetExtended: Extended; inline;
    function GetCurrency: Currency; inline;
    function GetPointer: Pointer; inline;

    function IsEqual(value: IntPtr): Boolean; overload; inline;
    function IsEqual(value: Int64): Boolean; overload; inline;
    function IsEqual(value: Single): Boolean; overload; inline;
    function IsEqual(value: Double): Boolean; overload; inline;
    function IsEqual(value: Extended): Boolean; overload; inline;
    function IsEqual(value: Currency): Boolean; overload; inline;
    function IsEqual(value: Pointer): Boolean; overload; inline;

    function GetType: Byte; inline;

    function IsType(Typ: Byte): Boolean; inline;

    function IsNULL: Boolean; inline;
    function IsInteger: Boolean; inline;
    function IsInt64: Boolean; inline;
    function IsSingle: Boolean; inline;
    function IsDouble: Boolean; inline;
    function IsExtended: Boolean; inline;
    function IsCurrency: Boolean; inline;
    function IsPointer: Boolean; inline;

    function isset(): Boolean; inline;
    function empty(): Boolean; inline;

    case Byte of
      0:
        (TByte: Byte);
      1:
        (TWord: WORD);
      2:
        (TCardinal: Cardinal);
      3:
        (TUInt64: UInt64);
      4:
        (TShortInt: ShortInt);
      5:
        (TSmallInt: SmallInt);
      6:
        (TInteger: NativeInt);
      7:
        (TInt64: PInt64);
      8:
        (TSingle: Single);
      9:
        (TDouble: Double);
      10:
        (TExtended: PExtended);
      11:
        (TCurrency: Currency);
      12:
        (TPointer: Pointer);
      13:
        (TBoxArray: PBoxArray);
  end;

...
Рейтинг: 0 / 0
Передача массива параметром
    #39472166
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeMДок, packed record, сделай так
зашел уточнить, а тут переписывать уже много чего надо. Так и на целый компонент можно написать
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472183
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокBred eFeM,

я не зря заострил внимание на слове феншуй
Я знаю, что это одно и то же. Как настоящие пац программисты пишут?

Ты зарплату за феншуй получаешь ?
Просто интересно...
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472191
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi,

В человеке коде все должно быть прекрасно... ©. Иначе мой перфекционизм не даст мне спать по ночам :)

зы. а зарплату я за другое получаю. Пока...
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472241
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокПонадобилось написать процедуру для добавления элемента в массива. Как по феншую...
Феншуйно & инлайново на 100%:
Код: pascal
1.
2.
SetLength(Arr, Length(Arr) + 1);
Arr[High(Arr)] := NewItem;


А когда нужно в цикле добавить 1000 элементов, то еще и быстро:
Код: pascal
1.
2.
3.
4.
i := Length(Arr);
SetLength(Arr, i + 1000);
for i := i to High(A) do 
  Arr[i] := GetNewItem()
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472269
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докschi,

...Иначе мой перфекционизм не даст мне спать по ночам :)



С этим спорить безусловно трудно :) А что, в самом Лазарусе нет примеров передачи массива ? Наверное там и есть феншуй, феншуйнее вроде некуда...
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472327
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если возникает вопрос регулярного добавления/удаление элементов из массива, то, обычно, логичнее использовать TList<T>
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472340
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Если возникает вопрос регулярного добавления/удаление элементов из массива, то, обычно, логичнее использовать TList<T>
+1
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472353
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДФеншуйно & инлайново на 100%
а если тебе надо вставить третий элемент? :)

schiА что, в самом Лазарусе нет примеров передачи массива ?
не нашел.

_Vasilisk_логичнее использовать TList<T>
это Лазарь, не дельфи

зы. короче, можно топ закрыть.
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472370
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док_Vasilisk_логичнее использовать TList<T>
это Лазарь, не дельфи

В дельфи это есть.
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472377
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докэто Лазарь, не дельфиТогда чуть более геморройно. TList + GetMem/FreeMem на добавление/удаление элементов. Я в D2006 так делал
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472379
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_+ GetMem/FreeMemА если элемент влазит в SizeOf(Pointer), то обычным кастом
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472382
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокчччДФеншуйно & инлайново на 100%
а если тебе надо вставить третий элемент? :)
...
Просто в этом случае старайся не использовать массивы.
Если "на выходе" все же требуется массив - сформируй его в момент, когда все данные уже стабильны.
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472383
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_GetMem/FreeMem_Vasilisk_то обычным кастомне забывая про инициализацию/финализацию управляемых типов
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472385
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_TList + GetMem/FreeMem
Это еще более геморройнее, чем работа с указателями. Лучше не преумножать сущности без необходимости :)
НяшикВ дельфи это есть
у меня Лазарь.
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472388
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

У меня код
Код: pascal
1.
2.
3.
SetLength(A, 0);
for i := 0 to Count - 1 do
  SetLength(A, Length(A) + 1);

бросал Out of memory. При этом код
Код: pascal
1.
SetLength(A, Count);

работал на ура
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472393
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док...
НяшикВ дельфи это есть
у меня Лазарь.

http://wiki.freepascal.org/Templates
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472412
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДПросто в этом случае старайся не использовать массивы
Для отображения на клиенте мне нужно некоторым образом перетасовать данные из датасета, не дергая сервер, и в зависимости от условий добавить/удалить часть произвольных записей. Выбор пока между датасетом с включенным CachedUpdates и каким-нибудь упорядоченным множеством.

Вот пока смотрю, где геморроя меньше
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472421
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокЭто еще более геморройнееНичуть. Это один раз написанный правильный абстрактный класс.

Как-то так
Код: 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.
TMyAbstractList = class
private
  FList: TList;
  FSize: Integer;
protected
  property Size: Integer read FSize;
protected
  procedure Get(AIdx, out AVal);
  procedure Set(AIdx, const AVal);
  procedure CopyData(const AFrom; out ATo); virtual; abstract;
  procedure FinalizeData(var AData); virtual; abstract;
public
  constructor Create(ASize: Integer);
  destructor Destroy; override;
  procedure Add(const AData);
  procedure Delete(AIdx: Integer);
  procedure Clear;
end;

TMyFixedList = class(TMyAbstractList)
protected
  procedure CopyData(const AFrom; out ATo); override;
  procedure FinalizeData(var AData); override;
end;

{ TMyAbstractList }

constructor TMyAbstractList.Create(ASize: Integer);
begin
  inherited Create;
  FList := TList.Create;
  FSize := ASize;
end;

destructor TMyAbstractList.Destroy; 
begin
  Clear;
  FList.Free;
  inherited Destroy;
end;

procedure TMyAbstractList.Get(AIdx, out AVal);
begin
  CopyData(FList[AIdx]^, AVal);
end;

procedure TMyAbstractList.Set(AIdx, const AVal);
begin
  CopyData(AVal, FList[AIdx]^);
end;

procedure TMyAbstractList.Add(const AData);
var
  LPtr: Pointer;
begin
  GetMem(LPtr, FSize);
  FillChar(LPtr, FSize, 0);
  CopyData(AVal, LPtr^);
  FList.Add(LPtr);
end;

procedure TMyAbstractList.Delete(AIdx: Integer);
var
  LPtr: Pointer;
begin
  LPtr := FList[AIdx];
  FinalizeData(LPtr^);
  FreeMem(LPtr);
  FList.Delete(AIdx);
end;

procedure TMyAbstractList.Clear;
var
  Li: Integer;
begin
  for Li := FList.Count - 1 downto 0 d0
    Delete(Li);
end;

{ TMyFixedList }

procedure TMyFixedList.CopyData(const AFrom; out ATo); 
begin
  Move(AFrom, ATo, Size);
end;

procedure TMyFixedList.FinalizeData(var AData); override;
begin
  // not need finalize
end;

...
Рейтинг: 0 / 0
Передача массива параметром
    #39472425
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И зачем тут абстрактный класс?...

Обычного бы хватило.
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472439
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокчччДПросто в этом случае старайся не использовать массивы
Для отображения на клиенте мне нужно некоторым образом перетасовать данные из датасета, не дергая сервер, и в зависимости от условий добавить/удалить часть произвольных записей. Выбор пока между датасетом с включенным CachedUpdates и каким-нибудь упорядоченным множеством.

Вот пока смотрю, где геморроя меньше
Ну вот, а ты - "массивы"...

Есть датасеты, которые умеют делать локальную фильтрацию и локальную сортировку. TpFIBPlus, например. Ах да, у тебя же лазарус...

Ну, есть библиотека Ehlib. В ней - отличный датасет с локальной сортировкой и локальной фильтрацией. А также отличный грид с локальной сортировкой и фильтрацией. Не?

В любом случае, массивы тут - плохой выбор.
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472490
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокDesWind,

у меня динамический
Код: pascal
1.
2.
3.
4.
5.
6.
7.
type
  TMyRec = packed record
    FInt: Integer;
    FBool: Boolean;
  end;

  TRecArr = Array of TMyRec;




Не знаю на 100% насчёт лазаря, но в дельфи даже древних версий можно сделать наследника TList, переопределив у него метод Notify, и дальше как-то так:
Код: 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.
type
  PMyRec = ^TMyRec;
  TMyRec = packed record
    FInt: Integer;
    FBool: Boolean;
  end;

  TMyList = class(TList)
  protected
    procedure Notify(Ptr: Pointer; Action: TListNotification);
    function Get(Index: Integer): PMyRec;
    procedure Put(Index: Integer; Value: PMyRec);
  public 
    property Items[Index: Integer]: PMyRec read Get write Put; default;
  end;

  procedure TMyList.Notify(Ptr: Pointer; Action: TListNotification);
  begin
    if Action = lnDeleted then
      Dispose(PMyRec(Ptr)); // не уверен насчёт необходимости PMyRec()
  end;

  function TMyList.Get(Index: Integer): PMyRec;
  begin
    Result := PMyRec(inherited Get(Index));
  end;

  procedure TMyList.Put(Index: Integer; Value: PMyRec);
  begin
    inherited Put(Index, Value);
  end;  



Ну и добавлять новые элементы соответственно:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 
  function NewMyRec(aInt: Integer; aBool: Boolean);
  begin
    New(Result);
    Result.FInt := aInt;
    Result.FBool := aBool;
  end;

  MyList.Add(NewMyRec(13, True));
  MyList.Insert(3, NewMyRec(7, False));
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472492
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
function NewMyRec(aInt: Integer; aBool: Boolean): PMyRec;

разумеется.
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472583
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДЕсть датасеты, которые умеют делать локальную фильтрацию и локальную сортировку.
у меня случай сложнее. Надо заполнить VTV из сджойненного запроса к нескольким обычным (недревовидным) таблям, объединив неск. однотипных, следующих друг за другом (child node) записей в одну ноду (root node).

Это сформулировать-то трудно, а ты эхлиб-эхлиб

Попробую на клиенте сделать, потом пойду вопрос в ветку FB задавать :)
alekcvpв дельфи даже древних версий можно сделать наследника TList
У меня такая же мысль в голове появилась после наводки чччД по ссылке выше.
Ваш вариант мне больше нравится, спасибо. Щас посмотрю, что можно наваять.
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472593
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_правильный абстрактный класс
Спасибо за код, познавательно.
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472597
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

с VTV вообще никаких проблем. Можешь данные хранить сразу в узлах, заливать их только в рутовые ветви и при экспандинге их. Вот и хранилища данных отдельного не нужно.

С сортировкой в VTV тоже просто: определяешь в кастом-методе, как сравнивать два узла.
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472624
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДзаливать их только в рутовые ветви и при экспандинге их
вот эта фраза интересна, но не совсем понятна :)
т.е., в VTV есть методы, позволяющие группировать записи по каким-то критериям и позволять дереву самому их объединять и отрисовывать соответственно заданным критериям? Я правильно понял?

зы. с VTV освоил только простейшие манипуляции: доки нормальной нет не встречал, демки не очень-то информативны
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472650
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокУ меня такая же мысль в голове появилась после наводки чччД по ссылке выше.
Ваш вариант мне больше нравится, спасибо. Щас посмотрю, что можно наваять.
У меня там еще косяк, надо так:
Код: pascal
1.
procedure Notify(Ptr: Pointer; Action: TListNotification); override;



P.S: Отсутствие возможности править сообщения в 2017м году... вносит свежих впечатлений
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472661
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докметоды, позволяющие группировать записи


нет таких методов.

Речь о процессе инициализации дерева.
Смотри:
1. читаешь из базы только данные, которые должны быть в ветвях самого верхнего уровня;
1.1. также определяешь для каждой такой ветки - есть ли у нее подуровни ("есть ли в базе") - но не читаешь эти данные из базы:
Код: pascal
1.
    vstHasChildren[ветка] := True;

- сие для того, чтобы на ветке получился плюсик для разворачивания дерева.

Таким образом, твой исходный "страшно сложный запрос" вырождается до примитивного => "загрузить из базы ветви верхнего уровня"

2. В событии OnInitChildred (как раз, когда юзер "разворачивает" содержимое ветки) - читаешь из базы только те данные, которые являются подветвями текущей ветви.
2.1. Выполняешь пункт 1.1.

Итак, вместо чудовищно сложной работы ты обходишься простыми запросами.

3. Если нужна сортировка "на лету" (например, по клику на заголовок столбца дерева) - то задаешь обработчик клика на хэдер:
Код: pascal
1.
2.
 VST.Header.SortDirection := sdAscending; // Например
 VST.SortTree(Column, VST.Header.SortDirection, False);// И вызываешь процедуру сортировки.


- а саму логику сортировки определяешь в коде обработчика OnCompareNode, сравнивая "правильным" для тебя способа данные двух узлов.
3.1 Если же тебе не нужна сортировка "на лету" - то весь п.3 вообще не делаешь, сортируешь данные в запросе к базе (пп. 1 и 2) и дерево строишь уже отсортированным как нужно.

http://teran.karelia.pro/articles/item_5845.html
http://delphigears.blogspot.ru/2011/08/virtual-treeview.html
Еще тут где-то были статейки, приаттаченные к сообщениям.
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472664
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatИ зачем тут абстрактный класс?...По двум причинам
1) Определить наследников для строгого контроля типов компилятором
2) Для управляемых типов обязательно переопределять FinalizeData + CopyData с кастом к конкретному типу
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472701
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДСмотри
Ну, хорошо, смотри

IDDATEVISITRV_IDRV_NAMEMDNAME_SHORT910.06.2017 10:352повторный осмотрврач гинеколог Нуруллинамедклиника11109.06.2017 20:205инъекция лекарственного веществаврач гинеколог Нуруллинамедклиника11007.06.2017 10:545инъекция лекарственного веществаврач гинеколог Нуруллинамедклиника1507.06.2017 10:344массаж простатыврач гинеколог Нуруллинамедклиника2809.06.2017 10:354массаж простатыврач уролог Перевезенцевмедклиника2608.06.2017 10:344массаж простатыврач уролог Перевезенцевмедклиника2213.09.2016 00:002повторный осмотрврач уролог Перевезенцевмедклиника3131.08.2016 00:001первичный осмотрврач уролог Перевезенцевмедклиника21315.08.2016 21:404массаж простатыврач уролог Перевезенцевмедклиника21414.06.2016 21:414массаж простатыврач уролог Перевезенцевмедклиника3407.06.2017 10:213профилактический осмотрврач эндоскопист Дятловмедклиника1

теперь попробуй одним махом, не дергая сервер, объединить под root-нодой для каждой группы записи с ID 11-10, 5-6-8, 13-14

Повторюсь, объединить однотипные данные, не проблема - у kdv на сайте хорошая статья есть.

Теперь понимаешь, откуда мои изыскания? :)
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472704
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокНу, хорошо, смотри
не, вот так корректнее (сортировка по дате)
IDDATEVISITRV_IDRV_NAMEMDNAME_SHORT910.06.2017 10:352повторный осмотрврач гинеколог Нуруллинамедклиника31109.06.2017 20:205инъекция лекарственного веществаврач гинеколог Нуруллинамедклиника3809.06.2017 10:354массаж простатыврач уролог Перевезенцевмедклиника2608.06.2017 10:344массаж простатыврач уролог Перевезенцевмедклиника21007.06.2017 10:545инъекция лекарственного веществаврач гинеколог Нуруллинамедклиника3507.06.2017 10:344массаж простатыврач гинеколог Нуруллинамедклиника2407.06.2017 10:213профилактический осмотрврач эндоскопист Дятловмедклиника3213.09.2016 00:002повторный осмотрврач уролог Перевезенцевмедклиника1131.08.2016 00:001первичный осмотрврач уролог Перевезенцевмедклиника21315.08.2016 21:404массаж простатыврач уролог Перевезенцевмедклиника21414.06.2016 21:414массаж простатыврач уролог Перевезенцевмедклиника1
Соответственно объединению подлежат записи 6-8, 13-14
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472711
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

это не постановка задачи.
Ты рассматриваешь свою странную выборку как данность, от которой нужно плясать. Я тебе совсем другое говорил.
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472742
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДэто не постановка задачи.
Ты рассматриваешь свою странную выборку как данность, от которой нужно плясать. Я тебе совсем другое говорил
если честно, я уже начинаю терять нить твоих суждений :)

Постановка задачи проистекает из запросов юзера, не противоречащих здравому смыслу. Ему плевать, как ты ее решишь. Ты же меня зачем-то убеждаешь в том, что если задача не решаема рутинными методами, то она неправильная.

В контексте всего выше сказанного у меня создалось впечатление, что из предложенных вариантов (массив, коллекция, дженерики) массив - не самый худший из них.
Пожалуй, поэкспериментирую с дженериками (раньше не доводилось их пользовать), и на чем-нибудь остановлюсь уже.

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

в лазарусе есть FCL-STL,
lazarus\fpc\{$ver}\source\packages\fcl-stl\src\

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

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


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