Newsgroup: it.comp.lang.delphi
Titolo: Come costruire un logger?

Avrei la necessità di creare un oggetto , che mi crei un log di  tutto
quello che accade nel mio programma. C'è in  giro qualcosa del genere?
Qualcuno può darmi un suggerimento?
Grazie Marco
ps, Auguri di Buon Anno a tutti

 Qualcuno può darmi un suggerimento?
in che senso "tutto cio' che accade"?
... non so, potresti usare un TStringList dove aggiungi
(quando ritieni opportuno) delle stringe
Ciao,
Alan Solo

 > Qualcuno puņ darmi un suggerimento?


 usare il termine "TRACER" invece che file di log.
non ne ho mai sentito parlare, sinceramente,
e, risincermente non mi viene in mente un modo comodo per farlo
"generalizzato"...
cio' che ti suggerivo prima era, ad es. se vuoi sapere quando si entra in
un evento
procedure Form1.Button1Click(...)
begin
 Log.Add('E' stato cliccato Button1');
 ....
end;
dove log e' un TStringList...
poi ad es. lo puoi salvare su file Log.SaveToFile('Log.txt');
... non e' cio' che vuoi eh? ... non mi viene altro ;)
per il resto cedo la parola, non ho mai affrontato il problema
Ciao,
Alan Solo

 > Intendo dire tutto ciņ che puo accardere... es. premuto pulsante


 Ti ringrazio comunque dell'aiuto.
di niente, cmq ho avuto un'illuminazione mistica,
ho messo giu' due righe:
var
  Form1: TForm1;
  L: TStringList;
implementation
{$R *.DFM}
function ComponentNameByHandle(Handle: hwnd):string;
var i: integer;
begin
 i:=0;
 while i<Form1.ComponentCount do begin
  if (Form1.Components[i] is TWinControl)
   and (TWinControl(Form1.Components[i]).Handle=Handle)
   then begin
    Result := Form1.Components[i].Name;
    i:=Form1.ComponentCount; // esce dal ciclo :P
   end
   else inc(i);
 end;
end;
procedure TForm1.MyApplicationMessage(var Msg: TMsg; var Handled: Boolean);
begin
 case Msg.Message of
  WM_LBUTTONDOWN: L.Add('Click SX su '+ComponentNameByHandle(Msg.hwnd));
  WM_RBUTTONDOWN: L.Add('Click DX su '+ComponentNameByHandle(Msg.hwnd));
  // ecc...
 end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
 Application.OnMessage:=MyApplicationMessage;
 L:=TStringList.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
 L.SaveToFile('C:\log.txt');
 L.Free;
end;
l'ho provata e funziona, ci sono cmq delle cose che potrbbero essere
migliorate tipo la funzione fatta "in casa" da me ComponentNameByHandle
cmq come idea non mi sembra malaccio e poi non tanto difficile da
realizzare, in alternativa potresti anche semplicemente scrivere il
"numero" del messaggio cioe' Msg.Message, in questo modo potresti loggare
tutti i messaggi senza bisogno del case, anche se poi diventerebbe
incomprensibile, anziche' vedere
"click DX su Button1"
vedrai
"xxxyyyxyxy su Button1"
magari poi potresti farti un "traduttore" del log (non so se esiste un
qualcosa del tipo GetMessageName(Msg.Message) gia' fatto...)
Beh, ti saluto :)
Ciao,
Alan Solo


Il codice che hai scritto va bene per intercettare i click o i messaggi
"postati" alla message queue dell'applicazione, ma mi pare che non
intercetti nulla che sia stato inviato con un "SendMessage" invece che con
un "PostMessage". Inoltre se si vuole loggare anche cosa fa il programma al
di fuori degli eventi (tipo lettura da un file, scrittura su tabelle, ecc.)
devi per forza farlo a mano quando scrivi il programma. =(
Alla fine io ho fatto cosi' (e su un programma di 80.000 righe e' stata una
vera palla, ma in fase di debug serve moltissimo). =)
Ciao
Daigo

 ma in fase di debug serve moltissimo). =)
hehe almeno un lato positivo c'e'... ;)
Ciao,
Alan Solo