Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - problem mit dem wiederaufrufen eines timers


haasler88 - Mo 31.03.08 01:01
Titel: problem mit dem wiederaufrufen eines timers
Hallo DF!
Ich habe 10 Panels und alle sollen nacheinander die Farbe rot erhalten. Ich möchte dies mit einem Timer realisieren. Der Timer funktioniert, allerdings weiß ich nicht wie ich die Panels nacheinander einfärben kann. Wisst ihr, soll im Grunde genommen wie ne Ampelschaltung sein, nur, dass die Felder, wenn sie die Farbe einmal erhalten haben auch die Farbe behalten sollen.
Könnt ihr mir bitte helfen? Ich bin voll schlecht im Programmieren.

Hier sind schon mal meine Ansätze:

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:
procedure TForm1.FormCreate(Sender: TObject);
begin
 timer1.Enabled:=false;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 intervall:=2000;
 timer1.Interval:=intervall;
 timer1.Enabled :=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
MyPanels : array[0..9of TPanel;
i        : Integer;
        begin
        MyPanels[0]:=Panel1;
        MyPanels[1]:=Panel2;
        MyPanels[2]:=Panel3;
        MyPanels[3]:=Panel4;
        MyPanels[4]:=Panel5;
        MyPanels[5]:=Panel6;
        MyPanels[6]:=Panel7;
        MyPanels[7]:=Panel8;
        MyPanels[8]:=Panel9;
        MyPanels[9]:=Panel10;

        MyPanels[0].Color:=clred;

        end;


Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Topic aus Programmierwerkzeuge verschoben am Mo 31.03.2008 um 01:04


elundril - Mo 31.03.08 01:28

beschreib mal bitte was dein programm ausführt bzw was es nicht ausführt. oder anders gesagt: was passiert wenn du bei dem derzeitigen code auf den button drückst??

lg elundril


Narses - Mo 31.03.08 01:31
Titel: Re: problem mit dem wiederaufrufen eines timers
Moin!

user profile iconhaasler88 hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FormCreate(Sender: TObject);
begin
 timer1.Enabled:=false;
end;
Stell mal im ObjectInspector die Eigenschaft .Enabled des Timers auf FALSE, dann kannst du dir das hier sparen. :idea:

user profile iconhaasler88 hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
// intervall:=2000;            | unnötig, zugehörige Variablendeklaration auch
// timer1.Interval:=intervall; | unnötig
 timer1.Enabled :=true;
end;
Du kannst auch den Wert für das Intervall direkt im OI für den Timer vorgeben, dann brauchst du nur noch "einschalten". :idea:

user profile iconhaasler88 hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.Timer1Timer(Sender: TObject);
var
MyPanels : array[0..9of TPanel;
i        : Integer;
        begin
        MyPanels[0]:=Panel1;
        MyPanels[1]:=Panel2;
        MyPanels[2]:=Panel3;
        MyPanels[3]:=Panel4;
        MyPanels[4]:=Panel5;
        MyPanels[5]:=Panel6;
        MyPanels[6]:=Panel7;
        MyPanels[7]:=Panel8;
        MyPanels[8]:=Panel9;
        MyPanels[9]:=Panel10;

        MyPanels[0].Color:=clred;

        end;
Das hier ist allerdings ist eher unsinnig. Statt das Array mit den Panel-Referenzen in der Timer-Methode zu füllen, solltest du das lieber im FormCreate tun und das Array (klassen-)global deklarieren. :idea:

Aber der entscheidende Punkt: du brauchst eine Zustandsvariable, in der du den aktuellen "Fortschritt" deiner Panelfärberei von einem Timeraufruf zum nächsten zwischenspeicherst. :idea: ;)

cu
Narses


haasler88 - Mo 31.03.08 01:34

user profile iconelundril hat folgendes geschrieben:
beschreib mal bitte was dein programm ausführt bzw was es nicht ausführt. oder anders gesagt: was passiert wenn du bei dem derzeitigen code auf den button drückst??

lg elundril


mmh... wie schon gesagt, es soll die Panels nacheinander füllen.

Es füllt das erste Panel, mehr nicht. Ich glaube eigentlich ist es ein For To Schleifen Problem. Ich weiß einfach nicht wie ich das machen soll...


Narses - Mo 31.03.08 01:37

Moin!

user profile iconhaasler88 hat folgendes geschrieben:
Es füllt das erste Panel, mehr nicht. Ich glaube eigentlich ist es ein For To Schleifen Problem.
Nein, ist es nicht. ;)

user profile iconhaasler88 hat folgendes geschrieben:
Ich weiß einfach nicht wie ich das machen soll...
Setze doch schonmal die Änderungsvorschläge aus meinem Beitrag um. Wenn du dann noch nicht weiter kommst, stell mal die komplette .pas-Datei deines Projekts hier in den Anhang.

cu
Narses


oldmax - Di 01.04.08 13:06

Hi
Nun gut, machen wir es kurz..
Auf deinem Formular hast du 10 Panels mit den Namen Panel1 bis Panel10.
Ok, nun zum Timer. Der wird mit dem Objektinspektor parametriert, also, Intervall = irgendwas (z.B.1000ms) und Enabled=false sowie die Ereignisprocedure OnTimer mit Doppelclick..
Im Bereich der globalen, also überall im Programm verfügbaren Variablen deklarierst du die Variable


Delphi-Quelltext
1:
2:
var   ......
      Schritt   : Integer;// global, damit überall gültig !

die du im OnCreate der Form sowie im OnButtonclick auf 1 setzt.
so:

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FormCreate(Sender: TObject);  
  begin  
    Schritt:=1
  end;

Mit deinem Button setzt du

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.BitBtn1Click(Sender: TObject);  
 begin  
   Schritt:=1
   timer1.Enabled :=true;  // Timer starten
 end;

nun noch die OnTimer-Procedure

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Timer1Timer(Sender: TObject); 
 Begin
   TPanel(FindComponent('Panel'+IntToStr(Schritt))).Color:=ClRed;
   Schritt:=Schritt+1// Inc(Schritt) geht auch
   if Schritt > 10 then Timer.Enabled:=False; //alle Panels müssten jetzt rot sein
 end;


Die Function Findcomponent kennst du vielleicht nicht, aber die Delphi-Hilfe wird's dir erklären. Du brauchst also weder eine Schleife noch sonst was, sondern nur diese wenigen simplen Anweisungen..
Gruß oldmax