|
![]() |
|
nahpets
(Gast)
n/a Beiträge |
#1
@Helmi: Ne, nicht diese Monster. Wenn ich der Optik trauen darf, dann müssten das SIMATIC IPC677D sein. Zumindest sehen die im Produktkatalog dem sehr ähnlich, wenn mich mein visuelles Erinnerungsvermögen nicht völlig verlassen hat.
@naphets: TApplicationEvents habe ich noch nie eingesetzt. (Kein Grund, hab's mir einfach nie genauer angesehen.) Aber riesen Dank für die Tipps bzgl. Jedi - die habe ich immerhin schon drauf! Das probiere ich auch mal. Wobei ich nach wie vor noch immer skeptisch bei den Error-Loggern bin, da das Programm ja scheinbar außerhalb der normalen Fehlerbehandlung aussteigt. Meine "Fehlerabfangroutine" sieht so aus:
Delphi-Quellcode:
Es ist die Ereignisroutine für TApplicationEvents.OnException.
{-----------------------------------------------------------------------------
Procedure: AppEventsException Date: 04.10.2012 Arguments: Sender: TObject; E: Exception Result: None Purpose: Ausgabe von Fehlermeldungen. Diese Routine wird beim Auftreten von Exceptions aufgerufen. -----------------------------------------------------------------------------} procedure TSBAutoRegistry.AppEventsException(Sender: TObject; E: Exception); Var sExceptionClassMessage : String; sDebugMessage : String; sMessage : String; sAddr : String; sOwner : String; dbgLocInfo : TJclLocationInfo; begin try // Ist Fehlerverursacher eine Komponente oder deren Nachfolger? if Sender is TComponent then begin // Hat sie einen Owner? if HasProperty(Sender, 'Owner') then begin // Dann diesen ermitteln sOwner := GetStrProp(Sender,'Owner'); // und die Fehlermeldung zusammen bauen. sExceptionClassMessage := Format('%s, Fehlertyp: %s, Sender: %s [%s], Owner: %s', [E.Message, E.ClassName, TComponent(Sender).Name, Sender.ClassName, sOwner ]); // Sollen Debugfehlermeldungen erstellt werden? if fDebugMessages then begin sDebugMessage := Format('%s',[E.Message]) + #13 + #13 + Format('Fehlertyp: %s',[E.ClassName]) + #13 + Format('Sender: %s [%s]',[TComponent(Sender).Name, Sender.ClassName]) + #13 + Format('Owner: %s',[sOwner]) + #13; end; end else begin // Es gibt keinen Owner // und die Fehlermeldung zusammen bauen. sExceptionClassMessage := Format('%s, Fehlertyp: %s, Sender: %s [%s]', [E.Message, E.ClassName, TComponent(Sender).Name, Sender.ClassName ]); // Sollen Debugfehlermeldungen erstellt werden? if fDebugMessages then begin sDebugMessage := Format('%s',[E.Message]) + #13 + #13 + Format('Fehlertyp: %s',[E.ClassName]) + #13 + Format('Sender: %s [%s]',[TComponent(Sender).Name, Sender.ClassName]) + #13; end; end; end else begin // Der Fehlerverursacher ist keine Komponente oder einer ihrer Nachfolger. sExceptionClassMessage := Format('%s, Fehlertyp: %s, Sender: %s', [E.Message, E.ClassName, Sender.ClassName ]); // Sollen Debugfehlermeldungen erstellt werden? if fDebugMessages then begin sDebugMessage := Format('%s',[E.Message]) + #13 + #13 + Format('Fehlertyp: %s',[E.ClassName]) + #13 + Format('Sender: %s',[Sender.ClassName]) + #13; end; end; finally end; // Von der JCL genauere Fehlerinformationen ermitteln lassen dbgLocInfo := GetLocationInfo(ExceptAddr); // und diese in eine lesbare Zeichenfolge bringen lassen. sMessage := GetLocationInfoStr(ExceptAddr, True, True, True, True); // Einen Teil davon möchten wir jedoch separat haben. sAddr := Copy(sMessage,2,Pos(')',sMessage) - 2); // Und die Fehlermeldung in die LOG-Datei ausgeben. WriteAppLog(sExceptionClassMessage); WriteAppLog(sMessage); WriteAppLog(Format('Dateiname: %s',[ExtractFileName(dbgLocInfo.DebugInfo.FileName)])); WriteAppLog(Format('Fehleradresse: %s',[sAddr])); WriteAppLog(Format('Unit: %s',[dbgLocInfo.UnitName])); WriteAppLog(Format('Fehleradresse: %p',[dbgLocInfo.Address])); WriteAppLog(Format('Modulname: %s',[dbgLocInfo.SourceName])); WriteAppLog(Format('Prozedur: %s',[dbgLocInfo.ProcedureName])); WriteAppLog(Format('Prozeduroffset: %d',[dbgLocInfo.OffsetFromProcName])); WriteAppLog(Format('Zeilennummer: %d',[dbgLocInfo.LineNumber])); WriteAppLog(Format('Zeilenoffset: %d',[dbgLocInfo.OffsetFromLineNumber])); WriteAppLog(Format('Modul: %d [%x]',[dbgLocInfo.DebugInfo.Module, dbgLocInfo.DebugInfo.Module])); if fDebugMessages then begin // Dann hier eine entsprechende Zeichenfolge zusammenbauen. sDebugMessage := sDebugMessage + #13 + Format('Dateiname: %s',[ExtractFileName(dbgLocInfo.DebugInfo.FileName)]) + #13 + Format('Fehleradresse: %s',[sAddr]) + #13 + #13 + Format('Unit: %s',[dbgLocInfo.UnitName]) + #13 + Format('Fehleradresse: %p',[dbgLocInfo.Address]) + #13 + Format('Modulname: %s',[dbgLocInfo.SourceName]) + #13 + #13 + Format('Prozedur: %s',[dbgLocInfo.ProcedureName]) + #13 + Format('Prozeduroffset: %d',[dbgLocInfo.OffsetFromProcName]) + #13 + Format('Zeilennummer: %d',[dbgLocInfo.LineNumber]) + #13 + Format('Zeilenoffset: %d',[dbgLocInfo.OffsetFromLineNumber]) // + #13 + #13 // + Format('Modul: %d [%x]',[dbgLocInfo.DebugInfo.Module, dbgLocInfo.DebugInfo.Module]) // + Format('BinaryFile: %s',[dbgLocInfo.BinaryFileName]) + #13 ; end else begin sDebugMessage := e.Message; end; // Ist eine Ereignisroutine für die Fehlerausgabe... zugewiesen? if Assigned(fOnAppExceptionEvent) then begin fOnAppExceptionEvent(self,sDebugMessage); end else begin // Wenn keine Ereignisroutine für die Fehlerbehandlung zugewiesen ist, // geben wir hier selbst eine Fehlermeldung aus. MessageDlg(sDebugMessage, mtError, [mbOk], 0); end; end; Eventuell kannst Du mit Teilen davon ja was anfangen. |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |