Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - TMemo Zeilenumbruch entfernen


tolosonic - Do 23.02.06 17:51
Titel: TMemo Zeilenumbruch entfernen
Hey,

falls die frage dumm ist, sorry, bin noch anfänger :)

ich hab ein memo, dem ich mit lines.add diverse zeilen aus einer textdatei (readln) zuweise. das klappt auch alles.
nur ist am ende des memos dann immer ein zeilenumbruch. da ich später diverse memos in ein weiteres "addiere", entstehen da leerzeilen. wie kann ich den zeilenumbruch ohne viel aufwand verhinden oder löschen, so dass beim zusammenfügen keine leerzeilen entstehen?


Marco D. - Do 23.02.06 17:53

Nicht die direkte Hilfe - aber memo1.lines.loadfromfile(dateipfad) ist doch viel einfacher ;)


tolosonic - Do 23.02.06 17:54

klar, aber ich sortier da noch ein paar zeilen aus und so, weeßte? :)


Marco D. - Do 23.02.06 17:56

Dann machs mit memo1.lines.delete(index), dann werden die Zeilen gelöscht.


tolosonic - Do 23.02.06 17:58

wenn ich für index (count - 1) nehme löscht er aber nicht den zeilenumbruch, der scheint nicht als zeile zu gelten. der umbruch bleibt, die letzte zeile verschwindet. das sollte nicht so sein... :(


Marco D. - Do 23.02.06 18:00

Woran erkennst du den Zeilen, die raus sollen?


tolosonic - Do 23.02.06 18:04

achso, du meinst ich soll die leerzeilen dann im zusammengesetzten memo löschen? nö, das ist doof. geht das nicht, dass ich die zeilenumbrüche in den einzelnen memos direkt entferne?


alias5000 - Do 23.02.06 18:20

hm wie war das denn?
Ich glaub so:

Du musst in er property "TMemo.Text" nach den Zeichen #13 oder #1310 suchen (Zeichen für Zeilenumbruch) oder irgendwie sowas. Auf jedenfall ist in Text der Text mit Zeilenumbruchszeichen drinnen.
Also müsstest du diese nur noch raussuchen und entfernen.
Du könntest mal folgendes machen:

Delphi-Quelltext
1:
Label1.Caption := memo1.Text                    

um heruaszufinden, welche Zeichen es sind.
Mein Problem ist halt, dass ich grad ein Delphi in der Nähe hab...

Gruß alias5000

Ich hoffe es geht... :roll:

EDIT:
Und wenn du nicht Memo1.lines.add benutzt, sondern einfach von vorne herein an eine Zeile etwas dranhängst?

Delphi-Quelltext
1:
Memo1.Lines.Strings[XY] := Memo1.lines.Strings[XY] + 'dein Text';                    

XY steht für die Zeile, in der das stattfindet


tolosonic - Do 23.02.06 18:26

nee, da zeigt er nur zwei striche an. aber selbst wenn ich die zeichen kenne (#13#10 glaub ich), wie entferne ich die dann ausm memo? memo1.text := memo1.text - '#13#10'; wird wohl kaum funktionieren, oder?


alias5000 - Do 23.02.06 18:29

-->

Delphi-Quelltext
1:
2:
3:
4:
5:
var s: string;
begin
s := Memo1.Text;
delete(s, {der Index des Zeichens}{Länge des Zeichens});
Memo1.Text := s;


Aber les erstmal mein EDIT


Fabian W. - Do 23.02.06 18:32

such mal nach stringreplace();


tolosonic - Do 23.02.06 18:44


Delphi-Quelltext
1:
2:
3:
4:
i:=(length(memo1.text)-1);
s:=memo1.text;
delete(s,i,2);
memo!.text:=s;


das ist soweit ok. nur find ich den umweg über den string noch sehr hässlich, wie kann ich vielleicht die zwei zeichen direkt löschen?


Fabian W. - Do 23.02.06 19:09

hier kann mna sich den mUnd fusselig red- naja ok -schreiben. Schau mal meinen oberen Post an.
:roll:


Freiberger - Do 23.02.06 19:47

Ich muß Fabian Recht geben...
such mal nach stringreplace();

Du ersetzt einfach alle #13 & #13+#10 gegen ''


Lannes - Do 23.02.06 20:44
Titel: Re: TMemo Zeilenumbruch entfernen
Hallo,
user profile icontolosonic hat folgendes geschrieben:
ich hab ein memo, dem ich mit lines.add diverse zeilen aus einer textdatei (readln) zuweise. das klappt auch alles.
nur ist am ende des memos dann immer ein zeilenumbruch. da ich später diverse memos in ein weiteres "addiere", entstehen da leerzeilen. wie kann ich den zeilenumbruch ohne viel aufwand verhinden oder löschen, so dass beim zusammenfügen keine leerzeilen entstehen?
Der Zeilenumbruch stellt beim addieren von Memo-Inhalten in ein weiteres Memo kein Problem dar, wenn man mit AddStrings arbeitet.

Angenommen Memo1 und Memo2 enthalten die bereinigten Lines.
Der letzte Zeilenumbruch kann bleiben!
Das zusammenführen geht dann so:

Delphi-Quelltext
1:
2:
3:
Memo3.Lines.AddStrings(Memo1.Lines);
Memo3.Lines.AddStrings(Memo2.Lines);
//...


Abgesehen davon würde ich Texte nicht über Memos zusammenführen,
da sind IMHO Stringlisten besser geeignet.


rybe - Do 23.02.06 23:49

probiere es doch mal, nach jedem memo1.lines.add(); mit:

memo1.text:=trim(memo1.text);


tolosonic - Fr 24.02.06 13:31

@lannes: danke, das hats gebracht. ja, natürlich sonst nicht mit memos, ich brauch die hier aber aus nem anderen grund. vielen dank!

... das trim() klingt laut hilfe ganz vielversprechend, bewirkt aber irgendwie überhauptnichts. seltsam.


Lannes - Fr 24.02.06 14:50

Hallo,
user profile icontolosonic hat folgendes geschrieben:
... das trim() klingt laut hilfe ganz vielversprechend, bewirkt aber irgendwie überhauptnichts. seltsam.
es bewirkt schon etwas.
Die Funktion Trimm entfernt alle am Anfang und Ende eines Strings vorhandene Leer- und Steuerzeichen. Wobei in deinem Fall Memo.Test der String ist.

Angenommen folgende Zeilen sind im Memo vorhanden:

Quelltext
1:
2:
3:
4:
5:
6:
 


Zeile mit Text

Zeile mit Text

führst Du dann den Code aus:
memo1.text:=trim(memo1.text);
sind die ersten und letzten Leerzeilen (1. 2. 3. und 7.)nicht mehr im Memo enthalten,
auch die letzte leere Zeile(nur ein Zeilenumbruch) die Dir die Probleme bereitet hat:

Quelltext
1:
2:
3:
Zeile mit Text

Zeile mit Text

Die leere Zeile in der Mitte kann man mit Trim nicht löschen.


davidgippner - Fr 24.02.06 15:04

Für die dazwischenliegenden Zeilen vielleicht bei der Übernahme eine if-then... einfügen:


Delphi-Quelltext
1:
if Memo1.Lines[x]<>'' then Memo2.Lines.Add(Memo1.Lines[x])                    


oder in der Art


rybe - Sa 25.02.06 18:15

user profile icondavidgippner hat folgendes geschrieben:
Für die dazwischenliegenden Zeilen vielleicht bei der Übernahme eine if-then... einfügen:


Delphi-Quelltext
1:
if Memo1.Lines[x]<>'' then Memo2.Lines.Add(Memo1.Lines[x])                    


oder in der Art


oder wie folgt:


Delphi-Quelltext
1:
2:
3:
4:
5:
var i:integer;
begin
 for i:=memo1.lines.count-1 downto 0 do
  if memo1.lines[i]='' then memo1.lines.delete(i);
end;


damit sparst du dir ein zweites memo bzw eine zweites tstringlist