Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

замена или переопределение процедуры


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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо