Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Memo Zeichenzähler mit Eingabe (https://www.delphipraxis.net/146945-memo-zeichenzaehler-mit-eingabe.html)

DaveRidge 29. Jan 2010 23:38

Re: Memo Zeichenzähler mit Eingabe
 
MMh, mir fällt grd auf, das wenn ich was lösche, das dies als zeichen mit hinzugefügt wird.
MMh, naja. Ich mach morgen weiter. Heute isses mir zu spät.

MfG Dave

Luckie 30. Jan 2010 01:35

Re: Memo Zeichenzähler mit Eingabe
 
Zitat:

Zitat von DaveRidge
MMh, mir fällt grd auf, das wenn ich was lösche, das dies als zeichen mit hinzugefügt wird.
MMh, naja. Ich mach morgen weiter. Heute isses mir zu spät.

MfG Dave

Weil ich nicht die Zeichen zähle, sondern nur die Tastendrücke. War auch nur als Anregung gedacht.

fkerber 30. Jan 2010 08:27

Re: Memo Zeichenzähler mit Eingabe
 
Hi!

Als Tipp dazu:
Du musst dann noch abfragen, welches Zeichen da so kommt - es kommen ja nur 2 Tastendrücke in Frage, die etwas löschen können.
Allerdings gibt es noch mehr Sonderfälle:
Markierten Text (mehr als ein Zeichen) löschen oder sogar ausschneiden oder überschreiben...
Auch das Einfügen von Text (sei es über Kontextmenü oder über Tastenkombi) solltest du bedenken...


Grüße, Frederic

jaenicke 30. Jan 2010 09:14

Re: Memo Zeichenzähler mit Eingabe
 
Zitat:

Zitat von DaveRidge
Delphi-Quellcode:
Form1.StatusBar1.Panels[1].Text:=('Zeichenzahl: ' + InttoStr(zeichenzaehler));

Vorausgesetzt du bist innerhalb von Form1 ist das eine sehr schlechte Idee explizit auf die in der globalen Variablen Form1 gespeicherte Instanz des Formulares zuzugreifen.
Das solltest du wie beim Memo lieber weglassen.

Zum Thema: Warum denkt ihr so kompliziert? :mrgreen:
Delphi-Quellcode:
  StatusBar1.Panels[1].Text := 'Zeichenzahl: '
    + IntToStr(Length(StringReplace(Memo1.Text, #13#10, ' ', [rfReplaceAll])));
Bzw. wenn der Zeilenumbruch gar nicht gezählt werden soll, dann einfach durch einen leeren String statt mit einem Leerzeichen ersetzen, fertig.

Diese Lösung ist zwar langsamer usw. als einfaches Zählen, aber bei der zu erwartenden Zeichenanzahl spielt das ja keine Rolle.

Amateurprofi 30. Jan 2010 11:36

Re: Memo Zeichenzähler mit Eingabe
 
Zitat:

Zitat von jaenicke
Zitat:

Zitat von DaveRidge
Delphi-Quellcode:
Form1.StatusBar1.Panels[1].Text:=('Zeichenzahl: ' + InttoStr(zeichenzaehler));

Vorausgesetzt du bist innerhalb von Form1 ist das eine sehr schlechte Idee explizit auf die in der globalen Variablen Form1 gespeicherte Instanz des Formulares zuzugreifen.
Das solltest du wie beim Memo lieber weglassen.

Zum Thema: Warum denkt ihr so kompliziert? :mrgreen:
Delphi-Quellcode:
  StatusBar1.Panels[1].Text := 'Zeichenzahl: '
    + IntToStr(Length(StringReplace(Memo1.Text, #13#10, ' ', [rfReplaceAll])));
Bzw. wenn der Zeilenumbruch gar nicht gezählt werden soll, dann einfach durch einen leeren String statt mit einem Leerzeichen ersetzen, fertig.

Diese Lösung ist zwar langsamer usw. als einfaches Zählen, aber bei der zu erwartenden Zeichenanzahl spielt das ja keine Rolle.

Da finde ich Luckies Vorschläge, bzw. das was sich daraus ergibt, deutlich eleganter:
Delphi-Quellcode:
StatusBar1.Panels[1].Text:=IntToStr(Length(Memo1.Text)-Memo1.Lines.Count);

jaenicke 30. Jan 2010 13:02

Re: Memo Zeichenzähler mit Eingabe
 
Zitat:

Zitat von Amateurprofi
Da finde ich Luckies Vorschläge, bzw. das was sich daraus ergibt, deutlich eleganter:
Delphi-Quellcode:
StatusBar1.Panels[1].Text:=IntToStr(Length(Memo1.Text)-Memo1.Lines.Count);

Nur dass du festgestellt hättest, dass es so nicht funktioniert, wenn du es ausprobiert oder die Antworten gelesen hättest...
Zitat:

Zitat von DaveRidge
Zitat:

Zitat von Luckie
Na dann ziehe die Anzahl der Zeilen wieder ab. Dann müsste es stimmen. Bei zwei Zeilen hast du vier Steuerzeichen minus zwei Zeilen sind ein Steuerzeichen pro Zeile.

Das hab ich jetzt auch mal gemacht, von den Zeichen her passt es, nur beim Eingabe zählt er immernoch 2 Zeichen, aber dann bei der neuen Zeile der erste Buchstabe zählt er nicht mit. Er fängt dann beim 2.ten Zeichen an.

Das lässt sich sicher auch noch korrigieren, aber da hatte ich jetzt keine Lust zu. ;-)
// EDIT:
Es sollte reichen bei 0 Zeichen in der letzten Zeile nochmal minus Eins zu rechnen. Kommt noch dazu, dass man die Leerzeile woanders machen kann...

Amateurprofi 31. Jan 2010 11:03

Re: Memo Zeichenzähler mit Eingabe
 
Ich hab das schon getestet, habe mir aber zugegebenermaßen nicht alle Kommentare angesehen und deswegen den Sonderfall (Zeile hat noch kein CRLF) nicht 'drauf gehabt.
So sollte es dann vollständig funktionieren:
Delphi-Quellcode:
var s:string; len:integer;
begin
   s:=Memo1.Text;
   len:=Length(s);
   dec(len,Memo1.Lines.Count-Integer((len>0) and (s[len]<>#10)));
   Statusbar1.Panels[0].Text:=IntToStr(len);
end;
M.E. sollte das aber nicht in Memo1KeyPress stehen sondern im Memo1Change.

mkinzler 31. Jan 2010 11:10

Re: Memo Zeichenzähler mit Eingabe
 
Man könnte es auch mit
Delphi-Quellcode:
Anzahl := Length(Memo.Lines.DelimitedText);
versuchen

DaveRidge 31. Jan 2010 16:44

Re: Memo Zeichenzähler mit Eingabe
 
Hallo

Dank jaenicke, das war das was ich gesucht hatte
Delphi-Quellcode:
IntToStr(Length(StringReplace(Memo1.Text, #13#10, ' ', [rfReplaceAll])));
Funzt perfekt

MfG Dave


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:03 Uhr.
Seite 2 von 2     12   

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