Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Delphi > Delphi .NET
Delphi .NET Forum d'entraide sur l'EDI Delphi pour .NET et Borland Developer Studio
Avant de poster -> F.A.Q. Delphi .NET, F.A.Q. Delphi ASP.NET
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 05/07/2009, 13h38   #1
PHIL45
Invité régulier
 
Inscription : mars 2003
Messages : 34
Détails du profil
Informations personnelles :
Âge : 59

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 !
PHIL45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2009, 15h44   #2
Aka Guymelef
Membre Expert
 
Inscription : novembre 2007
Messages : 1 519
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : novembre 2007
Messages : 1 519
Points : 1 919
Points : 1 919
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 -
Aka Guymelef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2009, 20h50   #3
PHIL45
Invité régulier
 
Inscription : mars 2003
Messages : 34
Détails du profil
Informations personnelles :
Âge : 59

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.
PHIL45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2009, 08h43   #4
Aka Guymelef
Membre Expert
 
Inscription : novembre 2007
Messages : 1 519
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : novembre 2007
Messages : 1 519
Points : 1 919
Points : 1 919
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 -
Aka Guymelef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2009, 10h05   #5
PHIL45
Invité régulier
 
Inscription : mars 2003
Messages : 34
Détails du profil
Informations personnelles :
Âge : 59

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.
PHIL45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2009, 08h39   #6
Aka Guymelef
Membre Expert
 
Inscription : novembre 2007
Messages : 1 519
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : novembre 2007
Messages : 1 519
Points : 1 919
Points : 1 919
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 -
Aka Guymelef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2009, 09h49   #7
PHIL45
Invité régulier
 
Inscription : mars 2003
Messages : 34
Détails du profil
Informations personnelles :
Âge : 59

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
PHIL45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2009, 10h30   #8
Aka Guymelef
Membre Expert
 
Inscription : novembre 2007
Messages : 1 519
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : novembre 2007
Messages : 1 519
Points : 1 919
Points : 1 919
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 -
Aka Guymelef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2009, 13h02   #9
PHIL45
Invité régulier
 
Inscription : mars 2003
Messages : 34
Détails du profil
Informations personnelles :
Âge : 59

Informations forums :
Inscription : mars 2003
Messages : 34
Points : 6
Points : 6
OK, merci pour votre réponse : problème résolu !
PHIL45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2009, 16h11   #10
Aka Guymelef
Membre Expert
 
Inscription : novembre 2007
Messages : 1 519
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : novembre 2007
Messages : 1 519
Points : 1 919
Points : 1 919
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 -
Aka Guymelef est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 12h56.


 
 
 
 
Partenaires

Hébergement Web