Le meilleur moyen d'afficher un *.txt dans un TMemo ?

[Résolu]
Signaler
Messages postés
249
Date d'inscription
mardi 5 août 2003
Statut
Membre
Dernière intervention
15 juillet 2006
-
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
-
Bonjour

je débute en Delphi et je m'entraine à faire des ptits trucs tout concons pour le moment. J'ai voulu ouvrir un fichier texte et en afficher le contenu dans un TMemo. En prenant le code de Filipe35 sur CS ça me donne ça :

procedure StringFromFile(const FileName: TFileName; var S: TMemo);
var
F: TextFile;
S1: string;
begin
S.Text := EmptyStr;
AssignFile(F, FileName);
Reset(F);
try
while not Eof(F) do
begin
ReadLn(F, S1);
S.Text := S.Text + S1 + chr(13) + chr(10);
end;
finally
CloseFile(F);
end;
end;

J'ai cependant remarqué que pour un fichier de 8Ko ça met quand même un peu trop de temps à s'effectuer...

Quelqu'un saurait-il comment faire pour améliorer la rapidité ? Je sais qu'on peut passer par un RichEdit et Loadfromfile. Mais juste dans un but didactique je voudrais savoir si c'est possible avec un TMemo. :)

Merci pour vos idées.

13 réponses

Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
salut,

le meilleur moyen pour charger un Tmemo à partir d'un fichier texte est
d'utiliser la méthode loadfromfile elle initialise la propriété lines
et charge la totalite du fichier en une seule fois.

Memo1.lines.loadfromfile(FileName);

@+

jlen
Messages postés
249
Date d'inscription
mardi 5 août 2003
Statut
Membre
Dernière intervention
15 juillet 2006

Ha bah oui tiens -_-
Pourtant j'avais essayé le Loadfromfiles avec mon Memo mais ça avait pas marché...
J'ai du foiré qqchose lol

Merci bcp !!! :)
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
il faut surtout que ton chemin soit bon!!
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
une façon de tester:

sur uneform tu mets :

-1 bouton

-1 Tmemo

-1 opendialog

et dans le on click du bouton tu mets:

procedure TForm1.Button1Click(Sender: TObject);

begin

with opendialog1 do

begin

execute;

memo1.Lines.LoadFromFile(filename);

end;

end;



@+

jlen
Messages postés
249
Date d'inscription
mardi 5 août 2003
Statut
Membre
Dernière intervention
15 juillet 2006

heu justement si on met ça ya pas de gestion d'erreur là.

Tu executes le OpenDialog et tu lui dis de placer le contenu du fichier dans le Memo. Mais si tu fais Annuler par exemple (donc pas de nom de fichier) t'as une erreur (pas méchante mais bon).

Si on met ça plutot :

procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
Memo1.lines.loadfromfile(OpenDialog1.FileName);
end;
end;

ça teste bien que le nom de fichier ne soit pas vide. (ça met quand même une erreur si on entre manuellement un nom qui n'existe pas. Mais bon c assez logique de laisser ça :)).
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
oui effectivement il vaut iueux tester le filename tu peux aussi
rajouter un fileexists(filename) pour varifier si le fichier est valide

if (OpenDialog1.Execute)and(FileExists(OpenDialog1.FileName) then

Memo1.lines.loadfromfile(OpenDialog1.FileName);

@+

jlen
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
T'es fatigué JLen!

with OpenDialog1 do
if Execute and FileExists(FileName) then
Memo1.Lines.LoadFromFiles(FileName);

tout simplement.
faut aussi lui montrer comment ecrire un code rapide et clair.

note importante sur le code de jlen, "Execute" doit etre le premier elements de la condition sinon y'auras un bug.

<hr size="2" width="100%">La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
oui mais les parenthese ça fait pas de mal!! des fois que DELPHI ne
comprenne pas tout (reaarque c'est une habitude que me vient du C ou si
tu ne mets pas de parentheses le and n'a pas tout à fait la même
fonction)
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
d'autre part je n'ai pris pris la peine de le réécrire avec le with
(bien que ce soit ce que je fasse d'habitude , surtout histoire de ne
pas avoir à réécrire les opendialog1.....)
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
pour le C j'ai chercher pendant un moment pourquoi un test ne fonctionnait c'éatit à peut près ça :

if !(data[2]==171) checksum1=1; au lieu de

if (!(data[2]==171)) checksum1=1;

ce qui donne exactement l'effet inverse de celui escompté!!
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
oui le C c'est comme en PHP (bien qu'en PHP tu sois obligé de mettre les () dans la condition).

en plus, contrairemen au delphi ou au php qui generalement t'injure en cas d'erreur, le C compile bourrin.

d'ailleurs (habitude du PHP) quand j'ecris une condition en C++ je protege tout de cette façon :

if (condition) { methode; }

car la aussi les bug dus au mauvais placement ou oublis des { } ça peu faire mal.

delphi est trop strict pour qu'une erreur arrive a ce niveau. et je prefere de loin sa phylosophie a celle des C-Like.

le pire c'est les resultats ambigu en PHP (existe surrement aussi en C et C++) quand tu doit tester une egalitée qui doit necessite l'utilisation de l'operteur "trop-carrement-egale-a" === ...
ça aussi ça fout bien la merde, merci les variants qui peuvent renvoyer des boolean qui ne sont pas des boolean.

mais bien sur, toujours proteger les conditions et meme les operations avec des parentheses. ne jamais faire confiance a la prioritée des operateurs.

5 * 5 / 2 = 5 ou 12.5 (selon les humeurs des langages et des compilateurs)
(5 * 5) / 2 = 5
5 * ( 5 / 2) = 12.5

par contre ici :

if Execute and FileExists(FileName) then

les parentheses ne sont pas necessaire. vus que c'est du Delphi et que Delphi comprend bien cela et le fait bien.

en C,C++, JavaScript et PHP il faudrait l'ecrire comme cela en effet :

if (Execute && FileExists(FileName)) { }

et en Python :

Flags : DoitPlanterTouteLes10Secondes UtiliseXML FaitNimporteQuoi

PythonAND : execute filename

(ça ce voit que j'aime pas le python ...)

aaaah les parentheses ... c'est souvent qu'on en loupe une... mais heureusement que Delphi nous avertis en cas de probleme.

<hr size="2" width="100%">La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
C'est vrai que DELPHI renvoyant des boolean pour les fonctions execute
et fileexists les parentheses ne sont pas nécessaires , ce qui ne
serait pas le cas si les varleurs étaient des strings par exemple ou
dans ce cas il aurait fallut les mettre

Comme sur les projets je passe alternativement du DELPHI au C et que C
ne connait pas les booleans j'ai pris l'hatidude de proteger par des
parentheses sans trop me poser de question (de toutes façons en
DELPHI le fait de mettre des parentheses ne modifie pas le code )

pour le l'operateur == en C ça c'est le vrai piége:

1) en Delphi le test d'égalité c'est = --> quand on repasse en C il est fréquent d'oublier de le doubler

2) C étant très tolérant (trop?) et que l'on peut faire des opérations
dans les conditions le compilateur se moquant éperduement de la
cohérence.

3) cela revient à écrire 1=1 et la condition est toujours vérifiée

de même si l'on fait un and bitwise au lieu d'un et logique le
compilateur l'accepte sauf que la condition ne sera vérifiée que si le
resultat <>0et que la variable est modifiée!!
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
tout a fait, c'est pour cela que je n'aime pas trop les comparaison d'egalitée en C tout comme en PHP ...
on oublis un "=" et pouf gros bug et aprés vas retrouver l'erreur.

<hr size="2" width="100%">La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>