Главная страница
    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.065 c
2-1336127281
__QWERTY
2012-05-04 14:28
2013.03.22
как правильно очистить TList ы, чтобы не было утечек памяти


2-1331807216
selesasha
2012-03-15 14:26
2013.03.22
Поиск в массиве


2-1328870827
Константин
2012-02-10 14:47
2013.03.22
Можно ли имена компонентов формировать программго?


15-1340803269
AV
2012-06-27 17:21
2013.03.22
А вы сегодня как накосячили на свою голову? :)


3-1280093798
Alexkont
2010-07-26 01:36
2013.03.22
Запрос с датами и временем к Access





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский