Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Ereignis-Name zur Laufzeit zuweisen (https://www.delphipraxis.net/87605-ereignis-name-zur-laufzeit-zuweisen.html)

Hansa 2. Mär 2007 21:12


Ereignis-Name zur Laufzeit zuweisen
 
Hi,

die Frage hat hiermit was zu tun :

http://www.delphipraxis.net/internal...955d5395de32b4

Es geht um ein Panel und ein Label darauf. Nun kommt hinzu, dass bei Drücken von Enter etwas gemacht werden muss. Und zwar, sofern das Label oder das entsprechende Panel den Focus hat. Leider hat das Label kein KeyPress usw. und das Panel hat kein MouseEnter usw. Ich habe deshalb (vorläufig) den Weg gewählt, im PanelEnter/Mouseenter die entsprechhenden Komponentennamen zu speichern und das FormKeyDown auszuwerten :

Delphi-Quellcode:
procedure Tfrm.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var c : TComponent;
begin
  if key = 13 then begin
    c := FindComponent(AltKompName);
    ShowMessage ('****** '+c.Name);
    Label2Click (Sender);
    //c.Name+'OnKeyDown';
  end;
end;

Delphi-Quellcode:
procedure Tfrm.Label2Click(Sender: TObject);
begin
showmessage ('Label2Click');
end;
Das Label2Click geht auch soweit (momentan eben nur showmessage), aber der ganaue Name ist zum Zeitpunkt des auslösens ja gar nicht bekannt. Das könnte auch Label12345Click heißen. ShowMessage ('****** '+c.Name); liefert den Namen des Controls. Wie baue ich daraus jetzt einen Prozedurnamen zusammen oder führe die Procedure aus ?

mkinzler 2. Mär 2007 21:26

Re: Ereignis-Name zur Laufzeit zuweisen
 
Ruf die Methode nicht per Namen sondern über die entsprechende Property des Senders auf.

Hansa 5. Mär 2007 01:10

Re: Ereignis-Name zur Laufzeit zuweisen
 
Der Sender ist aber das Formular (FormKeyDown). Woher soll dieses denn wissen, um was es genau geht ? Ohne Bsp. oder einen längeren Satz kann ich nichts mit der Antwort anfangen. :???:

Lannes 5. Mär 2007 06:37

Re: Ereignis-Name zur Laufzeit zuweisen
 
Hallo Hansa,

immer noch mit den Panel-Labels beschäftigt? :wink:

ActiveControl könnte da helfen:
Delphi-Quellcode:
if Key = 13 then
  if (assigned(ActiveControl)) and
     (ActiveControl.ClassType = TPanel) then
     showmessage('Label: '+ActiveControl.Controls[0].Name+#13#10+
                 ' auf Panel: '+ActiveControl.Name);

TStringlist 5. Mär 2007 08:18

Re: Ereignis-Name zur Laufzeit zuweisen
 
mkinzler meinte wahrscheinlich: Wenn Du mit c sowieso schon die Komponente hast, warum benutzt Du dann die On-Properties nicht gleich zum Methodenaufruf, ala:

Delphi-Quellcode:
with (c as TLabel) do
  if assigned(OnClick) then OnClick(Sender);

Hansa 5. Mär 2007 21:31

Re: Ereignis-Name zur Laufzeit zuweisen
 
Mit dem ActiveControl (Lannes) kriege ich tatsächlich das gewünschte Label. Das ist schonn mal gut. Wie bringe ich das nun noch dazu sein eigenes OnClick auszuführen ? Blöd, wenn man nicht am Stück an einer Sache dran bleiben kann. Mühsam ernährt sich das Eichhörnchen. :mrgreen:

mkinzler 5. Mär 2007 21:36

Re: Ereignis-Name zur Laufzeit zuweisen
 
Delphi-Quellcode:
(ActiveControl as TLabel).onClick( ActiveControl);

Hansa 5. Mär 2007 23:27

Re: Ereignis-Name zur Laufzeit zuweisen
 
Wo muss denn das jetzt genau hin ? :shock: Ich kann es doch nur im OnKeyDown des Formulars gebrauchen. Delphi meckert schon hier drüber:

Delphi-Quellcode:
(ActiveControl as TLabel)
Delphi-Quellcode:
[Fehler]Form1.pas(250): Inkompatible Typen: 'TLabel' und 'TWinControl'
Bitte jetzt Butter bei die Fische, sonst verhungert das Eichhörnchen. :P Das kann nicht mehr viel sein.

Ghostwalker 6. Mär 2007 05:50

Re: Ereignis-Name zur Laufzeit zuweisen
 
Wie TStringlist schon schrieb, einfach:

Delphi-Quellcode:
   with (c as TLabel) do
   begin
     if assigned(onClick) then
       OnClick(Sender);
   end;

Lannes 6. Mär 2007 07:25

Re: Ereignis-Name zur Laufzeit zuweisen
 
Hallo,

Sender = Form, denn auslösendes Ereignis = FormKeyDown
ActiveControl = Panel, denn Pfeiltasten oder Tab setzen das jeweilige Panel activ
ActiveControl.Controls[0] = Label, denn das Label ist einziges Control, also Index = 0

@Hansa: damit Dein Eichhörnchen nicht verhungert :Sciurus: :-D
Delphi-Quellcode:
//...
var aLabel : TControl;
//...
if Key = 13 then
  if (assigned(ActiveControl)) and
     (ActiveControl.ClassType = TPanel) then
     begin
     showmessage('Label: '+ActiveControl.Controls[0].Name+#13#10+ 
                 'auf Panel: '+ActiveControl.Name+#13#10+
                 'Sender ist Form: '+TControl(Sender).Name);

     aLabel := ActiveControl.Controls[0];//<----------
     TLabel(aLabel).OnClick(aLabel);
     end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:21 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz