SynEdit abfragen ob es leer ist oder nicht.

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

SynEdit abfragen ob es leer ist oder nicht.

Beitrag von Ally »

Hallo zusammen,

ich möchte wissen ob ein SynEdit text enthält oder nicht.
Also habe ich folgendes probiert:

Code: Alles auswählen

Label1.Caption := IntToStr(SynEdit1.Text.Length);

if SynEdit1.Text.IsEmpty then
  Label2.Caption := 'leer'
else
  Label2.Caption := 'nicht leer';
Das funktioniert auch direkt nach dem Programmstart, gibt man aber ein Zeichen ein und löscht es wieder, liefert SynEdit1.Text.Length den Wert 2 und SynEdit1.Text.IsEmpty False.

Was ist die Logik dahinter?

Gruß Roland

Win10, Lazarus 2.0.10 r63526 FPC 3.2.0 x86_64-win64-win32/win64
Dateianhänge
SynEditTest.zip
(126.96 KiB) 76-mal heruntergeladen

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: SynEdit abfragen ob es leer ist oder nicht.

Beitrag von h-elsner »

Wenn du nur den Text löschst, bleibt die Zeile wo du geschrieben hast im Editor stehen. Die zeile ist zwar leer, wird aber mit CRLF ($0D $0A) abgeschlossen. Das sind die zwei (unsichtbaren) Zeichen.
SynEdit1.Lines.Clear; löscht wieder alles und es wird 'leer' angezeigt.

Gruß HE

Benutzeravatar
six1
Beiträge: 788
Registriert: Do 1. Jul 2010, 19:01

Re: SynEdit abfragen ob es leer ist oder nicht.

Beitrag von six1 »

evtl. so?

Code: Alles auswählen

if trim(SynEdit1.Text) = '' then
  Label2.Caption := 'leer'
else
  Label2.Caption := 'nicht leer';
Gruß, Michael

Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: SynEdit abfragen ob es leer ist oder nicht.

Beitrag von Ally »

Hallo h-elsner, hallo six1,

danke für eure Antworten.

@h-elsner:
Du hast recht, genau so ist das wohl.
So ganz plausibel ist das allerdings nicht. SynEdit1.Text.Length zählt ja ein CRLF mit das nicht eingegeben wurde.
Und wenn ich diese scheinbar leere Datei speichere und mit z.B. dem Windows-Editor öffne, erscheint dort gleich mal eine Leerzeile.


@h-elsner, @six1:
Aber wie auch immer, mein Problem konnte ich mit eurer Hilfe lösen.

Mein Test auf „Leer“ sieht jetzt so aus:

Code: Alles auswählen

var
  Leer: Boolean;
.
.  
  Leer := SynEdit1.Text = LineEnding;
Gruß Roland

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: SynEdit abfragen ob es leer ist oder nicht.

Beitrag von Winni »

Hi!

Das fällt auf die Nase, wenn Du mal einen Text von einem Linux-Rechner lädtst.
Also Plattform übergreifend:

Code: Alles auswählen

Leer := ( SynEdit1.Text = #10) or (SynEdit1.Text = #13#10);
Winni

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: SynEdit abfragen ob es leer ist oder nicht.

Beitrag von Socke »

Winni hat geschrieben:
Di 13. Okt 2020, 19:48
Das fällt auf die Nase, wenn Du mal einen Text von einem Linux-Rechner lädtst.
Warum? LineEnding ist doch platformabhängig definiert?
Außerdem müsste du bei dir noch auf MacOS (Classic) mit #13 beachten.
Offen wäre dann die Frage, wie SynEdit Dateien aus unterschiedlichen Quellen einliest und ggf. automatisch konvertiert.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: SynEdit abfragen ob es leer ist oder nicht.

Beitrag von Winni »

Hi!

Ist das so schwer zu verstehen?

Wenn ich eine Linux Text unter Windows einlese,
dann sucht LineEnding nach CR LF und findet nix - weil das LineEnding des Linux-Textes LF ist.

Wenn ich einen Windows Text unter Linux einlese,
dann such LineEnding nach LF und findet nix weil das LineEnding des Windows-Texte CRLF ist.

Und die Mac-Leute sollen erstmal ihre 64-Bit-Version fixen, damit das "Mac funktioniert nicht" im internationalen Forum abnimmt.

Winni

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: SynEdit abfragen ob es leer ist oder nicht.

Beitrag von Socke »

Winni hat geschrieben:
Di 13. Okt 2020, 20:49
Ist das so schwer zu verstehen?
Nein, eigentlich nicht. Nach deiner Frage habe ich echt überlegt, ob ich falsch Liege und das ganze kurz getestet.
Das Ergebnis ist: SynEdit (oder TStrings bzw. die in SynEdit genutzte Implementierung) konvertiert die Zeilenumbrüche automatisch!
Lese ich eine Datei mit #13-Zeilenumbrüchen ein, habe ich in SynEdit.Text #13#10-Zeilenunmbrüche (ich arbeite mit Windows).

Man kann SynEdit1.Lines.LineBreak explizit ändern. Dann übernimmt SynEdit1.Lines.Text die gesetzten Zeilenumbrüche, SynEdit1.Text aber nicht. Die Eigenschaft wird nicht automatisch beim Einlesen einer Datei gesetzt.
Zum Einlesen habe ich ein einfaches SynEdit1.Lines.LoadFromFile genutzt.

Demnach reicht die Prüfung auf LineEnding aus.

Code: Alles auswählen

var
  Leer: Boolean;
begin
  Leer := SynEdit1.Text = LineEnding // ist äquivalent zu:
  Leer := SynEdit1.Lines.Text = SynEdit1.Lines.LineBreak
end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: SynEdit abfragen ob es leer ist oder nicht.

Beitrag von Winni »

Hi!

Und wenn der vorliegende Text ein anderes LineEnding hat, als das geraden arbeitende Sytem?
Dann hast Du den Salat wieder.

Nun akkzeptier mal die halbe Zeile code mehr!
Oder mach ein automatisches erkennen beim Laden des Textes!

Winni

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: SynEdit abfragen ob es leer ist oder nicht.

Beitrag von Socke »

Winni hat geschrieben:
Di 13. Okt 2020, 22:15
Und wenn der vorliegende Text ein anderes LineEnding hat, als das geraden arbeitende Sytem?
Dann hast Du den Salat wieder.
Genau das versuche ich doch gerade! Ich lade eine Datei mit #CR-Zeilenende. Vom Synedit erhalte ich aber nur #CR#LF-Daten. Was mache ich hier falsch?
Winni hat geschrieben:
Di 13. Okt 2020, 22:15
Oder mach ein automatisches erkennen beim Laden des Textes!
Soweit ich das heraus gefunden habe, passiert das beim Laden einer Datei in TSynEditLines.LoadFromFile ohnehin automatisch. Wie kann ich später darauf zugreifen?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: SynEdit abfragen ob es leer ist oder nicht.

Beitrag von Ally »

Hallo zusammen,

ich denke Socke hat recht. Beim einlesen werden die Zeilenumbrüche nach Lineending konvertiert.
Wenn ich mit dem Windows-Editor einen leeren Text speichere dann ist der auch leer. (rechte Maustaste-Eigenschaften liefert 0 Bytes)
Wenn ich einen leeren SynEdit-Text speichere dann ist der nicht leer, sondern enthält Lineending. Unter Windows also CRLF(rechte Maustaste-Eigenschaften liefert 2 Bytes)
Das kann man sich auch mit einem HEX-Editor anschauen, dann sieht man es ganz genau.
Gleichgültig welche Variante man mit SynEdit öffnet (0 Bytes, CR, LF oder CRLF), werden alle zum aktuellen Lineending konvertiert.
Deshalb reicht die folgende Zeile um festzustellen ob der Text leer ist.

Code: Alles auswählen

Leer := SynEdit1.Text = LineEnding;
Vielleicht sollte ich noch erklären wozu ich das überhaupt brauche.
Wenn ein Text leer ist dann werden alle Menüpunkte die etwas mit dem Text machen deaktiviert.

Gruß Roland

Antworten