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 !
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.
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.
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