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

    DLL e turbopower

    Ciao a tutti,
    premesso che non ho mai creato una libreria in vita mia, vorrei crearne
    una per la connessione a una porta seriale ma avrei qualche
    difficoltà.
    Questo è il codice che ho iniziato a scrivere:

    uses
    SysUtils {: CoClass},
    Classes {: CoClass},
    ShareMem {: CoClass};


    type
    TApdComPort = Class


    {$R *.res}
    var
    ApdComPort1: TApdComPort;


    begin
    ApdComPort1 := TApdComPort.Create();
    ApdComPort1.Baud := 9600;
    ApdComPort1.InitPort;


    if ApdComPort1.Open then
    begin
    ApdComPort1.PutString('#01A1#05');
    end;


    end.


    Mi da diversi errori:
    Undeclared identifier: 'Baud'
    Undeclared identifier: InitPort'
    Undeclared identifier: PutString'
    Undeclared identifier: 'Open'



    Come posso sistemare la cosa?
    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,301
    Questo codice a cosa serve?

    codice:
    type
      TApdComPort = Class
    :master:
    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
    Ancora non lo so, risposta stupida ma non ho idea di come si facciano le DLL e visto che il componente è per VCL non mi compare nemmeno nella palette.
    [oscenitàmode] In quel modo dovrei riuscire ad includere il componente nella DLL istanziandolo come classe per poi poterlo utilizzare.[/oscenitàmode] Naturalmente non è così.
    www.beppegrillo.it
    Il blog di Beppe!!

  4. #4
    Utente di HTML.it L'avatar di colde
    Registrato dal
    Feb 2001
    Messaggi
    1,802
    Ho scaricato ora un esempio ma devo ancora capirci qualcosa.
    www.beppegrillo.it
    Il blog di Beppe!!

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Originariamente inviato da colde
    Ancora non lo so, risposta stupida ma non ho idea di come si facciano le DLL e visto che il componente è per VCL non mi compare nemmeno nella palette.
    [oscenitàmode] In quel modo dovrei riuscire ad includere il componente nella DLL istanziandolo come classe per poi poterlo utilizzare.[/oscenitàmode] Naturalmente non è così.
    Non potendoti fare un "corso privato" in questa sede, non ha senso che io scriva qui come fare DLL, cosa che puoi trovare benissimo in qualsiasi documentazione, ivi compresa quella di Delphi.

    A parte questo discorso, non posso correggere il tuo codice in quanto non è qualcosa di funzionante influenzato da un problema da risolvere, ma semplicemente il tentativo di creare qualcosa senza sapere come si fa e scrivendo istruzioni a casaccio, tra l'altro con il dolo della tua stessa ammissione.

    Documentati sull'argomento nel modo adeguato e, una volta compreso il modo in cui procedere - non a tentativi, ma seriamente, intendo - scrivi codice di cui sei consapevole del significato e solo allora sarà possibile ragionarci sopra per risolvere un problema.

    Il modo con cui vuoi procedere tu è fallimentare ed è una perdita di tempo.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  6. #6
    Utente di HTML.it L'avatar di colde
    Registrato dal
    Feb 2001
    Messaggi
    1,802
    Che dire..hai ragione.
    Ora mi studio un po il codice dell'esempio e vedo se riesco a capirci qualcosa.
    Per ora grazie.
    www.beppegrillo.it
    Il blog di Beppe!!

  7. #7
    Utente di HTML.it L'avatar di colde
    Registrato dal
    Feb 2001
    Messaggi
    1,802
    Dunque, dovrei aver capito qualcosa di più o per lo meno sono riuscito ad inserire ApdComPort nella DLL, bastava solo inserire la Uses giusta (AdPort).

    Questo è il codice:

    uses
    ShareMem,
    SysUtils {: CoClass},
    Classes {: CoClass},
    AdPort;


    type
    TMyObject = class(TObject)
    ApdComPort1: TApdComPort;
    end;

    var
    MyObject: TMyObject;

    function Connect(): String; export;
    begin
    MyObject.ApdComPort1.ComNumber := 1;
    MyObject.ApdComPort1.Baud := 9600;
    MyObject.ApdComPort1.Parity := pNone;
    MyObject.ApdComPort1.DataBits := 8;
    MyObject.ApdComPort1.StopBits := 1;
    MyObject.ApdComPort1.BufferFull := 0;
    MyObject.ApdComPort1.BufferResume := 0;
    MyObject.ApdComPort1.DeviceLayer := dlWin32;
    MyObject.ApdComPort1.DTR := true;
    MyObject.ApdComPort1.AutoOpen := true;
    MyObject.ApdComPort1.Open := false;
    MyObject.ApdComPort1.InitPort;

    if MyObject.ApdComPort1.Open then
    begin
    MyObject.ApdComPort1.PutString('YO!!!');
    Result := 'SEI TROPPO FIGO!!';
    end
    else Result := 'VAI A GIOCARE A BOCCE!!';
    end;


    Naturalmente non va!
    ERRORE: Access violation

    Dalla miriade di test e prove che ho fatto per capirci un po di più, ho notato che se commento tutte le proprietà di ApdComPort incluse nella funzione e lascio solo il messaggio di ritorno, il programma funziona correttamente. Probabilmente c'è qualche proprietà errata o più presumibilmente mancante che genera errore ma non saprei quale, mi sembra di averle inserite tutte (o almeno quelle principali) con i dati corretti.

    Sapete darmi qualche consiglio?
    Grazie
    www.beppegrillo.it
    Il blog di Beppe!!

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Originariamente inviato da colde
    Dunque, dovrei aver capito qualcosa di più o per lo meno sono riuscito ad inserire ApdComPort nella DLL, bastava solo inserire la Uses giusta (AdPort).
    Se per "inserire" intendi "scrivere AdpComPort da qualche parte nella unit", la risposta è sì.

    Se invece ti riferisci ad un uso corretto di un oggetto, direi che stai ancora andando molto per tentativi.

    Originariamente inviato da colde
    uses
    ShareMem,
    SysUtils {: CoClass},
    Classes {: CoClass},
    AdPort;
    Non si capisce da dove vengono questi "CoClass"... hanno un significato preciso, ma in un contesto che è completamente differente da questo. Non so perché li hai inseriti, se lo hai fatto è perché lo hai letto, ma non hai senz'altro attribuito alcun significato a questa cosa, e quindi si tratta già di un punto in cui devi fermarti e prendere atto che non sai cosa ottieni con ciò che digiti.


    Originariamente inviato da colde
    type
    TMyObject = class(TObject)
    ApdComPort1: TApdComPort;
    end;
    A cosa serve la dichiarazione del tuo oggetto? Perché creare un oggetto che contiene un altro oggetto per usare solamente questo? Basta usare direttamente l'ultimo. La classe che hai creato non ha alcuno scopo. A proposito, hai ben presente il concetto di classe e il motivo per cui si usano? Se la risposta è no, allora non puoi fare uso di qualcosa che non ha un significato per te, senza prima documentarti a riguardo. Concordi?


    Originariamente inviato da colde
    var
    MyObject: TMyObject;
    Così dichiari una variabile che appartiene al tipo della tua classe che hai inserito nella unit, ma non equivale ad avere un oggetto utilizzabile, o per meglio dire un'istanza.

    Hai solamente dichiarato una variabile ed associato ad essa un tipo, ma non ha ancora un valore e pertanto qualsiasi tentativo di utilizzarla si traduce in un Access Violation.


    Originariamente inviato da colde
    Naturalmente non va!
    ERRORE: Access violation
    Se dici "naturalmente", vuol dire che ti aspetti che ciò che hai scritto non funzioni, il ché non è una bella cosa.


    Originariamente inviato da colde
    Dalla miriade di test e prove che ho fatto per capirci un po di più, ho notato che se commento tutte le proprietà di ApdComPort incluse nella funzione e lascio solo il messaggio di ritorno, il programma funziona correttamente. Probabilmente c'è qualche proprietà errata o più presumibilmente mancante che genera errore ma non saprei quale, mi sembra di averle inserite tutte (o almeno quelle principali) con i dati corretti.
    Non è per essere assillante e asfissiante, ma come ho scritto nei miei precedenti messaggi, il problema è essenzialmente relativo alle conoscenze di base, non all'uso di una mera proprietà.

    Ti viene restituito un errore preciso, un Access Violation, che ha un significato ben preciso e che dovresti conoscere ancora prima di utilizzare qualsiasi oggetto; anche ammesso che tu voglia scoprire in seguito l'errore, non puoi pretendere di decidere tu qual è il problema che lo scatena, determinando che si tratti sicuramente di un'errata impostazione delle proprietà e quindi commentandole una per una.

    Se proprio non vuoi addentrarti in un minimo di formazione propedeutica - che parrebbe richiedere tempo ma non mi pare che in questo modo si vada molto più in fretta visto che nascono solo problemi e non si ha la possibilità di capire qual è la causa - quando ottieni un errore specifico e non sai cosa vuol dire, cerca su Google o da qualsiasi altra parte il suo significato, in quanto non puoi inventartelo; certo, magari in certi casi lo si può intuire, ma presumo che ci voglia maggiore esperienza e, in ogni caso, se alla fine non risolvi, sei costretto a cercare informazioni riguardo il responso che ti restituisce il programma.

    Ricapitolando, non puoi usare una parola chiave, come class ad esempio, senza sapere cosa vuol dire e, in caso di errore, senza cercare informazioni, aspettarti di trovare una soluzione adeguata se non conosci la causa.

    In conclusione: l'errore è Access Violation? Cerca su Google e vedrai quanti risultati trovi che spiegano per filo e per segno cosa vuol dire quell'errore; una volta che hai trovato il motivo, se leggi parole che non ti sono chiare, cerca anche quelle fino ad arrivare al quadro completo.

    Se alcuni concetti, visto che sono tanti, possono non esserti chiari, il forum è qui per questo e, in prima persona, sono a disposizione per dare una mano; se però non collabori e attendi che le risposte arrivino da sole o peggio ancora le costruisci, non potrai completare la tua opera nel modo corretto e farla funzionare a dovere.

    Lascio a te le conclusioni...
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  9. #9
    Utente di HTML.it L'avatar di colde
    Registrato dal
    Feb 2001
    Messaggi
    1,802

    Q

    Originariamente inviato da alka
    Se per "inserire" intendi "scrivere AdpComPort da qualche parte nella unit", la risposta è sì.

    Se invece ti riferisci ad un uso corretto di un oggetto, direi che stai ancora andando molto per tentativi.


    Non si capisce da dove vengono questi "CoClass"... hanno un significato preciso, ma in un contesto che è completamente differente da questo. Non so perché li hai inseriti, se lo hai fatto è perché lo hai letto, ma non hai senz'altro attribuito alcun significato a questa cosa, e quindi si tratta già di un punto in cui devi fermarti e prendere atto che non sai cosa ottieni con ciò che digiti.
    I CoClass non li ho inseriti io, erano già di default quando ho creato un nuovo progetto per DLL.

    A cosa serve la dichiarazione del tuo oggetto? Perché creare un oggetto che contiene un altro oggetto per usare solamente questo? Basta usare direttamente l'ultimo. La classe che hai creato non ha alcuno scopo. A proposito, hai ben presente il concetto di classe e il motivo per cui si usano? Se la risposta è no, allora non puoi fare uso di qualcosa che non ha un significato per te, senza prima documentarti a riguardo. Concordi?




    Così dichiari una variabile che appartiene al tipo della tua classe che hai inserito nella unit, ma non equivale ad avere un oggetto utilizzabile, o per meglio dire un'istanza.

    Hai solamente dichiarato una variabile ed associato ad essa un tipo, ma non ha ancora un valore e pertanto qualsiasi tentativo di utilizzarla si traduce in un Access Violation.



    Se dici "naturalmente", vuol dire che ti aspetti che ciò che hai scritto non funzioni, il ché non è una bella cosa.



    Non è per essere assillante e asfissiante, ma come ho scritto nei miei precedenti messaggi, il problema è essenzialmente relativo alle conoscenze di base, non all'uso di una mera proprietà.

    Ti viene restituito un errore preciso, un Access Violation, che ha un significato ben preciso e che dovresti conoscere ancora prima di utilizzare qualsiasi oggetto; anche ammesso che tu voglia scoprire in seguito l'errore, non puoi pretendere di decidere tu qual è il problema che lo scatena, determinando che si tratti sicuramente di un'errata impostazione delle proprietà e quindi commentandole una per una.

    Se proprio non vuoi addentrarti in un minimo di formazione propedeutica - che parrebbe richiedere tempo ma non mi pare che in questo modo si vada molto più in fretta visto che nascono solo problemi e non si ha la possibilità di capire qual è la causa - quando ottieni un errore specifico e non sai cosa vuol dire, cerca su Google o da qualsiasi altra parte il suo significato, in quanto non puoi inventartelo; certo, magari in certi casi lo si può intuire, ma presumo che ci voglia maggiore esperienza e, in ogni caso, se alla fine non risolvi, sei costretto a cercare informazioni riguardo il responso che ti restituisce il programma.

    Ricapitolando, non puoi usare una parola chiave, come class ad esempio, senza sapere cosa vuol dire e, in caso di errore, senza cercare informazioni, aspettarti di trovare una soluzione adeguata se non conosci la causa.

    In conclusione: l'errore è Access Violation? Cerca su Google e vedrai quanti risultati trovi che spiegano per filo e per segno cosa vuol dire quell'errore; una volta che hai trovato il motivo, se leggi parole che non ti sono chiare, cerca anche quelle fino ad arrivare al quadro completo.

    Se alcuni concetti, visto che sono tanti, possono non esserti chiari, il forum è qui per questo e, in prima persona, sono a disposizione per dare una mano; se però non collabori e attendi che le risposte arrivino da sole o peggio ancora le costruisci, non potrai completare la tua opera nel modo corretto e farla funzionare a dovere.

    Lascio a te le conclusioni...
    Sono daccordo sulle tue osservazioni e cercherò di migliorare anche nella comprensione del linguaggio ma tornando al mio problema, se includo AdPort nelle uses è vero che l'oggetto ApdComPort mi viene riconosciuto ma le proprietà no e non capisco il perchè dato che sono parte di quell'oggetto e senza di quelle non mi serve a nulla. Sulla guida del componente non ho trovato niente per il suo utilizzo in una DLL e nemmeno esempi (uno si per la verità ma include una form nella dll che io non posso usare) quindi è vero, vado un po a tentoni visto che oltre a questo, non ho mai creato una DLL. E' tutto un mondo nuovo per me quindi mi ci vuole tempo, non è così facile; oggi mi scarico la guida da html.it e mi guarderò un po di concetti base ma devo riuscire in qualsiasi modo a creare sta maledetta DLL con ApdComPort funzionante.
    www.beppegrillo.it
    Il blog di Beppe!!

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301

    Re: Q

    Originariamente inviato da colde
    I CoClass non li ho inseriti io, erano già di default quando ho creato un nuovo progetto per DLL.
    No, non li crea automaticamente, se stiamo parlando del semplice DLL Wizard, che è ciò che si deve utilizzare.

    Originariamente inviato da colde
    Sono daccordo sulle tue osservazioni e cercherò di migliorare anche nella comprensione del linguaggio ma tornando al mio problema, se includo AdPort nelle uses è vero che l'oggetto ApdComPort mi viene riconosciuto ma le proprietà no e non capisco il perchè dato che sono parte di quell'oggetto e senza di quelle non mi serve a nulla.
    Nel tuo codice non viene mai creato un oggetto di tipo TAdpComPort, quindi non sarà mai possibile utilizzarlo (la variabile AdpComPort vale nil); qualsiasi tentativo di accedere alla proprietà o invocare metodi dell'oggetto (inesistente) referenziato dalla variabile che non è impostata (vale nil) provoca un Access Violation.

    E' necessario crearlo l'oggetto prima di poterlo utilizzare.

    codice:
    AdpComPort := TAdoComPort.Create(nil);
    Quando hai un oggetto creato, allora sì che puoi impostarne le proprietà e farne uso.

    Al termine dell'uso, è sempre bene distruggerlo chiamando il metodo Free (che libera la memoria allocata), magari usando un costrutto try...finally per garantire che, qualunque cosa succeda, tale operazione venga eseguita.

    Per fornire un esempio funzionante di codice in base a quello che hai proposto:
    codice:
    function Connect(): string;
    var
      AdpComPort: TAdpComPort;
    begin
      AdpComPort := TAdpComPort.Create(nil);
      try
        ApdComPort.ComNumber := 1;
        ApdComPort.Baud := 9600;
        ApdComPort.Parity := pNone;
        ApdComPort.DataBits := 8;
        ApdComPort.StopBits := 1;
        ApdComPort.BufferFull := 0;
        ApdComPort.BufferResume := 0;
        ApdComPort.DeviceLayer := dlWin32;
        ApdComPort.DTR := true;
        ApdComPort.AutoOpen := true;
        ApdComPort.Open := false;
        ApdComPort.InitPort;
        if ApdComPort.Open then
        begin
          ApdComPort.PutString('YO!!!');
          Result := 'SEI TROPPO FIGO!!';
        end
        else
          Result := 'VAI A GIOCARE A BOCCE!!';
      finally
        AdpComPort.Free;
      end;
    end;
    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.