Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ampel programmieren (https://www.delphipraxis.net/125307-ampel-programmieren.html)

michapitbull 4. Dez 2008 00:16


Ampel programmieren
 
Hi leute ich bin neu also nich zu streng mit mir.
Naja also ich hab hier schon die SuFu benutzt und der spuckt auch viel aus aber ich kann mit den ganzen sachen nichts anfangen !
Wir machen zurzeit in der Schule Programmierung mit Delphi und ich hänge da total hinterher da ich 1 Jahr weniger Erfahrung damit habe als der ganze Kurs.
Ich muss selbst irgendwie zusehen wie ich da reinkomme, denn ich habe mit delhi vorher nun wirklich nichts gemacht.
Nun haben wir eine Hausaufgabe aufbekommen und zwar sollen wir eine Ampel programmieren.
Sie soll nach einem klick bei rot anfangen und dann einmal durchlaufen.
Das Layout --> http://img444.imageshack.us/img444/5858/hdztvq2.jpg bekomme ich hin aber was ich jetzt da reinschreiben soll weiss ich wirklich nicht.
Könnt ihr mir das hier vielleicht in einigen Schritten erklären ?
Ich wäre euch sehr dankebar

toms 4. Dez 2008 04:57

Re: Ampel programmieren
 
Hallo

Um es einfach zu halten, könntest du 3 TShapes (Circle) nehmen, welche ebenfalls auf einen TShape (Rechteck, schwart) gesetzt werden.

Beim Buttonclick änderst du dann einfach die Farben der Shapes, mit einem Hier im Forum suchenDelay dazwischen.

michapitbull 4. Dez 2008 13:20

Re: Ampel programmieren
 
habe jjetzt rumprobiert aber ich krieg die verdammte ampel einfach nicht zum laufen...sie bleibt immer bei rot stehen !
hier mein Quellentext:

Delphi-Quellcode:
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Shape1: TShape;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    SRot  : TShape;
    SGelb : TShape;
    SGruen : TShape;
    Timer1  : TTimer;

    procedure Button3Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
    Phase: Integer;
    Zeit: Integer;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
 case Phase of
    1: begin
         SRot.Brush.Color:= clRed;
         SGelb.Brush.Color:= clBlack;
         SGruen.Brush.Color:= clBlack;
         Phase:= Phase + 1;
       end;
    2: begin
         SRot.Brush.Color:= clRed;
         SGelb.Brush.Color:= clYellow;
         SGruen.Brush.Color:= clBlack;
         Phase:= Phase + 1;
       end;
    3: begin
         SRot.Brush.Color:= clBlack;
         SGelb.Brush.Color:= clBlack;
         SGruen.Brush.Color:= clGreen;
         Phase:= Phase + 1;
       end;
    4: begin
         SRot.Brush.Color:= clBlack;
         SGelb.Brush.Color:= clYellow;
         SGruen.Brush.Color:= clBlack;
         Phase:= 1
end;
end;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  Phase:= 1;
  Zeit:= 1;
end;

{ Rr }

procedure TForm2.Button3Click(Sender: TObject);
begin
close;
end;

procedure TForm2.Timer1Timer(Sender: TObject);
begin
begin
  Zeit:= Zeit + 1;
  case Zeit of
    1..5 : Phase:= 1;
    6    : Phase:= 2;
    7..11: Phase:= 3;
    12   : begin
             Phase:= 4;
             Zeit:= 0;
           end;
end;

end;
end;
end.

guidok 4. Dez 2008 13:39

Re: Ampel programmieren
 
Wäre es nicht einfacher den Code, der unter ButtonClick steht, in den Timer zu schreiben und im ButtonClick einfach den Timer zu aktivieren. Sobald im Timer die Phase 4 erreicht ist, deaktivierst du ihn dort wieder.

edit:

Ich sehe grad noch, dass du unterschiedliche Phasenzeiten haben willst. Dazu könntest du einfach im jeweiligen case-Abschnitt die Zeit des Timers setzen.

NormanNG 4. Dez 2008 13:50

Re: Ampel programmieren
 
Hi,

ist doch erstmal nicht schlecht :-D

(1)
wird wahrscheinlich der Timer bereits bei Programmstart aktiv sein.
Damit funkt der dir ständig dazwischen, wenn du manuell umschalten willst.
--> Timer.Enabled := False; setzen
(2)
der Timer zählt munter die Zeit und schaltet die Phasen, aber angezeigt wird nichts.
--> du musst Button1Click(NIL) am Ende der Timerprozedur aufrufen.
(3) [edit; vergessen]
auf einen dritten Butten das Ein-/Ausschalten des Timers legen.
--> Timer1.Enabled := not Timer1.Enabled;

DeddyH 4. Dez 2008 13:54

Re: Ampel programmieren
 
Zitat:

Zitat von NormanNG
du musst Button1Click(NIL) am Ende der Timerprozedur aufrufen.

Oder Phase zu einer Property machen und im Setter umstellen, aber das ist wahrscheinlich zu umständlich.

michapitbull 4. Dez 2008 14:01

Re: Ampel programmieren
 
es funktioniert jetzt alles !
vielen dank für eure hilfe !

Sir Rufo 4. Dez 2008 14:11

Re: Ampel programmieren
 
Als ersters fällt auf, dass beim Timer-Aufruf zwar die Phase gewechselt wird, aber der Teil für die Anzeige wird nur durch Drücken von Button1 durchlaufen ...

Also hier fehlt eigentlich nur noch die vernünftige Aufspaltung der einzelnen Teile:
Delphi-Quellcode:
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Shape1: TShape;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    SRot  : TShape;
    SGelb : TShape;
    SGruen : TShape;
    Timer1  : TTimer;

    procedure Button3Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
    { Private-Deklarationen }
    FPhase: Integer;
    FZeit: Integer;
   
   procedure ZeichneAmpelBild;
   
   procedure SetPhase( Value : Integer );
   procedure SetZeit( Value : Integer );
  public
    { Public-Deklarationen }
   property Phase : Integer read FPhase write SetPhase;
   property Zeit : Integer read FZeit write SetZeit;
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
  Phase := Phase + 1; // <--- hier wird automatisch SetPhase aufgerufen
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  FPhase := 1;
  FZeit := 1;
  ZeichneAmpelBild;
end;

{ Rr }

procedure TForm2.ZeichneAmpelBild;
begin
  case
   Phase
  of
    1: // Rote Ampel
     begin
        SRot.Brush.Color  := clRed;   // leuchtendes Rot
        SGelb.Brush.Color := clOlive; // dunkles Gelb
        SGruen.Brush.Color := clGreen; // dunkles Grün
       end;
    2: // Rot-Gelbe Ampel
     begin
        SRot.Brush.Color  := clRed;   // leuchtendes Rot
        SGelb.Brush.Color := clYellow; // leuchtendes Gelb
        SGruen.Brush.Color := clGreen; // dunkles Grün
      end;
    3: // Grüne Ampel
     begin
        SRot.Brush.Color  := clMaroon; // dunkles Rot
        SGelb.Brush.Color := clOlive; // dunkles Gelb
        SGruen.Brush.Color := clLime;  // leuchtendes Grün
      end;
    4: // Gelbe Ampel
     begin
        SRot.Brush.Color  := clMaroon; // dunkles Rot
        SGelb.Brush.Color := clYellow; // leuchtendes Gelb
        SGruen.Brush.Color := clGreen; // dunkles Grün
      end;
  end;
end;

procedure TForm2.Button3Click(Sender: TObject);
begin
  Close;
end;

procedure TForm2.SetPhase(Value: Integer);
begin
  if
    ( Value <> FPhase )
  then
    begin
      if
        ( Value > 4 ) or
       ( Value < 1 )
      then
        FPhase := 1
      else
        FPhase := Value;
      ZeichneAmpelBild;
   end;
end;

procedure TForm2.SetZeit(Value: Integer);
begin
  if
   ( Value > 12 ) or
   ( Value < 1 )
  then
    FZeit := 1
  else
    FZeit := Value;
   
  case
    FZeit
  of
    1..5 :
     Phase := 1; // <--- hier wird automatisch SetPhase aufgerufen
    6    :
     Phase := 2; // <--- hier wird automatisch SetPhase aufgerufen
    7..11:
     Phase := 3; // <--- hier wird automatisch SetPhase aufgerufen
    12   :
      Phase := 4; // <--- hier wird automatisch SetPhase aufgerufen
  end;
end;

procedure TForm2.Timer1Timer(Sender: TObject);
begin
  Zeit := Zeit + 1; // <--- hier wird automatisch SetZeit aufgerufen
end;

end.
Die Getter/Setter für Properties eigenen sich hier sehr schön, weil dadurch die Programmierung der Steuerung sehr simpel ausfällt :)

[der rote Kasten war da ... und ich wohl zu langsam ... aber hier eben mal mit Getter und Setter ... und umständlich keineswegs]

cu

Oliver

[edit] es fehlt natürlich noch das ein und ausschalten des timers [/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 Uhr.

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