![]() |
TMemo : Leerzeilen am Ende erkennen
Hallo !
Ich hab ein kleines Problem : In einem Fenster habe ich ein TMemo, in dem der User Text eingeben können soll :-). Dabei soll es auch möglich sein, am Ende des Textes Leerzeilen hinzuzufügen (damit nach Speichern wieder am Ende mit der Eingabe fortgesetzt werden kann. 1. Bsp : "BlaDiBla"<CR><LF> BlubbDiBlubb"<CR><LF> <CR><LF>" Hier liefert mir: TMemo.Text = ""BlaDiBla"<CR><LF>BlubbDiBlubb"<CR><LF>" -> also keine Leerzeile am Ende TMemo.GetTextBuf(...) = "BlaDiBla"<CR><LF>BlubbDiBlubb"<CR>" -> auch keine Leerzeile (Cnt mögl. 1 zu niedrig) 2. Bsp : "BlaDiBla"<CR><LF> BlubbDiBlubb"<CR><LF> <CR><LF>" <CR><LF>" <CR><LF>" Hier liefert mir: TMemo.Text = ""BlaDiBla"<CR><LF>BlubbDiBlubb"<CR><LF>" -> also keine Leerzeilen am Ende TMemo.GetTextBuf(...) = "BlaDiBla"<CR><LF>BlubbDiBlubb"<CR>" -> auch keine Leerzeilen (Cnt mögl. 1 zu niedrig) 3. Bsp : "BlaDiBla"<CR><LF> BlubbDiBlubb" Hier liefert mir: TMemo.Text = ""BlaDiBla"<CR><LF>BlubbDiBlubb"<CR><LF>" -> also ein <CR><LF> am Ende TMemo.GetTextBuf(...) = "BlaDiBla"<CR><LF>BlubbDiBlubb"<CR>" -> also ein <CR><LF> am Ende Mit TMemo.Lines.Count komme ich immer auf 2 Zeilen - auch bei dem 2. Bsp. Was nun ? |
Re: TMemo : Leerzeilen am Ende erkennen
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
versuch mal diesen Code:
Delphi-Quellcode:
Und guck dir mal mein Beispiel an das angehaengt ist!
procedure TForm1.BtnExecuteClick(Sender: TObject);
begin Memo1.Clear; Memo1.Lines.Add('Dies ist ein sample Test!!!'); Memo1.Lines.Add('Dies ist die 2. Zeile!!!'); Memo1.Lines.Add(''); Memo1.Lines.Add('Dies ist die 4. Zeile da die 3. Zeile leer ist!!!') end; procedure TForm1.BtnLoadClick(Sender: TObject); begin Memo1.Lines.LoadFromFile('c:\Test.txt'); end; procedure TForm1.BtnSaveClick(Sender: TObject); begin Memo1.Lines.SaveToFile('c:\Test.txt'); end; procedure TForm1.BtnShowLinesClick(Sender: TObject); begin Caption := IntToStr(Memo1.Lines.Count); end; Ich hoffe dass ich dein Problem richtig erkannt habe und dir helfen konnte! |
Re: TMemo : Leerzeilen am Ende erkennen
Hi MackHack !
Ich meinte etwas anderes : Es geht mir darum, zu erkennen, ob bzw. wie viele Leerzeilen am Ende eines Memos auftauchen . Wie schon gezeigt, liefert Memo.Text immer ein CRLF am Ende. Egal ob keine, eine oder fünf Leerzeilen am Ende sein sollen. Wenn sich Leerzeilen im Text befinden, also z.B. "Zeilentext 1"<CR><LF> "Zeilentext 2"<CR><LF> ""<CR><LF> "Zeilentext 4"<CR><LF> <CR><LF> liefert er bei lines.count 4 Zeilen zurück; Er sollte aber 5 zeilen zurückliefern. Oder hab ich Dich da falsch verstanden? Gruss maanton |
Re: TMemo : Leerzeilen am Ende erkennen
Hallo,
Zitat:
Wenn man dann noch den Cursor ans Ende setzt (Selection), dann kann man auch sofort am Ende weiterschreiben. Sehe hier also kein Problem. Zitat:
Zitat:
Edit: wenn es Dir aber wirklich darum geht, zu ermitteln, wieviele Leerzeilen sich am Ende Deines Textes befinden, dann könntest Du das so machen (Achtung: auch hier wird ein abschließendes CRLF nicht als Leerzeile interpretiert)
Delphi-Quellcode:
Edit: Wenn Du als zweiten Parameter 'False' übergibst, werden auch Leerzeilen gezählt, die sich innerhalb Deines Textes befinden.
Function TForm1.CountBlankLines(_Memo: TMemo; _bEndOnly: Boolean = True): Integer;
Var i: Integer; Begin Result := 0; If _Memo.Text <> '' Then Begin For i := _Memo.Lines.Count - 1 Downto 0 Do Begin If _Memo.Lines.Strings[i] = '' Then Inc(Result) Else If _bEndOnly Then Break; End; End; End; |
Re: TMemo : Leerzeilen am Ende erkennen
Hallo s-off !
Da liegt genau mein Problem : Wenn wir zu meiner ursprünglichen Problembeschreibung zurück gehen liefert mir lines.count immer 2 zurück. (Würde sich zwischen den beiden Zeilen eine Leerzeile befinden (also ein CRLF) würde lines.count 3 zurückliefern). Memo.Lines.Strings[i] liefert mir den Inhalt der einzelnen Zeilen; da -bei mir (Delphi6)- in den Bsp lines.count immer 2 zurückliefert bin ich damit angeschmiert. Aus Geschwindigkeitsgründen würd ich schon ganz gern mit Memo.Lines.Strings arbeiten - ein Hinzufummeln mit z.B. textzeile := textzeile + #13 + #10; ist ja auch kein Problem. <CR><LF> beschreibt für mich immer ein Zeilenende : Carriage Return (also Druckkopf zurück) und Line Feed (also Zeilenvorschub). Ergo hätte mein Beispiel in der Antwort an MackHack 5 Zeilen. (Wenn ich also einen Cursor (caret) an das Ende zu plazieren hätte, würde ich diesen nach dem letzten Zeichen, also an den Beginn der 6. Zeile setzen) Ich versuch es mal mit einer anderen Beschreibung (entspricht den Bsp. in der ursprünglichen Prob.beschreibung). Diese hier zeigt die Rücklieferung der TMemo-Control. : 1. Bsp : Soll-Wert : Memo.Text = BlaDiBla<CR><LF>BlubbDiBlubb<CR><LF><CR><LF> Ist-Wert : Memo.Text = BlaDiBla<CR><LF>BlubbDiBlubb<CR><LF> 2.Bsp Soll-Wert : Memo.Text = BlaDiBla<CR><LF>BlubbDiBlubb<CR><LF><CR><LF><CR><L F><CR><LF> Ist-Wert : Memo.Text = BlaDiBla<CR><LF>BlubbDiBlubb<CR><LF> 3. Bsp Soll-Wert : Memo.Text = BlaDiBla<CR><LF>BlubbDiBlubb Ist-Wert : Memo.Text = BlaDiBla<CR><LF>BlubbDiBlubb<CR><LF> Ich sehe also an den Ist - Werten nicht, ob und wieviele CRLF am Ende sind... Gruss maanton Anmerkungen : In meiner Antwort an MackHack habe ich zu Beginn der 5. Zeile "" vergessen. In meiner usprünglichen Beschreibung ist vor BlubbDiBlubb ein " zu setzen. bei <CR><LF>" ist " zu ignorieren. Also, ich hab auch schon Beschreibungen mit weniger Fehlern gemacht... . :oops: Kürzel : <CR> = $D, <LF> =$A oder in "C" : 0x0D,0x0A |
Re: TMemo : Leerzeilen am Ende erkennen
Hallo Maanton,
offenbar werden "intern" bereits alle mehrfachen CRLF am Ende des Memos unterdrückt, also weder in Memo.Text noch Memo.Lines übernommen. Aber, ich frage mich: Wozu ist das denn überhaupt wichtig zu wissen? Wie s-off ja völlig richtig geschrieben hat, ist ein weiteres Einfügen von Text am Textende doch in jedem Fall möglich - mir ist nach wie vor unklar, wozu du diese mehrfachen CRLF überhaupt benötigst... Gruß |
Re: TMemo : Leerzeilen am Ende erkennen
Hallo pstruh !
Das ist ganz einfach zu beantworten : Wenn ich beim Editieren des Memo-Feldes eine Zwischenspeicherung mache, möchte ich den Cursor wieder ans Ende des Textes setzen... . Und wenn ich ein paar Leerzeilen ans Ende gemacht habe, dann sollen nach der Zwischenspeicherung auch diese Leerzeilen noch da sein. Bzw. besser : Speichern->Schliessen des Dialogs->Dialog wieder öffnen->Inhalt irgendwoher (z.B. aus Datei) einlesen und in Memofeld übernehmen : Dann sollen die Leerzeilen (bzw. ggf. kein CRLF am Ende) auch noch da sein. Ich dachte, dass ich bei der Controldefinition oder eine mögliche Auslesemöglichkeit oder sonst irgenwas übersehen habe... . Vielleicht könnte man ein anderes Control verwenden ? Gruss maanton P.S. ich lasse den Thread mal noch offen |
Re: TMemo : Leerzeilen am Ende erkennen
Zitat:
|
Re: TMemo : Leerzeilen am Ende erkennen
Hmmm,
das "ans Ende setzten des Cursors" ist in jedem Fall möglich (war je weiter oben schon ausgesagt worden). Wozu in aller Welt ist es aber wichtig, dann auch noch die mehrfachen Leerzeilen am Ende wieder vorzufinden. Ich hatte dich zuerst so verstanden, dass du der Meinung bist, nur auf diesem Wege den Cursor an das Textende zu bringen. Gruß (Sorry, aber das verstehe ich immer noch nicht :pale: ) |
Re: TMemo : Leerzeilen am Ende erkennen
Hallo S-Off !
Ich war zu langsam (->s.o.) : Zwischenspeichern meint natürlich auch Speichern, also : Speichern->Dialog schliessen-> Daten wieder aus Datei auslesen->Dialog irgendwann wieder öffnen und mit Inhalt der Datei setzen Gruss maanton |
Re: TMemo : Leerzeilen am Ende erkennen
Hallo,
TMemo bildet einen Text exakt wie vorgegeben ab. Enthaltene Zeilentrenner (!) werden bei der Zählung genau beachtet. Der Text 'two'#13#10'lines' führt erwartungsgemäß zu einer Zeilenzahl 2, wird doch der Text vor und nach dem Windows-Zeilentrenner #13#10 (sLineBreak) auf zwei Zeilen verteilt. Ein Sonderfall liegt beim Text 'one line'#13#10 vor. Die Zählung liefert den Wert 1, obwohl man argumentieren könnte, dass dem Zeilentrenner ein leerer String folgt und deshalb zwei Zeilen vorliegen. Hier haben die VCL-Entwickler entschieden, dass ein leerer String sich nicht als letzte Zeile qualifizieren kann. Damit wird sicher gestellt, dass die Zeilenzählung auch bei Verwendung von Lines.Add() ein erwartungsgemäßes Ergebnis liefert. Das alles funktioniert auch bei zwischenzeitlichem Speichern. Grüße vom marabu |
Re: TMemo : Leerzeilen am Ende erkennen
Also ehrlich gesagt blicke ich nicht mehr durch.
Situation: Ich habe ein Memo (Memo1), in welches ich gerade meine Memoiren schreibe. Und weil ich gerade so lustig bin, füge ich am Ende einfach mal ein paar Leerzeilen ein. Vielleicht kommen ja gleich, während ich beim Mittagessen sitze, die Hainzelmännchen, und schreiben irgeendwas in die Leerzeilen rein. So, nun ruft Mami zum Mittagessen. Plötzlich denke ich mir jedoch, bevor gleich das Hausschwein kommt, und meine Memoiren löscht, speichere ich den Text aus dem Memo lieber mal ab (Memo1.Lines.SaveToFile()) - und zwar auf der Festplatte in der Datei 'C:\MeineMemoiren.txt'. Und da ich ein energiebewusster Mensch bin, fahre ich den Rechner herunter und ziehe den Stecker raus. Nach dem Essen möchte ich weiterschreiben. Ich fahre also den Rechner wieder hoch, starte mein Programm, und lade meine Textdatei in das Memo (Memo1.Lines.LoadFromFile()). Und da ich ja genau dort weiterschreiben möchte, wo ich aufgehört habe, setze ich mit 'Memo1.SelStart := Length(Memo1.Text);' den Cursor an das Ende meines Memos - in diesem Falle hinter meine ganzen Leerzeilen, die ich vor dem Mittagessen eingefügt habe. |
Re: TMemo : Leerzeilen am Ende erkennen
Hallo pstruh !
Sorry - ich sollte auch vielleicht mein Deutsch wieder auf Vordermann bringen. Also - und das mag ja vielleicht etwas misstrauig erscheinen : Auch bei Zwischenspeichern möchte ich nach Speicherung den Inhalt der Datei anzeigen, meint : Zwischenspeichern-> Datei schreiben->datei schliessen->Datei wieder öffnen-> Memo leeren-> Datei auslesen und Memo wieder füllen->Datei schliessen Gruss maanton |
Re: TMemo : Leerzeilen am Ende erkennen
Hallo pstruh !
Das mit den Memoiren ist genau die Situation... . Nun ist es so, dass ich einfach mal so 2 Leerzeilen aus Formatierungsgründen einfügen möchte -> danach ruft Mami zu Essen->ordentlich,brav, wie ich bin, reagiere ich direkt->ich speichere ab, schliesse Programm, Rechner runter (wg. CO2 und so). Nach Mittagessen möchte ich einfach da weitermachen, wo ich war... (Also nach den 2 Leerzeilen). @Marabou : So was ähnliches hab ich mir gedacht. Etwas spitz formuliert :Im Gegensatz zu den VCL-Entwicklern bin ich der Meinung, das zwischen "Zeile 1" und "Zeile 1<CR><LF" ein Unterschied besteht. Zur Sicherstellung bei Lines.Add könnte man da entsprechend auch anderer Ansicht sein. - Oh, diese Philosophiesachen ! Am Schluss gibt es keine Argumente mehr, sondern nur noch Meinungen. Gibt es irgeneine Möglichkeit an die Rohmasse heranzukommen ? Wie ich schon mal bemerkte - ich muss mir das Memo eh beim Neueinlesen selbst zusammenbauen... Gruss maanton |
Re: TMemo : Leerzeilen am Ende erkennen
Sry ich hab jetzt nicht alles gelesen, aber wenn du die Anzahl der Leerzeichen am ende einer Zeile erfahren willst könntest du das mal versuchen:
Delphi-Quellcode:
so kannst das denke ich machen.
function LeerzeichenAmEnde(str : String):LongInt;
begin result := Length(str) - (Length(Trim(str)); end; Thorben |
Re: TMemo : Leerzeilen am Ende erkennen
@Thorben_Ko, ich glaube es gin um Leerzeilen nicht um Leerzeichen
Bei mir tut das alles genau das wa es soll... Lines.Count gibt auch die leerzeilen am Ende mit aus... sowohl vor dem speicehrn als auch danach, als auch nach einem Neustart des Programms
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Memo1: TMemo; Button3: TButton; Button4: TButton; Button5: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); // Laden begin memo1.Lines.SaveToFile('c:\temp\test.txt'); end; procedure TForm1.Button2Click(Sender: TObject); // Speichern begin memo1.Lines.LoadFromFile('c:\temp\test.txt'); end; procedure TForm1.Button3Click(Sender: TObject); // Memo leeren begin memo1.Clear; end; procedure TForm1.Button4Click(Sender: TObject); // Cursor setzen begin memo1.SelStart:=Length(memo1.Lines.Text); memo1.SetFocus; end; procedure TForm1.Button5Click(Sender: TObject); // Anzhl Zeilen Auslesen und anzeigen begin Label1.Caption:=inttostr(Memo1.Lines.Count); end; end. |
Re: TMemo : Leerzeilen am Ende erkennen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz