AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ampel programmieren

Ein Thema von michapitbull · begonnen am 3. Dez 2008 · letzter Beitrag vom 4. Dez 2008
Antwort Antwort
michapitbull

Registriert seit: 3. Dez 2008
7 Beiträge
 
#1

Ampel programmieren

  Alt 3. Dez 2008, 23:16
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
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

Re: Ampel programmieren

  Alt 4. Dez 2008, 03:57
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.
Thomas
  Mit Zitat antworten Zitat
michapitbull

Registriert seit: 3. Dez 2008
7 Beiträge
 
#3

Re: Ampel programmieren

  Alt 4. Dez 2008, 12:20
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.
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#4

Re: Ampel programmieren

  Alt 4. Dez 2008, 12:39
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.
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Ampel programmieren

  Alt 4. Dez 2008, 12:50
Hi,

ist doch erstmal nicht schlecht

(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;
Gruß
Norman
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Ampel programmieren

  Alt 4. Dez 2008, 12:54
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
michapitbull

Registriert seit: 3. Dez 2008
7 Beiträge
 
#7

Re: Ampel programmieren

  Alt 4. Dez 2008, 13:01
es funktioniert jetzt alles !
vielen dank für eure hilfe !
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

Re: Ampel programmieren

  Alt 4. Dez 2008, 13:11
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]
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:55 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