Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Eingaben mitloggen (https://www.delphipraxis.net/194112-eingaben-mitloggen.html)

matashen 18. Okt 2017 09:20

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

RWarnecke 18. Okt 2017 10:11

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.

TiGü 18. Okt 2017 10:15

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:
https://www.pcwelt.de/tipps/Mit-der-...-10096546.html

Rollo62 18. Okt 2017 10:47

AW: Eingaben mitloggen
 
Das hier würde ich mir auch mal ansehen ...

Rollo

4dk2 18. Okt 2017 13:28

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 22:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz