Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2009, 19:21   #1
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию Как сохранить ссылку на объект?

Например, я каждый раз посылал в юнит сам ListBox. Как сохранить его адрес? Что бы потом можно было изменять его не передавая снова в юнит?

Вроде как-то так:
Код:
var
lb:^TLisbox;
begin
  lb:=@Listbox;
  lb.items.add...
end;
?
TwiX вне форума Ответить с цитированием
Старый 12.12.2009, 19:24   #2
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Код:
procedure TForm1.Button2Click(Sender: TObject);
var
 lb: ^TListBox;
begin
 lb := @ListBox1;
 TListBox(lb^).Items.Add('text');
end;
Но это исправления вашего кода. Если в юнит отправлять, то проще так:
Код юнита:
Код:
unit Unit2;

interface

uses
  StdCtrls;

procedure lb_add(lb: pointer);

implementation

procedure lb_add(lb: pointer);
begin
 TListBox(lb^).Items.Add('text');
end;

end.
Вызов:
Код:
procedure TForm1.Button2Click(Sender: TObject);
begin
 lb_add(@ListBox1);
end;
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.

Последний раз редактировалось Neeter; 12.12.2009 в 19:30.
Neeter вне форума Ответить с цитированием
Старый 12.12.2009, 19:42   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Записывайте на листик шариковой ручкой :D
Вроде в дельфи, объект это и так уже адрес. Значит можно просто
Код:
var
  o2: TObject;

procedure dosomethng(o1: TObject)
begin
  o2 := o1;
end;
BOBAH13 вне форума Ответить с цитированием
Старый 12.12.2009, 20:31   #4
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Уже сделал как у Вована, но всё-равно всем спасибо)
Что значит lb^?
TwiX вне форума Ответить с цитированием
Старый 12.12.2009, 20:35   #5
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Цитата:
Что значит lb^?
Это данные по указателю. А @lb - это указатель на указатель.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 12.12.2009, 20:52   #6
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Цитата:
Сообщение от TwiX Посмотреть сообщение
Уже сделал как у Вована, но всё-равно всем спасибо)
Что значит lb^?
А так не пробовали?
Код:
var
lb:TLisbox;
begin
  lb:=Listbox;
  lb.items.add...
end;
s.Creator вне форума Ответить с цитированием
Старый 12.12.2009, 22:31   #7
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

^Разве это не то же самое, что сказал Вован?)
TwiX вне форума Ответить с цитированием
Старый 13.12.2009, 00:16   #8
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Совсем разные вещи.
У Вована указан глобальный объект и поэтому он будет хранить нужный вам указатель, а у s.Creator он объявлен локально и ничего хранить не будет.
mihali4 вне форума Ответить с цитированием
Старый 14.12.2009, 09:56   #9
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Извиняюсь, невнимательно прочитал вопрос.
Во исправление напишу подробнее, как я это делаю.
Во первых, стараюсь меньше хранить ссылок на визуальные компоненты в других модулях и стараюсь разделить модули использованием функций или методов. Например если у меня есть форма диалога редактирования какого нибудь Edit, я делаю приблизительно так:
Код:
unit UEditNameDlg;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TEditNameDlg = class(TForm)
    edName: TEdit;
    btOk: TButton;
  private
    { Private declarations }
  public
    { Public declarations }
    class function ShowEditDlg(const dlgCaption: string; 
       aEdit: TEdit): Boolean;
  end;
implementation
{$R *.dfm}
{ TEditNameDlg }
class function TEditNameDlg.ShowEditDlg(const dlgCaption: string;
  aEdit: TEdit): Boolean;
var
  form: TEditNameDlg;
begin
  form := TEditNameDlg.Create(nil);
  try
    form.edName.Text := aEdit.Text;
    form.Caption := dlgCaption;
    Result := form.ShowModal = mrOk;
    if Result then
      aEdit.Text := form.edName.Text;
  finally
    form.Free;
  end;
end;
end.
Использую:
Код:
  if TEditNameDlg.ShowEditDlg('Редактирование', FioEdit) then //....
Но случаи бывают разные, также как и модули.
У меня есть модули функций ( типа библиотек часто используемых функций ) - в них обычно никаких сторонних ссылок не храню.
И модули Классов, которые позволяют создавать объекты, выполняющие какую-то деятельность. В них я предпочитаю хранить ссылки в виде полей класса. Даже если это класс формы - можно хранить ссылки на компоненты других форм в секции private например ( хотя уже давно не припомню, чтобы одни формы у меня хранили ссылки на компоненты других ). Причем если класс наследник от TComponent или его потомков, то можно пользоваться механизмом нотификации для обнуления ссылки при уничтожении компонента. Например:
Код:
unit UEditNameDlg;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TEditNameDlg = class(TForm)
    edName: TEdit;
    btOk: TButton;
  private
    { Private declarations }
    FOtherEdit: TEdit;
    procedure SetOtherEdit(const Value: TEdit);
  protected
    procedure Notification(AComponent: TComponent;
      Operation: TOperation); override;
  public
    { Public declarations }
    property OtherEdit: TEdit read FOtherEdit write SetOtherEdit;
  end;
implementation
{$R *.dfm}
{ TEditNameDlg }

procedure TEditNameDlg.Notification(AComponent: TComponent;
  Operation: TOperation);
begin
  if (Operation = opRemove) and Assigned(FOtherEdit) 
      and (FOtherEdit = AComponent) then
    FOtherEdit := nil;
  inherited;
end;

procedure TEditNameDlg.SetOtherEdit(const Value: TEdit);
begin
  if FOtherEdit = Value then
    Exit;
  if Assigned(FOtherEdit) then
    RemoveFreeNotification(FOtherEdit);
  FOtherEdit := Value;
  if Assigned(FOtherEdit) then
    FreeNotification(FOtherEdit);
end;

end.
Это предотвращает обращение к уже уничтоженному внешнему компоненту.
s.Creator вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как уничтожить объект в C# Никки Общие вопросы .NET 7 30.10.2014 23:54
Компонент как 3D объект AsmodElial Мультимедиа в Delphi 1 19.09.2009 12:12
Возможно ли получить обработчиком событий ссылку на объект? neizerth Общие вопросы C/C++ 4 15.02.2009 11:00
Получить ссылку на вызывающий объект grenles Общие вопросы Delphi 10 07.11.2008 12:37