tablice, komponenty dynamiczne i onclick

0

witam, mam mały problem (szukałem ale nie znalazłem więc piszę temat), mianowicie w zdarzeniu OnClick chciałbym sprawdzić który komponent został kliknięty (Image) i wyswietlic info za pomocą ShowMessage, ponadto jak za pomocą tych pobranych danych można by było zmodyfikować np przesunąć dany obrazek, proszę o pomoc

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, JPEG;

type
  TForm1 = class(TForm)
    procedure OnClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
    TNewImg = class(TImage)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  tabl: array[0..2] of TNewImg;
  x: integer;

implementation

{$R *.dfm}

procedure TForm1.OnClick(Sender: TObject);
begin
     ShowMessage('');
     tabl[x].Picture.LoadFromFile('C:\0.jpg');
     tabl[x].Left:=0;
     tabl[x].Top:=250;
     Form1.Refresh;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
     Form1.DoubleBuffered:=True;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
     tabl[0]:=TNewImg.Create(self);
     tabl[0].Parent:=Form1;
     tabl[0].Name:='tabl0';
     tabl[0].Picture.LoadFromFile('C:\1.jpg');
     tabl[0].Left:=0;
     tabl[0].Top:=0;
     tabl[0].Width:=320;
     tabl[0].Height:=200;
     tabl[0].Stretch:=True;
     tabl[0].OnClick:=OnClick;

     tabl[1]:=TNewImg.Create(self);
     tabl[1].Parent:=Form1;
     tabl[1].Name:='tabl1';
     tabl[1].Picture.LoadFromFile('C:\2.jpg');
     tabl[1].Left:=500;
     tabl[1].Top:=0;
     tabl[1].Width:=320;
     tabl[1].Height:=200;
     tabl[1].Stretch:=True;
     tabl[1].OnClick:=OnClick;
end;

end.
0

Nie za bardzo wiem coś Ty tam nabazgrał i co to jest to TImg czy coś, więc przedstawię rozwiązanie na przykładzie TButton.

procedure TForm1.ProceduraSprawdzajaca(Sender: TObject);
var S: String;
begin
  S := TButton(Sender).Name;
  ShowMessage(S);
end;

I tą procedurę podepnij w zdarzeniu OnClick każdego obrazka.

0

dobra wyświetla mi nazwę i akurat to wiem ale jak to zrobić z użyciem tablicy? tzn jak pobrać index tablicy klikniętego obrazka i wg. tego indexu podać nazwe komponentu? bo do każdej komórki tablicy są przypisane komponenty tj Image ale tylko do dwóch (tablica 0..2) - tabl : array[0..2] of TNewImg ... moze tak:

  1. wyświetlenie tabl0 i tabl1 (tabl[0] - tabl0, tabl[1] - tabl1)
  2. kliknięcie na któryś z nich
  3. pobranie informacji o klikniętym komponencie i wyświetlenie
  4. modyfikacja
0

jakbyś to trzymał na liście a nie w tablicy to by wystarczyło ListaKomponentow.IndexOf(Sender);

0

a da się tak zrobić do samych Image'ów czy ta lista tyczy się wszystkich komponentów? jeśli da to proszę o przykład

0

ListaKomponentow to tylko nazwa zmiennej. DO wyboru masz TList, przechowującą wszystko co jej wciśniesz, TObjectList przechowująca TObject i pochodne, TComponentList przechowująca TComponent i pochodne i pewnie by się jeszcze coś znalazło

0

ok zrobiłem, kod można dodać do gotowców, dzięki za pomoc :)
ps. brakuje tylko zniszczenia ImgList ale to już proste wywołanie OnDestroy i ot cała filozofia :)

 
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, JPEG, Contnrs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    ImgList: TComponentList;
    procedure ImageClick(Sender: TObject);
  end;

type
    TNewImg = class(TImage)
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;
  ImgCount: integer;
  s: string;

implementation

{$R *.dfm}

procedure TForm1.ImageClick(Sender: TObject);
var
   ImgID: integer;
   show: string;

begin
     ImgID:=(Sender as TNewImg).Tag;
     show:=ImgList.Items[ImgID].Name;
     ShowMessage(show);

     Form1.Refresh;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
   i: integer;
begin
     ImgCount:=2;

     Form1.DoubleBuffered:=True;

     ImgList:=TComponentList.Create(True);
     for i:=0 to ImgCount-1 do
     begin
          ImgList.Add(TNewImg.Create(nil));
          with (ImgList.Items[i] as TNewImg) do
          begin
               Parent:=Form1;
               Name:='A'+inttostr(i);
               Left:=i*50;
               Top:=0;
               Width:=50;
               Height:=50;
               Stretch:=True;
               Picture.LoadFromFile('A'+inttostr(i)+'.jpg');
               Tag:=i;
               Visible:=True;
               OnClick:=ImageClick;
          end;
     end;
end;

end.

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