[Delphi] Problem z parametrem Sender: TObject

0

No nie wiem jak wywołać parametr Sender: TObject poprawnie, co tam wpisać aby dział program.
Poniżej przedstawiam kod źródłowy programu

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure wyswietl(Sender: TObject;i:integer);
  private
    { Private declarations }
  public
    { Public declarations } 
  end;

var
  Form1: TForm1;
  obrazki:array[1..10] of Timage;
  i,x:integer;
implementation

{$R *.dfm}
procedure Tform1.wyswietl(Sender: TObject;i:integer);
begin
MessageDlg('Klikneles obrazek nr. '+inttostr(i), mtInformation, [mbOK],0);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
x:=50;
for i:=1 to 10 do begin
                  obrazki[i]:=TImage.Create(self);
                  obrazki[i].Left:=x;
                  obrazki[i].Top:=10;
                  obrazki[i].Width:=40;
                  obrazki[i].Height:=40;
                  obrazki[i].Parent:=self;
                  obrazki[i].Visible:=True;
                  obrazki[i].Canvas.TextOut(10,10,inttostr(i));
                  obrazki[i].OnClick:=wyswietl(,i); //tutaj nie wiem jak wywolac parametr Sender: Tobject
                  x:=x+50;
                  end;
end;

end.
0

sendera sie nie wywoluje.
jak klikkasz na obrazek to wywoluje sie procedura "wyswietl" a parametr sender jest automatycznie przypisywany (sender staje sie tym co spowodowalo wywolanie tej procedury)

procedure Tform1.wyswietl(Sender: TObject);
var img:TImage;
begin
 img:=sender as TImage;
 MessageDlg('Klikneles obrazek nr. '+inttostr(img.tag), mtInformation, [mbOK],0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 x:=50;
 for i:=1 to 10 do
        begin
         obrazki[i]:=TImage.Create(self);
         obrazki[i].Left:=x;
         obrazki[i].Top:=10;
         obrazki[i].Width:=40;
         obrazki[i].Height:=40;
         obrazki[i].Parent:=self;
         obrazki[i].Visible:=True;
         obrazki[i].Canvas.TextOut(10,10,inttostr(i));

         obrazki[i].Tag:=i;
         obrazki[i].OnClick:=wyswietl;
         x:=x+50;
        end;
end;
0

Może źle się wyraziłem, chodzi mi o to aby wywołać tą procedurę z tymi parametrami
procedure wyswietl(Sender: TObject;i:integer);

A jak chcę wysłać jeszcze z jakimś parametrem to jak mam to zrobić??

0

nie da sie.
z reszta event musi miec okreslana budowe. jesli dodasz jakis parametr to tego nie lyknie.
zrob tak jak napisalem.

kamil3453 napisał(a)

A jak chcę wysłać jeszcze z jakimś parametrem to jak mam to zrobić??

to zalezy. a co jeszcze chcialbys wyslac?

0

Na przykład wyswietl(nil,0)

0

No chciałbym wysłać liczbę integer do tej procedury.

Na przykład wyswietl(nil,0)

To nie działa

0

jesli tylko jedna to przesylasz ja uzywajac "tag" //tak jak napisalem w kodzie wyzej!
jesli chcesz wiecej to mozesz sobie zrobic np globalna tablice z dowolna zawartoscia, i potem odwolywac sie do tej tablicy uzywajac tag'u jako indexu.

0

Spróbuj tak:

obrazki[i].OnClick:=obrazki[i];
0
pelsta napisał(a)

Spróbuj tak:

obrazki[i].OnClick:=obrazki[i];

po co piszesz takie bzdury?

0

Spróbuj tak:
obrazki[i].OnClick:=obrazki[i];

Też nie działa

Mam pytanie do cimak po co ta linijka img:=sender as TImage;
bez tej linijki program tez działa poprawnie.

0

nie moze dzialac poprawnie.
ta linijka jest po to zeby do img zostal wpisany ten TImage na ktory kliknieto.
stary, naucz sie podstaw programowania bo widze, ze z tym cienko u Ciebie.

0
         obrazki[i]:=TImage.Create(self);
         obrazki[i].Left:=x;
         obrazki[i].Top:=10;
         obrazki[i].Width:=40;
         obrazki[i].Height:=40;
         obrazki[i].Parent:=self;
         obrazki[i].Visible:=True;
         obrazki[i].Canvas.TextOut(10,10,inttostr(i));
         obrazki[i].Tag:=i;
         obrazki[i].OnClick:=wyswietl;

Po pierwsze, to nie C++, i mamy konstrukcję with:

         obrazki[i]:=TImage.Create(self);
         with obrazki[i] do
         begin
           Left:=x;
           Top:=10;
           Width:=40;
           Height:=40;
           Parent:=self;
           Visible:=True;
           Canvas.TextOut(10,10,inttostr(i));
           Tag:=i;
           OnClick:=wyswietl;
         end;

Po drugie, nawet jeśli nie lubisz with, ciągłe odwoływanie do tablicy ma pewien narzut. Lepiej (wydajniej) będzie tak, z osobną zmienną:

         obrazek:=TImage.Create(self);
         obrazek.Left:=x;
         obrazek.Top:=10;
         obrazek.Width:=40;
         obrazek.Height:=40;
         obrazek.Parent:=self;
         obrazek.Visible:=True;
         obrazek.Canvas.TextOut(10,10,inttostr(i));
         obrazek.Tag:=i;
         obrazek.OnClick:=wyswietl;
         obrazki[i]:=obrazek;

Możesz też oba sposoby połączyć:

         obrazek:=TImage.Create(self);
         with obrazek do
         begin
           Left:=x;
           Top:=10;
           Width:=40;
           Height:=40;
           Parent:=self;
           Visible:=True;
           Canvas.TextOut(10,10,inttostr(i));
           Tag:=i;
           OnClick:=wyswietl;
         end;
         obrazki[i]:=obrazek;
0
cimak napisał(a)
pelsta napisał(a)

Spróbuj tak:

obrazki[i].OnClick:=obrazki[i];

po co piszesz takie bzdury?

Nie wiem :-D

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