Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di colde
    Registrato dal
    Feb 2001
    Messaggi
    1,802

    Help su procedure con component ApdComPort

    Ciao a tutti,
    avrei un problema in una DLL con l'uso di procedure e assegnazioni a variabili.
    Mi spiego meglio sperando che in qualche modo si possa fare ciò che vorrei:
    in una funzione apro la porta COM1 e invio alcuni dati alla seriale dopodichè li ricevo (almeno spero) tramite DataPacket. La ricezione avviene tramite procedura all'evento OnStringPacket(Sender: TObject; Data: String) ma dato che le procedure non ritornano un valore, devo riuscire ad assegnare a una variabile (interna alla mia funzione) il valore di "Data" creata dalla procedura. Questo perchè il dato ricevuto devo rispedirlo all'applicazione che ha richiamato la funzione nella DLL. La DLL non ha form, solo codice.

    Questa è una parte del codice inserita nella mia funzione:

    codice:
    var Data: string;
    .
    .
    .
    if ApdComPort1.Open then
          begin
            ApdComPort1.PutString(chr($04));
            ApdComPort1.PutString(chr($01)+chr($41)+DID+chr($05));
            ApdDataPacket1.StartCond := scString;
            ApdDataPacket1.StartString := '02';
            ApdDataPacket1.EndCond := [ecString];
            ApdDataPacket1.EndString := '03'+'?';
            ApdDataPacket1.IncludeStrings := true;
            ApdDataPacket1.OnStringPacket(ApdDataPacket1, Data); <------
            ResponseBox := Data; <------
    .
    .
    .
    Non ci sono errori di compilazione ma all'avvio mi da access violation. L'istruzione che provova l'errore è proprio ApdDataPacket1.OnStringPacket(ApdDataPacket1, Data);
    La procedura OnStringPacket salva i dati reperiti nella variabile Data e al termine dell'evento la varibile viene azzerata. E' possibile fare qualcosa?

    Grazie
    www.beppegrillo.it
    Il blog di Beppe!!

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,311
    Non ho sottomano i componenti a cui fai riferimento, ma posso dire con probabile certezza che OnStringPacket è un evento.

    Ciò che stai facendo, quindi, è materialmente la chiamata al metodo che può essere associato a quell'evento per l'intercettazione.

    Ci sono in sostanza più errori logici, totalmente slegati dai componenti in sé, nel codice: innanzitutto, è quasi certo che l'evento OnStringPacket non sia intercettato dal tuo codice; in secondo luogo, in generale sono i componenti ad invocare gli eventi quando accade qualcosa, passando loro i parametri opportuni (come avviene, ad esempio, per il clic su un pulsante con l'evento OnClick).

    In sostanza, hai fatto tutti e due gli errori assieme: invochi al posto del componente un evento al quale non è associato alcun metodo.

    Documentati riguardo l'uso di metodi, proprietà ed eventi nell'utilizzo (e nella creazione) di componenti Delphi, oppure semplicemente leggi la documentazione dei componenti che stai utilizzando che riporta numerosi esempi.

    Se vai a caso, ti garantisco che non funzionerà nulla...
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di colde
    Registrato dal
    Feb 2001
    Messaggi
    1,802
    Non si tratta di andare a caso Alka, si tratta di capire, e io non ho capito come fare quello che vorrei e ti assicuro che mi sto leggendo guide su guide oltre a supazzarmi la guida del componente ma evidentemente sono tardo. Lo so anche io che OnStringPacket è il metodo associato a quell'evento che richiama la procedura ma non potendola utilizzare devo riuscire a recuperare sto benedetto valore in qualche modo per ritornarlo all'applicazione quando l'evento viene richiamato.

    l'evento TStringPacketNotifyEvent avvia la procedura procedure(Sender: TObject; Data: String)

    Premesso che non appena i dati sono disponibili il componente richiama l'evento in modo autonomo, come faccio a recuperarne il valore?
    www.beppegrillo.it
    Il blog di Beppe!!

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,311
    Originariamente inviato da colde
    Non si tratta di andare a caso Alka, si tratta di capire, e io non ho capito come fare quello che vorrei e ti assicuro che mi sto leggendo guide su guide oltre a supazzarmi la guida del componente ma evidentemente sono tardo.
    Non credo che nella documentazione che hai letto vi sia alcuna indicazione ad utilizzare l'evento nel modo che hai adottato tu; quindi, se non c'è scritto e tu lo fai sperando che funzioni, se non vai a caso vai per tentativi, ma non è che cambi molto.

    Gli eventi vengono generati dai componenti per eseguire *tuoi* metodi passando i parametri utili per l'evento stesso, non il contrario.

    Originariamente inviato da colde
    Lo so anche io che OnStringPacket è il metodo associato a quell'evento che richiama la procedura
    Se sai che si tratta del riferimento alla procedura da eseguire quando l'evento viene generato, perché provvedi tu a richiamare manualmente quella procedura, senza averla assegnata, usando l'identificatore dell'evento?

    Originariamente inviato da colde
    ma non potendola utilizzare devo riuscire a recuperare sto benedetto valore in qualche modo per ritornarlo all'applicazione quando l'evento viene richiamato.
    Su questo sono d'accordo.

    Originariamente inviato da colde
    l'evento TStringPacketNotifyEvent avvia la procedura procedure(Sender: TObject; Data: String)
    L'evento non avvia nulla: tecnicamente, gli eventi sono "riferimenti a procedure", sono proprietà speciali a cui è possibile assegnare una procedura come valore; quando nel componente si determina il caso in cui è necessario generare un evento, quel riferimento viene controllato e, se assegnato, viene eseguita la procedura agganciata.

    Originariamente inviato da colde
    Premesso che non appena i dati sono disponibili il componente richiama l'evento in modo autonomo, come faccio a recuperarne il valore?
    Se il componente genera l'evento quando i dati sono disponibili, crea un metodo di risposta all'evento che abbia il numero e il tipo di parametri richiesti dall'evento stesso e assegnalo all'evento in modo che, quando è necessario, il componente esegua il tuo metodo passando ad esso i dati necessari che tratterai successivamente come credi.

    Se il "prototipo" dell'evento è così dichiarato

    codice:
    TStringPacketNotifyEvent = procedure(Sender: TObject; Data: String) of object;
    crea un metodo nella tua classe personalizzata che sia compatibile con tale prototipo

    procedure TMyClass.MyPacketNotifyEvent(Sender: TObject; Data: string);
    begin
    // Codice di gestione dell'evento...
    end;

    e assegna all'evento del componente il riferimento al tuo metodo

    codice:
    ApdComPort1.OnStringPacket := MyPacketNotifyEvent;
    In questo modo, il componente - quando sarà necessario generare l'evento - non farà altro che richiamare un tuo metodo.

    Non è nulla di diverso da quanto avviene con il clic su un pulsante e l'evento OnClick intercettato con un metodo del Form che lo ospita, con la differenza che il metodo di gestione e la sua assegnazione avviene tramite l'Object Inspector in modo semplificato.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.