Delphi-PRAXiS

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 22:43


Memo Zeichenzähler mit Eingabe
 
Hallo, ich hab ein kleines Problem. Ich möchte die Zeichen vom Memo feld auslesen, sodass das mit der MaxLength passt. Nur die Eingabetaste nimmt er nicht mit, warum weiss ich net.
Hier ist bis jetzt mein Code:
Delphi-Quellcode:
var wort: string;
zeichenzahl, zeilenzahl,i,zeile,zeichenzaehler: Longint;
begin
 Zeichenzahl:=Memo1.lines.count;
 Zeichenzaehler:=0;
  FOR i:=0 TO zeichenzahl-1 DO
   Begin
    wort:=memo1.lines[i];
   zeichenzaehler:=zeichenzaehler+length(wort);
   end;
Form1.StatusBar1.Panels[1].Text:=('Zeichenzahl: ' + InttoStr(zeichenzaehler));
Ich Bitte um Hilfe

MfG Dave

Luckie 29. Jan 2010 22:46

Re: Memo Zeichenzähler mit Eingabe
 
Warum nicht
Delphi-Quellcode:
Length(Memo1.Text)

DaveRidge 29. Jan 2010 22:53

Re: Memo Zeichenzähler mit Eingabe
 
Zitat:

Zitat von Luckie
Warum nicht
Delphi-Quellcode:
Length(Memo1.Text)

Weil er dann bei der eingabetaste 2 Zeichen hinzufügt, statt ein zeichen.

MfG Dave

Luckie 29. Jan 2010 22:55

Re: Memo Zeichenzähler mit Eingabe
 
Ist ja auch richtig. Ein Return führt zu einem Zeilenvorschub und einem Wagenrücklauf. Und die zählen auch zu der Anzahl Zeichen.

DP-Maintenance 29. Jan 2010 22:56

DP-Maintenance
 
Dieses Thema wurde von "Luckie" von "Programmieren allgemein" nach "VCL / WinForms / Controls" verschoben.
Delphi VCL Thema.

DaveRidge 29. Jan 2010 22:59

Re: Memo Zeichenzähler mit Eingabe
 
Zitat:

Zitat von Luckie
Ist ja auch richtig. Ein Return führt zu einem Zeilenvorschub und einem Wagenrücklauf. Und die zählen auch zu der Anzahl Zeichen.

Ja, das stimmt, aber er soll bei der Eingabe nur ein zeichen zählen, denn wenn ich ne SMS sende, dann kommen nur 148 Zeichen oder so an, keine 160 Zeichen, wie ich das im Text geschrieben habe, versteht ihr?

Luckie 29. Jan 2010 23:00

Re: Memo Zeichenzähler mit Eingabe
 
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.

DaveRidge 29. Jan 2010 23:07

Re: Memo Zeichenzähler mit Eingabe
 
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.

MfG Dave

Luckie 29. Jan 2010 23:20

Re: Memo Zeichenzähler mit Eingabe
 
Dann von Hand zählen:
Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure Memo1KeyPress(Sender: TObject; var Key: Char);
  private
    { Private-Deklarationen }
    cntChars: Integer;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
  Inc(cntChars);
  Caption := IntToStr(cntChars);
end;

DaveRidge 29. Jan 2010 23:34

Re: Memo Zeichenzähler mit Eingabe
 
Zitat:

Zitat von Luckie
Dann von Hand zählen:
Delphi-Quellcode:
....

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
  Inc(cntChars);
  Caption := IntToStr(cntChars);
end;


Jo, danke. genau das hab ich gesucht. Warum bin ich heut net selber dahinter gekommen?
Ist mir ein rätsel :-)

Trotzdem danke

MfG Dave

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 14:35 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