Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi einfaches lauflicht? (https://www.delphipraxis.net/5053-einfaches-lauflicht.html)

Chriss 22. Mai 2003 07:51


einfaches lauflicht?
 
hi @ all!!

ich hab ein einfaches lauflicht programmiert. es arbeitet mit 10 labels, wovon immer nur 3 "rot leuchten".
ich hab es schon hinbekommen, dass das lauflicht von links nach rechts und wieder zurück funktioniert, aber dann geht es nicht weiter... warum nicht!?

damit zähle ich ein label hoch, woran sich das lauflicht orientieren soll:

Code:
Label1.Caption := IntToStr(i+1);
i := i+1;
und mit diesem teil "leuchten" die label auf:

Code:
if label1.caption='20' then
begin
label12.color:=clblack;
label15.color:=clred;
end;
(da ist es bereits an der 4. "lampe")

der rückweg geht gleich:

Code:
if label1.caption='85' then
begin
label15.color:=clblack;
label12.color:=clred;
end;

alles schön und gut... aber wenn ich jetzt das label auf '0' setzte, geht es nicht weiter, aber er sollte doch eigentlich wieder hochzählen, oder?

thx

Chriss

[Flox]Cauchy 22. Mai 2003 07:55

Kannst Du bitte erst mal posten, wie diese 10 Labels angeordnet sind bzw. wie das mit dem Lauflicht aussehen soll? Irgendwie peile ich die Quelltextteile, die Du geschrieben hast, nämlich (noch) nicht. ;-)

Chriss 22. Mai 2003 08:01

also, die label sind horizontal angeordnet, also in einer reihe:

:arrow: :arrow: :arrow: :arrow: :arrow: :arrow: :arrow: :arrow: :arrow: :arrow:

nach den quelltextausschnitten, leuchtet gerade (beide male einmal von links nach rechts und auf dem rückweg von rechts nach links):

:arrow: :idea: :idea: :idea: :arrow: :arrow: :arrow: :arrow: :arrow: :arrow:


ich hoffe, dass das die anordnung verdeutlicht...

der timer ist übrigends auf 0001 gestellt, damit ein laufender übergang erfolgen kann

[Flox]Cauchy 22. Mai 2003 08:09

Warum machst Du denn nicht so etwas?:
Delphi-Quellcode:
var
  Position: Byte;
  Labels: array[0..9] of TLabel;

procedure Initialize;
  var
    i: Byte;
  begin
    for i := 0 to 2 do
      Labels[i].Color := clRed;
    for i := 3 to 9 do
      Labels[i].Color := clBack;
    Position := 1;
  end;

procedure MoveRight;
  begin
    Labels[(Position+9) mod 10].Color := clBlack;
    Position := (Position+1) mod 10;
    Labels[(Position+1) mod 10].Color := clRed;
  end;

procedure MoveLeft;
  begin
    Labels[(Position+1) mod 10].Color := clBlack;
    Position := (Position+9) mod 10;
    Labels[(Position+9) mod 10].Color := clRed;
  end;
In "Position" steht gerade die Nummer des mittleren der drei Labels, die gerade leuchten.

Chriss 22. Mai 2003 14:02

ähm, sorry, aber dann tut sich gar nichts!
sicher, dass ich nicht noch was brauche?!
timer oder so?!

flomei 22. Mai 2003 15:34

Du brauchst natürlich noch deinen Timer! Der muss ja die Prozeduren ausführen.
Die Labels bewegen sich ja nicht weil es ihnen Spaß macht sondern weil der Timer ihnen in den Ar*** tritt! ;)

MfG Florian :hi:

Chriss 22. Mai 2003 17:29

entweder bin ich jetzt total durch den wind, oder ich bin zu blöd dazu!!!

ich muss die prozeduren da nehmen und sie mit dem timer starten, oder?!
wie mache ich das denn, wenn ich die in den timer setze, gibts nen fehler (wegen dem wort "prozedur" hinter "begin") *schäm*

:oops: :oops:

Stanlay Hanks 22. Mai 2003 17:59

das wort procedure is ja nur bei der eigentlichen Prozedur. Wenn du sie aufrufst musst du das nich mehr schreiben. wenn du z.B. ein Procedur

Delphi-Quellcode:
procedure TForm1.Hallosagen;
begin
ShowMessage('Hallo')
end;
hast, dann musst du beim aufrufen z.B. in einem ButtonClick nur noch schreiben:

Delphi-Quellcode:
begin
Hallosagen
end;

flomei 23. Mai 2003 15:15

Ich schließ mich da jetzt mal Satanly (;)) an. Du nimmst einen Timer, doppelklickst auf ihn nachdem du alle Einstellungen gemacht hast und dann schreibst du hinter das begin der Prozedur:
Delphi-Quellcode:
Labels[(Position+9) mod 10].Color := clBlack;
    Position := (Position+1) mod 10;
    Labels[(Position+1) mod 10].Color := clRed;
Dann kommt schon das end; der Prozedur und gut is.

MfG Florian :hi:

Chriss 23. Mai 2003 16:12

Feherl: unkompatible typen...
denke, dass bezieht sich auf die labels!

[Flox]Cauchy 24. Mai 2003 00:01

Hier mal der gesamte Quelltext:
Delphi-Quellcode:
unit UnitMain;

interface

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

type
  TFormMain = class(TForm)
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure TimerMoveLightsTimer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FormMain: TFormMain;

implementation

{$R *.DFM}

type
  TMoveLights = record
    Position: Byte;
    Shapes: array[0..9] of TShape;
    Timer: TTimer;
  end;

var
  MoveLights: TMoveLights;

procedure MoveLightsInit;
  var
    i: Byte;
  begin
    for i := 0 to 9 do
      begin
        MoveLights.Shapes[i] := TShape.Create(FormMain);
        with MoveLights.Shapes[i] do
          begin
            Left := 20 + i*20;
            Top := 20;
            Width := 20;
            Height := 20;
            Shape := stCircle;
            Parent := FormMain;
          end;
      end;
    for i := 0 to 2 do
      MoveLights.Shapes[i].Brush.Color := clRed;
    for i := 3 to 9 do
      MoveLights.Shapes[i].Brush.Color := clBlack;
    MoveLights.Position := 1;
    MoveLights.Timer := TTimer.Create(FormMain);
    MoveLights.Timer.Interval := 250;
    MoveLights.Timer.OnTimer := FormMain.TimerMoveLightsTimer;
  end;

procedure MoveLightsFree;
  var
    i: Byte;
  begin
    MoveLights.Timer.Free;
    for i := 0 to 9 do
      MoveLights.Shapes[i].Free;
  end;

procedure MoveLightsRight;
  begin
    with MoveLights do
      begin
        Shapes[(Position+9) mod 10].Brush.Color := clBlack;
        Position := (Position+1) mod 10;
        Shapes[(Position+1) mod 10].Brush.Color := clRed;
      end;
  end;

procedure MoveLightsLeft;
  begin
    with MoveLights do
      begin
        Shapes[(Position+1) mod 10].Brush.Color := clBlack;
        Position := (Position+9) mod 10;
        Shapes[(Position+9) mod 10].Brush.Color := clRed;
      end;
  end;

procedure TFormMain.FormShow(Sender: TObject);
  begin
    MoveLightsInit;
  end;

procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction);
  begin
    MoveLightsFree;
  end;

procedure TFormMain.TimerMoveLightsTimer(Sender: TObject);
  begin
    MoveLightsRight;
  end;

end.
Ich habe mal statt der Labels Shapes genommen. Das Formular ist im übrigen leer, weil die zehn Shapes und der Timer dynamisch erzeugt werden. Vielleicht könnte man daraus ja mal eine Komponente programmieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:18 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