Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bei einem memo leere Zeilen richtig löschen (https://www.delphipraxis.net/37933-bei-einem-memo-leere-zeilen-richtig-loeschen.html)

padavan 12. Jan 2005 13:48


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:
memo1.lines.add(blabla);
Delphi fügt den String nach der letzen beschriebenen Zeile hinzu.

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:
.add(blabla)
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.

Habe versucht es so zu lösen:

Delphi-Quellcode:
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;
Um ehrlich zu sein, es funktioniert nicht :gruebel:

Für Denkanstöße oder Belehrungen wäre ich sehr dankbar :wink:

Christian Seehase 12. Jan 2005 13:57

Re: Bei einem memo leere Zeilen richtig löschen
 
Moin Padavan,

die letzte Zeile im Memo löschen ginge so:

Delphi-Quellcode:
Memo1.Lines.Delete(Memo1.Lines.Count-1);
Dies machst Du dann so lange (while-Schleife), bis keine Zeile mehr da ist, oder die letzte Zeile nicht leer ist.

padavan 13. Jan 2005 07:51

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:
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.
dann löscht er das komplette memo

Gruß
Padavan

Dani 13. Jan 2005 08:03

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]);

Robert_G 13. Jan 2005 08:52

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.

padavan 13. Jan 2005 12:19

Re: Bei einem memo leere Zeilen richtig löschen
 
bei der Anweisung
Delphi-Quellcode:
Writeln(StringList[i]);
gibt´s ´ne Exception :gruebel:

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

Dani 13. Jan 2005 15:33

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?!

padavan 14. Jan 2005 09:32

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.)

Harald 14. Jan 2005 10:11

Re: Bei einem memo leere Zeilen richtig löschen
 
Hallo,

mit MultiSelect:=true sollte das gehen.

Gruß
Harald

padavan 15. Jan 2005 16:07

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