Loggare operazioni utente

di il
5 risposte

Loggare operazioni utente

Ho una app con diversi form e diversi pannelli e ovviamente diversi componenti.

Principalmente l'applicativo ha una mainform, su questa è posizionato un pannello.

Questo pannello diventa poi il parent di un altro pannello di un altra form.

Probabilmente mi sono spiegato male ma quello che a me serve sarebbe creare un file di log che logghi qualsiasi cosa l utente scriva da tastiera e soprattutto che logghi i vari click sui componenti, riportando appunto il nome dell oggetto cliccato.

Ovviamente mettermi a fare un Onclick su tutti gli oggetti di tutte le form mi diventa improponibile.

Ho provato con l oggetto Applicationevent ma pare non funzioni o non sono riuscito a farlo funzionare, per esempio già su un pannello non “prende” il click.

qualche consiglio?

grazie

5 Risposte

  • Re: Loggare operazioni utente

    La soluzione non e' cosi semplice. 

    Diciamo che un approccio è quello di creare una versione “che scrive i log” di TUTTI i componenti che usi. 

    Cioe' (quasi) esattamente quello che dichiari “improponibile” 

    Un secondo approccio e' “Rimpiazzare” i metodi che ti interessano con una versione che logga

    MA vuol dire entrare nei dettagli piu' infinitesimi dell'implementazione del linguaggio. Con Python e' semplice. Nel 99% degli altri casi, estremamente difficile. 

    Il terzo approccio è fare in modo di non avere questa esigenza ;-)

    l'ultimo e' ovviamente, quello di ‘infilare’ delle callback direttamente a livello di sistema operativo. 

    MA e' pratica da ‘hacker’ che il SO non ti lascia fare ‘inpunemente’ . E comunque a questo livello ci sono ben pochi software ‘legittimi’ che ne hanno necessita'

    Ci sarebbe un'altro modo  ma si puo' fare solo in java,C# è linguaggi simili. 

  • Re: Loggare operazioni utente

    27/02/2024 - ziobacco ha scritto:


    Principalmente l'applicativo ha una mainform, su questa è posizionato un pannello.

    Questo pannello diventa poi il parent di un altro pannello di un altra form.

    Pur essendo possibile farlo, mi chiedo qual è il senso di una simile architettura, sia perché vi sono componenti appositamente dedicati per realizzare pezzi di interfaccia (Frame), sia perché il codice preposto a governare una commistione di Form e pannelli di questo tipo non sarà senz'altro ottimale, oltre a essere a rischio di “glitch” dati dal fatto che nascono su due Form diversi e hanno rispetti Owner differenti.

    Ma sorvoliamo su questo non essendo il punto centrale del problema (anche se mi permetto di sollevare qualche dubbio e critica). :)

    27/02/2024 - ziobacco ha scritto:


    Probabilmente mi sono spiegato male ma quello che a me serve sarebbe creare un file di log che logghi qualsiasi cosa l utente scriva da tastiera e soprattutto che logghi i vari click sui componenti, riportando appunto il nome dell oggetto cliccato.

    Anche qui, mi sembra strana una simile esigenza, proprio perché in genere quello di cui si tiene traccia è un “call stack” in caso di problemi, oppure il log delle operazioni che vengono fatte a livello “logico”, quindi i “comandi business” eseguiti e che fanno parte della propria implementazione, piuttosto che dell'evento (click o altro) che porta alla loro esecuzione, che è meno rilevante, anche perché alcune azioni possono essere scatenate in diversi modi (posso confermare una dialog cliccando un pulsante, premendo INVIO, chiudendo con la X, premendo ESC, ecc.).

    27/02/2024 - ziobacco ha scritto:


    Ovviamente mettermi a fare un Onclick su tutti gli oggetti di tutte le form mi diventa improponibile.

    Diciamo che qui le cose improponibili iniziano a essere parecchie… :)

    27/02/2024 - ziobacco ha scritto:


    Ho provato con l oggetto Applicationevent ma pare non funzioni o non sono riuscito a farlo funzionare, per esempio già su un pannello non “prende” il click.

    Non hai postato il codice né hai spiegato come usi quel componente, quindi risulta difficile darti una mano in questo senso.

    27/02/2024 - ziobacco ha scritto:


    qualche consiglio?

    Prima di tutto, dovresti dire a che ti serve una cosa del genere. Non perché ci si voglia fare gli affari tuoi, ma perché la necessità guida i possibili suggerimenti riguardo soluzioni che sono probabilmente più efficaci di quella che vuoi mettere in piedi, a cui magari hai pensato inizialmente non valutando altre strade che, architetturalmente, ti risolverebbero la problematica alla radice.

    In linea generale, non c'è un modo per loggare automaticamente gli eventi. Vi sono tutt'al più dei componenti, come ApplicationEvents, con i quali puoi intercettare messaggi in generale, ma trattandosi appunto di un sistema “centrale” e generico, i messaggi sono contestualizzati in modo altrettanto generico (ovvero vedi costanti per il tipo di messaggio, un handle per il controllo interessato, ecc. e non vedi “OnClick su Button1”, per intenderci, perché quel contesto viene creato in seguito, nella logica di Delphi che converte il messaggio in coda e lo indirizza al componente e all'evento relativo). Una variante potrebbe essere quella di usare controlli che derivano da quelli standard di Delphi e integrare nel click un log dell'evento.

    In conclusione, le soluzioni sono svariate, ma io prima analizzerei qual è il problema che porta a una necessità del genere, che non ho visto da nessuna parte (se non contestualizzata in termini di “metriche” e “analytics”, ma in quel caso non c'entrano i singoli click ma i dati aggregati e presi dalla logica business, ovvero “quante volte stampo una fattura”, ad esempio, e “quanto tempo impiego a generare un report”).

    Solo in seguito, penserei alle soluzioni più adatte.

  • Re: Loggare operazioni utente

    28/02/2024 - migliorabile ha scritto:


    Ma sorvoliamo su questo non essendo il punto centrale del problema (anche se mi permetto di sollevare qualche dubbio e critica). :)

    posso essere in accordo ma come al solito mi trovo a dover modificare una app della preistoria, iniziata con non so neanche che versione di delphi, e cosi è stato fatto, una main con un pannello centrale e varie finestre dei sottomenu che per essere visualizzate vengono messe in questo pannello, cosi è.

    Faccio un passo indietro.

    Sulla main form c'è una label che visualizza un dato, questo dato è preso al click di una riga di una dbgrid.

    cioe' esiste una lista di lavori che possono essere caricati a sistema, per caricare questo lavoro l utente deve selezionare una riga e cliccare su un bottone “load”.

    Esiste quindi una procedura che in base al ID del lavoro carica vari parametri di quel lavoro e nello specifico il nome del lavoro finisce in una label nella mainform.

    Il cliente dice che a random, ogni tanto, quella label cambia “da sola”…

    cercando nel codice l istruzione d assegnamento della caption di quella label ho trovato solo un' istruzione che viene eseguita al caricamento di un lavoro, ed il caricamento del lavoro avviene solo al click di quel bottone.

    Il fatto quindi di loggare il click di quel bottone mi sarebbe servito per “dimostrare” che la label non “cambia da sola”, o almeno lo spero, altrimenti non saprei neppure dove e come andare a verificare il cambio random…

    La cosa strana è che riferiscono che cambia solo la label, mentre al caricamento del lavoro a quel punto dovrebbero cambiare anche altri parametri.

    l'idea quindi di loggare cosa fa l utente è nata da qui, vero che nello specifico adesso mi servirebbe solo quel bottone diciamo, ma gia che c'ero volevo fare una cosa “generale”.

  • Re: Loggare operazioni utente

    Beh, stando così le cose puoi creare il log nell'evento OnClick del pulsante in contemporanea all'evento MouseMove o OnEnter. Almeno se succede sai se il mouse si trovava sul pulsante e l'utente ha fatto click. se non trovi il mousemove log e/o onenter log allora l'evento click lo richiama il codice da qualche parte. Sicuro che l'evento non venga richiamato da codice sparso da qualche parte? oltre a cercare Labelxy prova a cercare Buttonmz.click per vedere se viene evocato da qualche parte. Togli anche il tabstop e eventuale default al pulsante. In piu' aggiungi un messaggio di conferma (data la delicatezza del ruolo del pulsante), oppure prima lo abiliti anche con una variabile logica: se libero=true allora click. Alla fine del lavoro con pulsante “fine” riporti libero a true. Un log mi sembra l'ultima spiaggia, di solito si usa per i dati dove metti data ora utente tabella e record modificato così se ti dicono che un dato sparisce sai chi è il colpevole.

  • Re: Loggare operazioni utente

    28/02/2024 - ziobacco ha scritto:


    posso essere in accordo ma come al solito mi trovo a dover modificare una app della preistoria, iniziata con non so neanche che versione di delphi, e cosi è stato fatto, una main con un pannello centrale e varie finestre dei sottomenu che per essere visualizzate vengono messe in questo pannello, cosi è.

    Ok, ma il codice è scritto dentro ai file sorgenti e non è scolpito nella pietra: in alcuni casi si può anche cercare di rifattorizzare un minimo, pena poi il verificarsi di “side effect” a volte anche imprevedibili. Ma come dicevo, è un'altra questione.

    28/02/2024 - ziobacco ha scritto:


    Il cliente dice che a random, ogni tanto, quella label cambia “da sola”…

    Ok. Posso confermarti che si tratta di un “classico”, anche se da sviluppatori software sappiamo che il programma in sé non ha una volontà propria, quindi c'è senz'altro un motivo per cui cambia.

    28/02/2024 - ziobacco ha scritto:


    cercando nel codice l istruzione d assegnamento della caption di quella label ho trovato solo un' istruzione che viene eseguita al caricamento di un lavoro, ed il caricamento del lavoro avviene solo al click di quel bottone.

    In questo caso, la tua “prova” del fatto è il codice che costituisce “fonte di verità”: se dal sorgente risulta che il valore viene impostato in quel punto e solo in quello, a meno che non vi siano procedure automatiche che invocano la stessa routine che parte al clic del pulsante, questo deve bastare.

    28/02/2024 - ziobacco ha scritto:


    Il fatto quindi di loggare il click di quel bottone mi sarebbe servito per “dimostrare” che la label non “cambia da sola”, o almeno lo spero, altrimenti non saprei neppure dove e come andare a verificare il cambio random…

    Credimi, qualora tu avessi un log sul click, il cliente metterebbe comunque in discussione la validità del tuo log ribadendo la presenza del problema. :)

    28/02/2024 - ziobacco ha scritto:


    l'idea quindi di loggare cosa fa l utente è nata da qui, vero che nello specifico adesso mi servirebbe solo quel bottone diciamo, ma gia che c'ero volevo fare una cosa “generale”.

    Capisci però che non ha senso loggare dei click quando l'utente dice che la Label cambia senza fare clic, e nel contempo non ha senso loggare tutto, non solo i click, perché un cliente sostiene che c'è una Label che cambia in modo random, quando in informatica il random è un concetto molto ristretto e tutt'al più può avvenire in un momento in cui quel cambiamento non è atteso, ma capire cosa lo scatena deve partire da un'analisi del codice e da tutti i punti che possono dare luogo all'invocazione della routine che cambia quel valore, non ci sono altri strumenti che possono venire in aiuto.

    Le possibilità qui sono poche:

    1. il cliente sta parlando di uno scenario che non è stato ben compreso o magari dice di non aver “fatto nulla” anche se ha scatenato in qualche modo l'esecuzione del cambio di Label,
    2. il cliente non si ricorda di aver cliccato o dato luogo in altri modi alla procedura che cambia la Label,
    3. nonostante le tue ricerche, sono presenti altri punti in cui la Label viene cambiata
    4. magari la Label non viene cambiata ma il suo pannello viene sostituito da un altro pannello con una Label simile che viene scambiata per la prima dicendo che “cambia”, ma in realtà non è così.

    Per risolvere:

    1. Digli di produrre un video quando utilizza il software e di fornirtelo nel momento in cui avviene il problema, evidenziandoti i punti a cui si riferisce.
    2. Ricontrolla il codice sorgente del progetto: se siamo in presenza di Form che diventano Parent di pannelli che stanno in altre Form, la logica è tutto fuorché lineare e non si può escludere a priori che esista codice che cambia la Label in modi imprevisti, e un log di un click non risolverebbe comunque la questione.
Devi accedere o registrarti per scrivere nel forum
5 risposte