Ktory SpeedButton klikniety. Jak sprawdzic?

0

Sytuacja wyglada tak.
Mam PANEL1 o rozmiarach 400x400 i w nim umieszczam 100 speedbuttonow o rozmiarach 40x40 kazdy. Robie to w taki sposob:

var
plansza: array[1..10,1..10] of TSpeedButton;

begin
x:= 0;
y:= 0;
{dwie petle tworzace plansze}
for i:=1 to 10 do
begin
for j:=1 to 10 do
begin
plansza[i,j]:=TSpeedButton.create(Form1);
plansza[i,j].height:=40;
plansza[i,j].width:=40;
plansza[i,j].top := (y);
plansza[i,j].left := (x);
plansza[i,j].parent:=panel1;
y:=y+40;
end;
x:=x+40;
y:=0;
end;

Moje pytanie brzmi. Jak sprawdzic, ktory speedbutton zostal klikniety? W standardowym SpeedButtonie sprawa prosta. Zdarzenie OnClick ew Down, ale tutaj tych speedbuttonow fizycznie NIE MA. Są one tworzone dopiero w trakcie działania programu. Domyslam sie, ze mozna pomiedzy linie powyzej wstawic cos w stylu

plansza[i,j].OnClick (skocz do linii sprawdzania, ktory SpeedButton jest down.).

W tym sprawdzaniu domyslam sie, ze mozna znowu walnac dwie petle FOR.. i zrobic cos w stylu: IF plansza[i,j].down = true then PoziomoX := i;

a wy jak myslicie? Jak wykryc klikniecie i wykryc KTORY to Speedbutton zostal klikniety?

0

np tak:

type
  TForm1 = class(TForm)
    procedure SpeedButtonClick(Sender: TObject);

{...}

procedure TForm1.SpeedButtonClick(Sender: TObject);
var
  i, j: byte;
begin
  i := (Sender as TSpeedButton).Tag;
  j := (Sender as TSpeedButton).Tag shr 8;
end;

//przy tworzeniu buttonów:
  plansza[i,j].tag := i + (j shl 8);
  plansza[i,j].OnClick := SpeedButtonClick;

możesz też tag ustawiać tak:

tag := i-1 + 10*(j-1);

i := tag mod 10 + 1;
j := tag div 10 + 1;

wtedy tag bedzie zawirał numer buttona od 0 do 99 np tag 35 to button o indeksie i=6 i j=4 (nie 5 i 3 bo ideksujesz od 1 do 10, jakbyś indeksował od 0 do 9 niebyłoby tych +1 i -1:

tag := i + 10*j;

i := tag mod 10;
j := tag div 10;
0

E tam, jest łatwiejszy sposób. Podczas tworzenia TSpeedButtonów przypypisujesz im swoją procedure OnClick :

Plansza[i][j].OnClick := Twoje_OnClick ;

a potem w tej procedurze OnClick:

procedure TForm1.Twoje_OnClick(Sender TObject) ;
var
   i , j : Integer ;
begin
     for i := 0 to 10 do
      for j := 0 to 10 do
       if Sender = Plansza[i][j] then 
       // coś tam :)
end ;

To jest lepsze rozwiazanie moim zdaniem...

0

Hmmm... porównywanie obiektów(a w zasadzie to pointerów czyli liczb) 100-krotnie jest lepsze od odczytu tag'u ? Nie sądze, ale musze przyznać że ciekawy pomysł.

Jeszcze zauważyłem

plansza[i,j].top := (y);
plansza[i,j].left := (x);

tu powinno być
plansza[i,j].top := (j-1)40;
plansza[i,j].left := (i-1)40;
A tak w ogóle to numeruj od 0 do 9 (chyba juz to pisałem wcześniej), wtedy:
plansza[i,j].top := j
40;
plansza[i,j].left := i
40;

0

Loczek, bez sensu przegladac buttony przy kazdym kliknieciu - w najgorszym wypadku będziesz musiał zrobić 100 obrotów petli. W wersji adf88 jest blyskawicznie.

0

Dzieki chlopaki. Zmienilem indeksowanie od 0 do 9 bo to faktycznie wygodniejsze. No coz. Sam zrobilem takie cusio w oparciu o DOWN i działało. Tzn petelka leciala po wszystkich klawiszach i jak ktorys byl DOWN to przekazywala jego wspolrzednie (i,j), ale rozwiazanie to bylo prymitywne. Faktycznie, sprobuje wykorzystac tutaj rozwiazanie ADFa. Pozdrawiam!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.