Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Prozentzahl von Buchstaben im Memofeld


Philipp_Frank - Mo 13.01.03 13:47
Titel: Prozentzahl von Buchstaben im Memofeld
Hi,
habe in delphi 6 ein memofeld. Nun schreibe ich da z.B. 20 Buchstaben rein, wenn man auf analysebutton klickt soll für jeden buchstaben die prozentuale ausgabe angegeben werden, am besten in einem neuen fenster, geht das, wenn ja wie? Kann man das nicht mit nem array machen? Also praktisch intern die prozentuale anzahl mit variablen errechnen, und dann mit "gauge" in samples veranschaulichen. Brauche wirklich hilfe!!! Kann mir jemand den code schreiben.
Das ist mein bisheriger code mit dem memofeld, in das man die texte reinlädt.
Könnt Ihr mir den vervollständigen

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:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ToolWin, ComCtrls;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    ToolBar1: TToolBar;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    OpenDialog2: TOpenDialog;
    OpenDialog3: TOpenDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
close
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if OpenDialog1.Execute then
Memo1.Lines.Loadfromfile(Opendialog1.Filename)
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
if SaveDialog1.Execute then Memo1.Lines.SaveToFile(SaveDialog1.Filename);
end;

procedure TForm1.Button5Click(Sender: TObject);
var filename : string;
begin    filename := 'H:\Html\abc.txt';
if OpenDialog2.Execute then
Memo1.Lines.Loadfromfile(Opendialog2.filename)
end;

procedure TForm1.Edit1Change(Sender: TObject);
var count : integer;
begin



end;

end.



Bin echt verzweifelt!
Gruß Philipp :oops:


Raphael O. - Mo 13.01.03 13:59

also das mit dem gauge, wenn du schon die Prozentuale anzahl hast kannst du so machen: gauge1.maxvalue:=anzahlbuchstabengesamt
dann könntest du z.B. nen Pulldownmenu auswählen lassen, welche buchstaben prozentual angegeben werden sollen...
dann sagst du gauge1.progress:=round(anzahlbuchstabe/anzahlbuchstabengesamt*100);
des weiteren, für das zählen der Buchstaben könntest du ein array of char machen, wobei das Problem ist, dass du festlegen musst welcher Buchstabe z.B. bei zaehlarray[10] gezählt werden soll...

das überprüfen, wieviele Buchstaben im Memofeld jeweils vorahnden sind brauchst du ne Schleife: z.B. so:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
var s:string;
begin
for i:=1 to memo1.lines.count-1 do
 begin 
  s:=memo1.lines[i];
  for k:=1 to length(s) do
   begin
    case s[k] of 
     'a':inc(variableanzahl_a);
     'b':inc(variableanzahl_b);
       ...
    end; 
   end;
 end;

Fiji-Fighter


Raphael O. - Mo 13.01.03 14:02

ach noch was: wofür deklarierst du in Button5click eie Variable Filename, die du eh nicht benutzt???

Fiji-Fighter


Philipp_Frank - Mo 13.01.03 14:04
Titel: ohne pulldown
Und wie mache ich das, wenn ich kein pulldownmenü haben will, einfach, alle gauge prozzesse für jeden buchstaben unternander schreiben?
Kannst du mir das nicht direkt in meinen code einbauen bitte, glaube du hast richtig ahnung.


Wolff68 - Mo 13.01.03 22:11

Normalerweise mach ich ja nicht anderer Leute Hausaufgaben.
Aber weil ich grad 1 Stündchen Zeit und Lust hatte:
Hier ein Link [http://www.wolff68.de/german/Delphi/downloads/CharStat.zip]

In der AusgabeForm:
1. Const AscIImin = 32 und AscIImax = 122
2. Folgende Arrays:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
    { Private-Deklarationen }
    // Variable für GesamtZahl der Buchstaben
    Gesamt    : LongWord;
    // AscII-Werte von 32 ' ' bis 122 'z'
    Anzahl    : Array[AscIImin..AscIImax] of Word;
    // Edits zur Anzeige des Buchstabens
    aEdit     : Array[AscIImin..AscIImax] of TEdit; 
    // Progressbars
    aProgress : Array[AscIImin..AscIImax] of TProgressBar;
    // Labels zur Anzeige der Prozente
    aLabel    : Array[AscIImin..AscIImax] of TLabel;
3. Edits, ProgressBars und Labels erzeugen (Code spar ich mir hier)
4. public Procedure CalcStats, und in dieser...
4.1. AlteWerte Löschen

Quelltext
1:
2:
3:
4:
5:
6:
  { Alte Werte löschen }
  For i := AscIImin to AscIImax do begin
    aProgress[i].Position := 0;
    aLabel[i].Caption := '0%';
  end;
  Gesamt := 0;
4.2. Zählen

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  { Buchstaben durchgehen und zählen }
  For i := 0 to Length(Memo1.Text)-1 do begin
    Found := Ord(Memo1.Text[i]);
    IF (Found >= AscIImin) and (Found <= AscIImax) then begin
      Inc(Anzahl[Found]);
      Inc(Gesamt);
    end;
  end;
4.3. Ausgeben

Quelltext
1:
2:
3:
4:
5:
6:
  { Ausgabe der Werte }
  For i := AscIImin to AscIImax do begin
    Prozent := (Anzahl[i] / Gesamt) * 100;
    aProgress[i].Position := Round(Prozent);
    aLabel[i].Caption := Format('%f',[Prozent])+'%';
  end;

In der Hauptform brauchst nur einen OpenDialog und einen Button

Quelltext
1:
2:
3:
4:
5:
6:
  If OpenDialog1.Execute then begin
    StatForm.Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
    StatForm.Caption := 'Statistik von '+ExtractFileName(OpenDialog1.FileName);
    StatForm.CalcStats;
    StatForm.ShowModal;
  end;

Viel Spaß damit, und sag mir die Note, die ich dafür bekomm 8)