IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web & réseau Delphi Discussion :

transmettre des VARIANT via la fonction sendbuf


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 38
    Par défaut transmettre des VARIANT via la fonction sendbuf
    Bonjour tout le monde ,
    J'aimerais faire une application sous delphi6 afin de pouvoir transmettre via des sockets plusieurs type de donnée(bool,string et integer) et afficher leur résultat.
    Pour cela j'ai décidé de stocker toutes ces données dans un tableau de VARIANT et de faire le transfert via la fonction sendbuf.
    J'ai essayé l'exemple suivant sans savoir si cétait vraiment possible mais lorsque j'effectue le transfert, il m'affiche une fenêtre d'erreur à la réception "Argument incorrect "
    • à l'émission :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      procedure TForm1.Button2Click(Sender: TObject);
      var
        tab1 : Variant;
      begin
        tab1 :=VarArrayCreate([1,3],varVariant);
        tab1[1]:=d1;  // d1 : boolean
        tab1[2]:=d2;  // d2 : Integer
        tab1[3]:=d3;  // d3 : string
        ClientSocket1.Socket.SendBuf(tab1,27); // taille connue : 27
      end;
    • à la réception :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
        Socket: TCustomWinSocket);
      var
        tab2 : Variant;
      begin
        tab2 :=VarArrayCreate([1,3],varVariant);
        Socket.ReceiveBuf(tab2,27);
        if tab2[1] Then RadioButton1.Checked := True
        else RadioButton2.Checked := True;
        Edit2.Text := intToStr(tab2[2]);
        Edit3.Text := tab2[3];
      end;

    Quelqu'un pourrait m'aider svp

  2. #2
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    oulah !

    bon alors si tu connais ta structure et que dit qu'elle fait 27 octets je soupçonne qu'elle devrait ressembler à ceci

    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    type
      TData = packed record 
        d1 : Boolean; // 1
        d2 : Integer; // +4 = 5
        d3 : array[0..21] of Char;  // +22 = 27
      end;

    et là oui tu peux envoyer une telle structure sur un socket.

    Par contre un tableau de variants...à condition que ton serveur et ton client déclarent bien le même type variant...ben il ne fait pas 27 octets vu que SizeOf(Variant) sur Delphi 5 me donne 16, donc si tu en mets 3 ça fait pas loin de 48 octets

    sachant de plus que si ton variant fait référence à une chaîne, celle ci n'est pas contenu dans ces octets, on a que son adresse...laquelle adresse fait une belle jambe à ton serveur

    en résumé tu peux vouloir écrire une fonction Send qui accepte un tableau de variant en paramètre mais elle sera bien obligée au minimum d'envoyer en plus des variants, les données pointées (et je n'imagine même pas ce que donnerais un vtObject)

    pour rappel (sous Delphi 5) :
    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
      TVarRec = record { do not pack this record; it is compiler-generated }
        case Byte of
          vtInteger:    (VInteger: Integer; VType: Byte);
          vtBoolean:    (VBoolean: Boolean);
          vtChar:       (VChar: Char);
          vtExtended:   (VExtended: PExtended);
          vtString:     (VString: PShortString);
          vtPointer:    (VPointer: Pointer);
          vtPChar:      (VPChar: PChar);
          vtObject:     (VObject: TObject);
          vtClass:      (VClass: TClass);
          vtWideChar:   (VWideChar: WideChar);
          vtPWideChar:  (VPWideChar: PWideChar);
          vtAnsiString: (VAnsiString: Pointer);
          vtCurrency:   (VCurrency: PCurrency);
          vtVariant:    (VVariant: PVariant);
          vtInterface:  (VInterface: Pointer);
          vtWideString: (VWideString: Pointer);
          vtInt64:      (VInt64: PInt64);
      end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 38
    Par défaut
    Merci pou les infos.
    ok j'essai ça

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 38
    Par défaut
    Cool, ça marche bien ! Merci !
    Par contre j'ai une autre question si je mets un string à la place du tableau de caractères, est ce que le transfert peut fonctionner ?
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type
      TData = packed record 
        d1 : Boolean; 
        d2 : Integer; 
        d3 : string;   
      end;

  5. #5
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    un string c'est un pointeur...même punition que pour le Variant. Par contre un ShortString passerait car il est alloué statiquement. Idem pour un "string[22]" (qui est un ShortString) qui occupera toujours 23 octets, 1 pour la longueur et 22 pour les caractères.

    attention tout de même à Delphi 2009 qui passe le type Char sur 16bits
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 38
    Par défaut
    Merci Mr TOTH pour toutes ces infos, ça m'a bcp aidé

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/09/2008, 11h46
  2. Transmettre des messages udp via une page web
    Par DrMaboul dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 02/04/2008, 21h33
  3. [JSF et JSP] Transmettre des paramétre via <jsp:include
    Par Shivan dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 27/02/2006, 11h37
  4. Transmettre des données à un executable via visual basic
    Par kantelise dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 23/12/2005, 08h59
  5. Réponses: 7
    Dernier message: 20/03/2005, 14h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo