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

Langage Delphi Discussion :

MemoryStream vers string?


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 123
    Points : 68
    Points
    68
    Par défaut MemoryStream vers string?
    Bonjour

    J'essaye d'utiliser le composant HTTPCLI de ICS pour télécharger une page web puis le composant TPerlRegEx pour en extraire des informations.

    Le problème est que HTTPCLI utilise un TMemoryStream pour récupérer la page, alors que TPerlRegEx attend un string.

    J'ai essayé une fonction qui convertit, mais D2007 génère une erreur "Incompatible types"

    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
     
    function StreamToText(oStream : TMemoryStream ): String;
    var
      oSL : TStringlist;
    begin
      oSL := TStringlist.Create;
      oSL.LoadFromStream(oStream);
      result := oSL.Text;
      oSL.Free;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      WebPage : String;
    begin
      With HttpCli1 do begin
        URL            := 'www.acme.com';
        RcvdStream := TMemoryStream.Create;
        try
          Get;
        except
          ShowMessage('Oops');
          RcvdStream.Free;
          Exit;
        end;
     
        RcvdStream.Seek(0,0);
        //E2010 Incompatible types: 'TMemoryStream' and 'TStream'
        WebPage := StreamToText(RcvdStream);
        RcvdStream.Free;
      end;
     
      PerlRegEx1.RegEx := '<title>(.+)</title>';
      PerlRegEx1.Options := [preCaseLess];
      //TPerlRegEx attend une string
      PerlRegEx1.Subject := WebPage;
     
      If PerlRegEx1.Match then begin
        ShowMessage(PerlRegEx1.SubExpressions[1]);
      end else begin
        ShowMessage('Not found');
      end;
    end;
    Quelqu'un aurait-il une idée sur la cause du problème?

    Merci.

  2. #2
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Essaye de passer le paramètre TMemoryStream par réference (mot clé var) dans ta fonction...
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 123
    Points : 68
    Points
    68
    Par défaut
    Merci pour l'info mais... nouvelle erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function StreamToText(var oStream : TMemoryStream ): String;
    [...]
     
    //E2033 Types of actual and formal var parameters must be identical
    WebPage := StreamToText(RcvdStream);
    Ca n'est pas comme ça qu'il fallait faire peut-être?

  4. #4
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut Contrôle de type et Transtypage
    Bonjour,

    Je ne connais pas le composant HTTPCLI de ICS mais il semble que HTTPCLI n' utilise pas un TMemoryStream.

    Modifies ton code ou utilise le débogueur pour confirmer le type de RcvdStream.
    Et si il s'agit d'un type hérité tu peux le caster.


    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
    function StreamToText(oStream : TMemoryStream ): String;
    var
      oSL : TStringlist;
    begin
      oSL := TStringlist.Create;
      oSL.LoadFromStream(oStream);
      result := oSL.Text;
      oSL.Free;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      WebPage : String;
    begin
      With HttpCli1 do begin
        URL            := 'www.acme.com';
        RcvdStream := TMemoryStream.Create;
           ShowMessage(RcvdStream.ClassName);
         try
          Get;
        except
          ShowMessage('Oops');
          RcvdStream.Free;
          Exit;
        end;
    
        RcvdStream.Seek(0,0);
        //E2010 Incompatible types: 'TMemoryStream' and 'TStream'
        WebPage := StreamToText(TMemoryStream(RcvdStream));
        RcvdStream.Free;
      end;
    
      PerlRegEx1.RegEx := '<title>(.+)</title>';
      PerlRegEx1.Options := [preCaseLess];
      //TPerlRegEx attend une string
      PerlRegEx1.Subject := WebPage;
    
      If PerlRegEx1.Match then begin
        ShowMessage(PerlRegEx1.SubExpressions[1]);
      end else begin
        ShowMessage('Not found');
      end;
    end;
    Quelqu'un aurait-il une idée sur la cause du problème?


    a+
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 123
    Points : 68
    Points
    68
    Par défaut
    J'allais répondre que j'avais trouvé la solution en castant explicitement, mais tu m'as devancé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        RcvdStream := TMemoryStream.Create;
        [...]
        PerlRegEx1.Subject := StreamToText(RcvdStream as TMemoryStream);
    Merci bp.

  6. #6
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    tu peux simplement remplacer la fonction de ton premier message par celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function StreamToText(oStream : TStream): String;
    var
      oSL : TStringlist;
    begin
      oSL := TStringlist.Create;
      oSL.LoadFromStream(oStream);
      result := oSL.Text;
      oSL.Free;
    end;
    remplace TMemoryStream par TStream (pas besoin de "var").
    Ainisi, tu n'as rien besoin de caster, ca marchera pareil, et ca sera plus propre.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 123
    Points : 68
    Points
    68
    Par défaut
    Mais bon sang mais c'est bien sûr Merci bp.

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

Discussions similaires

  1. Formatage de int vers string
    Par menzlitsh dans le forum Langage
    Réponses: 7
    Dernier message: 17/07/2007, 13h34
  2. [DOM] Conversion vers String
    Par jymmy dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 02/05/2007, 14h25
  3. Convertion Double vers String
    Par brsoft.org dans le forum Langage
    Réponses: 11
    Dernier message: 28/09/2006, 15h19
  4. [JDOM] XML vers String
    Par newgrir dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 28/07/2006, 10h01
  5. Conversion LPCTSTR vers string
    Par The Lord of Nesquik dans le forum C++
    Réponses: 15
    Dernier message: 02/07/2006, 19h37

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