AGB  ·  Datenschutz  ·  Impressum  







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

MouseDown Procedure einer Instanz überschreiben

Ein Thema von Rabenrecht · begonnen am 27. Jan 2017 · letzter Beitrag vom 27. Jan 2017
Antwort Antwort
Rabenrecht

Registriert seit: 9. Dez 2016
79 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

MouseDown Procedure einer Instanz überschreiben

  Alt 27. Jan 2017, 09:38
Die Ausgangslage:
Alle myComponent haben ein Panel als Attribut, nennen wir es FPanel.
myComponent übeschreibt die MouseDown procedure von TControl und schreibt da was nützliches rein.

Was ich erreichen möchte:
Wenn ich auf das FPanel einer Komponente vom Typ myComponent klicke, soll die Logik, die in der MousDown procedure von myComponent liegt, ausgeführt werden.

Das soll natürlich NUR für FPanel, also einer Instanz von Panel gelten, NICHT für alle Panels.
Diese Änderung soll allerdings für ALLE myComponent gelten. Das heist im Designer mit den Events rumspielen bringt mir nichts. Ich muss die Änderungen in der Komponentendefinition von myComponent machen.

Ich stehe da grad aufm Schlauch. Irgendwelche Ideen?

Geändert von Rabenrecht (27. Jan 2017 um 09:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#2

AW: MouseDown Procedure einer Instanz überschreiben

  Alt 27. Jan 2017, 09:48
Ich bin nicht sicher, ob ich Dich richtig verstanden habe, aber wieso leitest Du nicht das Panel von TPanel ab und überschreibst dort das MouseDown? Falls ich falsch liegen sollte, wäre etwas Code hilfreich.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Rabenrecht

Registriert seit: 9. Dez 2016
79 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: MouseDown Procedure einer Instanz überschreiben

  Alt 27. Jan 2017, 10:25
Weil ich dann eine neue Komponente nur für diese Panels hätte. Das wäre zwar eine Lösung, aber keine sehr saubere. Da klopfen mir meine Chefs bestimmt auf die Finger

Ich versuchs mal mit Code:
Delphi-Quellcode:
//aus einer Komponenten-Unit
type
TMyComponent = class(...TControl)
  private
    FPanel : TPanel
  protected
    procedure MouseDown(Button: TMouseButton;
                                Shift: TShiftState;
                                X: Integer;
                                Y: Integer); override;
[...]
implementation

procedure TMyComponent.MouseDown(Button: TMouseButton;
                                Shift: TShiftState;
                                X: Integer;
                                Y: Integer);
begin
  //cool stuff
end;
Wenn ich jetzt eine Form mit einer TMyComponent erstelle und ich zur Laufzeit auf den Teil der grafischen Repräsentation der Komponente klicke, der vom Panel "überdeckt" ist, wird so wie es ist nicht TMyComponent.MouseDown ausgeführt (weil das MouseEvent ja auf dem Panel stattfand). Soll es aber!

Für jede Instanz von TMyComponent nen EventHandler für FPanel.OnMouseDown einzufügen und da TMyComponent.MouseDown aufzurufen kommt nicht in Frage.
Diese Funktionalität muss in der Komponentendefinition von TMyComponent sichergestellt werden.
TPanel selbst kann ich nicht verändern, weil diese Änderung natürlich nicht für alle TPanels gelten soll.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: MouseDown Procedure einer Instanz überschreiben

  Alt 27. Jan 2017, 10:26
Du kannst das Event doch einfach im Constructor von TMyComponent setzen. An der Stelle, an der du auch FPanel erzeugst.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#5

AW: MouseDown Procedure einer Instanz überschreiben

  Alt 27. Jan 2017, 11:00
Oder etwas ausführlicher:
Delphi-Quellcode:
type
  TMyComponent = class(TWinControl)
  private
    FPanel: TPanel;
    procedure PanelMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X: Integer; Y: Integer);
  protected
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer;
      Y: Integer); override;
  public
    constructor Create(AOwner: TComponent); override;
  end;

...

constructor TMyComponent.Create(AOwner: TComponent);
begin
  inherited;
  Width := 200;
  Height := 200;
  FPanel := TPanel.Create(self);
  FPanel.Parent := self;
  FPanel.OnMouseDown := PanelMouseDown;
end;

procedure TMyComponent.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
  Y: Integer);
begin
  inherited;
  if Button = mbLeft then
    ShowMessage(Format('X: %d, Y: %d', [X, Y]));
end;

procedure TMyComponent.PanelMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState;
  X, Y: Integer);
begin
  self.MouseDown(Button, Shift, X, Y);
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Rabenrecht

Registriert seit: 9. Dez 2016
79 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: MouseDown Procedure einer Instanz überschreiben

  Alt 27. Jan 2017, 11:15
Ah, stimmt, so geht das im Prinzip

Eine Frage dazu aber noch:
In TMyComponent.MouseDown ist ein inheirited drin. Wenn ich den OnMouseDown-EventHandler von FPanel so umbiege, wie ihr das vorschlagt, wohin führt dann das inheirited, wenn ich auf das Panel klicke? Auf (Vorfahr von TPanel).MouseDown oder auf (Vorfahr von TMyComponent).MouseDown?

Das ist leider ziemlich entscheidend für die Funktionalität...
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#7

AW: MouseDown Procedure einer Instanz überschreiben

  Alt 27. Jan 2017, 11:24
Der Code wird ja im Kontext Deiner Komponente ausgeführt, daher zeigt das inherited auf den Vorfahrcode der Komponente.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Rabenrecht

Registriert seit: 9. Dez 2016
79 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: MouseDown Procedure einer Instanz überschreiben

  Alt 27. Jan 2017, 11:38
Ok, mal schauen ob das funktioniert.
  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 10:26 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