Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Reaktionstest (https://www.delphipraxis.net/139520-reaktionstest.html)

KingMax 30. Aug 2009 19:02


Reaktionstest
 
Hallo,
wir haben als aufgabe in der Schule das Projekt "Reaktionstest" aufbekommen. Dabei geht es darum, die Reaktion zu testen. Hierzu wird eine gezeichnete Ampel nach zufälliger Zeit von rot auf "Grün" springen, und dann muss man eine taste drücken. Die Reaktion wird dann unten im Edit feld angezeigt. Das Programm besteht aus zwei Formularen, das Hauptformular und das Ampel-Formular (Units).

Mein Problem besteht nun hier, dass ich mithilfe der Klasse TAmpel die Ampel erzeuge. Nun wird die Klasse aber nicht akzeptiert! Könnt ihr mir vielleicht sagen wo ich einen Fehler gemacht habe? Ich lade den Quelltext beider Formulare mit hoch:

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TMain = class(TForm)


  procedure FormCreate(Sender: TObject);
  procedure BtTestreiheClick (Sender: TObject);
  procedure BtReaktionstestClick (Sender: TObject);
  procedure FormKeyDown (Sender: TObject; var Key: Word; Shift: TShiftState);
  procedure TiReaktionTimer (Sender: TObject);


  private
    { Private declarations }
  BtTestreihe: TButton;            //Klassen und Objecte (bei Laufzeit erzeugt)
  BtReaktionstest: TButton;
  TiReaktion: TTimer;
  EdZeit: TEdit;
  LbZeit: TLabel;


  Start, Stop: Longint;
  public
    { Public declarations }
  end;

var
  Main: TMain;
  Ampel: TAmpel;      //WARUM AKZEPTIERT DER DIE KLASSE NICHT???


implementation

{$R *.dfm}

procedure TMain.FormCreate(Sender: TObject);
begin
BorderStyle := bsSingle;                           //Hauptformular
Left := 150;
Top := 100;
Width := 240;
Height := 250;
Caption := 'Projekt Reaktion';

BtTestreihe := TButton.Create (Main);             //Komponenten
BtTestreihe.Parent := Main;
BtTestreihe.SetBounds (60,20,120,32);
BtTestreihe.Caption := 'Neuer Test';
BtReaktionstest := TButton.Create(Main);
BtReaktionstest.Parent := Main;
BtReaktionstest.SetBounds (60,70, 120, 32);
BtReaktionstest.Caption := 'Start!';
LbZeit := TLabel.Create(Main);
 with LbZeit do begin
        Parent := Main;
        SetBounds (60, 120, 120, 32);
        Caption:= 'Reaktionszeit';
 end;
EdZeit := TEdit.Create(Main);
 with EdZeit do begin
        Parent := Main;                              
        SetBounds (60, 140, 120, 32);
        Font.Name := 'Arial';
        Font.Size := 20;
        Text := '  0 ms';
 end;
TiReaktion := TTimer.Create (Main);

end;

procedure TMain.BtTestreiheClick(Sender: TObject);          //Button Testreihe
begin
   Ampel := TAmpel.Create(Main);
   Ampel.Show;
   Ampel.Rot;
   BtReaktionstest.Enabled := True;
end;

procedure TMain.BtReaktionstestClick(Sender: TObject);      //Button Reaktionstest
begin
  EdZeit.Text := '';
  Ampel.Rot;
  TiReaktion.Interval := 2000 + Random(3000);
  TiReaktion.Enabled := True;
end;

procedure TMain.TiReaktionTimer(Sender: TObject);             //Timer
begin
Ampel.Gruen;
Start := GetTickCount;
TiReaktion.Enabled := False;
end;
                                                               //Zeit
procedure TMain.FormKeyDown (Sender: TObject; var Key: Word; Shift: TShiftState);
begin
Stop := GetTickCount;
if Ampel.IstGruen
   then EdZeit.Text := ''+ IntToStr (Stop-Start)+ ' ms';
end;




end.
Hier Formular mAmpel:

Delphi-Quellcode:
unit mAmpel;

interface

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

type TAmpel = class (TForm)

private
AmpelGruen: Boolean;

public                                        
procedure Rot;
procedure Gruen;
function IstGruen: Boolean;
end;


implementation

procedure TAmpel.Rot;                        //Rote Ampel
begin
  with Canvas do
  begin
     Pen.Width := 3;
     Brush.Color := clred;
     Ellipse (20,20,140,140);
     Brush.Color := clgray;
     Ellipse(20,160,140,280);
  end;
  AmpelGruen := false;
end;

procedure TAmpel.Gruen;                         //Gruene Ampel
begin
  with Canvas do
  begin
     Pen.Width := 3;
     Brush.Color := cllime;
     Ellipse(20,160,140,280);
     Brush.Color := clgray;
     Ellipse(20,20,140,140);
  end;
  AmpelGruen := True;
end;

function TAmpel.IstGruen;
begin
  IstGruen := AmpelGruen;
end;








end.

Die Muhkuh 30. Aug 2009 19:04

Re: Reaktionstest
 
Da fehlt noch ein Verweis auf die Unit: Oben bei uses noch ein mAmpel eintragen.

Vasco da Gama 30. Aug 2009 19:05

Re: Reaktionstest
 
Hi, bei der ersten Unit fehlt mir in der Uses Klausel das zweite Formular.

Edit: Schade, zu langsam

himitsu 30. Aug 2009 19:06

Re: Reaktionstest
 
"wird nicht akzeptiert" ist keine Fehlerbeschreibung!
Was sagt denn der Compiler genau?


Aber als Tipp: wie wäre es, wenn du die Unit ...
[edit]
ach mist, die Kuh war schneller

KingMax 30. Aug 2009 19:10

Re: Reaktionstest
 
hmm danke! Jetzt kommt zwar keine Fehlermeldung mehr, aber irgendwie passiert nichts wenn ich die buttons drücke! Ich bin alles nochmal durchgegangen.. und eigendlich hab ich alles richtig gemacht... komisch :/

Klaus01 30. Aug 2009 19:17

Re: Reaktionstest
 
.. Du solltest der Ampel noch einen Parent zuweisen,
ansonsten wird sie nicht angezeigt.


was natürlich Mist ist, da Ampel eine Ableitung von TForm ist.

Grüße
Klaus

KingMax 30. Aug 2009 19:20

Re: Reaktionstest
 
Ich vermute dass man die Buttons im object-inspektor bei Events auf OnClick stellen muss, was aber nicht geht, da die buttons ja bei der laufzeit erstellt werden, und nicht manuell

Klaus01 30. Aug 2009 19:23

Re: Reaktionstest
 
.. vielleicht klappt es ja so:

Delphi-Quellcode:
BtTestreihe.onClick := BtTestreiheClick;
Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz