Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

замена или переопределение процедуры   Найти похожие ветки 

 
vasa777   (2012-07-30 10:48) [0]

есть некий юнит abc.pas с множеством процедур и функций X0..Xn вида

Procedure X0;
begin
try
<тут что то делаем>
except on e:exception do Y(e);
end
end;

....

Procedure Xn;
begin
try
<тут что то делаем>
except on e:exception do Y(e);
end
end;

Где Y(e) процедура в этом же модуле, предназначена для обработки ошибок

Procedure Y(e:exception);
begin
<тут чтото делаем, например пишем в лог или выводим E.message>
end;

Модуль abc компилируется и передается вторичному разработчику (например) без исходного кода (только dcu).

Вопрос: может ли вторичный разработчик переопределить свою процедуру Y(e)? Или что надо сделать в модуле abc чтобы такая возможность была? Вариант с глобальным переопределением класса ошибки не интересен.
Или может быть можно сделать как то так:

Procedure Y(const e:exception;const MyProc:Procedure=nil);
begin
if assigned(MyProc) then begin // вызов процедуры MyProc
>>> как вызвать MyProc(e)? <<<
exit;
end;
//стандартная обработка
<тут чтото делаем, например пишем в лог или выводим E.message>
end;

Подскажите решение, если можно с примером. Спасибо.


 
Ega23 ©   (2012-07-30 10:53) [1]

type
TExceptionHandlerProc = procedure (E: Exception);

procedure Foo(E: Exception; Handler: TExceptionHandlerProc);
begin
 if Assigned(Handler) then
   Handler(E);
end;


 
vasa777   (2012-07-30 11:06) [2]

т.е. если я напишу в abc.pas

type
TExceptionHandlerProc = procedure (E: Exception);

procedure Foo(E: Exception; Handler: TExceptionHandlerProc);
begin
if Assigned(Handler) then
  Handler(E) else showmessage(e.message);
end;

Procedure X0;
begin
try
<тут что то делаем>
except on e:exception do Foo(e,nil);
end;
end;

то как мне в юните abc2.pas описать свою процедуру-замену стандартной

unit abc2;
...
uses abc;

type
TExceptionHandlerProc = procedure (E: Exception);

Procedure MyNewErrProc(e:exception);
begin
..
end;

<как тут описать процедуру (или вызов) чтобы при обработке ошибки в abc\X0 работала тутошняя MyNewErrProc а не вызывалось showmessage из abc\Foo?>


 
vasa777   (2012-07-30 11:09) [3]

что то запутался совсем


 
icWasya ©   (2012-07-30 11:49) [4]

Как-то так

unit abc;
interface

type
TabcExceptionHandlerProc = procedure (E: Exception);

var abcExceptionHandlerProc:TabcExceptionHandlerProc;
Procedure X0;
Procedure X1;
Procedure X2;
...
Procedure XN;

implementation
Procedure X0;
begin
try
<тут что то делаем>
except on e:exception do Y(e);
end
end;

....

Procedure Xn;
begin
try
<тут что то делаем>
except on e:exception do Y(e);
end
end;

Где Y(e) процедура в этом же модуле, предназначена для обработки ошибок

Procedure Y(e:exception);
begin
if Assigned (abcExceptionHandlerProc) then begin
 abcExceptionHandlerProc(e);
 Exit;
end;
<тут чтото делаем, например пишем в лог или выводим E.message>
end;
end.


 
vasa777   (2012-07-30 12:21) [5]

а в abc2.pas

TabcExceptionHandlerProc:= MyNewErrProc;

?


 
Плохиш ©   (2012-07-30 12:36) [6]

Без "T"


 
vasa777   (2012-07-30 12:47) [7]

спасибо



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.051 c
2-1332915245
Вася
2012-03-28 10:14
2013.03.22
По какому событию сохранять рекордсет в базу?


2-1339503702
kurolesov
2012-06-12 16:21
2013.03.22
Работа с TBitmap. Как быстрее?


2-1332258565
Сергей
2012-03-20 19:49
2013.03.22
Как добавить новое поле в таблицу Oracle с помощью dbExpress?


15-1334662086
xayam
2012-04-17 15:28
2013.03.22
Преобразование RGB в оттенки серого (схема)


15-1341211017
KilkennyCat
2012-07-02 10:36
2013.03.22
Понедельничная задачка :)