![]() |
Eingaben mitloggen
Hallo zusammen,
ich hab momentan einen nicht nachvollziehbaren Fehler bei einer meiner Programme. Ich geh davon aus das der/die Benutzer einen Arbeitsablauf verwenden den ich nicht getestet habe und der zu einem Datenfehler führt. Um das einzugrenzen möchte ich gern mitloggen welcher Button gedrückt bzw welche Eingabe gemacht wurde. gibt es eine einfache Methode das mit zu loggen? Ich hab jetzt eine Stunde rum gesucht und nichts passendes gefunden, meine aber hier in der DP schon mal ein Debug-logging gesehen zu haben das über die ganze Anwendung hinweg Eingaben erfasst. Gruß Matthias |
AW: Eingaben mitloggen
Die Komponente Eurekalog wäre hier sicherlich ein Ansatz. Das Log gibt dir genau den Ablauf aus mit Zeilenangabe, wo das Programm hingesprungen ist und wo die Exception aufgetreten ist. Dazu kannst Du Dir auch einen Screenshot erstellen lassen zu der Zeit, wo die Exception auftritt.
|
AW: Eingaben mitloggen
Kannst du den Benutzer dazu bringen ein externes Programm zu starten und das daraus resultierende Log mitzuschicken?
Seit Windows 7 gibt es die "Problemaufzeichnung" (später "Schrittaufzeichnung"). Hiermit kannst du später nachvollziehen, was in deinen Programm geklickt wurde: ![]() |
AW: Eingaben mitloggen
|
AW: Eingaben mitloggen
ich würde als erste JV empfehlen
(...jcl git\jcl\experts\repository\ExceptionDialog\Standar dDialogs\ExceptDlg.pas) wenn der in projekt eingebunden ist, meldet der den Fehler und Aufrufstack. du solltest aber dann Projekt-> JCL Debug Expert -> Generate und Insert aktivieren und -> .Map Datei löschen aktivieren, Bzw dann auch testen einmal ob eine Exception angezeigt wird und der richtige Stack. Der Aufrufstack sollte eigendlich zu 99% der Fehler führen. Aber du kannst auch einfach eine Protokollierung der Controls für deine Anwendung erstellen.
Delphi-Quellcode:
type
TForm2 = class(TForm) tmr1: TTimer; mmo1: TMemo; edt1: TEdit; btn1: TButton; procedure tmr1Timer(Sender: TObject); procedure FormShow(Sender: TObject); private FLastForm:TForm; FLastControl:TControl; protected procedure WndProc(var Message: TMessage); override; { Private-Deklarationen } public { Public-Deklarationen } end; var Form2: TForm2; implementation {$R *.dfm} uses Unit3; procedure TForm2.FormShow(Sender: TObject); begin Form3.show; end; procedure TForm2.tmr1Timer(Sender: TObject); var CurForm:TForm; CurControl:TControl; begin if tmr1.Tag<>0 then exit; tmr1.Tag:=1; //logging über Screen... CurForm:=Screen.ActiveForm; CurControl:=Screen.ActiveControl; if CurForm<>FLastForm then begin mmo1.Lines.Add(CurForm.ToString()+'.'+CurForm.Name); FLastForm:=CurForm; end; if CurControl<>FLastControl then begin mmo1.Lines.Add(CurControl.ToString()+'.'+CurControl.Name); FLastControl:=CurControl; if CurControl is TButton then begin //noch irgendwas ? end; end; tmr1.Tag:=0; end; procedure TForm2.WndProc(var Message: TMessage); var MausPos: TPoint; control: TControl; begin //logging über die Messages... //aus http://www.delphipraxis.net/45239-wndproc-funktioniert-nicht-mit-buttons-auf-formular.html If (Message.Msg = WM_LBUTTONDOWN) or ((Message.Msg = WM_PARENTNOTIFY) and (Message.wParam = WM_LBUTTONDOWN)) then begin GetCursorPos(MausPos); MausPos := ScreenToClient(MausPos); control := self.ControlAtPos(MausPos, false, true); //oder control := screen.ActiveControl; if control = nil then mmo1.Lines.Add('WndProc: WM_LBUTTONDOWN --- nil ---') else mmo1.Lines.Add('WndProc: WM_LBUTTONDOWN --- '+control.name+' ---') end; inherited WndProc(Message); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz