AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Objecten ein gemeinsames Ereigniss zuweisen

Ein Thema von Pro_RJ · begonnen am 28. Mai 2009 · letzter Beitrag vom 28. Mai 2009
Antwort Antwort
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#1

Objecten ein gemeinsames Ereigniss zuweisen

  Alt 28. Mai 2009, 10:48
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
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Objecten ein gemeinsames Ereigniss zuweisen

  Alt 28. Mai 2009, 11:45
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.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#3

Re: Objecten ein gemeinsames Ereigniss zuweisen

  Alt 28. Mai 2009, 12:13
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
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
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
655 Beiträge
 
Delphi 12 Athens
 
#4

Re: Objecten ein gemeinsames Ereigniss zuweisen

  Alt 28. Mai 2009, 12:28
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
  Mit Zitat antworten Zitat
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#5

Re: Objecten ein gemeinsames Ereigniss zuweisen

  Alt 28. Mai 2009, 12:42
@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
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#6

Re: Objecten ein gemeinsames Ereigniss zuweisen

  Alt 28. Mai 2009, 14:50
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.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Objecten ein gemeinsames Ereigniss zuweisen

  Alt 28. Mai 2009, 15:03
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 [/edit]

Gruß oki
42
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
655 Beiträge
 
Delphi 12 Athens
 
#8

Re: Objecten ein gemeinsames Ereigniss zuweisen

  Alt 28. Mai 2009, 15:09
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... )
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Objecten ein gemeinsames Ereigniss zuweisen

  Alt 28. Mai 2009, 15:25
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... )
Joo, dann hats ja trotzdem geklappt mit dem Missverständnis. Mein Fehler.

Gruß oki
42
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:07 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