AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Komponente ableiten: Ereignisse überschreiben
Thema durchsuchen
Ansicht
Themen-Optionen

Komponente ableiten: Ereignisse überschreiben

Ein Thema von Martin K · begonnen am 6. Jun 2006 · letzter Beitrag vom 6. Jun 2006
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#1

Komponente ableiten: Ereignisse überschreiben

  Alt 6. Jun 2006, 13:12
Hi,

bin gerade dabei, mir eine Komponente ableiten.
Dabei möchte ich, dass bestimmte Ereignisse (z. B. OnMouseMove) im OI nicht verfügbar sein sollen, da ich sie bereits in der abgeleiteten Komponente für etwas anderes nutze (habe also diesem Ereinis schon etwas zugeordnet).

Eine andere Möglichkeit wäre natürlich, bei OnMouseMove würden beide Ereignisse ausgeführt werden:
Das was ich in der abgeleiteten Komponente habe und das was der User im OI hinzufügt.
Dieses wäre natürlich eine bessere Lösung!

Ist eines von beiden (oder beides?) irgendwie möglich?
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Komponente ableiten: Ereignis löschen ???

  Alt 6. Jun 2006, 13:28
du kannst die WIndowsmessage (WM_MOUSE oder so) selbst abfangen und dann zuerst dein eigenes event starten udn dann fOnMouseMove auslösen.

Du kannst natürlich auch nur in der Nachrichtenbehandlung deine Sache machen und dann die message einfach weiterleiten.

Ich würde da wahrscheinlcih sogar die komplette Nachrichtenschleife "verschieben" und in meiner eigenen die nachrichten abfangen/weiterleiten, wenn du verstehst was ich meine.
Lukas Erlacher
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

Re: Komponente ableiten: Ereignis löschen ???

  Alt 6. Jun 2006, 13:31
Du musst die Methode MouseMove überschreiben. Sie hat folgende Deklaration:
procedure MouseMove(Shift: TShiftState; X, Y: Integer); dynamic; Du kannst innerhalb von MouseMove zuerst dein eigenes Zeug ausführen und dann rufst du
den ursprünglichen Code auf:
Delphi-Quellcode:
   inherited MouseMove(Shift, X, Y);
end;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Komponente ableiten: Ereignis löschen ???

  Alt 6. Jun 2006, 13:33
warum einfach, wenns auch kompliziert geht...
Lukas Erlacher
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

Re: Komponente ableiten: Ereignis löschen ???

  Alt 6. Jun 2006, 13:34
Zitat von DGL-luke:
warum einfach, wenns auch kompliziert geht...
Tja... wer den Sourcecode der VCL hat, hat auch die MACHT.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Komponente ableiten: Ereignis löschen ???

  Alt 6. Jun 2006, 13:37
Danke erstmal für den Code, sieht echt einfach aus
Aberm muss ich dann nicht noch das Ereignis zuweisen?
  OnMouseMove := MouseMove;
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

Re: Komponente ableiten: Ereignis löschen ???

  Alt 6. Jun 2006, 13:44
Zitat von Martin K:
Aberm muss ich dann nicht noch das Ereignis zuweisen?
Nicht nötig. Der Sourcecode der Klasse TControl sieht so aus:
Delphi-Quellcode:
procedure TControl.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
  // Wenn Event OnMouseMove gesetzt, dann wird der Eventhandler aufgerufen
  if Assigned(FOnMouseMove) then FOnMouseMove(Self, Shift, X, Y);
end;
Durch Überschreiben von MouseMove wird dein MouseMove aufgerufen.
Du kannst also schön dein Ding ausführen und dann die Kontrolle über inherited
wieder auf den Standardweg abgeben.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Komponente ableiten: Ereignis löschen ???

  Alt 6. Jun 2006, 13:47
Okay, danke!

Dann werd ich's mal testen...
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Komponente ableiten: Ereignis löschen ???

  Alt 6. Jun 2006, 13:54
Als ich den Source noch nicht hatte hab ich sowas wie folgt gemacht:
Delphi-Quellcode:
  TMeinKlasse = class(TUrsprungsklasse)
  private
    fOnMouseMove: TMouseMoveEvent;
    procedure FOnMouseMoveProc(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  public
    constructor Create(AOwner: TComponent); override;
  published
    property OnMouseMove: TMouseMoveEvent read fOnMouseMove write fOnMouseMove;
  end;
[...]
constructor TMeinKlasse.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  inherited OnMouseMove := FOnMouseMoveProc;
end;

procedure TMeinKlasse.FOnMouseMoveProc(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  //Mein Zeugs
  if Assigned(fOnMouseMove) then
    fOnMouseMove(Sender, Shift, X, Y);
end;
Die Lösung mit dem Überschreiben ist zwar besser (vor allem wenn auf Vorgängerobjecte gecastet wird etc.) aber wenn es keine Methode zum Überschreiben gibt bzw. man diese nicht kennt ist dies eine annehmbare Lösung.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Komponente ableiten: Ereignis löschen ???

  Alt 6. Jun 2006, 15:56
Hmm... irgendwie krieg ich's nich hin.

Wo muss ich denn die Prozedurprocedure MouseMove(Shift: TShiftState; X, Y: Integer); dynamic; deklarieren? (nach dem Schema von Beitrag #3 !!!)

Zur Zeit steht sie im public Teil, aber sie wird einfach nicht ausgeführt

Übrigens:
Seit dem ich daran rumbastle kann ich Delphi nicht mehr neu starten, nur noch mit dem gerade geöffneten Delphi arbeiten.
Wenn ich Delphi starten will, kommt diese Fehlermeldung:
Zitat:
---------------------------
delphi32.exe - Einsprungpunkt nicht gefunden
---------------------------
Der Prozedureinsprungpunkt "@Inifiles@TMemIniFile@$bctr$qqrx17System@AnsiStri nt" wurde in der DLL "rtl70.bpl" nicht gefunden.
---------------------------
OK
---------------------------
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 08:57 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