Entwickler-Ecke

Sonstiges (Delphi) - Problem: Zeichen in Memo zählen


hansano - So 24.11.02 19:38
Titel: Problem: Zeichen in Memo zählen
Moin! Ich bin Anfänger in Sachen Delphi, und stehe im Moment vor einem kleineren Problem: Mein "NotePad" soll die Anzahl der Zeichen zählen, es soll nicht mehr als alle Zeichen minus alle Zwischenräume anzeigen in den "Dokumenten-Informationen".
Um solche Infos rauszufinden wird der Inhalt der Memo in einen String gepackt, und der wird durchgelaufen...


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
procedure Tstatform.FormActivate(Sender: TObject);
Const  LovBogs : set of Char = ['A'..'Z','0'..'9'];
Var MemoStr : String; i, AntalOrd, AntalLinier, AntalTegn : Integer; space : Boolean;

begin

MemoStr := UpperCase(mainform.Memo1.Text);
space := True;
AntalOrd := 0;
AntalTegn := 0;
For i := 1 to Length(MemoStr) do begin
 if MemoStr[i] In LovBogs then begin
  if space = true then begin
  Inc(AntalOrd);
  space := false;
  end;
 end
 else
 space := true;
 if MemoStr[i] <> ' ' then
 Inc(AntalTegn);
// if MemoStr[i] = '/' then
//  if MemoStr[i + 1] = 'n' then
//  Dec(AntalTegn,2);
end;

AntalLinier := mainform.Memo1.Lines.Count;

Label1.Caption := IntToStr(AntalOrd);
Label2.Caption := IntToStr(AntalTegn);
Label3.Caption := IntToStr(AntalLinier);

end;


das Problem ist nun die Berechnung der Zeichen. Denn mit der jetztigen Prozedur zählt er für jeden Zeilenwechsel zwei extra Zeichen. Für jede Line 2 Zeichen abzuziehen geht allerdings nicht, denn wenn in der Memo eine Linie ganz leer ist, dann wird sie nicht gecounted :-(
Wie kann ich nun die wirkliche Anzahl der Linien herausfinden?

MfG: Hansano


Delete - So 24.11.02 20:06

Lad dir das ganze in eine Stringlist und lösch dann alle leeren Zeilen. Oder du zählst alle Zeichen in einer Zeile und addierst die in der Schleife laufend auf.


Christian S. - So 24.11.02 20:08

Hi!


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
VAR i,count : INTEGER;
begin
  count:=0;
  for i:=1 TO Length(Memo1.text) do
  begin
    if NOT (memo1.text[i] IN [#13,#10]) then
    inc(count);
  end;
  Label1.Caption:=IntToStr(count);
end;


Dieser Code gibt Dir die Anzahl der Zeichen aus, ohne Leerzeilen und so weiter zu werten. Wenn es noch irgendwelche anderen Zeichen gibt, die stören, kannst Du die einfach in die Menge, in der jetzt nur #13 und #10 drin stehen, hineinschreiben. Die werden dann auch nicht gewertet.

MfG,
Peter


hansano - So 24.11.02 21:24
Titel: besten dank!
vielen dank!
ich habe Peter L. Lösung benutzt, und einfach diese Zeile:


Quelltext
1:
if MemoStr[i] <> ' ' then                    


mit dieser ersetzt:


Quelltext
1:
if not (MemoStr[i] in [' ',#13,#10]) then                    


und es klappt wunderbar.


Christian S. - So 24.11.02 21:56

:D


Wolff68 - Mi 27.11.02 00:09

Da die ganzen Steuerzeichen ja einen Ord < 32 haben, und netterweise das Leerzeichen die #32 ist könntest Du auch einfach alles unter #33 ignorieren:IF Ord(Memo1.Text[i]) > 32 then Inc(count);
Das Problem sind nun höchstens noch Zeichen, die im aktuellen Zeichensatz nicht definiert sind. Du bräuchtest nichtmal dieses Uppercase bzw die extra Stringvariable.

Schau Dir am besten mal die Zeichntabelle in Windows an (In der aber die ersten 31 Zeichen nicht vorkommen)