Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Vorzeitige Ausgabe???


JoschiBK19 - Fr 24.02.06 12:53
Titel: Vorzeitige Ausgabe???
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:


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 - Fr 24.02.06 13:59

Du könntest es mit einem

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.


raiguen - 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 ;-)


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ß