powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Метод создания множества экземпляров объектов
11 сообщений из 11, страница 1 из 1
Метод создания множества экземпляров объектов
    #39500161
AntonioPermskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,

Есть код вида:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    
CreateOracleQuery(lOracleQuery0);
CreateOracleQuery(lOracleQuery1);
CreateOracleQuery(lOracleQuery2);
CreateOracleQuery(lOracleQuery3);
try
  ...
finally
  FreeOracleQuery([lOracleQuery0, lOracleQuery1, lOracleQuery2, lOracleQuery3]);
end;



Где

Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure FreeOracleQuery(const Arr: array of TOracleQuery);
var
  lOracleQuery: TOracleQuery;
begin
  for lOracleQuery in Arr do
    lOracleQuery.Free;
end;



Можно ли написать процедуру CreateOracleQuery сразу для множества переменных, как это сделано в FreeOracleQuery?
Пробовал через массив - запрещает Create
Через множество - запрещает множество из классов: E2001 Ordinal type required
...
Рейтинг: 0 / 0
Метод создания множества экземпляров объектов
    #39500170
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
начните с малого
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure СreeOracleQuery(const Arr: array of TOracleQuery);
var
  lOracleQuery: TOracleQuery;
begin
  for lOracleQuery in Arr do
    lOracleQuery.Free;
end;

потом
Код: pascal
1.
procedure СreaOracleQuery(const Arr: array of TOracleQuery);


ну и потихоньку
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure СreateOracleQuery(const Arr: array of TOracleQuery);
begin
  for i:=0 to high(Arr) do
  begin
    CreateOracleQuery(arr[i]);
  end;
end;
...
Рейтинг: 0 / 0
Метод создания множества экземпляров объектов
    #39500171
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри, последний кусок
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure СreateOracleQueries(const Arr: array of TOracleQuery);
begin
  for i:=0 to high(Arr) do
  begin
    CreateOracleQuery(arr[i]);
  end;
end;
...
Рейтинг: 0 / 0
Метод создания множества экземпляров объектов
    #39500199
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonioPermskiyДобрый день,

Есть код вида:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    
CreateOracleQuery(lOracleQuery0);
CreateOracleQuery(lOracleQuery1);
CreateOracleQuery(lOracleQuery2);
CreateOracleQuery(lOracleQuery3);
try
  ...
finally
  FreeOracleQuery([lOracleQuery0, lOracleQuery1, lOracleQuery2, lOracleQuery3]);
end;



Где

Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure FreeOracleQuery(const Arr: array of TOracleQuery);
var
  lOracleQuery: TOracleQuery;
begin
  for lOracleQuery in Arr do
    lOracleQuery.Free;
end;



Можно ли написать процедуру CreateOracleQuery сразу для множества переменных, как это сделано в FreeOracleQuery?
Пробовал через массив - запрещает Create
Через множество - запрещает множество из классов: E2001 Ordinal type required

Не вижу причин, почему нельзя вынести код создания компонент во вложенную процедуру.
...
Рейтинг: 0 / 0
Метод создания множества экземпляров объектов
    #39500249
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonioPermskiy, можно
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
type POracleQuery = ^TOracleQuery;

procedure СreateOracleQuery(const Arr: array of POracleQuery);
var
 lOracleQuery: POracleQuery;
begin
 for lOracleQuery in Arr do lOracleQuery^ := nil;
 for lOracleQuery in Arr do lOracleQuery^ := TOracleQuery.Create;
end;


СreateOracleQuery([@lOracleQuery0, @lOracleQuery1, @lOracleQuery2, @lOracleQuery3]);

лень это понятно, но постановка такого вопроса свидетельствует о необходимости подумать, почему мы к нему пришли ...
...
Рейтинг: 0 / 0
Метод создания множества экземпляров объектов
    #39500250
AntonioPermskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krapotkinсорри, последний кусок
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure СreateOracleQueries(const Arr: array of TOracleQuery);
begin
  for i:=0 to high(Arr) do
  begin
    CreateOracleQuery(arr[i]);
  end;
end;



Увы:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure CreateOracleQueries(const Arr: array of TOracleQuery);
var
  i: Integer;
begin
  for i := Low(Arr) to High(Arr) do
    CreateOracleQuery(Arr[i]);  //E2197 Constant object cannot be passed as var parameter
end;
...
Рейтинг: 0 / 0
Метод создания множества экземпляров объектов
    #39500257
AntonioPermskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bred eFeM

Спасибо. Так работает.

А для чего
Код: pascal
1.
 for lOracleQuery in Arr do lOracleQuery^ := nil;


?

Bred eFeMлень это понятно, но постановка такого вопроса свидетельствует о необходимости подумать, почему мы к нему пришли ...
Увидел, что коллега для множественного уничтожения экземпляров объектов заиспользовал такой подход - стало интересно, как его реализовать для создания. Кому-то такой код(одна строка для создания, одна для уничтожения) покажется изящным и лаконичным, кому то нет - лично я пока не определился к какому лагерю примкнуть, меня интересовала техническая сторона вопроса.
...
Рейтинг: 0 / 0
Метод создания множества экземпляров объектов
    #39500274
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonioPermskiy,

Такое массовое создание-уничтожение -- немного спорное решение, которое ставит лишние палки в колеса в виде ограниченных сценариев использования (создавать-уничтожать всё или ничего) и проблем статическому анализатору на предмет ошибок-опечаток.
...
Рейтинг: 0 / 0
Метод создания множества экземпляров объектов
    #39500313
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonioPermskiy, nil, чтобы в finally AV не было. И вопрос не в одна строка , а в коде, в котором группа одинаковых переменных не задвинута изначально в список или массив ...
...
Рейтинг: 0 / 0
Метод создания множества экземпляров объектов
    #39501054
AntonioPermskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bred eFeM... И вопрос не в одна строка , а в коде, в котором группа одинаковых переменных не задвинута изначально в список или массив ...

Переменные названы в соответствии с предметной областью, что добавляет читабельность, понимание, контроль. Не нужно заморачиваться с маппингом, думать в какой элемент списка засунули запрос с документами, а в какой с ссылками на документы.
Вот пример реального кода:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
...
    CreateOracleQuery([@lRSNDocumentLinkCur, @lRSNDocumentCur, @lPrRSNEventLinkCur, @lRSNEventCur]);
    try
      lDBConnect.DBPackageDocument.Get(aId, lRSNDocumentLinkCur, lRSNDocumentCur, lPrRSNEventLinkCur,
        lRSNEventCur);
...
    finally
      FreeOracleQuery([lRSNDocumentLinkCur, lRSNDocumentCur, lPrRSNEventLinkCur, lRSNEventCur]);
    end;



Такой подход предполагает больше писанины, зато отладка да и доработка проходят эффективнее. Особенно когда к этому блоку кода возвращаешься через месяц другой.


Еще раз - спасибо за участие в теме.
...
Рейтинг: 0 / 0
Метод создания множества экземпляров объектов
    #39501161
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonioPermskiy, пример кода
- если в CreateOracleQuery будет передаваться больше одной ссылки, то её нужно поместить вну-try блока.

Но лень она такая, что потом даже try становится тяжело писать: 20622323 , 20637609 .
Там, кстати, в моём коде тоже нужно первым делом за-nil-ить содержимое ссылок. Ну и использовать можно вроде и без with.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Метод создания множества экземпляров объектов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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