PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Delphi 7 - Scrollbar "beliebig" laufen lassen.


Qui
2015-02-10, 15:47:11
Servus,

ich versuche mich seit geraumer Zeit an der Programmiersprache Delphi und möchte nun ein Programm schreiben, bei dem Scrollbars "beliebig" von ihrem Minimum auf ihr Maximum und umgekehrt verlaufen. Ich habe versucht das über einen Timer zu realisieren, jedoch klappt das nur bis der Balken auf seinem Maximum steht.

procedure TForm1.StartClick(Sender: TObject);
begin
timer1.Enabled :=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
If Sbar1.Position < 100 then
begin
Sbar1.Position := Sbar1.Position +1;
Sbar2.Position := Sbar2.Position +2;
Sbar3.Position := Sbar3.Position +3;
end
else
timer1.enabled := false;
end;

Die Balken haben "unterschiedliche" Geschwindigkeiten, daher die unterschiedlichen Werte. Mit Randomize hats leider nicht geklappt, die Scrollbars "unterschiedlich" hin und her fahren zu lassen.

RattuS
2015-02-10, 20:24:11
Hier hast du Logikfehler:

1. Die Scrollbars inkrementieren nur solange der 1. Scrollbar nicht auf 100 ist.
2. Du weist nie an, dass die Position wieder dekrementieren soll, sondern unterbrichst den Timer einfach.

Du musst dir die "aktuelle Laufrichtung" für jede Scrollbar merken und nachdem du >= 100 bzw. <= 0 erreicht hast jeweils umkehren.

Randomize ist zum Initialisieren des Pseudo-Zufalls. Für eine zufällige Zahl brauchst du Random(). Zum Beispiel:

Sbar1.Position := Sbar1.Position + (1 + Random(4)); // addiert 1 bis 3

Randomize solltest du beim Programmstart trotzdem einmal ausführen, sonst könntest du theoretisch jedes Mal die selben "Zufallswerte" erhalten.

Qui
2015-02-10, 21:01:16
Hier hast du Logikfehler:

1. Die Scrollbars inkrementieren nur solange der 1. Scrollbar nicht auf 100 ist.
2. Du weist nie an, dass die Position wieder dekrementieren soll, sondern unterbrichst den Timer einfach.

Du musst dir die "aktuelle Laufrichtung" für jede Scrollbar merken und nachdem du >= 100 bzw. <= 0 erreicht hast jeweils umkehren.

Randomize ist zum Initialisieren des Pseudo-Zufalls. Für eine zufällige Zahl brauchst du Random(). Zum Beispiel:

Sbar1.Position := Sbar1.Position + (1 + Random(4)); // addiert 1 bis 3

Randomize solltest du beim Programmstart trotzdem einmal ausführen, sonst könntest du theoretisch jedes Mal die selben "Zufallswerte" erhalten.

Zu 1.) Richtig, das ist mein "Notansatz" gewesen, da die Sbar1 am "längsten" braucht.

Zu 2.) Korrekt, die Schleife ist ja dann zu Ende.

Was mir Probleme bereitet ist, dass die von dir angesprochenen Ausgangsbedingungen >= 100 bzw. <= 0 nicht in 1 Prozedur (sprich Buttonclick) reinpassen. Sie heben einander auf bzw. blockieren den Fortgang der Scrollbar.

Ist mein Vorhaben überhaupt mit einer If-Then-Schleife realisierbar?

RattuS
2015-02-10, 22:23:46
Delphi ist für mich gut 10 Jahre her, aber ungefähr sowas hier dürfte funktionieren:


procedure TForm1.FormCreate(Sender: TObject);
Var Sbar1_inc, Sbar2_inc, Sbar3_inc : Boolean;
begin
Randomize;
Sbar1_inc := true;
Sbar2_inc := true;
Sbar3_inc := true;
end;

procedure TForm1.StartClick(Sender: TObject);
begin
timer1.Enabled := true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin

Var r1, r2, r3 : Integer;

r1 := (1 + Random(4));
r2 := (1 + Random(4));
r3 := (1 + Random(4));

if Sbar1_inc then
begin
if Sbar1.Position >= 100 then
Sbar1_inc := false;
else
Sbar1.Position := Sbar1.Position + r1;
end

if Not Sbar1_inc then
begin
if Sbar1.Position <= 0 then
Sbar1_inc := true;
else
Sbar1.Position := Sbar1.Position - r1;
end

if Sbar2_inc then
begin
if Sbar2.Position >= 100 then
Sbar2_inc := false;
else
Sbar2.Position := Sbar2.Position + r1;
end

if Not Sbar2_inc then
begin
if Sbar2.Position <= 0 then
Sbar2_inc := true;
else
Sbar2.Position := Sbar2.Position - r1;
end

if Sbar3_inc then
begin
if Sbar3.Position >= 100 then
Sbar3_inc := false;
else
Sbar3.Position := Sbar3.Position + r1;
end

if Not Sbar3_inc then
begin
if Sbar3.Position <= 0 then
Sbar3_inc := true;
else
Sbar3.Position := Sbar3.Position - r1;
end

end;

Ist nicht sehr elegant, but you get the idea...

Qui
2015-02-10, 22:43:07
Delphi ist für mich gut 10 Jahre her, aber ungefähr sowas hier dürfte funktionieren:


procedure TForm1.FormCreate(Sender: TObject);
Var Sbar1_inc, Sbar2_inc, Sbar3_inc : Boolean;
begin
Randomize;
Sbar1_inc := true;
Sbar2_inc := true;
Sbar3_inc := true;
end;

procedure TForm1.StartClick(Sender: TObject);
begin
timer1.Enabled := true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin

Var r1, r2, r3 : Integer;

r1 := (1 + Random(4));
r2 := (1 + Random(4));
r3 := (1 + Random(4));

if Sbar1_inc then
begin
if Sbar1.Position >= 100 then
Sbar1_inc := false;
else
Sbar1.Position := Sbar1.Position + r1;
end

if Not Sbar1_inc then
begin
if Sbar1.Position <= 0 then
Sbar1_inc := true;
else
Sbar1.Position := Sbar1.Position - r1;
end

if Sbar2_inc then
begin
if Sbar2.Position >= 100 then
Sbar2_inc := false;
else
Sbar2.Position := Sbar2.Position + r1;
end

if Not Sbar2_inc then
begin
if Sbar2.Position <= 0 then
Sbar2_inc := true;
else
Sbar2.Position := Sbar2.Position - r1;
end

if Sbar3_inc then
begin
if Sbar3.Position >= 100 then
Sbar3_inc := false;
else
Sbar3.Position := Sbar3.Position + r1;
end

if Not Sbar3_inc then
begin
if Sbar3.Position <= 0 then
Sbar3_inc := true;
else
Sbar3.Position := Sbar3.Position - r1;
end

end;

Ist nicht sehr elegant, but you get the idea...

Danke sehr für deine Hilfe, RattuS.

Dein Quelltext hat mich auf die Idee gebracht, die Scrollbarpositionen bzw. deren Verläufe auf mehrere, seperat ablaufende Prozeduren (mithilfe mehrerer Timer) auszulagern, so sind auch gesteuerte, asynchrone Verläufe möglich und man muss sich nicht auf den Random-Befehl verlassen (die Balken bewegen sich homogen und laufsicherer).

Manchmal steht man echt auf dem Schlauch :D.