Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.064 c
1-1302439218
Luarvic
2011-04-10 16:40
2013.03.22
Плагин Миранды в свое приложение


15-1352269270
Chorus
2012-11-07 10:21
2013.03.22
Вычисление высот в произвольном треугольнике


15-1329815103
Kolan
2012-02-21 13:05
2013.03.22
Напомните историю про уволенного программиста


2-1330463360
Михалыч
2012-02-29 01:09
2013.03.22
Сетевая Бд на MySql


2-1339941974
ankazh
2012-06-17 18:06
2013.03.22
ShowModal





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский