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

Delphi Discussion :

[DELPHI] Problème de String <-> MemoryStream


Sujet :

Delphi

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Par défaut [DELPHI] Problème de String <-> MemoryStream
    Salut tout le monde !

    Je pensais bien connaître les MemoryStream mais je bute sur un détail :/.
    Je voulais lire quelques octets dans un MemoryStream et placer le résultat dans un String mais problème. Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.Button1Click(Sender: TObject);
    var MS : TMemoryStream;
         txt : String;
    begin
      MS := TMemoryStream.Create;
      MS.LoadFromFile('C:\wa.txt');
      MS.Position := 0;
     
      MS.Read(txt, 4);
    end;
    Avec une chaine courte aucun problème... Pourtant là je ne lis que 4 octets. Alors où est le problème avec mon String ?

    Merci d'avance

    Merci d'utiliser les balises code ou quote, Laurent Dardenne

  2. #2
    Membre confirmé
    Profil pro
    Directeur
    Inscrit en
    Juin 2005
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Juin 2005
    Messages : 113
    Par défaut
    Ca m'interesse aussi, si qq1 avait une idee...

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 934
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.Button1Click(Sender: TObject);
    var MS : TMemoryStream;
    txt : String;
    begin
    MS := TMemoryStream.Create;
    MS.LoadFromFile('C:\wa.txt');
    MS.Position := 0;
    SetLength(txt, 4); // dimensionne le string
    MS.Read(txt[1], 4); // lit à partir du 1° caractère de la chaîne
    end;
    il est pê plus facile d'utiliser un PChar, un array of Char, ou une chaine du type string[4]
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Membre confirmé
    Profil pro
    Directeur
    Inscrit en
    Juin 2005
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Juin 2005
    Messages : 113
    Par défaut
    Merci, ca fonctionne (en partie en tous cas ^^)

  5. #5
    Membre confirmé
    Profil pro
    Directeur
    Inscrit en
    Juin 2005
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Juin 2005
    Messages : 113
    Par défaut
    Bizzare, ca fonctionne vraiment en partie aparament ...
    Exemple: prenons test.txt avec inscrit dedans "test&test" (sans les quotes), on le load dans un stream, on passe se stream en string comme tu nous l'as indiqué et on affiche ce string via showmessage ca nous donne "testtest" ... bizzare.
    J'ai essayé cette technique quand un programme, et il semble que ca pose un probleme mais je sais pas lequel :/ assez ennuyant... Si qq1 a une idee d'ou ca peut venir ce genre de chose (ps pr le programme: http://www.developpez.net/forums/sho...d.php?t=192597 cf 2eme partie avec le stream --> string)

  6. #6
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 139
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 139
    Par défaut
    Exemple: prenons test.txt avec inscrit dedans "test&test" (sans les quotes), (...) on affiche ce string via showmessage ca nous donne "testtest" ... bizzare.
    Non, rien que de très normal : quand tu veux faire afficher sur un bouton un caractère souligné (ie hot key), tu mets bien une esperluette à l'endroit qui va bien, non ?
    Ben c'est pareil !
    Mets-en 2, d'esperluettes, et ça t'en affichera une.
    C'est comme le slash "/" sous Linux, et d'autres caractères du même genre, qu'il faut doubler.

    Mes 2 cts,
    JP

  7. #7
    Membre éclairé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Par défaut
    Salut

    De mémoire, lorsque Delphi écrit un string dans un stream (writebuffer), le 1er octet écrit contient la longueur de la chaîne.
    Par ex, un string de 4 caractères nécessite 5 octets

    Ca explique peut-être l'anomalie du début...

    Bonne prog

  8. #8
    Membre chevronné Avatar de Bejaia-In
    Inscrit en
    Avril 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 365
    Par défaut
    Le composant TMemoryStream ne fait aucune distinction sur la nature des fichiers ecrit ou lus; pour lui c'est du binaire pur (une suite d'octets).
    Dans ce cas, c'est à l'utilisateur de connaitre trés bien le type de fichier et le manipuler en conséquence.
    Si vous n'ête pas sûr de ça, utilisez plutôt TStringStream.

  9. #9
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Par défaut
    Merci pour toutes ces réponses instructives !
    (désolé du retard je viens de rentrer de vacances )

  10. #10
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    Tente ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TForm1.Button1Click(Sender: TObject);
    var MS : TMemoryStream;
         txt : String;
    begin
      MS := TMemoryStream.Create;
      MS.LoadFromFile('C:\wa.txt');
      SetLength(txt, MS.Size);
      MS.Position := 0;
      MS.Read(@txt[1], 4);
    end;
    cdlt

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  11. #11
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 139
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 139
    Par défaut
    Tente plutôt celà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    procedure TForm1.Button1Click(Sender: TObject);
    var
      MS : TMemoryStream;
      txt : String;
    begin
      MS := TMemoryStream.Create;
      MS.LoadFromFile('C:\testdate.txt');// = Longue ligne de texte &texte pour test * OU texte &&texte
      SetLength(txt, MS.Size);
      MS.Position := 0;
    //[Erreur] Unit1.pas(34): Un objet constante ne peut être passé comme paramètre Var
    //  MS.Read(@txt[1], 4);
      MS.Read(txt[1], MS.Size);
      Form1.Caption := txt; // = Longue ligne de texte &texte pour test * texte &&texte
      ShowMessage(txt);     // = Longue ligne de texte t[souligné, le 't']exte pour test * texte &texte
    end;
    Et tu verras dans la foulée le pb de l'esperluette dont on causait + haut.

    HTH,
    --
    jp

  12. #12
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    C'est dans la FAQ qui sort bientôt les gars !!!
    [QR] Comment écrire et/ou lire un type string dans un TStream ?

    Pour écrire ou lire des données de longueur fixe dans un flux (TFileStream, TMemoryStream, bref toutes les classes dérivées de TStream), comme par exemple des types integer, double, boolean ou des types string de longueur fixe, ou même des type enregistrement (record) simples déclarés comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    type TUnEnregistrement=record
              Nom,Prenom,Pseudo:string[20];
              Age:integer;
              InscritAuClubDVP:Boolean;
           end;
    ...
    var i:integer;
         d:double;
         b:boolean;
         s:string[10];
         UnEnregistrement:TUnEnregistrement;
    ...la lecture et l'écriture dans un flux pourra toujours s'effectuer de façon similaire selon ce schéma :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //Ecriture
    UnStream.Write(<variable>,SizeOf(<variable ou bien type de la variable>));
     
    //Lecture
    UnStream.Read(<variable>,SizeOf(<variable ou bien type de la variable>));
    Par exemple pour écrire nos données dans un flux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //Ecriture
      UnStream.Write(i,SizeOf(integer));
      UnStream.Write(d,SizeOf(double));
      UnStream.Write(b,SizeOf(boolean));
      UnStream.Write(s,SizeOf(s));
      UnStream.Write(UnEnregistrement,SizeOf(TUnEnregistrement));
    Et pour les lire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //Lecture
      UnStream.Read(i,SizeOf(integer));
      UnStream.Read(d,SizeOf(double));
      UnStream.Read(b,SizeOf(boolean));
      UnStream.Read(s,SizeOf(s));
      UnStream.Read(UnEnregistrement,SizeOf(TUnEnregistrement));
    Pour ce qui est des données de longueur variable (tableau dynamique, string), Delphi ne propose pas de méthode standard pour le faire, c'est donc à chacun d'en imaginer une ou bien de suivre l'exemple de la méthode proposée ci-dessous.

    L'astuce consiste lors de l'écriture des données :
    1. de fournir dans un premier temps un entier qui représente le nombre de données (Nbre d'élément d'un tableau, nombre de caractères, etc...).
    2. puis les données proprement dites.
    Pour la lecture :
    1. lire le nombre de données.
    2. Adapter les dimension de la variable qui va recevoir les données en fonction de la valeur lue à l'étape 1)
    3. lire les données proprement dites.
    Pour une chaine de caractères, nous vous proposons le code suivant :
    Code : 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    {écrire une chaîne de caractères depuis le flux}
    procedure WriteStreamString(Stream : TStream; UneChaine : string);
    var LongueurChaine : integer;
    begin
      {obtenir la longueur de la chaîne de caractères}
      LongueurChaine := Length(UneChaine);
      {écrire cette longueur dans le flux}
      Stream.Write(LongueurChaine,SizeOf(integer));
      {écrire les caractères (tous d'un coup !)}
      Stream.Write(UneChaine[1], LongueurChaine);
    end;
     
    {retourne une chaîne de caractères depuis le flux}
    function ReadStreamString(Stream : TStream) : string;
    var LongueurChaine : integer;
    begin
      {obtenir la longueur de la chaîne de caractères}
      Stream.Read(LongueurChaine,SizeOf(integer));
      {Redimensionner la chaine pour allouer la mémoire nécessaire}
      SetLength(Result, LongueurChaine);
      {Lire les caractères (Tous d'un coup)}
      Stream.Read(Result[1], LongueurChaine);
    end;
     
    ...
    //Utilisation de nos fonctions et procédures
    var s:string;
        AStream:TMemoryStream;
    begin
       AStream:=TMemoryStream.Create;
       ...
     
       s:='www.developpez.com, c'est génial !';
       //Ecriture
       WriteStreamString(AStream,s);
     
       ...
     
       //Lecture
       s:=ReadStreamString(AStream);
       ...
     
       AStream.Free;
    end;

    Il existe aussi la méthode qui utilise les chaïnes AZT (A Zéro Terminal).
    Pour l'utiliser, il faut ajouter le caractère #0 à la fin de la chaine de caractères au moment de l'écriture.
    Lors de la lecture, il suffit alors de parcourir le stream jusqu'à ce que l'on tombe sur #0:

    Fonction de lecture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      function LitStringDansStream(Stream:TStream):string;
    var c:char;
    begin
      result:='';
      repeat
        stream.Read(c,1);
        if c<>#0 then result:=result+c;
       until c=#0;
    end;
    Procédure d'écriture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    procedure EcritStringDansStream(Stream: TStream;Chaine:string);
    var 
      i:integer;
      c:char;
    begin
      if length(Chaine)>0 then
        for i:=1 to length(Chaine) do
        begin
          c:=Chaine[i];
          stream.Write(c,1);
        end;
      c:=#0;
      stream.Write(c,1);
    end;

  13. #13
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Par défaut
    Hello !
    Ce topic date un peu mais je viens de rencontrer une petite subtilité du même genre !

    je développe une classe et j'ai un pb là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    constructor TLGPFile.Create(FileName : String);
    var FS : TFileStream;
    begin
      FS := TFileStream.Create(FileName, fmOpenRead);
      FS.Position := 0;
      //SetLength(_FileCreator, 12);
      FS.Read(_FileCreator[1], 12);
     
      FreeAndNil(FS);
    end;
    Sans le SetLength ça foire. Je sais tout le monde l'a dit plus haut lol.

    Mais j'aimerais savoir pourquoi. _FileCreator est un String et j'aimerais savoir pourquoi la taille n'est pas allouée automatiquement.

    Pourtant si je fais une simple affectation du genre _FileCreator := 'jajajajajaja' aucun problème. Alors pourquoi la taille est allouée ici et pas dans le Read ??

    Merci de m'expliquer

  14. #14
    Membre chevronné
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Par défaut
    Salut à tous.

    J'ai eu le même genre de problème il y a quelque temps, et c'est Pedro qui m'a trouvé la solution.

    Faire précéder MS.Position := 0; par MS.Seek(0);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    par MS.Seek(0);
    MS.Position := 0;
    Pour dimensionner le TMemoryStream, il faut utiliser la méthode Size (MP.Size(1000); et non SetLength.

  15. #15
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Euh, Philippe, t'es sûr que t'as bien lu la question ?

    Voici l'explication :

    Lorsque tu utilises une affectation d'une string à une autre, le compilateur sait qu'il doit auparavant allouer de la mémoire et tutti quanti... C'est d'ailleurs une spécificité du langage Pascal par rapport au C.

    Seulement, lorsque tu utilises Read, tu ne passes pas la chaîne en paramètre, mais bien un pointeur sur cette chaîne. Le compilateur ne sait donc plus, si j'ose m'exprimer ainsi, qu'il a affaire à une chaîne. Il s'agit juste d'un pointeur sur un buffer qui doit être alloué auparavant, car il ne sait pas comment il doit l'allouer (cela dépend du type de donnée, ce qu'un pointeur ne retient pas).

    Il faut donc allouer toi-même la mémoire avant un appel à Read, ce qui, pour les chaînes, s'effectue au moyen de la routine système SetLength.

    C'est assez clair ?
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  16. #16
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Par défaut
    Très clair ! c'est bien ce que je pensais (mais pas en aussi détaillé).

    Donc l'affectation alloue automatiquement non ?

  17. #17
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Citation Envoyé par Squall78
    Donc l'affectation alloue automatiquement non ?
    Oui.

    Enfin pour être exact, c'est la modification qui réalloue. Car une affection ne fait que copier l'adresse de la chaîne, en incrémentant le compteur de référence. Lorsqu'une chaîne avec un compteur supérieur à 1 est modifiée, alors elle est effectivement copiée avant d'être modifiée.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  18. #18
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Par défaut
    Ok c'est compris !

    Tout marchait bien mais je comprenais pas pourquoi et j'aime pas continuer sans comprendre ce que je fais lol.

    Merci beaucoup pour ces explications !

  19. #19
    Membre Expert Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Par défaut
    voir: projet-->option-->compilateur (chaine vaste)
    dans l'aide de delphi:
    Type Bascule
    Syntaxe {$H+} ou {$H-}
    {$LONGSTRINGS ON} ou {$LONGSTRINGS OFF}
    Défaut {$H+}
    {$LONGSTRINGS ON}
    Portée Locale
    Remarque

    La directive $H contrôle la signification du mot réservé string utilisé seul dans une déclaration de type. Le type générique string peut représenter soit une chaîne longue allouée dynamiquement (de type fondamental AnsiString) ou une chaîne courte allouée statiquement (de type fondamental ShortString).
    Dans le mode par défaut, {$H+}, Delphi définit le type chaîne générique par une AnsiString longue. Tous les composants des bibliothèques de composants sont compilés dans ce mode. Si vous écrivez des composants, ils doivent aussi utiliser des chaînes longues, comme doit le faire tout code recevant des données de propriétés de type chaîne VCL ou CLX.

    Le mode {$H-} est principalement utilisé pour reprendre du code des versions Pascal Objet utilisant des chaînes courtes par défaut. Vous pouvez localement surcharger la signification des définitions des types chaînes pour assurer la génération de chaînes courtes. Vous pouvez aussi changer les déclarations des types chaînes courtes en string[255] ou ShortString, qui ne sont pas ambigus et sont indépendants du paramètre $H.

  20. #20
    Membre chevronné
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Par défaut
    sjrd a écrit :
    Euh, Philippe, t'es sûr que t'as bien lu la question ?
    Salut. Désolé, non effectivement. Il y a des jours comme ça...

    J'utilise effectivement un pointeur pour le transfert de données dans un Stream quand je ne connais pas exactement la structure -> D : pointer Of Byte; par exemple.

    Mais toute cette discussion m'éclaire un peu sur des problèmes qui paressent invraisemblables pour transférer un TRichEdit dans un TMemoryStream.

    Bon ! Au boulo.


Discussions similaires

  1. [D7][Débutant] Problème conversion String <- TEdit
    Par _alex_ dans le forum Composants VCL
    Réponses: 2
    Dernier message: 16/02/2006, 22h48
  2. [oracle][delphi] Problème format de date dans une requete
    Par le_parrain dans le forum Bases de données
    Réponses: 1
    Dernier message: 21/07/2005, 10h12
  3. Réponses: 2
    Dernier message: 11/05/2005, 13h23
  4. Réponses: 5
    Dernier message: 18/03/2005, 20h10
  5. [delphi] problème d'eclairage
    Par Dr@ke dans le forum OpenGL
    Réponses: 4
    Dernier message: 26/02/2005, 14h17

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