Entwickler-Ecke
Sonstiges (Delphi) - Memo: alle Leerzeichen löschen + bsp code
mausi123 - Mo 05.11.07 20:29
Titel: Memo: alle Leerzeichen löschen + bsp code
Hallo, wie kann ich den folgenden code so ändern, um alle leerzeichen in memo1 zu löschen?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.Button1Click(Sender: TObject); Var i,_pos:integer; s:string; begin for i:=0 to Memo1.Lines.count-1 do begin
s:=memo1.lines[i]; _pos:=pos(' ',s); if _pos<>0 then begin delete(s,_pos,length(s)-_pos+1); memo1.lines[i]:=s; end; end; end; |
Moderiert von
Christian S.: Delphi-Tags hinzugefügtModeriert von
Christian S.: Topic aus Dateizugriff verschoben am Mo 05.11.2007 um 19:41
Narses - Mo 05.11.07 20:55
Titel: Re: Memo: alle Leerzeichen löschen + bsp code
Moin und :welcome: im Forum!
mausi123 hat folgendes geschrieben: |
Hallo, wie kann ich den folgenden code so ändern, um alle leerzeichen in memo1 zu löschen? |
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Text := StringReplace(Memo1.Text,' ','',[rfReplaceAll]); end; |
cu
Narses
bflegel - Mo 05.11.07 20:57
Hallo Mausi,
Dein Ansatz war schon ganz gut... nur ein paar kleine Änderungen müssen noch rein:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| Var i,_pos:integer; s:string;
begin for i:=0 to Memo1.Lines.count-1 do begin s:=memo1.lines[i]; repeat _pos:=pos(' ',s); delete(s,_pos,1); memo1.lines[i]:=s; until _pos=0; end; end; |
Damit werden alle Leerzeichen aus dem Memo gelöscht.
Viel Spaß
bflegel
//Edit: Wieder zu spät.
@Narses: Alter Spielverderber... so ists ja langweilig :wink:
Ich hab mich wenigstens an die Vorlage gehalten :D
Narses - Mo 05.11.07 21:04
Moin!
bflegel hat folgendes geschrieben: |
Ich hab mich wenigstens an die Vorlage gehalten :D |
Dann würde ich´s aber auch so machen: ;)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var i, _pos: Integer; s: String; begin for i := 0 to Memo1.Lines.Count-1 do begin s := Memo1.Lines.Strings[i]; _pos := Pos(' ',s); while (_pos > 0) do begin Delete(s, _pos, 1); _pos := Pos(' ',s); end; Memo1.Lines.Strings[i] := s; end; end; |
cu
Narses
bflegel - Mo 05.11.07 21:09
Dann hast Du aber 2x die Zuweisung drinnen:
Narses hat folgendes geschrieben: |
_pos := Pos(' ',s);
|
Das erscheint mir nicht sinnvoll?!? Oder hat Deine Variante einen Vorteil, der mir bisher noch nicht klar wurde :?:
Narses - Mo 05.11.07 21:10
Moin!
bflegel hat folgendes geschrieben: |
Oder hat Deine Variante einen Vorteil, der mir bisher noch nicht klar wurde :?: |
Was macht dein Code, wenn kein Leerzeichen im String ist? ;)
cu
Narses
bflegel - Mo 05.11.07 21:13
Gar nix!
Er rauscht einfach drüber. Das Programm stürzt mir nicht ab, er löscht keine Zeichen, die er nicht soll...
Also tut es genau das, wofür ich es geschrieben habe.
bye
bflegel
Narses - Mo 05.11.07 21:18
Moin!
bflegel hat folgendes geschrieben: |
Gar nix!
Er rauscht einfach drüber. |
:? Hast Recht,
Delete() ignoriert Aufrufe mit Index < 1. :|
bflegel hat folgendes geschrieben: |
Oder hat Deine Variante einen Vorteil, der mir bisher noch nicht klar wurde :?: |
Er löscht nur, wenn auch was zum Löschen da ist... :lol: (ist also sog. "sauberer" Code; und um die Frage zu beantworten: nein ;))
cu
Narses
bflegel - Mo 05.11.07 21:22
Servus,
mit der Antwort kann ich leben. :wink:
Ich wünsche noch einen schönen Abend.
Schöne Grüße aus München.
Bye
bflegel
Lannes - Di 06.11.07 00:44
Hallo,
bflegel: Du solltest Deinen Code nochmal überdenken :wink:
Mit der Zeile:
memo1.lines[i]:=s;innerhalb der repeat-Schleife wird bei jedem gefundenen Leer-Zeichen die Zeile ins Memo geschrieben.
Hab Deinem Code mal einen Text mit 6000 Zeilen, in dem ca. 500.000 Leerzeichen enthalten sind, zur Bearbeitung übergeben.
Vermutlich wird er in ein paar Stunden fertig sein.
Schlage folgenden Code vor, er greift nur zweimal auf Memo.Text zu.:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| function DelSpace(s: String): String; var z,i : Integer; begin Setlength(Result,Length(s)); i := 1; for z := 1 to Length(s) do if s[z] <> ' ' then begin Result[i] := s[z]; inc(i); end; showmessage(IntToStr(i)); Setlength(Result,i); end;
Memo.Text := DelSpace(Memo.Text); |
bflegel - Di 06.11.07 20:55
Hallo Lannes,
6.000 Zeilen mit 500.000 Leerzeichen sind ein Argument. Ich habs natürlich nur mit 3-4 Zeilen getestet, in denen weniger als 10 Leerzeichen drin waren. Wenn man natürlich riesige Daten zu verarbeiten hat, ist meine Lösung wohl nicht so optimal :?
Bei den "Mengen", die ich normal verarbeite, fällt der Geschwindigkeitsunterschied gar nicht auf.
Danke für Deine Erläuterung.
Bye bflegel
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!