Delphi-PRAXiS

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 Objecten ein gemeinsames Ereigniss zuweisen (https://www.delphipraxis.net/134756-objecten-ein-gemeinsames-ereigniss-zuweisen.html)

Pro_RJ 28. Mai 2009 09:48


Objecten ein gemeinsames Ereigniss zuweisen
 
Hallo,
Ich nutze das BDS2006.
Ich möchte in einem Formular per Schleife allen Objekten das gemeinsame Ereigniss "onMouseEnter" zuweisen.
Delphi-Quellcode:
  for I := 0 to Self.ComponentCount - 1 do
  Begin
    Comp := Self.Components[I];
    if comp is TControl then TControl(Comp).onMouseEnter := MeineProc;
  end;
Das "problem" ist, das onMouseEnter in der Klasse TControl() protected deklariert ist und ich demnach natürlich nicht auf diese Methode zugreifen kann (ist ja auch logisch). Diese Methode wird erst in den entsprechenden "Endklassen" (TEdit,TMemo...) published freigegeben :-(


Nur wie könnte ich eine solche schleife Automatisieren? Da ich eine Lösung ala

Delphi-Quellcode:
  for I := 0 to Self.ComponentCount - 1 do
  Begin
    Comp := Self.Components[I];
    if comp is TEdit then TEdit(Comp).onMouseEnter := MeineProc;
    if comp is TButton then TButton(Comp).onMouseEnter := MeineProc;
....
  end;
irgendwie viel zu aufwendig/umständlich finde.

danke schonmal im vorraus
mfg Jens

chaosben 28. Mai 2009 10:45

Re: Objecten ein gemeinsames Ereigniss zuweisen
 
Variante 1 wäre per RTTI:
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm3 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormMouseEnter(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.FormCreate(Sender: TObject);
var
  m : TMethod;
begin
  m := GetMethodProp(Self, 'OnMouseEnter');
  SetMethodProp(Button1, 'OnMouseEnter', m);
end;

procedure TForm3.FormMouseEnter(Sender: TObject);
begin
  Caption := Sender.ClassName;
end;

end.

Variante 2 ist schmutzig, aber funktioniert:
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm3 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormMouseEnter(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TMyControl = class(TControl)
  public
    property OnMouseEnter;
  end;



var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.FormCreate(Sender: TObject);
begin
  TMyControl(Button1).OnMouseEnter := FormMouseEnter;
end;

procedure TForm3.FormMouseEnter(Sender: TObject);
begin
  Caption := Sender.ClassName;
end;

end.

Pro_RJ 28. Mai 2009 11:13

Re: Objecten ein gemeinsames Ereigniss zuweisen
 
Danke für den Tip.
Das funktioniert sogar wenn die Klassendeklaration so aufbaue:


Delphi-Quellcode:
  Type
    TMyControl = class(TControl)
    //Protected
      //Property OnMouseEnter;
  end;
Und jetzt kann ich per
Delphi-Quellcode:
if comp is TControl then TMyControl(Comp).onMouseEnter := MeineProc;
darauf zugreifen.Und das Ereignis wird auch ausgeführt.
Auch wenn ich ehrlich gesagt nicht verstehe warum :gruebel:

Bbommel 28. Mai 2009 11:28

Re: Objecten ein gemeinsames Ereigniss zuweisen
 
Das funktioniert, weil du die protected-Eigenschaft durch die Vererbung für deine neue Klasse TMyControl sichtbar gemacht hast. Oder wie es die Delphi-Hilfe formuliert:

"Ein protected-Element ist innerhalb des Moduls mit der Klassendeklaration und in allen abgeleiteten Klassen (unabhängig davon, in welchem Modul sie deklariert sind) sichtbar."

Heißt: TMyControl darf jetzt auf die Eigenschaft zugreifen, obwohl sie noch immer protected ist.

Bis denn
Bommel

Pro_RJ 28. Mai 2009 11:42

Re: Objecten ein gemeinsames Ereigniss zuweisen
 
@Bbommel
Ahh ok danke.
Ich hatte die Vererbung von Protected deklarierten Methoden immer so verstanden das diese Protected bleiben bis sie hochgestuft werden. naja wieder was gelern danke.


@chaosben
Die Variante 1
funktioniert nur, wenn diese Methode in der Vererbten Klasse(z.B. TEdit) auch angegeben ist. Bei Klassen, die diese Methode nicht angegeben haben z.B.: TAnimate geht das leider nicht.

ich mache es jetzt über die Variante 2.
Danke euch beiden für die hilfe
mfg Jens

chaosben 28. Mai 2009 13:50

Re: Objecten ein gemeinsames Ereigniss zuweisen
 
Zitat:

Zitat von Pro_RJ
Die Variante 1
funktioniert nur, wenn diese Methode in der Vererbten Klasse(z.B. TEdit) auch angegeben ist. Bei Klassen, die diese Methode nicht angegeben haben z.B.: TAnimate geht das leider nicht.

Ja, das habe ich stillschweigend vorausgesetzt. :)

oki 28. Mai 2009 14:03

Re: Objecten ein gemeinsames Ereigniss zuweisen
 
Zitat:

Zitat von Pro_RJ
@Bbommel
Ahh ok danke.
Ich hatte die Vererbung von Protected deklarierten Methoden immer so verstanden das diese Protected bleiben bis sie hochgestuft werden. naja wieder was gelern danke.
mfg Jens

Falsch gelernt.
Dadurch, dass die Klasse auf die gecasted wird (TMyControl) in der gleichen Unit steht kann man bei dieser auf die protected-Methoden und Eigenschaften zugreifen. Damit wird nicht die Sichtbarkeit der Klassenmember erhöht. Sie bleiben gleich. Verwendest du den Cast mittels deiner Klasse TMyControl in einer anderen Unit, dann klappt das nicht mehr.

[edit] Aus diesem Grund hat Bbommel die Sichtbarkeit durch eine Deklaration unter public erhöht. Somit klappt dein Cast auch in anderen Units; oder mit dem Nachbarn :mrgreen: [/edit]

Gruß oki

Bbommel 28. Mai 2009 14:09

Re: Objecten ein gemeinsames Ereigniss zuweisen
 
Zu viel der Ehre, das Beispiel hatte sich chaosben ausgedacht. Nicht, dass sich jemand benachteiligt fühlt. :)

(edit: Aber deswegen hatte ich extra noch mal den Satz: "Heißt: TMyControl darf jetzt auf die Eigenschaft zugreifen, obwohl sie noch immer protected ist." hinterhergeschrieben, weil ich genau das Missverständnis vermeiden wollte... tjo... :zwinker: )

oki 28. Mai 2009 14:25

Re: Objecten ein gemeinsames Ereigniss zuweisen
 
Zitat:

Zitat von Bbommel
(edit: Aber deswegen hatte ich extra noch mal den Satz: "Heißt: TMyControl darf jetzt auf die Eigenschaft zugreifen, obwohl sie noch immer protected ist." hinterhergeschrieben, weil ich genau das Missverständnis vermeiden wollte... tjo... :zwinker: )

Joo, dann hats ja trotzdem geklappt mit dem Missverständnis. Mein Fehler.

Gruß oki


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:14 Uhr.

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