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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.09.2010, 12:59   #11
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от Sanprof Посмотреть сообщение
а по другому и не получится, так как сначала вызывается деструктор TSecondaryObject, а уже потом TPrimaryObject, а происходит это потому, что TPrimaryObject держит ссылку на интерфейс.
О, в том то вся и суть трейда. Как сделать наоборот что-бы это ещё и красиво смотрелось

Вы вообще вопрос не поняли...

Как сделать так, что-бы Delphi не подставляла автоматически _AddRef и _Release?

Не знаете ответ? Нечего здесь флудить!

Последний раз редактировалось Altera; 06.09.2010 в 13:03.
Altera вне форума Ответить с цитированием
Старый 06.09.2010, 14:56   #12
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
О, в том то вся и суть трейда. Как сделать наоборот что-бы это ещё и красиво смотрелось
Освобождать Интерфейс если он не нужен:
можно в destroy;
можно в любой другой процедуре;
можно вообще не сохранять интерфейс в объекте (передавать в каждую процедуру как параметр при необходимости) .

P.S. и соблюдать принцип работы с интерфейсами (хранятся не объекты TinterfacedObject, TPrimaryObject, TSecondaryObject а только ссылки на нужные интерфейсы
вместо
Код:
   PrimaryObject: TIPrimaryObject;
должно быть
Код:
   PrimaryObject: IIPrimaryObject;
тогда и освобождение будет проходить в соответствии с правилами работы с интерфейсами.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 06.09.2010 в 15:42.
evg_m вне форума Ответить с цитированием
Старый 07.09.2010, 06:31   #13
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

evg_m +

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  IPrimaryObject = interface
    procedure SomeProcedure;
  end;

  TPrimaryObject = class(TInterfacedObject, IPrimaryObject)
  protected
    fList: tList;
    procedure SomeProcedure;
  private
    procedure BeforeDestruction; override;
    constructor create;
    destructor destroy; override;
  end;

  TSecondaryObject = class
  protected
    fPrimaryObject: TPrimaryObject;
  public
    destructor destroy; override;

    procedure SetInterface(const aPrimaryObject: TPrimaryObject);

    procedure CallSomeProcedure;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    PrimaryObject: TPrimaryObject;
    SecondaryObject: TSecondaryObject;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  SecondaryObject.CallSomeProcedure;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  PrimaryObject.Free;
  SecondaryObject.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SecondaryObject := TSecondaryObject.create;
  PrimaryObject := TPrimaryObject.create;

  SecondaryObject.SetInterface(PrimaryObject);
end;

{ TPrimaryObject }

procedure TPrimaryObject.BeforeDestruction;
begin
  inherited BeforeDestruction;
  ShowMessage('Интерфейс уничтожен');
end;

constructor TPrimaryObject.create;
begin
  fList := tList.Create;
end;

destructor TPrimaryObject.destroy;
begin
  showMessage('Уничтожаем TPrimaryObject');
  fList.Free;
  inherited;
end;

procedure TPrimaryObject.SomeProcedure;
begin
  ShowMessage('Hello World!');
end;

{ TSecondaryObject }

procedure TSecondaryObject.CallSomeProcedure;
begin
  fPrimaryObject.SomeProcedure;
end;

destructor TSecondaryObject.destroy;
begin
  showMessage('Уничтожаем TSecondaryObject');
  inherited;
end;

procedure TSecondaryObject.SetInterface(const aPrimaryObject: TPrimaryObject);
begin
  fPrimaryObject := aPrimaryObject;
end;

end.
Проблема не в том, что мы не поняли вопрос, а в том что вы изначально не правильно подошли к решению задачи.

Код:
type
  IБалда для молотка = interface
    тяжелая балда с дыркой;
    procedure А что будет если стукнуть;
  end;

  TМолоток = class(TСборный объект, IБалда для молотка)
    Деревянная ручка для молотка
    Тяжелая балда с дыркой средних размеров;
    procedure А что реально будет если стукнуть;
  end;

  TРука = class
  protected
    fИнструмент: IБалда для молотка; - а должон быть сам молоток
  public
    procedure Взять(const aИнструмент: IБалда для молотка); - Здесь тоже должен быть молоток
    procedure Стукнуть;
  end;
...
Еще раз + evg_m. С интерфейсами ну очень редко работаешь. Сразу и не схватишь чё к чему.

Последний раз редактировалось Sibedir; 07.09.2010 в 08:34. Причина: Испраил код
Sibedir вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
статья - Взаимодействие с сетевыми интерфейсами в Linux Pblog Обсуждение статей 0 23.06.2010 05:13
Ситуация: Ekspert Операционные системы общие вопросы 4 28.03.2010 11:47
исключительная ситуация Psicheja Помощь студентам 1 18.03.2010 23:40
Исключительная ситуация Delphi VadEr Помощь студентам 1 20.09.2009 20:22