Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Вниззамена или переопределение процедуры Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.063 c