Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - OnClick ereignis einem dynamisch erstellten Label zuweisen..


SpaghettiCodix - Do 11.10.07 15:41
Titel: OnClick ereignis einem dynamisch erstellten Label zuweisen..
Wie kann ich einem dynamisch erstellten Label ein OnClick Ereignis zuweisen, damit es auf Mausklicks reagiert?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
var
  Form1: TForm1;
  Labels:array of TLabel;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  i:integer;
begin
SetLength(Labels,5);

  for i:=1 to 5 do
   begin
     Labels[i]:=TLabel.Create(self);
     Labels[i].Parent:= Form1;
     Labels[i].Caption:= 'Label'+ inttostr(i);
     Labels[i].Alignment := tacenter;
     ...
   end;
  end;


_frank_ - Do 11.10.07 15:51
Titel: Re: OnClick ereignis einem dynamisch erstellten Label zuweis
wie wäre es mit:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.ClickEvent(Sender: TObject);
begin
  ShowMessage((sender as TLabel).Caption+' wurde angeklickt :)');
end;
....
     Labels[i].OnClick := ClickEvent;


Gruß Frank


SpaghettiCodix - Do 11.10.07 16:28
Titel: Re: OnClick ereignis einem dynamisch erstellten Label zuweis
Intressant, Frank,

aber wohin kommt dann der Code:

Delphi-Quelltext
1:
     Labels[i].OnClick := ClickEvent;                    

Und muss ich da in einer Schleife alle Labels durchlaufen, wenn ich mit der Maus über die Labels fahre und eins anklicke?

Moderiert von user profile iconTino: Kompletten Beitrags-Quote entfernt.


_frank_ - Do 11.10.07 16:32
Titel: Re: OnClick ereignis einem dynamisch erstellten Label zuweis
ähm, ne...
ich dachte es ist an dem Aufbau schon erkennbar, dass die Zeile mit in deine Schleife (formCreate) soll....

Gruß Frank

Moderiert von user profile iconTino: Kompletten Beitrags-Quote entfernt.


SpaghettiCodix - Do 11.10.07 16:45
Titel: Re: OnClick ereignis einem dynamisch erstellten Label zuweis
Danke Frank, das funzt tatsächlich, obwohl doch 'FormCreate' beim Anklicken der Labels längst verlassen ist. Das verstehe ich nicht. Heist das, daß den Labels die Procedure 'Clickevent' in der 'FormCreate' bis zum Beenden der Anwendung zugewiesen ist?

Und könnte ich in der 'ClickEvent' dann auf das einzelne Label zugreifen, in etwa:

Delphi-Quelltext
1:
2:
3:
4:
with TLabel.sender do 
 if Sender is TLabel1 do
 begin
 end;
:oops:

Moderiert von user profile iconTino: Kompletten Beitrags-Quote entfernt.


_frank_ - Do 11.10.07 17:14
Titel: Re: OnClick ereignis einem dynamisch erstellten Label zuweis
user profile iconSpaghettiCodix hat folgendes geschrieben:

Danke Frank, das funzt tatsächlich, obwohl doch 'FormCreate' beim Anklicken der Labels längst verlassen ist. Das verstehe ich nicht. Heist das, daß den Labels die Procedure 'Clickevent' in der 'FormCreate' bis zum Beenden der Anwendung zugewiesen ist?

es ist solange zugewiesen, bis es überschrieben wird (nil, anderer EventHandler), das Label freigegeben wird oder bis zum FormDestroy.
user profile iconSpaghettiCodix hat folgendes geschrieben:
Und könnte ich in der 'ClickEvent' dann auf das einzelne Label zugreifen, in etwa:

Delphi-Quelltext
1:
2:
3:
4:
with TLabel.sender do 
 if Sender is TLabel1 do
 begin
 end;
:oops:


hab ich in der Klickmethode doch schon drin...mit (sender as TLabel) kannst du auf das Label zugreifen, auf das geklickt wurde. z.b. (sender as TLabel).Caption. Notfalls auch per with:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
if (Sender is TLabel) then //wenn du die ClickMethode noch anderen ControlTypen zuordnen willst, sonst brauchste das nicht
begin
  with (sender as TLabel) do
  begin
    Caption:='blah';
  end;
end;

auch wenn ich kein Freund von with bin, da handelt man sich schnell böse Fehler ein, wo man ewig sucht :)

HTH Frank


SpaghettiCodix - Do 11.10.07 17:21
Titel: Re: OnClick ereignis einem dynamisch erstellten Label zuweis
Ja Danke, Frank,

aber wenn ich das 1. Label anklicke, soll das was anderes machen, als das 2. Label.
Mit 'Sender as TLabel' macht jedes Label dasselbe...


_frank_ - Do 11.10.07 17:34

achso meinste das...
dann machst halt ne Abfrage rein:

Delphi-Quelltext
1:
2:
3:
4:
if sender=labels[1then
  MachWas()
else if sender=labels[2then
  MachWasAnderes();


geschickter wärs, wenn du in der schleife noch ein Tag setzt und das in der Click-Methode entsprechend verwendest....


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Labels[i].Tag:=i;

Case (Sender as TLabel).Tag of
  1:MachWas();
  2:MachWasAnderes();
end;


HTH Frank


SpaghettiCodix - Fr 12.10.07 14:01

Danke Frank,

das war es, was ich suchte.
Ich werde mich wohl in nächster Zeit mit 'Sender:TObject'
beschäftigen. Ist ein sehr intressantes Thema für 'nen Laien wie mich. :D