Bonjour ,
j'aimerais améliorer le temps de traitement de cette procédure qui consiste a indenter chaque ligne d'un mémo , je la trouve énormément longue à traiter toute les lignes du mémo.
Ma méthode :
Exemple d'une ligne : "G01 j0 x-10 F52"
1: On retire les espaces de la ligne (LnTrim) : "G01j0x-10F52"
2: On convertie la ligne en majuscule (UpperCase) : "G01J0X-10F52"
3: On recherche les délimiteurs de la chaine (if pos then), pour chaque délimiteurs qui correspond a la condition, on luis insert un espace a la position du délimiteur : "G01 J0 X-10 F52"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 {ABC := LnTrim(A B C)} function LnTrim(Ln: String): String; var ILn: Integer; begin for ILn := 1 to Length(Ln) do begin if not CharInSet(Ln[ILn], [#32]) then Result := Result + Ln[ILn]; end; end;
Auriez vous une méthode plus efficace qui pourrai amélioré le temps de traitement ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 procedure TForm1.BtIndenterClick(Sender: TObject); var ILn: Integer; Ln: String; begin with Memo do begin Gauge.MaxValue := Lines.Count; ReadOnly := True; Lines.BeginUpdate; for ILn := 0 to Lines.Count -1 do begin // On touche pas au commentaire (*//); if Pos('*//', Lines.Strings[ILn]) = 1 then Continue; Ln := EmptyStr; // On retire les espaces & convertie la ligne en majuscule Ln := LnTrim(UpperCase(Lines.Strings[ILn])); // Si la ligne est vide , on la remplace par un commentaire (*//) if Ln = EmptyStr then begin Ln := '*// !!! Ln n/a !!!'; Lines.Strings[ILn] := Ln; Continue; end; if Pos('J', Ln) <> 0 then begin Insert(#32, Ln, Pos('J', Ln)); end; if Pos('F', Ln) <> 0 then begin Insert(#32, Ln, Pos('F', Ln)); end; if Pos('X', Ln) <> 0 then begin Insert(#32, Ln, Pos('X', Ln)); end; Lines.Strings[ILn] := Ln; Gauge.Progress := ILn; Application.ProcessMessages; end; Gauge.Progress := 0; Gauge.Refresh; Lines.EndUpdate; ReadOnly := False; end;
Merci.
Partager