+ Répondre à la discussion
Affichage des résultats 1 à 10 sur 10
  1. #1
    Invité régulier
    Inscrit en
    mars 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 60

    Informations forums :
    Inscription : mars 2003
    Messages : 34
    Points : 6
    Points
    6

    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 :
    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 :
    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 :
    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 :
    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 :
    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 :
    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 Expert

    Inscrit en
    novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 30

    Informations forums :
    Inscription : novembre 2007
    Messages : 1 519
    Points : 2 084
    Points
    2 084

    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 :
    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
    Invité régulier
    Inscrit en
    mars 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 60

    Informations forums :
    Inscription : mars 2003
    Messages : 34
    Points : 6
    Points
    6

    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 Expert

    Inscrit en
    novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 30

    Informations forums :
    Inscription : novembre 2007
    Messages : 1 519
    Points : 2 084
    Points
    2 084

    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
    Invité régulier
    Inscrit en
    mars 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 60

    Informations forums :
    Inscription : mars 2003
    Messages : 34
    Points : 6
    Points
    6

    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 Expert

    Inscrit en
    novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 30

    Informations forums :
    Inscription : novembre 2007
    Messages : 1 519
    Points : 2 084
    Points
    2 084

    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
    Invité régulier
    Inscrit en
    mars 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 60

    Informations forums :
    Inscription : mars 2003
    Messages : 34
    Points : 6
    Points
    6

    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 Expert

    Inscrit en
    novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 30

    Informations forums :
    Inscription : novembre 2007
    Messages : 1 519
    Points : 2 084
    Points
    2 084

    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
    Invité régulier
    Inscrit en
    mars 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 60

    Informations forums :
    Inscription : mars 2003
    Messages : 34
    Points : 6
    Points
    6

    Par défaut

    OK, merci pour votre réponse : problème résolu !

  10. #10
    Membre Expert

    Inscrit en
    novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 30

    Informations forums :
    Inscription : novembre 2007
    Messages : 1 519
    Points : 2 084
    Points
    2 084

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •