AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TMemo : Leerzeilen am Ende erkennen

Ein Thema von maanton · begonnen am 18. Sep 2007 · letzter Beitrag vom 18. Sep 2007
Antwort Antwort
Seite 1 von 2  1 2      
maanton

Registriert seit: 10. Sep 2007
16 Beiträge
 
#1

TMemo : Leerzeilen am Ende erkennen

  Alt 18. Sep 2007, 00:28
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#2

Re: TMemo : Leerzeilen am Ende erkennen

  Alt 18. Sep 2007, 05:49
Hi,

versuch mal diesen Code:

Delphi-Quellcode:
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;
Und guck dir mal mein Beispiel an das angehaengt ist!

Ich hoffe dass ich dein Problem richtig erkannt habe und dir helfen konnte!
Miniaturansicht angehängter Grafiken
memoproblem_196.png  
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
maanton

Registriert seit: 10. Sep 2007
16 Beiträge
 
#3

Re: TMemo : Leerzeilen am Ende erkennen

  Alt 18. Sep 2007, 11:03
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
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#4

Re: TMemo : Leerzeilen am Ende erkennen

  Alt 18. Sep 2007, 11:20
Hallo,
Zitat von maanton:
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.
Wenn ich den Text eines Memos, welcher am Ende Leerzeilen enthält, speichere, und anschliessend wieder lade, dann sind die Leerzeilen noch immer vorhanden.
Wenn man dann noch den Cursor ans Ende setzt (Selection), dann kann man auch sofort am Ende weiterschreiben.
Sehe hier also kein Problem.

Zitat von maanton:
"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.
Nein, denn Du hast nur vier Zeilen - das letzte CRLF ist keine Zeile!

Zitat von maanton:
Wie schon gezeigt, liefert Memo.Text immer ein CRLF am Ende.
Wenn Du das doch weisst, und nach Deiner Logik auch ein abschließendes CRLF als Zeile interpretiert werden soll, warum sagst Du dann nicht einfach 'Lines.Count + 1'?

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:
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;
Edit: Wenn Du als zweiten Parameter 'False' übergibst, werden auch Leerzeilen gezählt, die sich innerhalb Deines Textes befinden.
  Mit Zitat antworten Zitat
maanton

Registriert seit: 10. Sep 2007
16 Beiträge
 
#5

Re: TMemo : Leerzeilen am Ende erkennen

  Alt 18. Sep 2007, 12:59
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... .
Kürzel : <CR> = $D, <LF> =$A oder in "C" : 0x0D,0x0A
  Mit Zitat antworten Zitat
pstruh
(Gast)

n/a Beiträge
 
#6

Re: TMemo : Leerzeilen am Ende erkennen

  Alt 18. Sep 2007, 13:23
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ß
  Mit Zitat antworten Zitat
maanton

Registriert seit: 10. Sep 2007
16 Beiträge
 
#7

Re: TMemo : Leerzeilen am Ende erkennen

  Alt 18. Sep 2007, 14:08
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
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#8

Re: TMemo : Leerzeilen am Ende erkennen

  Alt 18. Sep 2007, 14:13
Zitat von maanton:
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.
Aber das ist doch so - ohne, dass Du irgendetwas machst!
  Mit Zitat antworten Zitat
pstruh
(Gast)

n/a Beiträge
 
#9

Re: TMemo : Leerzeilen am Ende erkennen

  Alt 18. Sep 2007, 14:14
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 )
  Mit Zitat antworten Zitat
maanton

Registriert seit: 10. Sep 2007
16 Beiträge
 
#10

Re: TMemo : Leerzeilen am Ende erkennen

  Alt 18. Sep 2007, 14:17
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz