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/)
-   -   MouseDown Procedure einer Instanz überschreiben (https://www.delphipraxis.net/191552-mousedown-procedure-einer-instanz-ueberschreiben.html)

Rabenrecht 27. Jan 2017 08:38

MouseDown Procedure einer Instanz überschreiben
 
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? :)

DeddyH 27. Jan 2017 08:48

AW: MouseDown Procedure einer Instanz überschreiben
 
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.

Rabenrecht 27. Jan 2017 09:25

AW: MouseDown Procedure einer Instanz überschreiben
 
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 :P

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.

Zacherl 27. Jan 2017 09:26

AW: MouseDown Procedure einer Instanz überschreiben
 
Du kannst das Event doch einfach im Constructor von TMyComponent setzen. An der Stelle, an der du auch FPanel erzeugst.

DeddyH 27. Jan 2017 10:00

AW: MouseDown Procedure einer Instanz überschreiben
 
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;

Rabenrecht 27. Jan 2017 10:15

AW: MouseDown Procedure einer Instanz überschreiben
 
Ah, stimmt, so geht das im Prinzip :thumb:

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...

DeddyH 27. Jan 2017 10:24

AW: MouseDown Procedure einer Instanz überschreiben
 
Der Code wird ja im Kontext Deiner Komponente ausgeführt, daher zeigt das inherited auf den Vorfahrcode der Komponente.

Rabenrecht 27. Jan 2017 10:38

AW: MouseDown Procedure einer Instanz überschreiben
 
Ok, mal schauen ob das funktioniert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:00 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