Dodawanie procedur do dynamicznie tworzonych obrazków

0

Witam!!!!
Szukałem conieco ale nie znalazłem odpowiedzi na mój problem oto on:

Własnie robie w delphi mały programik podobny do Visio , czyli po prawej stronie mam obrazki przeciagam je na Canvas i wtedy robi sie kopia tego obrazka, wszystko szło gładko do mometu aż natrafiłem na taki problem, obrazki tworzą sie dynamicznie mniej wiecej tak:

.....................
Procedure stworzobraz (w1,w2:integer); //generowanie obrazu parametry w1-wysokosc, w2 - szerokosc
...........
l1,l2,l3,l4,l5,l6,l7:integer; //liczniki kolejnych obrazkow
imgn:string;//nazwa genrowanego obrazka
imgs:timage;//zrodlowy obrazek
..................

procedure Tform1.stworzobraz(w1,w2:integer);
begin
if (((mouse.CursorPos.X-(w1/2))>shape1.Left)and
((mouse.CursorPos.X+(w1/2))<(shape1.Left+shape1.Width)) and
((mouse.CursorPos.Y-w2)>shape1.Top)and
((mouse.CursorPos.y)<(shape1.Top+shape1.Height)) and
(shape1.Visible=true))
then
begin
img:=timage.Create(form1);
with img do
begin
Name:=imgn;
Left:=mouse.CursorPos.X-round(w1/2);
Top:=mouse.CursorPos.Y-round(w2);
Picture.Bitmap:=imgs.Picture.Bitmap;
Width:=w1;
Height:=w2;
proportional:=true;

  end;
  img.Parent:=Form1;
  end
  else showmessage('Przenoszony obrazek musi znajdować sie nad polem pomieszczenia');

end;
...................

Chodzi o to że obrazki trzeba jeszcze bedzie powiekszac, obracać i przesuwać ale to wiem jak zrobić , problemem jest zaznaczenie obrazka tzn. jeżeli klikne na stworzony obraz na Canvas to w tym momencie chciałbym żeby nazwa obrazka przypisywała mi sie do zmiennej typu timage tak aby można było robić z tym "kliknietym" obrazkiem wszystko. W tym momencie przychodzi mi do głowy tylko to żeby zrobic tablice z aktualnym położeniem danego obrazka na canvas ale to nie wchodzi w gre bo obrazki mogą sie nakładać na siebie i wtedy sieczka. Interesuje mnie coś takiego jak dynamiczne dodawanie procedury do danego obrazka czyli np OnClick- TempImage:=nazwa-kliknietego-obrazka i tyle.

Macie jakies pomysły??

0

Jeżeli wrzucasz te obrazki na jakiś panel, powiedzmy o nazwie Panel to możesz spróbować, przy tworzeniu każdego obrazka (już na tym panelu) nadawć mu nazwę (Name, w zależności np. od licznika 'Obraz1', 'Obraz2' itd. ).
Następnie dodajesz do sekcji private:
procedure MyOnImageClick(Sender: TObject);
Ustawiasz tworząc każdy obrazek jego procedurkę na kliknięcie myszką, czyli:

Obraz.OnClick = MyOnImageClick;

Teraz należy już tylko rozpoznać w procedurze, na który z obrazków się kliknęło, a robi się to tak:

begin
  //tutaj kręci się petelka
  if (Sender is TImage) then
     if (Sender as TImage).Name = 'Obraz'+IntToStr(licznikpetelki) then
          ShowMessage('Kliknięto '+IntToStr(licznikpetelki)+' obrazek!');
  // petelkaend
end;

zanim jednak odwołalibyśmy sie do obrazka, wypadałoby sprawdzić czy rzeczywiście znajduje się on na panelu, a robi się to funkcją Panel.FindChildControl('nazwa obrazka'). Mam nadzieję, że pomogłem i że kod zadziała, pisane z pamięci... :)

0

Dzieki, naprawde mi pomogłeś, duży rośnij :)
Oparłem sie na twoim kodzie i go udoskonaliłem działa bez pentelki:

.................
    Procedure WyborObrazka(Sender: TObject);
.................
  imgn:string;//nazwa genrowanego obrazka
  imgs:timage;//zrodlowy obrazek
  tempimage:timage;//aktualnie zaznaczony(ostatnio klikniety) obrazek
.................
procedure Tform1.stworzobraz(w1,w2:integer);
begin
      if (((mouse.CursorPos.X-(w1/2))>shape1.Left)and
          ((mouse.CursorPos.X+(w1/2))<(shape1.Left+shape1.Width)) and
          ((mouse.CursorPos.Y-w2)>shape1.Top)and
          ((mouse.CursorPos.y)<(shape1.Top+shape1.Height)) and
          (shape1.Visible=true))
      then
      begin
      img:=timage.Create(form1);
      with img do
      begin
        Name:=imgn;
        Left:=mouse.CursorPos.X-round(w1/2);
        Top:=mouse.CursorPos.Y-round(w2);
        Picture.Bitmap:=imgs.Picture.Bitmap;
        Width:=w1;
        Height:=w2;
        proportional:=true;
      end;
      img.Parent:=Form1;
  <font color=red>img.OnClick:=WyborObrazka;</span>
      
end
      else showmessage('Przenoszony obrazek musi znajdować sie nad polem pomieszczenia');
end;
....................
Procedure Tform1.WyborObrazka(Sender: TObject);
begin
TempImage:=(sender as timage);
end;

jak ktoś chce sprawdzić czy działa to moze sobie dopisać jescze np.

Procedure Tform1.WyborObrazka(Sender: TObject);
begin
TempImage:=(sender as timage);
label1.caption:=(sender as timage).name;
end;
0

Proszę bardzo... ;)

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