![]() |
Bei einem memo leere Zeilen richtig löschen
Hallo Delphianer, ich habe folgende Frage, evtl. hat jemand ´ne Idee.
Wenn man Strings in ein Memo einfügen will, kann man das ja z.B. auf diese Weis tun:
Delphi-Quellcode:
Delphi fügt den String nach der letzen beschriebenen Zeile hinzu.
memo1.lines.add(blabla);
Soweit so gut. Wenn man nun aber, warum auch immer die lines im Memo verschiebt, bleiben manchmal, je nach dem wie dies geschiet, leere Zeilen zurück. Diese sind zwar nichtbeschrieben aber zumindest schon so belegt, als würde man im Word die Enter-Taste ein paar mal betätigen. Man kann den Cursor also soweit unten plazieren, wie man die Enter-Taste gedrückt hat. Nun mein Problem, mit dem Befehl
Delphi-Quellcode:
sucht sich delphi ja nun die nächste freie Stelle und die ist leider unterhalb dieser "unbelegten" Zeilen. Das heißt, es bleiben freie Zeilen im Memo stehen.
.add(blabla)
Habe versucht es so zu lösen:
Delphi-Quellcode:
Um ehrlich zu sein, es funktioniert nicht :gruebel:
if memo1.lines[1] = '' then begin
memo1.selstart(1); //setzt den Cursor auf die leere Zeile postmessage( wm_keypress, vk_back, 0) // oder so ähnlich, führt Backspace an dieser Stelle aus end; Für Denkanstöße oder Belehrungen wäre ich sehr dankbar :wink: |
Re: Bei einem memo leere Zeilen richtig löschen
Moin Padavan,
die letzte Zeile im Memo löschen ginge so:
Delphi-Quellcode:
Dies machst Du dann so lange (while-Schleife), bis keine Zeile mehr da ist, oder die letzte Zeile nicht leer ist.
Memo1.Lines.Delete(Memo1.Lines.Count-1);
|
Re: Bei einem memo leere Zeilen richtig löschen
Hallo Christian,
vielen Dank erstmal für die schnelle Antwort. Deine Methode ist zumindest schonmal die richtige Vorgehensweise, was den Befehl angeht. Das was ich lösen wollte geht aber immernoch nicht, ich wende es scheinbar nicht richtig an. Beispiel: line[0] ist beschrieben, line[1] nicht, line[2] ist wieder beschrieben usw. ich wollte nun eine Routine starten, welche die "leeren" Zeilen wirklich löscht und den Text wieder zusammenrückt. Wende ich den Befehl nun folgendermaßen an:
Delphi-Quellcode:
dann löscht er das komplette memo
if memo1.lines[1] = '' then begin
memo1.selstart(2); //soll denn Cursor eine Zeile "untendrunter" ansetzen Memo1.Lines.Delete(Memo1.Lines.Count-1); //dein Befehl.... end; usw. Gruß Padavan |
Re: Bei einem memo leere Zeilen richtig löschen
Hi!
Seltsames Problem :gruebel: Versuch mal deinen Code so umzuschreiben, dass diese "Löcher" gar nicht erst entstehen. Ansonsten könntest du folgendes versuchen
Delphi-Quellcode:
Memo1.Lines.Text := StringReplace(Memo1.Lines.Text, #13#10#13#10, #13#10, [rfReplaceAll]);
|
Re: Bei einem memo leere Zeilen richtig löschen
Diese "Löcher" sollten eigentlich gar nciht entstehen können. (Solange man sich dabei nicht selbst ferfriemelt ;) )
Zum Löschen brauchst du nur für jede leere Zeile Delete aufrufen. Kleines Beispiel:
Delphi-Quellcode:
program RemoveEmptyLines;
{$APPTYPE CONSOLE} uses SysUtils, Classes; var StringList : TStrings; i : Integer; begin StringList := TStringList.Create(); StringList.Add('1'); StringList.Add('2'); StringList.Add(''); StringList.Add('4'); i := 0; while i < StringList.Count do begin if StringList[i] = '' then StringList.Delete(i) else Inc(i); end; for i := 0 to pred(StringList.Count) do Writeln(StringList[i]); Sleep(5000); end. |
Re: Bei einem memo leere Zeilen richtig löschen
bei der Anweisung
Delphi-Quellcode:
gibt´s ´ne Exception :gruebel:
Writeln(StringList[i]);
zum Thema "selbst drin rumgefrimelt", da habt ihr schon recht... Habe einen Player programmiert, bei dem das Memo als "offene" Playlist dient. Klickt man nur mit der Maus drin rum und benutzt quasi meine vorgegebenen Möglichkeiten bleiben auch keine Leerzeilen zurück. Ich wollte quasi eine Möglichkeit bieten die Playlist "aufzuräumen" falls man per Hand drin rumgefrimelt hat. Padavan |
Re: Bei einem memo leere Zeilen richtig löschen
Muss es denn eine Memo sein? Eine ListBox wäre für deine Zwecke doch viel besser geeignet?!
|
Re: Bei einem memo leere Zeilen richtig löschen
Hallo Dani,
da hab ich auch schon drüber nachgedacht, ich glaub die Idee ist wirklich gut. Ich habe gegenüber des Memos eigentlich keine Nachteile. Außer: Kann man bei einer Listbox auch mehrere Einträge markieren? (Mit der Maus meine ich.) |
Re: Bei einem memo leere Zeilen richtig löschen
Hallo,
mit MultiSelect:=true sollte das gehen. Gruß Harald |
Re: Bei einem memo leere Zeilen richtig löschen
stimmt, danke für eure hilfe,
werde gleich dieses WE angangen, meinen Programm auf Listbox statt memo zu ändern. Eine Sache hab ich im "Vortest" noch nicht geschafft. Eine funktion wie caretpos zum bestimmen der CursorPosition muss es doch bei Listbos auch geben, oder? Kann mir jemand sagen wie das da geht? Danke Padavan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:23 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