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

Résolu
cs_Squallou Messages postés 249 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 15 juillet 2006 - 16 déc. 2005 à 16:03
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 18 déc. 2005 à 02:28
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

jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
16 déc. 2005 à 16:36
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
3
cs_Squallou Messages postés 249 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 15 juillet 2006
16 déc. 2005 à 16:58
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 !!! :)
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
16 déc. 2005 à 17:04
il faut surtout que ton chemin soit bon!!
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
16 déc. 2005 à 17:20
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Squallou Messages postés 249 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 15 juillet 2006
16 déc. 2005 à 18:32
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 :)).
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
16 déc. 2005 à 18:43
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
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
16 déc. 2005 à 20:28
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>
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
16 déc. 2005 à 20:33
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)
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
16 déc. 2005 à 20:37
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.....)
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
16 déc. 2005 à 20:45
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é!!
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
16 déc. 2005 à 21: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>
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
16 déc. 2005 à 22:06
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!!
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
18 déc. 2005 à 02:28
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>
0
Rejoignez-nous