Autor Beitrag
Hacker1
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 21.06.06 14:24 
Hi leute ich brauche mal eure hilfe, ich habe ein ampelprojekt das ich nur mit der while funktion programmieren muss d Beschreibung unten



1. die Ampel soll durch Drücken eines Buttons in die nächste Phase schalten

2. es darf kein Timer verwendet werden

3. ich muss das ganze in einer Warteschleife schreiben.



Das bedeutet: 1. Innere Schleife mit "Delay"

2. Phasen - Schleife

3. Repeat "Taste"

also insgesamt 3 Schleifen. die ineinander geschachtelt sind.

Ich musste am Anfang mit einem fertig bearbeitetem Programm rausfinden, bei welcher Bit Nr. die Ampel in die entsprechenden farben umschalten kann.

Das Schema schreibe ich euch kurz einmal auf:

Es soll in 8 Phasen ablaufen. Ich habe eine Platte mit einem Ampelsystem an den PC angeschlossen darauf ist auch ein Knopf.

Die Ampel ist am Anfang aus. Sobald ich auf den Knopf (von der Platte) drücke wird die Ampel des Fußgängers rot und die Autoampel grün. dies soll 5 sek. dauern. Danach ist die Fußgängerampel immer noch rot und die Autoampel gelb. Nach 2 Sek. wird dann die Autoampel auf rot umgeschalten und die Fußg.ampel ist immer noch auf rot. Nach 5 sek. wird dann die Fußgängerampel grün,dies dauert 10 sek. Danach schaltet die ampel wieder auf rot, dabei stehen 2 sekunden lang alle ampeln auf rot. Bis dann die Autoampel auf gelb umschaltet, dies dauert ebenfalls 2 sek. Darauf wird dann die Autoampel wieder grün. Dabei ist die Fußgängerampel natürlich auf rot. Nach der ganzen Sache fängt das ganze wieder von vorne an.

???
Jakob Schöttl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Mi 21.06.06 14:34 
Mit application.ProcessMessage; kannst du die Schleife kurz unterbrechen, und eine ereignisbehandlungsroutine von dem ampelschalter auführen lassen. darin kann z.B. eine globale variable AmpelSchalterWurdeGedrueckt := True;. Darauf kannst du dann in der schleife reagieren, denn diese wird nach der ereignisbehandlungsroutine fortgesetzt werden: if AmpelSchalterWurdeGedrueckt then NaechstePhase;
Hacker1 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 21.06.06 19:10 
das war jetzt net so klar
Hacker1 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 22.06.06 11:17 
kann mir niemand helfen :-(
freak4fun
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: Do 22.06.06 13:54 
Darf man Fragen warum ohne Timer?

Du könntest dir einen Timestamp holen und dann in der While-Schleife prüfen, ob die Zeit (2, 5 Sekunden) um ist und dann den Status der Ampeln abfragen, um zu sehen, welche Phase als nächstes kommt. Finde ich allerdings unschön.

PS: Doppelt hält besser. ;)

MfG
freak

_________________
"Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
Hacker1 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 22.06.06 14:48 
weil alles in der while schleife erledigt werden muss
Jakob Schöttl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Do 22.06.06 15:14 
Schade, dass du es noch nicht verstanden hast.

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:
var AmpelWurdeGedrueckt,Beenden: Boolean;

//OnShow:

begin
  While not Beenden do begin
    Autoampel.Color := clgreen;
    Fussgaengerampel.Color := clred;
    Application.ProcessMessage;
    if AmpelWurdeGedrueckt then begin
      //Hier musst du halt noch schleifen einbauen, oder so in der art:
      AutoAmpel.Color := clyellow;
      Sleep(2000);
      AutoAmpel.Color := clred;
      Sleep(1000);
      Fussgaengerampel.Color := clgreen;
      //...
    end;
  end;
end;


//OnCloseQuery:
begin
  Beenden := True;
end;

//OnButton1Click:
begin
  AmpelWurdeGedrueckt := True;
end;
freak4fun
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: Do 22.06.06 16:32 
Heiß aber auch, das die Anwedung nicht sofort reagiert, wenn man Beeneden drückt. Ich denke es gibt da noch bessere Lösungen. Diese mag zwar laufen aber ... Leider kann ich keine Bessere anbieten. :( Aber er holt sich ja auch noch anderswo Hilfe. ;)

MfG
freak

_________________
"Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
Jakob Schöttl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Do 22.06.06 16:49 
Aber wenn er es nur in Schleifen machen darf, ohne Timer? Fällt dir was anderes ein
Hacker1 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: So 25.06.06 22:31 
Helft mir bitte ich hab kein plan :-(
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 26.06.06 00:10 
Moin!

Wir sollen dir helfen, aber der Thread ist im Status "gelöst"? :gruebel: Wat denn nu? ;)

OK, hast du denn schon ein Zustandsdiagramm/Tabelle für deine Ampelanlage gemacht? Wenn nicht, dann halte ich das für den ersten Schritt. Schreib dir in einer Tabelle auf, was genau passieren soll (Zeilen: Zustände; Spalten: die einzelnen Ampeln und die Zeit, für die der Zustand gültig ist).

Wenn du das fertig hast, dann stell das mal hier rein, damit kommen wir dann weiter.

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.