Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Передача данных между процедурами в Delphi: использование параметров по ссылке для работы с типами данных

Delphi , Синтаксис , Память и Указатели

Работа с данными в Delphi может быть довольно удобной, благодаря использованию различных структур и типов данных, включая записи. Однако, когда дело доходит до передачи данных между процедурами, особенно если данные должны быть изменены, важно понимать разницу между передачей по значению и по ссылке.

Проблема

В Delphi 2010 разработчик столкнулся с проблемой при работе с деревом (TreeView), где данные для узлов представлены в виде записи (record). Данные успешно создаются и отображаются в дереве, но при попытке передать запись в другую процедуру для изменения и последующего использования изменённых значений, данные не сохраняются. Проблема заключается в том, что при передаче записи в другую процедуру, не происходит передача по ссылке, а создаётся копия данных, что делает изменения невидимыми для вызывающей процедуры.

Пример кода

type
  TNodeRec = record
    rId: Integer;
    rDate: TDateTime;
    rSite, rURL, rRedirURL, rTitle, rCategory, rURL_RtnText: string;
    rURL_RtnCode: Integer;
  end;

var
  BuffData: ^TNodeRec; // Указатель на запись данных узла
  URLNode: TTreeNode;
begin
  // Создание новой записи данных
  new(BuffData);
  BuffData^.rId := 0;
  BuffData^.rDate := Now;
  // Заполнение полей записи данными
  // ...

  // Добавление узла в дерево
  URLNode := TV1.Items.AddChildObject(nil, BuffData^.rTitle, BuffData);
end;

procedure TURLListForm.btnEvalSelectedClick(Sender: TObject);
var
  SelNode: TTreeNode;
begin
  // Проверка на выбранный узел
  // ...

  // Попытка передачи данных в процедуру WebEvaluate
  WebEvaluate(TNodeRec(TV1.Selected.Data^));
  // Показ изменённых данных, которые остаются пустыми
  ShowMessage(TNodeRec(TV1.Selected.Data^).rRedirURL);
end;

procedure WebEvaluate(Data1: TNodeRec);
begin
  Data1.rRedirURL := 'Test value';
  // Внутри процедуры значение успешно изменено
  ShowMessage('In WebEvaluate Routine:' + Data1.rRedirURL);
end;

Решение

Для решения проблемы необходимо использовать параметры по ссылке (var-параметры). Это позволит процедуре изменять данные непосредственно в вызывающей процедуре. В примере кода выше, необходимо изменить определение процедуры WebEvaluate следующим образом:

procedure WebEvaluate(var Data1: TNodeRec);
begin
  Data1.rRedirURL := 'Test value';
  // Изменения видны внутри процедуры
end;

Также, при вызове WebEvaluate необходимо передать прямую ссылку на данные, а не копию:

WebEvaluate(TNodeRec(TV1.Selected.Data^));

Заключение

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

Создано по материалам из источника по ссылке.

В Delphi для работы с типами данных и их передачи между процедурами необходимо использовать параметры по ссылке, чтобы изменения в данных сохранялись и были доступны после выполнения процедуры.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Память и Указатели ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 16:07:25/0.0032060146331787/0