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)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!