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 .NET Discussion :

Problème sur chaine en Delphi.net


Sujet :

Delphi .NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 34
    Points : 22
    Points
    22
    Par défaut Problème sur chaine en Delphi.net
    Bonjour,

    J’ai réalisé une application sous Delphi 2005 avec la VCL Win 32 (Programme A). Depuis cette application, je dois récupérer une valeur par un WebService. J’ai donc écrit un autre programme sous Delphi 2005 avec la VCL .NET (Programme B).

    Lorsque je lance le programme le Programme B à partir d’un bouton du Programme A, j’obtient une erreur non gérée par l’application. Voici une partie du code du programme A :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var
      CodeErreur : integer;
    
    begin
      EcrireFichier('C:\ProgAAccount.txt', Trim(eNumCompte.Text));
    
      CodeErreur := ShellExecute(0, 'OPEN', 'C:\Program Files\ProgrammeB.exe',  
      Nil, Nil, SW_SHOW);
      if CodeErreur <=32
      then ShowMessage(SysErrorMessage(CodeErreur));
      else  ESMS.Text := ' '  + LireAccount;
    end;
    Voici le code de EcrireFichier :

    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
    procedure TForm1.EcrireFichier(NomFichier : string; Texte : string);
     
    var
      F   : TextFile;
      Res : integer;
     
    begin
        AssignFile(F, NomFichier);
        {$I-}
          Rewrite(F);
        {$I+}
        Res := IOResult;
        if Res = 0
        then begin
                   Try
                     WriteLn(F, Texte);
                   Finally
                     CloseFile(F);
                   end;
             end
    end;
    L’erreur est déclenchée par le lancement du ProgrammeB.exe. En faisant des recherches, je me suis aperçu que l’erreur vient du type de chaîne utilisé. Par le programme A, j’écrit un fichier de type TextFile en VCL (création du fichier .txt sur le disque).

    Avec le code suivant dans le programme B, j’obtient l’erreur citée plus haut au niveau de Result := Service.GetMessageLimit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    constructor TWinform2.Create;
     
    begin
      inherited Create;
      InitializeComponent;
      Account :=  LireFichier('C:\ ProgAAccount txt');
    end;
    La procédure du programme B qui appelle le WebService est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TWinform2.BSynchro_Click(sender: System.Object; e: System.EventArgs);
    
    begin
        myHeader := MessengerHeader.Create;
        myHeader.Account := Account;
        Service := accountService.AccountService.AccountService.Create;
        Service.MessengerHeaderValue := myHeader;
        Result := Service.GetMessageLimit;
        NbSMS.Text := IntToStr(Result); //Mets à jour le champs
    end;
    Si par contre, je renseigne en "dur" les valeurs comme suit, le programme fonctionne bien et j’ai bien une valeur en retour du WebService :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    constructor TWinform2.Create;
     
    begin
      inherited Create;
      InitializeComponent;
      Account := 'EX0055896';
    end;
    En fait, je me pose la question au niveau de la chaîne : comme j’écris un fichier texte en Delphi Win32 sur le disque, puis je lis la valeur de ce fichier par l’autre programme réalisé en Delphi .Net, l’erreur doit venir du type de string. Est-ce que je dois utiliser AnsiString, PChar ou autre pour lire une fichier texte ?

    Pour lire le fichier, voici la procédure que j’ai créé depuis le programme B :

    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
    function TWinform2.LireFichier(ChemFichier : string) : string;
     
    var
      FileInfo : System.IO.FileInfo;
      Reader   : System.IO.StreamReader;
     
    begin
      Result := '';
      FileInfo := System.IO.FileInfo.Create(ChemFichier);
      Reader := FileInfo.OpenText;
      Console.WriteLine(Reader.ReadToEnd);
      Result := Reader.ReadToEnd;
      Reader.Close;
      Console.Readline;
    end;
    Le fichier me renvoie bien pourtant la bonne valeur.

    Merci pour votre aide !

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    En fait si je regarde l'implémentation que tu nous as fournit ici pour ta méthode LireFichier, il y a une erreur selon moi. Tu fais un ReadToEnd pour l'afficher sur la console puis encore un ReadToEnd pour valuer le résultat sauf qu'à ce moment là le curseur de lecture est déjà à la fin donc ta fonction ne retourne rien au final.

    Essayes plutôt de le coder comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Result := Reader.ReadToEnd;
    Console.WriteLine(Result);
    Autre chose fais en sorte de replacer explicitement le curseur de lecture du StreamReader, souvent ces zigotos ont la mauvaise idée de se mettre ailleurs qu'au début une fois ouvert...
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 34
    Points : 22
    Points
    22
    Par défaut Problème sur chain en DelphiNet
    Merci d'avoir répondu. Non, le problème doit être ailleurs car ma fonction renvoie bien une valeur, celle du contenu du fichier .TXT. J'ai modifié en suivant votre réponse, j'ai toujours la même erreur.

    Le fichier contient un mot de passe pour accéder au WebService. En fait, l'erreur retourne le message "Autentification failed". J'ai comme l'impression qu'il ne "reconnait" pas le formatage ou le type (string, AnsiString, etc) alors que la valeur est la bonne.

    Je n'obtient pas d'erreur si je code en "dur" comme ceci :

    Account := 'EX0087965';

    Mais, j'ai besoin de récupérer la valeur Account car elle est différente pour chacun de mes clients, donc je code comme cela :

    Account := LireFichier ('C:\SynchroSMS\SynchroSMSAccount.txt');

    mais la procédure renvoie l'erreur !

    Est-ce que vous pouvez aussi m'indiquer une autre méthode pour lire un fichier texte créé sur le disque ?

    Merci d'avance, je maitrise bien Delphi 2005 en Win32 mais pas en .NET.

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Quelle est la valeur renvoyée par la fonction LireFonction alors ? Ou bien l'erreur qu'elle génère.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 34
    Points : 22
    Points
    22
    Par défaut Problème sur chaine en Delphi .Net
    La valeur est la bonne, c'est à dire celle que contient le fichier .txt, c'est à dire "EX0055896". L'erreur retournée par le Web Service est "Le projet X a rencontré une classe d'exception non gérée System.Web.Services.Protocols.SoapException avec le message 'Authentification Failed'.

    Ce que je ne comprend pas, c'est pourquoi en "dur" dans le code, il n' ya pas de problème de connexion, tout se passe bien alors que qaund je fais appel par la procédure LireFichier, cette erreur est retournée. Je suppose que cela ne peut provenir que du texte récupéré mais pourtant c'est la même valeur.

    Est-ce ma procédure LireFichier qui n'est pas correcte ? La chaine récupérée n'est elle pas du bon format ?

    J'ai fini le programme, il me reste juste ce problème à résoudre. Merci encore pour votre aide car kje ne maitrise pas le Delphi 2005 .NET.

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Sur ce problème j'ai l'intime conviction que l'erreur est sur l'encodage des caractères.
    Essayez de forcer l'encodage en ANSI dans le second paramètre du constructeur de FileInfo.
    Ou sinon remplacer toutes les occurences de String par WideString peut-être.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 34
    Points : 22
    Points
    22
    Par défaut Problème de chaines en Delphi .Net
    Merci pour votre aide :

    En effectuant de nombreux tests, j'ai remarqué que le fichier .TXT crée par
    mon programme A (en Delphi Win32) affiche 22 octets dans l'explorer.

    J'ai crée "à la main" un même fichier texte TXT, l'explorer m'affiche 20 octets,
    il y a une différence de 2 octets. Dans le programme B (en Delphi 2005.Net), le déboggeur m'affiche un retour à la ligne, ce qui explique pourquoi la
    valeur envoyé au serveur n'est pas la même !

    Donc si je tape :

    Result := Reader.ReadToEnd , j'ai une erreur

    par contre :

    Result := Trim(Reader.ReadToEnd) fonctionne correctement !
    Le Trim règle le problème !

    Le problème est résolu mais si vous avez une explication pour mieux comprendre, je suis vivement intéressé.

    Cordialement

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonjour, les deux octets supplémentaires doivent être un BOM.

    Plutôt que de faire un Trim je suggères plutôt de déplacer le curseur de lecture de 2 octet depuis le début au niveau du Stream puis lire jusqu'à la fin.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 34
    Points : 22
    Points
    22
    Par défaut
    OK, merci pour votre réponse : problème résolu !

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Merci de cliquer sur le bouton en bas de la discussion
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

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

Discussions similaires

  1. lien interessant sur le prochain Delphi .NET
    Par skywaukers dans le forum EDI
    Réponses: 0
    Dernier message: 07/10/2008, 19h09
  2. Problème de chaine sur une page HTML
    Par Kerod dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 23/11/2004, 16h23
  3. [VB.NET] Problème sur composant comboBox hérité
    Par SergeF dans le forum Windows Forms
    Réponses: 3
    Dernier message: 08/06/2004, 14h54

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