Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Автоматический уничтожитель объектов и компонентов 
:(
    Опции темы
Alex
Дата 31.1.2005, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



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

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.




--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0992 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.