powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Передача массива параметром
19 сообщений из 44, страница 2 из 2
Передача массива параметром
    #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
19 сообщений из 44, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Передача массива параметром
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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