Announcement

Collapse
No announcement yet.

Aufruf Stack

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Aufruf Stack

    Hallo,
    ich möchte eine Protokolldatei (TRACE) führen, in der ich protokolliere, wann welches Ereignis aufgerufen wurde. Dazu benötige ich, ähnlich wie der Ansicht Aufruf-Stack, den Namen der Aufrufenden Prozedur.

    Wie komme ich an diesen Namen ??

    Tipps immer wieder gerne genommen

    Gruß
    Heiko

  • #2
    naja, nicht elegant, aber eine lösung, wenn's denn unbedingt sein soll

    Das Formular
    <PRE>
    object Form1: TForm1
    Left = 290
    Top = 106
    Width = 489
    Height = 292
    Caption = 'Form1'
    Color = clBtnFace
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    OldCreateOrder = False
    PixelsPerInch = 96
    TextHeight = 13
    object Label1: TLabel
    Left = 288
    Top = 8
    Width = 41
    Height = 13
    Caption = 'Protokoll'
    end
    object Memo1: TMemo
    Left = 8
    Top = 48
    Width = 273
    Height = 209
    Lines.Strings = (
    'Memo1')
    TabOrder = 0
    OnChange = Memo1Change
    OnClick = Memo1Click
    OnKeyDown = Memo1KeyDown
    end
    object Button1: TButton
    Left = 8
    Top = 16
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 1
    OnClick = Button1Click
    end
    object Memo2: TMemo
    Left = 288
    Top = 24
    Width = 185
    Height = 233
    Lines.Strings = (
    'Memo2')
    TabOrder = 2
    end
    end
    </PRE>
    Die Unit
    <PRE>
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls;

    type
    TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Memo1Change(Sender: TObject);
    procedure Memo1Click(Sender: TObject);
    procedure Memo1KeyDown(Sender: TObject; var Key: Word;
    Shift: TShiftState);
    private
    FOnAppAction : TNotifyEvent;
    { Private-Deklarationen }
    procedure AppAction(Sender: TObject; JobKind: string);
    public
    { Public-Deklarationen }
    property OnAppAction: TNotifyEvent read FOnAppAction write FOnAppAction;
    end;
    var
    Form1: TForm1;

    implementation

    {$R *.DFM}

    procedure TForm1.AppAction(Sender: TObject; JobKind: string);
    begin
    Memo2.Lines.add(JobKind);
    if Assigned(OnAppAction) then OnAppAction(Self);
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    AppAction(Sender,'Button1Click');
    end;

    procedure TForm1.Memo2Change(Sender: TObject);
    begin
    // AppAction(Sender,'Memo2Change'); GEHT natürlich NICHT, weil End-Los-Loop
    end;

    procedure TForm1.Memo1Click(Sender: TObject);
    begin
    AppAction(Sender,'Memo1Click');
    end;

    procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
    AppAction(Sender,'Memo1KeyDown ' + inttostr(Key));
    end;

    end.

    </PRE>

    nun, bei näherer überlegung ist das so schlecht auch wieder nicht, weil du damit grundsätzlich festlegst, was protokolliert wird.

    Beim Einsatz in den Key + Mouse-Events hast Du sonst nämlich schnell ein paar Tausend -Events, denn jeder Key und Mouse Click sind ja 3 x Fire, bei Kombination mit Shift und dergl wirds dann richtig heftig, wie du Dir mittels des kleinen Progrämmchens ja ansehen kannst.

    Wenn dann mal einer auf der Tastatur einschläft, hast du viel,viel Müll in Deinem Protokoll.

    Bei redlichen Absichten wirst Du sicher auch diese Ereignisse nicht mitprotokollieren wollen.

    gruss
    bernhar

    Comment


    • #3
      Mhh...

      Nee, ich glaub, das ist nicht was ich gemeint habe...

      Was ich derzeit habe ist: Eine Prozedur

      <PRE>procedure debug(S: string);
      var f: text;
      begin
      assignfile(f, 'prot.log');
      if fileexists('prot.log') then
      append(f)
      else
      rewrite(f);
      writeln(f,format('%0.6d - '+Benutzer+' - ',[gettickcount-starttick])+ s);
      closefile(f);
      end;</PRE>

      Um zu erreichen was du meinst, brauche ich auch bloss in jedem Ereignis diese Prozedur mit meinem (manuell geführten) String aufrufen...

      "AppAction(Sender,'Button1Click'); "

      .. was ich will ist, ein Aufruf alá

      <PRE> debug(Mutterprozedur)</PRE>

      Ich weiss, wieder mal ziemlich abgefahren...

      Danke trotzdem erstmal

      Heik

      Comment


      • #4
        Dafuer besorge dir am besten die Jedi Code Library. http://jcl.sf.net/daily <br>
        JclDebug.pas sollte mehr bieten als du je brauchst

        Comment


        • #5
          Danke für den Tip Robert,
          ich probiere es mal.

          Heik

          Comment


          • #6
            Kleiner Hinweis: Borland nutzt die Unit seit einiger Zeit selber. :-

            Comment

            Working...
            X