![]() |
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:
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 :-(
for I := 0 to Self.ComponentCount - 1 do
Begin Comp := Self.Components[I]; if comp is TControl then TControl(Comp).onMouseEnter := MeineProc; end; Nur wie könnte ich eine solche schleife Automatisieren? Da ich eine Lösung ala
Delphi-Quellcode:
irgendwie viel zu aufwendig/umständlich finde.
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; danke schonmal im vorraus mfg Jens |
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. |
Re: Objecten ein gemeinsames Ereigniss zuweisen
Danke für den Tip.
Das funktioniert sogar wenn die Klassendeklaration so aufbaue:
Delphi-Quellcode:
Und jetzt kann ich per
Type
TMyControl = class(TControl) //Protected //Property OnMouseEnter; end;
Delphi-Quellcode:
darauf zugreifen.Und das Ereignis wird auch ausgeführt.
if comp is TControl then TMyControl(Comp).onMouseEnter := MeineProc;
Auch wenn ich ehrlich gesagt nicht verstehe warum :gruebel: |
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 |
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 |
Re: Objecten ein gemeinsames Ereigniss zuweisen
Zitat:
|
Re: Objecten ein gemeinsames Ereigniss zuweisen
Zitat:
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 |
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: ) |
Re: Objecten ein gemeinsames Ereigniss zuweisen
Zitat:
Gruß oki |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz