Pagina 2 di 4 primaprima 1 2 3 4 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 39
  1. #11
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    Grazie, ho risolto usando Read/WriteBuffer invece degli Stream.

    Perchè non voglio far collegare i client direttamente a MySQL? Non mi va di installare i driver mè tantomeno creare a manina i DSN su ogni macchina del cliente e non ho trovato dei componenti gratuiti che mi aiutassero

  2. #12
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,482
    Originariamente inviato da VaLvOnAuTa
    Perchè non voglio far collegare i client direttamente a MySQL? Non mi va di installare i driver mè tantomeno creare a manina i DSN su ogni macchina del cliente e non ho trovato dei componenti gratuiti che mi aiutassero
    In sostanza, benvenuto nel mondo n-tier.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  3. #13
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    Originariamente inviato da alka
    In sostanza, benvenuto nel mondo n-tier.
    n-tier si deve leggere alla napoletana? Perchè se no c'hai azzeccato: sto proprio 'n tier

  4. #14
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    Perdonami se rompo ancora.
    Allora.
    Il client invia al server la richiesta. Il server inizializza la TList, trova i record richiesti dal client, li memorizza e li inserisce nella TList del TCommand, infine invia il tutto al client.
    Quando il client riceve il comando (perchè lo riceve - sia lodato lo showmessage() ) deve iniziare un ciclo for su quella lista. Però se tento di accedere alla proprietà comando.data.Count mi dà errore di access violation.

  5. #15
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,482
    Il client e il server sono ovviamente applicazioni differenti, giusto?

    Come hai fatto le scritture nello stream?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  6. #16
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    Sì sono applicazioni differenti.
    codice:
    type
      TCommand = packed record
        cmd : string[10];
        opt : string[100];
        data: TList;
      end;
    
      TRubrica = class(TObject)
        id     : integer;
        Nome,
        Cognome: string[15];
        Azienda: string[30];
        NumTel,
        NumCell: string[20];
        Email,
        Notes  : string[30];
      end;
    Questi due tipi sono, ovviamente, comuni ad entrambi i software.
    Quando il server riceve il comando esegue questo codice:
    codice:
     //r è di tipo TRubrica
      q.SQL.Text := 'SELECT id,nome,cognome,azienda,ufficioD,cellulareD,email,note FROM contatti WHERE cognome LIKE ''%'+comando.opt+''' ORDER BY cognome, nome LIMIT 20';
       try
        q.Open;
        comando.data := TList.Create;
        r.create;
        while not q.Eof do
         begin
          r.id := q.FieldByName('id').AsInteger;
          // e tutti gli altri campi 
          comando.data.Add(r);
          q.Next;
         end;
        q.Close;
       except on e:exception do WriteLog('Errore ricerca contatto: '+e.Message);
       end;
      end;
     AThread.Connection.WriteInteger(sizeof(comando));
     AThread.Connection.OpenWriteBuffer;
     AThread.Connection.WriteBuffer(comando,sizeof(comando));
     AThread.Connection.CloseWriteBuffer;
    Quando poi il client riceve il comando tenta di accedere alla lista normalmente (comando.data.Count). Ma mi dà errore di "Access violation".

  7. #17
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,482
    Originariamente inviato da VaLvOnAuTa
    Questi due tipi sono, ovviamente, comuni ad entrambi i software.
    Questo è senz'altro un problema, o meglio lo è se non hai fatto uso di runtime package.

    Il compilatore Delphi è un bravo ottimizzatore, pertanto include nell'eseguibile, per quanto possibile, solo le risorse necessarie. Questo significa che, benché le dichiarazioni dei record siano uguali, potrebbero risultare differenti a livello di struttura binaria tra i due eseguibili, il tuo client e il tuo server.

    Per poter avere la certezza di utilizzare lo stesso tipo di dati a tutti gli effetti, devi racchiudere la dichiarazione del tipo TCommand (e correlati) in una unit che andrai a compilare all'interno di un package; le tue applicazioni, in seguito, dovranno fare riferimento a tale package (nelle impostazioni del progetto) quando si tratta di avere a che fare con il tipo, in modo da caricarlo da un file BPL (quello che si ottiene dalla compilazione del package) che sia identico per entrambi.

    La modifica è abbastanza semplice, soprattutto se il tipo è già in una unit.

    Ti basta creare un package runtime, inserire la unit al suo interno e levarla dal progetto.

    Quando compili il progetto normalmente, il codice del tipo viene incluso nell'eseguibile; abilitando l'opzione "Build with runtime packages" nelle opzioni del progetto e inserendo il nome del package che contiene il tipo, compilato precedentemente, Delphi non includerà più il codice ma farà in modo di rendere l'eseguibile in grado di utilizzare quello del package, che dovrai copiare nella cartella dell'eseguibile su tutte le macchine in cui è presente il client o il server, assieme a tutti i package da cui dipende il package che hai creato (in generale, quelli base della libreria VCL riportati nella clausola "requires").

    La Guida in linea contiene un'intera sezione dedicata a questo argomento, con opportune spiegazioni in base agli scenari di utilizzo.

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

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

  8. #18
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    Ho provato a seguire la guida ma ci ho capito una mazza.
    Ho creato la unit, l'ho aggiunta alla libreria, ho segnato la libreria come "run-time only", ho compilato la libreria, ma non mi crea alcun bpl

    E' possibile inserire il tipo in una dll (ammesso e non concesso che sia più facile utilizzarla)?

  9. #19
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,482
    Originariamente inviato da VaLvOnAuTa
    Ho creato la unit, l'ho aggiunta alla libreria, ho segnato la libreria come "run-time only", ho compilato la libreria, ma non mi crea alcun bpl
    Il file BPL viene creato in un percorso differente (vedi le opzioni Delphi) nel quale vengono riposti tutti i package BPL "runtime" e "designtime", non nella cartella del progetto (a meno di non forzare questa condizione attraverso le opzioni dello stesso progetto, facendo attenzione che il file si trovi poi in una cartella del percorso di ricerca di Windows o nella cartella dell'eseguibile).

    Originariamente inviato da VaLvOnAuTa
    E' possibile inserire il tipo in una dll (ammesso e non concesso che sia più facile utilizzarla)?
    Sì, ma avresti lo stesso problema dell'eseguibile: Delphi compila la DLL includendo solo ciò che nella DLL è usato; siccome la DLL nasce come contenitore di funzioni, se non fai uso di alcuna funzione il tipo *non viene nemmeno inserito* nel file generato.

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

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

  10. #20
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    codice:
    library typedll;
    uses
      SysUtils,
      Classes;
    
    type
      TCommand = packed record
        cmd : string[10];
        opt : string[100];
        data: TList;
      end;
    
      TRubrica = class(TObject)
        id     : integer;
        Nome,
        Cognome: string[15];
        Azienda: string[30];
        NumTel,
        NumCell: string[20];
        Email,
        Notes  : string[30];
      end;
    
    {$R *.res}
    
    procedure ExtractList(c: TCommand; var l:TList); stdcall;
    begin
     l := c.data;
    end;
    
    procedure AddList(var c: TCommand; l: TList); stdcall;
    begin
     c.data := TList.Create;
     c.data := l;
    end;
    
    exports
     ExtractList, AddList;
    
    begin
    end.
    E nel programma
    codice:
    procedure ExtractList; stdcall external 'typedll.dll';
    procedure AddList; stdcall external 'typedll.dll';
    Però se dichiaro una variabile di tipo TCommand nel programma mi dà errore.
    E' meglio creare una variabile globale dentro la dll ed usare quella (se è possibile)?

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 © 2026 vBulletin Solutions, Inc. All rights reserved.