Autor Beitrag
hansano
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 23


D5 Standart, D6 Pers
BeitragVerfasst: So 24.11.02 19:38 
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...

ausblenden volle Höhe 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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 24.11.02 20:08 
Hi!

ausblenden 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
hansano Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 23


D5 Standart, D6 Pers
BeitragVerfasst: So 24.11.02 21:24 
Titel: besten dank!
vielen dank!
ich habe Peter L. Lösung benutzt, und einfach diese Zeile:

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


mit dieser ersetzt:

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


und es klappt wunderbar.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 24.11.02 21:56 
:D

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Wolff68
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: 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)

_________________
"Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."