Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,308
Записей в блоге: 12
RAD XE3+

Передача записи как параметра

25.02.2019, 16:27. Показов 1502. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня!

Имею var List: TList<TMyRecord>, где, к примеру:
Delphi
1
2
3
4
5
TMyRecord = record
  Blah: String;
  Bloh: Integer;
  Bluh: Boolean;
end;
Хочу добавить запись а-ля List.Add(бла-бло-блу);, но не создавая промежуточную переменную или промежуточную функцию, возвращающую тип TMyRecord.

Это можно как-то сделать?
p.s. Такой вариант не работает: List.Add((Blah: 'Hello World!'; Bloh: 1000; Bluh: True));

Добавлено через 6 минут
Т.е. я хочу передать запись, поэлементно указывая значение каждого поля (значения либо константные, либо из других переменных), а не в виде отдельной переменной типа TMyRecord.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.02.2019, 16:27
Ответы с готовыми решениями:

Передача параметра в ActiveX
Параметр передаётся через тэг &lt;param&gt;, который пишется внутри тэга &lt;object&gt; (между &lt;object&gt; и &lt;object&gt;). Другой вопрос - как его...

Передача параметра из БД в FastReport
Как можно реализовать передачу параметра из БД, реализованной в Delphi 7, в FastReport? Имеется Form14 с запросом с параметром, который...

Передача параметра из БД в caption
Здравствуйте, не выходит передача параметра из БД в label.caption через запрос query/ Сначала идет запрос: ADOQuery2.Active:=false; ...

10
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
25.02.2019, 16:40
list хранит указатель на запись
что хранить, если записи нет?

а вот классы тут лучше в разы
Delphi
1
ObjectList.Add( TMyObject.Create(a,b,c,d));
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,308
Записей в блоге: 12
25.02.2019, 18:23  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
list хранит указатель на запись
что хранить, если записи нет?
В смысле?
TList<T> хранит не указатели, а сами записи в виде динамического массива (как и обычный TList, TStringList, TObjectList, TObjectList<T> и пр).

Цитата Сообщение от krapotkin Посмотреть сообщение
а вот классы тут лучше в разы
Зачем громоздить классы там, где это вообще не нужно?

Разве что так сделать:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
TMyRecord = record
  Blah: String;
  Bloh: Integer;
  Bluh: Boolean;
  constructor Create(const ABlah: String; ABloh: Integer; ABluh: Boolean);
end;
 
constructor TMyRecord.Create(const ABlah: String; ABloh: Integer; ABluh: Boolean);
begin
  Blah := ABlah;
  Bloh := ABloh;
  Bluh := ABluh;
end;
 
...
 
List.Add(TMyRecord.Create('Hello World', 1000, True));
Но я ж хотел без промежуточных функций...

Добавлено через 43 минуты
В эту же тему можно внести вопрос о том, как присвоить значения сразу всем полям записи (без создания конструктора... это может быть нужно, например, для локальных типов функции, где в записях нельзя создавать методы).
Что-то вроде MyRec := ('Hello World', 1000, True);
0
пофигист широкого профиля
4770 / 3205 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
26.02.2019, 02:57
Цитата Сообщение от Jin X Посмотреть сообщение
TList<T> хранит не указатели, а сами записи в виде динамического массива (как и обычный TList, TStringList, TObjectList, TObjectList<T> и пр).
Кто вам сказал такую ересь?
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,308
Записей в блоге: 12
26.02.2019, 09:22  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
Кто вам сказал такую ересь?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
type
  TMyRec = record
    X, Y: Integer;
  end;
 
var
  List: TList<TMyRec>;
 
procedure Test;
var Rec: TMyRec;
begin
  List := TList<TMyRec>.Create;
  Rec.X := 10;
  Rec.Y := 20;
  List.Add(Rec);
  Rec.X := 111;
  List.List[0].Y := 222;
  ShowMessageFmt('Rec: %d, %d'#10'List: %d, %d',
    [Rec.X, Rec.Y, List[0].X, List[0].Y]);
  List.Free;
end;


Rec никак не связан с элементом List.

Недостаточно?
Смотрим отладчиком в List.Add(Rec):
Delphi
1
2
3
4
5
6
7
8
9
10
function TListHelper.InternalAdd8(const Value): Integer;
begin
  Result := FCount;
  if Result = DynArraySize(FItems) then
    InternalGrow(Result + 1);
  PUInt64(FItems)[Result] := UInt64(Value);
  Inc(FCount);
  if Assigned(FNotify) then
    FNotify(FListObj, Value, cnAdded);
end;
InternalGrow:
Delphi
1
2
3
4
procedure TListHelper.InternalGrow(ANewCount: Integer);
begin
  InternalSetCapacity(GrowCollection(DynArraySize(FItems), ANewCount));
end;
InternalSetCapacity:
Delphi
1
2
3
4
procedure TListHelper.InternalSetCapacity(Value: NativeInt);
begin
  DynArraySetLength(FItems, FTypeInfo, 1, @Value);
end;
Все данные в FItems.
Ещё вопросы?
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
26.02.2019, 09:42
хм. заглянул. понакручено там, конечно
для разных типов данных все работает по-разному...
сейчас некогда дочитывать, но позже надо обязательно заняться посмотреть
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
26.02.2019, 09:48
Цитата Сообщение от Jin X Посмотреть сообщение
Ещё вопросы?
Точно ли утверждение про указатели для TObjectList<T>?

По сути вопроса: нет, так, скорее всего, не получится. Оптимальный вариант с точки зрения цена-качество, имхо - дополнительная функция.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
26.02.2019, 10:29
все что связано с объектами - суть указатель. так что там точно только ссылки
вот TList<Record> интересный случай
но записями пользуюсь крайне редко, т.к. у меня в программах все объекты - динамические
соотв-но использование синтаксиса объектов гораздо проще и удобнее
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,308
Записей в блоге: 12
26.02.2019, 11:25  [ТС]
Цитата Сообщение от Nanotentacle Посмотреть сообщение
Точно ли утверждение про указатели для TObjectList<T>?
Тут спорный вопрос, согласен, т.к. копирования самого объекта не происходит (как минимум метод Assign отсутствует у TObject).
Однако в Delphi обращении к объектам происходит через указатели, а TObjectList (как и другие контейнеры) хранит данные в виде дин. массива значений, которые передаются методу Add. А передаются туда указатели на объекты. С этой точки зрения утверждение верное

Добавлено через 5 минут
Цитата Сообщение от krapotkin Посмотреть сообщение
вот TList<Record> интересный случай
Да там без разницы какой там тип. Хоть Integer, хоть Record, хоть String.
Если будет объект, я почти уверен, что скопируется только ссылка (как минимум из-за отсутствия того же Assign).
Что касается строк, то они так и так не копируются при присваивании, только счётчик ссылок увеличивается. Зато при изменении создаётся копия. Так что программисту в большинстве случаев по барабану как там всё устроено внутри, ему исходная строка и новая (после присваивания) видятся как 2 копии
Ну и т.д.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
26.02.2019, 12:33
разница на самом деле огромная
либо у нас динмассив указателей по 4 байта
либо крупных объектов
и при каждом изменении перемещать область памяти туда-сюда...
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,308
Записей в блоге: 12
26.02.2019, 15:13  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
разница на самом деле огромная
либо у нас динмассив указателей по 4 байта
либо крупных объектов
Я не спорю, что разница огромная.
Просто при желании всегда можно организовать список как ссылок, так и записей или даже копий объектов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.02.2019, 15:13
Помогаю со студенческими работами здесь

DataSet повторная передача параметра
Есть проект который вытягивает номер из DBF после чего передает его в процедуру, вопрос таков. как сделать так что бы если номер уже был...

Передача параметра макроса Access из Delphi
Всем здравствуйте. Работаю с БД в Делфи, и мне нужно выполнить макрос Access из Delphi. При выполнении макрос требует ввода некоторого...

Передача данных с кавычками при записи в БД
Доброго времени суток! Имеется БД MySQL, в Delphi написана программа - подключаемся к БД ODBC, Connection, ADOQuery, DataSource -&gt;...

Передача функции как параметра
Добрый день, форумчане. type TFuncType = function: Double; var Form1: TForm1; FuncX,FuncY: TFuncType;

Передача функции как параметра
procedure TForm1.Button1Click(Sender: TObject); type Func = function (x: real):real; var x,y,eps,z: real; function f(x: real):real; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru