Tmemo et le fichier .txt

Résolu
Stef38200 Messages postés 5 Date d'inscription jeudi 11 mai 2006 Statut Membre Dernière intervention 3 août 2006 - 2 août 2006 à 11:22
hackerloc Messages postés 24 Date d'inscription jeudi 6 mars 2008 Statut Membre Dernière intervention 9 janvier 2009 - 2 oct. 2008 à 14:23
Bonjours,
Je suis débutant et j'ai un souci !!
Je viens de créer un petit prog avec un Tmemo et un Tbutton qui me sert à sauvegarder se que je met
met dans le Tmemo. Mais lorque j'ouvre le fichier
text avec notepad tout est sur une ligne !!!
Est-ce possible d'avoir un retour chariot tout les
82 caractéres? J'ai regardé toutes les questions du forum se rapportant a mon probléme et j'ai rien
trouvé pouvant m'aidé.
Mon code
procedure TForm1.Button1Click(Sender: TObject);

begin

Savedialog1.DefaultExt := 'TXT';
Savedialog1.filename := '*.txt';

if Savedialog1.Execute then Memo1.Lines.SaveToFile(Savedialog1.filename);
end;


procedure TForm1.Memo1Change(Sender: TObject);
Var
P : integer;

Begin
P:=Memo1.Perform(em_LineFromChar,$FFFF,0);
If Length(Memo1.Lines.Strings[p]) = 25 then
Memo1.Lines.add('');
End;


end.

Merci à vous de m'aider...

A toujour besoin d'aide

18 réponses

Utilisateur anonyme
3 août 2006 à 06:15
Oh pardon,

Procedure SaveMyFile(AFileName : string);
Var
F: TextFile;
i:integer;
Begin
AssignFile(F,AFileName); //<= Petite erreur de ma part
//J'avais un test c'est pour ca : désolé
Rewrite(F);
For i:=0 to Memo1.Lines.Count do
WriteLn(F,Memo1.Lines[i]);
CloseFile(F);
End;

procedure TForm1.Button1Click(Sender: TObject);
Begin
If savedialog1.execute then SaveMyFile(Savedialog1.filename);
3
Matt 261 Messages postés 1173 Date d'inscription mercredi 2 novembre 2005 Statut Membre Dernière intervention 10 septembre 2011 3
2 août 2006 à 11:32
Salut,

Dans la propriété WantTabs de ton memo, met True.

Ou alors un bout de code dans OnCreate de ta form :

Memo1.WantTabs :=True;

@+
 Matt

<hr size="2" width="100%" />La paresse est la mère du génie...
http://www.delphilab.com
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
2 août 2006 à 12:33
Salut,

Je suppose que tu voulais dire "WantReturns", Matt ?
Mais ça ne conviendra pas pour le problème de Stef.


Il faut marquer la fin de chaque ligne par les caractères #13#10 (fin de ligne et retour chariot), ce qui donne par exemple :

Memo1.Text := 'première ligne' + #13#10 + 'deuxième ligne' + #13#10 + 'troisième ligne';

Ou sinon, tu enregistres ligne par ligne (avec une boucle) dans ton fichier texte.

Bonne prog'


 
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
2 août 2006 à 13:08
un détail en passant:

system.sLineBreak

beaucoup mieux que le vieux #13#10 :D
0

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

Posez votre question
Stef38200 Messages postés 5 Date d'inscription jeudi 11 mai 2006 Statut Membre Dernière intervention 3 août 2006
2 août 2006 à 17:00
Merci à vous de m'avoir repondu.
La reponse de japee j'ai essayé de l'appliquer,
mais je sais pas ou la mettre dans le code ,pareil
pour celle de Loda.

Pouvez vous m'en dire plus svp ?


A toujour besoin d'aide
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
2 août 2006 à 17:44
comment remplis-tu ton memo? avec du code? au clavier?

Sinon, sauve ton fichier à la main (cad sans utiliser SaveToFile):
lit mem1.lines une par une et ajout les sLineBreak où tu les veux.
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
2 août 2006 à 18:23
Allez, pour une fois: Un code tout fait:

Decoupe le memo en ligne de longeur MAX

implementation

{$R *.dfm}
uses StrUtils;
procedure TForm2.Button1Click(Sender: TObject);
const
MAX = 10;
var
i,j : integer;
L : TStrings; // pour alleger le code

srcStr, tmpStr : string;

begin
// coupe la ligne tout les Max char

L := memo1.lines;

// pour chaque ligne
i := 0;
while i < L.count do begin
// ( on evite de lire des .Count dans des boulce for
// quand on le change dans la boucle -> while)
srcStr := L[i];

// si trop long
if length(srcStr) > MAX then begin
//enlever le string trop long
L.Delete(i);

// le decoupe et ajout les morceau (left to right)
j := i;
while length(srcStr) > MAX do begin
// ajout un bout
tmpStr := LeftStr(srcStr, MAX);
L.Insert(j, tmpStr);
inc(j); // on insert a la suite du dernier insere

// enleve de la source le bout qu'on a ajoute
srcStr := RightStr(srcStr, Length(srcStr)-Max);
end; //while
//insert le dernier bout
L.Insert(j, srcStr);

end;//if
inc(i);
end; //while

L.SaveToFile('test.txt');
end;

valeur de test:
A0123456789
0123456789012345678901234
0123
0123456
012345678901234567890123456789


bon code,
0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
2 août 2006 à 18:46
Salut,

Si c'est un simple problème de présentation avec NotePad :
pour insérer (par touche Enter) des fins de ligne avec retour chariot dans ton TMemo,  il te suffit de mettre la propriété WantReturns à true (ou alors l'utilisateur doit taper Ctrl  + Enter).
Et dans NotePad : menu Format : coche <retour auto à la ligne>
Tu as plus ou moins la même option dans WordPad.

A +
Thierry
0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
2 août 2006 à 18:51
Le temps que je poste mon message, Loda te donne gentillement du code de coupure de lignes.
A toi, Stef, de voir ce dont tu as besoin. 
0
Stef38200 Messages postés 5 Date d'inscription jeudi 11 mai 2006 Statut Membre Dernière intervention 3 août 2006
2 août 2006 à 20:12
Merci,
Je remplie le memo avec du text recup sur le net
donc c'est du copier coller.

Je vais essayer ton code.Et on est obliger de faire comme ça ?


A toujour besoin d'aide
0
Utilisateur anonyme
3 août 2006 à 04:19
Non il y a une autre solution,

Procedure SaveMyFile(AFileName : string);
Var
F: TextFile;
i:integer;
Begin
AssignFile(F,'c:\text.txt');
Rewrite(F);
For i:=0 to Memo1.Lines.Count do
WriteLn(F,Memo1.Lines[i]);
CloseFile(F);
End;

procedure TForm1.Button1Click(Sender: TObject);
Begin
If savedialog1.execute then SaveMyFile(Savedialog1.filename);
End;

@+
0
Stef38200 Messages postés 5 Date d'inscription jeudi 11 mai 2006 Statut Membre Dernière intervention 3 août 2006
3 août 2006 à 12:32
Merci beaucoup ( A tous)
Je vais reprendre mon petit prog et je vous tiens au courant si ça marche pas.




A toujour besoin d'aide
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
3 août 2006 à 12:34
@Francky: D'après ce que j'ai compris, il veut limiter la longeur des lignes à une longeur fixe (82). De plus, chez moi, SaveToFile enregistre les retour chariot ?!?. Donc je ne voit pas l'utilité de ton code.

PS: Memo1.Lines.Count -1 stp. ;)

@Stef: je ne connait pas d'autre moyen (bien qu'il en exist surement) pour tronquer(séparer) des lignes à une taille donnée.

Mais, si tu le remplit à la main (saise ou copier coller) le plus simple est d'ajouter toi même les retour à la ligne avec la touche ENTER. Après c'est à toi de voir. Perso, j'aime pas faire à la main ce qu'un code peut faire pour moi.

Au fait, si tu ne veut pas modifier le contenu de ton memo, crée un TstringsList vide et Assign le avec le memo.lines. OU adapter le code que je t'ai donné pour écrire directement dans le fichier text.

bon code,
0
Stef38200 Messages postés 5 Date d'inscription jeudi 11 mai 2006 Statut Membre Dernière intervention 3 août 2006
3 août 2006 à 12:58
Merci Loda.
Le code de Francky fonctionne , et je vais essayer
le tient.

MERCI BEAUCOUP


A toujour besoin d'aide
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
3 août 2006 à 15:53
Salut,


La propriété booléenne WordWrap ne fait passer à la ligne que d'un manière apparente dans le Memo, donc sans marquer les fins de lignes visibles d'un quelconque caractère fin de ligne/retour chariot.
L'enregistrement dans un fichier avec la méthode SaveToFile ne tiendra donc pas compte de ces "simili" retours chariot. Même si Memo.Lines.Count nous retourne bien malgré tout le nombre de chaînes apparentes, ce que je ne sais pas expliquer logiquement.
Donc, à mon avis, selon ce que veut faire exactement Stef, les méthodes de Loda et de Francky sont toutes les deux valables et complémentaires car répondant à des problématiques différentes.

Bonne prog'
0
Utilisateur anonyme
3 août 2006 à 16:22
Re,

@Loda :

*tu as raison pour le -1. Désolé pour la faute merci de l'avoir souligné ;).
*Pour tronquer : ton code est ok ;).


@Japee : tu as raison pour le savetofile.

@++
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
3 août 2006 à 17:25
@Jappe : "Memo.Lines.Count nous retourne bien malgré tout le nombre de chaînes apparentes" j'ignorais ce détail. J'ai pas perdu ma journée. :)

Et, c'est vrai, c'est pas logique...

Bon code,
0
hackerloc Messages postés 24 Date d'inscription jeudi 6 mars 2008 Statut Membre Dernière intervention 9 janvier 2009
2 oct. 2008 à 14:23
Salut !

procedure TForm1.Button2Click(Sender: TObject);

var Fichier: TextFile; //déclarer d'abord fichier comme textefile
begin
AssignFile(fichier,edit1.Text); //créer le dossier saisie dans Edit1 ou CreateDir('c:\delphikam');
end;

end.
0
Rejoignez-nous