[delphi] "zapętlony" TTrackBar

0

Mam na formularzu: TrackBar1 (1-39), StringGrid1 ( 1 wiersz, 7 komórek, też liczby 1-39) i timer, który w OnTimer ma:

if Trackbar1.Position<>StringGrid1.Cells[i,0] then begin
  if TrackBar1.Position<StringGrid1.Cells[i,0] then
    TrackBar1.Position:=TrackBar1.Position+1 else
      TrackBar1.Position:=TrackBar1.Position-1;
  end;
else begin
  i:=i+1
  if i=7 then Timer1.Enabled:=False;

i jest zmienną zadeklarowaną globalnie.

Moje pytanie jest następujące - jak zmodyfikować tą procedurę, żeby TrackBar1 'przeskakiwał' z 39 na 1 i odwrotnie (jeśli jest np. na 35 a ma doskoczyć do 4 to żeby nie skakał 35-34-33-...-6-5-4 ale 36-37-38-39-1-2-3-4, "bo bliżej"). Innymi słowy - nie wahadłowo, a po okręgu :)
Da się tak?

0
if Trackbar1.Position<>StringGrid1.Cells[i,0] then 
begin
  if TrackBar1.Position<StringGrid1.Cells[i,0] then
  TrackBar1.Position:=TrackBar1.Position+1 
  else
  TrackBar1.Position:=TrackBar1.Position-1;
end 
else 
begin
  if i<39 then i:=i+1 else i:=1;
  if i=7 then Timer1.Enabled:=False;
end;

pozdrawiam
paweld

0

alucard87pl: Możliwe, że pawełd lepiej zrozumiał o co Tobie chodzi.
Bo ja ro zrozumiałem tak jak poniżej widać, ale chyba się myliłem.

  Caption := Format('Pozycja: %d I: %d', [Trackbar1.Position, I]);
  if Trackbar1.Position <> StrToInt(StringGrid1.Cells[I, 0]) then
  begin
    if TrackBar1.Position < StrToInt(StringGrid1.Cells[I, 0]) then
    begin
      TrackBar1.Position := TrackBar1.Position + 1;
    end
    else
    begin
      TrackBar1.Position := TrackBar1.Position - 1;
    end;
  end
  else
  begin
    TrackBar1.Position := TrackBar1.Max - TrackBar1.Position + TrackBar1.Min;
    I := I + 1;
    if i = 7 then
    begin
      Timer1.Enabled := False;
    end;
  end;
0

Ummm.. obie odpowiedzi robią dokładnie to co opisałem. Jak się jednak okazuje, to ja byłem zbyt niejasny. To tym razem może bardziej obrazowo i więcej szczegółów :)

Na początku, TrackBar1 jest na 20.
Wczytujemy do StringGrid1 7 cyfr. Ostatnią jest 20. :)
Co każde Timer1OnTimer TrackBar1 sprawdza, czy liczba w danej komórce StringGrid1 jest większa/mniejsza od jego aktualnej Position i jeśli trzeba, to odpowiednio zwiększa/zmniejsza ją o 1.
Jak do niej dojedzie, to coś się dzieje a po tym przechodzi do następnej komórki i znów do niej skacze co 1.

Np.
StringGrid1: 17,31,2,5,39,16,20
Ruchy TrackBara u mnie wyglądają tak:
20-19-18-17 (i=1)
-18-19-20-21-22-23-24-25-26-27-28-29-30-31 (i=2)
-30-29-28-27-26-25-24-23-22-21-20-19-18-17-16-15-14-13-12-11-10-9-8-7-6-5-4-3-2 (i=3)
-3-4-5 (i=4)
-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-32-33-34-35-36-37-38-39 (i=5)
-38-37-36-35-34-33-32-31-30-29-28-27-26-25-24-23-22-21-20-19-18-17-16 (i=6)
-17-18-19-20 (i=7, TrackBar skończył wędrówkę)
A chciałbym, żeby wyglądały tak:
20-19-18-17 (i=1)
-18-19-20-21-22-23-24-25-26-27-28-29-30-31 (i=2)
-32-33-34-35-36-37-38-39-1-2 (i=3) <-- pójście do przodu przez 39-1, krótsze o 19 kroków!
-3-4-5 (i=4)
-4-3-2-1-39 (i=5) <-- pójście do tyłu przez 1-39, krótsze o 29 kroków!

W sumie oszczędzamy 39+19=58 kroków.

Może teraz zrozumiecie o co chodzi w tym moim poronionym pomyśle :)

0

to moze tak:

if Trackbar1.Position<>StringGrid1.Cells[i,0] then
begin
  if TrackBar1.Position<StringGrid1.Cells[i,0] then
  begin 
    if TrackBar1.Position<39 then 
    TrackBar1.Position:=TrackBar1.Position+1 
    else 
    TrackBar1.Position:=1;
  end 
  else
  begin
    if TrackBar1.Position>1 then 
    TrackBar1.Position:=TrackBar1.Position-1 
    else 
    TrackBar1.Position:=39;
  end;
end
else
begin
  if i<39 then i:=i+1 else i:=1;
  if i=7 then Timer1.Enabled:=False;
end;

 

pozdrawiam
paweld

1 użytkowników online, w tym zalogowanych: 0, gości: 1