К сожалению, автора исходного модуля мне установить не удалсь. Жаль, идеи заложенные в его модуле были очень хороши. Я лишь чуть усовершенствовал их. Интерфейс: Код | 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 /////////////////////////////////////////////////////////////////
|
Если интересно, то бери пристегнутый файл  .
--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце.
|