Autor Beitrag
JoschiBK19
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Fr 24.02.06 12:53 
Ich habe ein Programm, dass auf Knopfdruck 2 Zufallszahlen (extra Prozedur) und deren Mittelwert (Funktion) erstellen soll.
Als einen anderen Button habe ich den Button "10 Zufallszahlen berechnen". Er soll die gleiche Prozedur und die gleich Funktion verwenden und die Zufallszahlen, immer in 1 Sekunden abständen ausgeben... Aber er rechnet erst alle 10 Zufallszahlen aus (dauert 10 sekunden) und dann gibt er die letzten berechneten Werte aus.

Weiß jemand was man tun kann???

Hier noch der Code:

ausblenden volle Höhe Delphi-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:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

Var
  zahl1, zahl2:integer;
{$R *.dfm}

procedure zufallszahlen(VAR zahl1, zahl2:integer);
BEGIN
  RANDOMIZE;
  zahl1:=random(30000);
  zahl2:=random(30000);
END;

function mittelwert(zahl1, zahl2:integer):real;
BEGIN
  mittelwert:=(zahl1+zahl2)/2;
END;

procedure TForm1.Button1Click(Sender: TObject);
begin
  zufallszahlen(zahl1, zahl2);
  Label1.Caption:='Mittelwert: '+FloatToStrF(mittelwert(zahl1, zahl2), ffFixed, 101);
  Edit1.Text:=IntToStr(zahl1);
  Edit2.Text:=IntToStr(zahl2);
end;


procedure TForm1.Button2Click(Sender: TObject);
var
  x:integer;
begin
    x:=0;
    while x < 10 DO
      BEGIN
        zufallszahlen(zahl1, zahl2);
        Edit1.Text:=IntToStr(zahl1);
        Edit2.Text:=IntToStr(zahl2);
        Label1.Caption:='Mittelwert: '+FloatToStrF(mittelwert(zahl1, zahl2), ffFixed, 101);
        x:=x+1;
        sleep(1000);
      END;
end;

end.


Moderiert von user profile iconAXMD: Delphi-Tags hinzugefügt
chrisw
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 439
Erhaltene Danke: 3

W2K
D7
BeitragVerfasst: Fr 24.02.06 13:59 
Du könntest es mit einem
ausblenden Delphi-Quelltext
1:
Application.ProcessMessages;					

vor dem sleep() lösen, ich würde aber vom sleep bei "Ereignisgesteuerter Programmierung" grundsätzlich abraten und einen Timer nutzen.

_________________
Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.


Zuletzt bearbeitet von chrisw am Fr 24.02.06 14:29, insgesamt 2-mal bearbeitet
raiguen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 374

WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
BeitragVerfasst: Fr 24.02.06 13:59 
Moin :-)

Die Frage kannst Du Dir eigentlich selber beantworten ;-)

Schau Dir mal die Zeile 64 in dem geposteten Code an! Du gibst IMMER den grade errechneten Mittelwert auf dem gleichen Label an, also: wenn die Schleife zu Ende ist, steht da auch nur der letzte Wert!!

Lösung: nimm ein Memo, leere das Memo ehe die Schleife anfängt und trage die errechneten Mitelwerte in das Memo ein. Somit hast Du das gewünschte Ergebnis aller 10 Zufallswerte bzw deren Mittelwerte ;-)

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Button2Click(Sender: TObject);
var
  x:integer;
begin
    x:=0;
    Memo1.Lines.Clear;  //--alle Zeilen löschen
    while x < 10 DO
      BEGIN
        zufallszahlen(zahl1, zahl2);
(* nicht mehr anzeigen
        Edit1.Text:=IntToStr(zahl1);
        Edit2.Text:=IntToStr(zahl2);
*)

        Memo1.Lines.Add('Mittelwert aus '+IntToStr(zahl1)+' und '+IntToStr(zahl2)+' : '+ FloatToStrF(mittelwert(zahl1, zahl2), ffFixed, 101));
        x:=x+1;
        sleep(1000);
      END;
end;


Das MemoFeld natürlich entsprechend groß machen bzw ScrollBars setzen.

Gruß