![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
замена или переопределение процедуры
vasa777 © (2012-07-30 10:48:00)есть некий юнит 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;
Подскажите решение, если можно с примером. Спасибо.
vasa777 (2012-07-30 12:47:00) [1]спасибо
Плохиш (2012-07-30 12:36:00) [2]Без "T"
vasa777 (2012-07-30 12:21:00) [3]а в abc2.pas
TabcExceptionHandlerProc:= MyNewErrProc;
?
icWasya (2012-07-30 11:49:00) [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 11:09:00) [5]что то запутался совсем
vasa777 (2012-07-30 11:06:00) [6]т.е. если я напишу в 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?>
Ega23 (2012-07-30 10:53:00) [7]
type
TExceptionHandlerProc = procedure (E: Exception);
procedure Foo(E: Exception; Handler: TExceptionHandlerProc);
begin
if Assigned(Handler) then
Handler(E);
end;