[Delphi] Procedurka do dynamicznych obrazków

0

Jako że moj ostatni temat zniknal :( zakladam nowy.
Chodzio o to by dynamicznie wygenerowane obrazki reagowały na nacisniecie tzn. zeby zmieniał sie picture na nich i najlepiej w zaleznosci czy kliknieto lewy czy prawy przycisk myszy to wyswietla sie poprzednia albo nastepny obrazek.
PROCEDURA GENERUJACA OBRAZKI:

procedure ImageGenerate;                   
var
c,l:smallint; 
begin
x:=51; y:=9;
for c:=1 to 12 do
  begin
    for l:=1 to 4 do
	    begin
	      Peg[c,l]:=TImage.Create(form1);
       	Peg[c,l].Parent:=form1;
       	Peg[c,l].Left:=x;
	      Peg[c,l].Top:=y;
	      Peg[c,l].Height:=32;
       	Peg[c,l].Width:=32;
       	Peg[c,l].Visible:=true;
        Peg[c,l].Tag:=c*12+l+400;
        x:=x+32;
	    end;
    y:=y+35; x:=51;
  end;
end;

kazdemu obrazkowi nadaje unikalny Tag jak podpowiedział mi kolega Adamo. Teraz procedura odczytujaca klikniecia:

procedure TForm1.MouseDown(Sender: TObject);
var
a,b: smallint;
begin
  if Sender is TImage then
   with (Sender as TImage) do
    begin
      a:=(Tag-400 mod 12);
      b:=(Tag-400 div 12);
      GameArray[a,b]:=GameArray[a,b]+1;
      GameArray[a,b]:=(GameArray[a,b] mod 8);
        if GameArray[a,b]=0 then GameArray[a,b]:=8;
        Peg[a,b].Picture.LoadFromFile(ColorArray[5]);
    end;
end;

ColorArray jest tablica stringów, n a r a z i e (musze to tak napisac bo jakos system forum mi tego nie przpuszcza) dla sprawdzenia chcialem aby obrazek zmienial sie na 5-ty obrazek z tablicy ColorArray. Ale to niestety nie działa i nie wiem jak to napisac zeby zadziałało, ktos pomoze.

// Primo: posty nie znikają bez powodu, secundo: do oznaczania źródeł w delphi używaj tagu, no jakiego?, oczywiście, że <d e="e" l="l" p="p" h="h" i="i"> -Q

0
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
image1.Picture.LoadFromFile('wcisnieto.bmp');
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
image1.Picture.LoadFromFile('niewcisnieto.bmp');
end;
0

Ej sory ale ja sie pytam o dynamicznie wygenerowane obrazki, do zwykłego obrazka to sobie umiem napisac taka procedure, ale do dynamicznych to nie wiem jak wysiagnac przez tego sendera info ktory z dynamicznych obrazkow zostal nacisniety :|

0
procedure TForm1.ImageDYNMouseUp(Sender: TObject; Button: MouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  TImage(Sender).Picture.LoadFromFile('niewcisnieto.bmp');
{or} (Sender as TImage).Picture.LoadFromFile('niewcisnieto.bmp');
end;

analogicznie dla innych zdarzeń... a przypisanie procedury ma być podczas towrzenia obrazka.

0

wszystko good tylko nie:

 a:=(Tag-400 mod 12);
 b:=(Tag-400 div 12);

tylko:

 a:=(hej-400) div 12;
 b:=(hej-400) mod 12;

prawa działań obowiązują, nic z tego że dałeś całość w nawias bo równie dobrze mogłoby tego nawiasu nie być, najpierw wykonuje się dzielenie, mnożenie itd a na końcu odejmowanie więc od Taga odejmowałeś 400/12 i 400 mod 12 zamiast od Tag-400 i na odwrót dałeś div z mod'em

a przypisanie do obrazka metody podczas tworzenia, np:

Peg[c,l].OnMouseDown:=TForm1.MouseDown;

jeszcze walnąłeś się z deklaracją MouseDown, ma być:

procedure TForm1.MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);

bo inaczej delphi nie będzie chciał przyjąć, oczywiście w deklaracji klasy TForm1 musi być

procedure MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);

jak chcesz odczytać który klawisz myszy został na obrazku kliknięty to wykorzystujesz wartość "Button", np:

if Button=mbLeft then begin
  ShowMessage('Kliknięto lewy klawisz myszy !');
end;

Button może się równać mbLeft / mbRight / mbMiddle (mb od MouseButton żeby było łatwiej zapamiętać - F1)

0

dzieki ale jeszcze cos nie tak bo wywala mi niekompatybilne typy na:
Peg[c,l].OnMouseDown:=TForm1.MouseDown; ??

0

musiałeś zwalić coś z deklracją tej funkcji, zobacz czy jest identyczna jak napisałem w poprzednim poście

0

[Error] Unit1.pas(295): Incompatible types: 'TMouseEvent' and 'Procedure'
Wszystko przekopiowałem z twojego posta wiec powinno byc ok

0

pokaż kod może

0

w typach modułu:

procedure MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

Procedura do wykrywania kliniec i zmiany obrazka:

procedure TForm1.MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
w,a,b,tg:smallint;
begin
(Sender as TImage).Picture.LoadFromFile('nieb.bmp');
      tg:=(Sender as TImage).Tag;
      a:=(tg-400) div 12;
      b:=(tg-400) mod 12;
      w:=GameArray[a,b];

    if Button=mbLeft then
    begin
      w:=w+1;
      w:=(w mod 8);
      if w=0 then
      w:=8;
      (Sender as TImage).Picture.LoadFromFile(ColorArray[w]);
      GameArray[a,b]:=w;
    end;
    
    if Button=mbRight then
    begin
      w:=w-1;
      w:=(w mod 8);
      if w=-1 then
      w:=8;
      if w=0 then
      w:=8;
      (Sender as TImage).Picture.LoadFromFile(ColorArray[w]);
      GameArray[a,b]:=w;
    end;

end;

Generowanie obrazków:

procedure ImageGenerate;                    //   OK
var
x,y:integer; //pozycja x,y
c,l:smallint; //c-kolumny, l-wiersze
begin
x:=51; y:=9;
for c:=1 to 12 do
  begin
    for l:=1 to 4 do
	    begin
	      Peg[c,l]:=TImage.Create(form1);
       	Peg[c,l].Parent:=form1;
       	Peg[c,l].Left:=x;
	      Peg[c,l].Top:=y;
	      Peg[c,l].Height:=32;
       	Peg[c,l].Width:=32;
       	Peg[c,l].Visible:=true;
        Peg[c,l].Tag:=c*12+l+400;
        Peg[c,l].OnMouseDown:=TForm1.MouseDown;
        x:=x+32;
	    end;
    y:=y+35; x:=51;
  end;
end;
0

aha, to zamiast "TForm1" użyj "Form1" w przypisaniu

0

Wszytsko śmiga i działa jak powinno, dzieki wszystki. Szczegolnie tobie Adamo jestem uratowany :)

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