Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Автоматический уничтожитель объектов и компонентов


Автор: Alex 31.1.2005, 23:54
К сожалению, автора исходного модуля мне установить не удалсь. Жаль, идеи заложенные в его модуле были очень хороши. Я лишь чуть усовершенствовал их.
Интерфейс:
Код

unit SafeUnit;

// Является ремейком модуля "SafeUnit" неизвестного мне автора.

interface

uses Classes;

/////////////////////////////////////////////////////////////////////////// IsAs
(*
Позволяет упростить вот такие фрагметы кода:

  if aSomeObject is TMyObject then begin
    aMyObject := aSomeObject as TMyObject;
    // некоторые действия с aMyObject
  end;

При использовании функции IsAs это будет выглядить так:

  if IsAs (aMyObject, aSomeObject, TMyObject) then begin
    ... // некоторые действия с aMyObject
  end;

*)

function IsAs (out   aReference {: Pointer};
               const aObject     : TObject;
               const aClass      : TClass) : Boolean;

////////////////////////////////////////////////////////////////// ExceptionSafe
(* - "Накопитель" исключений
Позволяет делать например следующее

    with ExceptionSafe do
      try
        // Некоторые действия которые могут возбудить исключение
        for aIndex := 1 to 10 do
          try
            ... // Некоторые действия которые могут возбудить исключение
          except
            SaveException;  // <- запоминание текста возникшего исключения в списке ExceptionSafe
          end;
        ... // Некоторые действия которые могут возбудить исключение
        for aIndex := 10 to 20 do
          try
            ... // Некоторые действия которые могут возбудить исключение
          except
            SaveException;  // <- запоминание текста возникшего исключения в списке ExceptionSafe
          end;
        ... // Некоторые действия которые могут возбудить исключение
      except
        SaveException;  // <- запоминание текста возникшего исключения в списке ExceptionSafe
      end;
    end;// <===

  Тогда, в момент выхода из With (<===), если был сохранен текст хотя бы
  одного исключения, будет возбуждено Exception, с текстом всех сохраненных
  в этом блоке исключений.
  Формат текста:
    Ex1.ClassName+': '+Ex1.Message  {+^M^J^I+ExN.ClassName+' '+ExN.Message}
*)

type
  IExceptionSafe = interface
    procedure SaveException;
  end;

function ExceptionSafe :IExceptionSafe;

///////////////////////////////////////////////////////////////////// ObjectSafe
(* - Безопасный "контейнер" объектов и компонентов

Пример использования:

  procedure TestTheSafe;
  var
    aMyObject    :TMyObject;
    aMyComponent :TMyComponent;
  begin
    with ObjectSafe do begin

      // создание и регистрация объекта:
      New (aMyObject, TMyObject.Create);
      // или
      aMyObject := TMyObject.Create; Guard(aMyObject);

      // создание и регистрация компонента
      aMyComponent := TMyComponent.Create (Safe);

      ... // Некоторые действия которые могут возбудить исключение

      // уничтожение экземпляра aMyObject
      Dispose(aMyObject);

      ... // Некоторые действия которые могут возбудить исключение

    end; // <===
  end;

  Тогда, в момент выхода из With (<===), все объекты и компоненты
  зарегестрированные в ObjectSafe, будут автоматически уничтожены (Free).
  Причем, это произойжет даже если With будет покинут в результате
  возникновения исключительной ситуации.

  При уничтожении, сначала в произвольном порядке будут уничтожены
  зарегестрированные объекты, а затем, будут уничтожены
  зарегестрированные компоненты, так же в произвольном порядке.
*)

type
  IObjectSafe = interface
    function  Safe : TComponent;

    function  New     (out   aReference {: Pointer};
                       const aObject     : TObject) : IObjectSafe;

    procedure Guard   (const aObject     : TObject);

    procedure Dispose (var   aReference {: Pointer});
  end;

function ObjectSafe                                 : IObjectSafe; overload;
function ObjectSafe (out aObjectSafe : IObjectSafe) : IObjectSafe; overload;


////////////////////////////////////////////////////////////////////////////////


implementation /////////////////////////////////////////////////////////////////

Если интересно, то бери пристегнутый файл smile.

http://forum.vingrad.ru/index.php?act=module&module=vingradfaq&target=download_file&articleid=2291&attachid=1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)