Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi In eigener Komponente auf Klick reagieren (https://www.delphipraxis.net/78956-eigener-komponente-auf-klick-reagieren.html)

3_of_8 13. Okt 2006 17:28


In eigener Komponente auf Klick reagieren
 
Morgen.

Ich habe eine Komponente von TCustomControl abgeleitet und möchte jetzt auf einen Klick reagieren.

Ich verwende dafür die Botschaft WM_LBUTTONUP.

Jetzt habe ich aber zwei Probleme:
1. Ich weiß nicht, wie ich die Mausposition auf der Komponente bekomme. Ich habe überlegt, dass das eventuell in lparam drinsteht, jeweils 16 Bit für X und Y-Position, aber das auslesen mit and und shr hat falsche Ergebnisse erzeugt. Ich mache es mit GetCursorPos(p) und ScreenToClient(p). Das geht, ist aber IMHO unelegant.

2. Ich denke, das müsste auch anders gehen als mit der Botschaft. Vor allem reagiert der Rahmen des Formulars, also z.B. der "Schließen"-Button nicht mehr auf Klicks.

Christian Seehase 13. Okt 2006 17:42

Re: In eigener Komponente auf Klick reagieren
 
Moin Manuel,

ich habe den Eindruck, dass Du es Dir zu schwer machst.
TCustomControl bietet ja von sich aus das OnMouseUp (und auch OnClick, falls Du das benötigst)

Nimm mal ein leeres Formular, und einen Button.

Delphi-Quellcode:
type
  TMyCC = class(TCustomControl)
  end;

implementation

{$R *.dfm}

procedure TForm1.MyMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ShowMessage('CLICK');
end;

procedure TForm1.btn1Click(Sender: TObject);

var
  MCC : TMyCC;

begin
  MCC := TMyCC.Create(self);
  MCC.Parent := self;
  MCC.Width := 100;
  MCC.Height := 100;
  MCC.Left  := 0;
  MCC.Top   := 0;
  MCC.OnMouseUp := MyMouseUp;
end;

3_of_8 13. Okt 2006 17:45

Re: In eigener Komponente auf Klick reagieren
 
Das ist mir klar, aber der Benutzer soll diese Events weiterhin nutzen können.

Christian Seehase 13. Okt 2006 17:51

Re: In eigener Komponente auf Klick reagieren
 
Moin Manuel,

dann mach' die Eigenschaft OnClick doch sichtbar:

Delphi-Quellcode:
type
  TMyCC = class(TCustomControl)
  public
    property OnClick;
  end;

Hawkeye219 13. Okt 2006 17:52

Re: In eigener Komponente auf Klick reagieren
 
Hallo Manuel,

die Methoden TControl.MouseDown, TControl.MouseMove und TControl.MouseUp sind als "protected dynamic" gekennzeichnet und können somit überschrieben werden.

Gruß Hawkeye

3_of_8 13. Okt 2006 17:53

Re: In eigener Komponente auf Klick reagieren
 
Er soll auch OnMouseUp nutzen können, und das kann er ja dann nicht mehr, weil ich die schon belege.

EDIT: @Hawkeye: Ich wusste gar nicht, dass es die gibt. :mrgreen:
Hab sie in der OH nicht gefunden.

Hawkeye219 13. Okt 2006 18:01

Re: In eigener Komponente auf Klick reagieren
 
Zitat:

Zitat von 3_of_8
Ich wusste gar nicht, dass es die gibt.

Ohne Sourcen (D7 Personal) bleibt da nur die Online-Hilfe. Die war aber zumindest bei Delphi6 noch ziemlich gut und listet auch die protected Methoden der Klassen auf.

Gruß Hawkeye

Christian Seehase 13. Okt 2006 18:05

Re: In eigener Komponente auf Klick reagieren
 
Moin Manuel,

und so:

Delphi-Quellcode:
type
  TMyCC = class(TCustomControl)
  private
    FOnMouseUp : TMouseEvent;
    procedure MouseUp(Button: TMouseButton;Shift: TShiftState; X, Y: Integer); override;
  public
    property OnMouseUp read FOnMouseUp write FOnMouseUp;
  end;


procedure TMyCC.MouseUp(Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  ShowMessage('INTERNAL');
  if Assigned(FOnMouseUp) then FOnMouseUp(self,Button,Shift,x,y);
end;

xaromz 13. Okt 2006 19:02

Re: In eigener Komponente auf Klick reagieren
 
Hallo,
Zitat:

Zitat von Christian Seehase
Moin Manuel,

und so:...

Ist in TCustomControl das Event nicht schon definiert? Dann müsste das hier reichen:
Delphi-Quellcode:
type
  TMyCC = class(TCustomControl)
  protected
    procedure MouseUp(Button: TMouseButton;Shift: TShiftState; X, Y: Integer); override;
  published
    property OnMouseUp;
  end;


procedure TMyCC.MouseUp(Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  ShowMessage('INTERNAL');
end;
Gruß
xaromz

3_of_8 13. Okt 2006 20:35

Re: In eigener Komponente auf Klick reagieren
 
Egal, ich überschreibe jetzt einfach MouseUp. Die OH ist schon recht gut, nur unter den Methoden von TCustomControl stand das AFAIR nicht drin. Ist ja egal, es geht jetzt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:17 Uhr.
Seite 1 von 2  1 2      

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