![]() |
Mausbotschaft von CollectionItem an Komponente übergeben
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ein besserer Titel ist mir leider nicht eingefallen, hoffe man versteht trotzdem was ich meine. Bin immer noch am entwickeln meiner ersten Komponente, stehe aber im Moment gerade vor dem nächsten Problem. Zur Zeit verwende ich folgenden Source, um die Mausbotschaften MouseOver und MouseLeave meiner Items an die Komponente DateLine zu übergeben.
Delphi-Quellcode:
Nun möchte ich auch MouseDown, MouseUp usw. übergeben.TControlDateItem = class(TGraphicControl) private FOnMouseOver : TNotifyEvent; FOnMouseLeave : TNotifyEvent; procedure MouseOver(var Message : TMessage); message CM_MOUSEENTER; procedure MouseLeave(var Message : TMessage); message CM_MOUSELEAVE; ... published property OnMouseOver : TNotifyEvent read FOnMouseOver write FOnMouseOver; property OnMouseLeave : TNotifyEvent read FOnMouseLeave write FOnMouseLeave; ... end; TDateLine = class(TCustomGrid) private FItemMouseOver : TNotifyEvent; FItemMouseLeave : TNotifyEvent; procedure ItemMouseOver(Sender : TObject); procedure ItemMouseLeave(Sender : TObject); ... published property OnItemLeave : TNotifyEvent read FItemMouseLeave write FItemMouseLeave; property OnItemDown : TMouseEvent read FItemMouseDown write FItemMouseDown; ... end; procedure TDateLine.UpdateItem(Item : TDateItem); begin if Item <> nil then begin with Item.FControlDateItem do begin OnMouseOver := ItemMouseOver; OnMouseLeave := ItemMouseLeave; end; end; end; Ich denke mal, daß ich mit folgendem Source auf dem richtigen Weg bin.
Delphi-Quellcode:
Die Zuweisung
TControlDateItem = class(TGraphicControl)
private FOnMouseDown : TMouseEvent; procedure MouseDown(Button: TMouseButton; Shift: TShiftState;X, Y: Integer); override; ... published property OnMouseDown : TMouseEvent read FOnMouseDown write FOnMouseDown; ... end; TDateLine = class(TCustomGrid) private FItemMouseDown : TMouseEvent; procedure ItemMouseDown(Button: TMouseButton; Shift: TShiftState;X, Y: Integer); ... published property OnItemDown : TMouseEvent read FItemMouseDown write FItemMouseDown; ... end;
Delphi-Quellcode:
funktioniert natürlich nicht da noch die Parameter
procedure TDateLine.UpdateItem(Item : TDateItem);
begin if Item <> nil then begin with Item.FControlDateItem do begin ... OnMouseDown := ItemMouseDown; end; end; end; (Button: TMouseButton; Shift: TShiftState;X, Y: Integer); übergeben werden müssen, und hier liegt mein Problem wie sollte die Syntax genau aussehen? Danke schonmal an alle die sich dieses Problems annehmen. Uwe |
Re: Mausbotschaft von CollectionItem an Komponente übergeben
Nach 5 Std fiel mir gestern auf, daß auch ohne Übergabe der Mausbotschaft an die Komponente das Item auf click reagiert. Allerdings nur auf die rechte und die mittlere Taste.
Weiss vielleicht zufällig jemand warum?? Uwe |
Re: Mausbotschaft von CollectionItem an Komponente übergeben
Kennt vielleicht jemand eine ähnliche Komponente, wo ich es mir anschauen kann wie es dort gelöst wurde.
Uwe |
Re: Mausbotschaft von CollectionItem an Komponente übergeben
:gruebel: Wirklich keiner eine winzige Idee?
Sorry, diesen push mache ich wirklich ungerne und werde den Thread nächste Woche trotzdem auf beantwortet setzen, egal ob bis dahin eine Resonanz erfolgt ist. Uwe |
Re: Mausbotschaft von CollectionItem an Komponente übergeben
Hallo Uwe,
die Signatur von TMouseEvent() hat Sender: TObject als ersten Parameter - bei deinen Prozeduren MouseDown() und ItemMouseDown() fehlt dieser wichtige Parameter. Welchen Zweck verfolgst du mit der private method TDateLine.ItemMouseDown()?
Delphi-Quellcode:
Wenn du dem Entwickler erlauben möchtest einen eigenen Event-Handler für das OnMouseDown-Event bereit zu stellen, dann solltest du nur eine Hülle bereitstellen. Die Technik kannst du beim OnMouseDown-Event von TControl studieren. Der Message-Handler ruft eine Prozedur DoMouseDown() auf - das ist die Hülle - und dort wird dann geprüft, ob der Entwickler der puslished property OnMouseDown einen eigenen Handler zugewiesen hat.
type
TDateLine = class(TCustomGrid) private FOnItemMouseDown: TMouseEvent; // procedure ItemMouseDown() muss hier weg, sie wird später vom // Entwickler als Methode derjenigen Form vereinbart, welche TDateLine // beherbergt. published property OnItemMouseDown: TMouseEvent read FOnItemMouseDown write FOnItemMouseDown; end; Grüße vom marabu |
Re: Mausbotschaft von CollectionItem an Komponente übergeben
Hallo Marabu,
erstmal Danke für die Antwort. Wie ich in meinem 2ten Posting hier geschrieben habe, fiel mir auf das ich in meinem ControlDateItem, MouseDown auch einfach nur überschreiben kann.
Delphi-Quellcode:
Die procedure MouseDown wird auch aufgerufen reagiert allerdings nur auf mittlere und rechte Maustaste.
TControlDateItem = class(TGraphicControl)
private procedure MouseDown(Button: TMouseButton; Shift: TShiftState;X, Y: Integer); override; ... end;
Delphi-Quellcode:
Das verwirrt mich etwas.
procedure TControlDateItem.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
Y: Integer); begin inherited; ShowMessage('Mouse Down'); end; Mein erster Gedanke war, dass ich es genauso lösen müsste wie bei MouseOver, MouseLeave. Ich denke aber inzwischen das brauche ich hier nicht da es ja, wenn auch nicht mit der linken Maustaste funktioniert. Gruß Uwe |
Re: Mausbotschaft von CollectionItem an Komponente übergeben
Hallo Uwe,
ich habe den gleichen Fehler wie du gemacht, weil ich deinen zweiten Beitrag überlesen hatte. Nun habe ich mich ein wenig mit dem Thema auseinandergesetzt und komme zu folgender Frage: Warum veröffentlichst du nicht einfach die property OnMouseEvent, anstatt die Methode MouseDown() zu überschreiben?
Delphi-Quellcode:
Wenn ich diese Komponente in meinem Testprogramm nutze, dann wird jede Maustaste korrekt ausgewertet.
unit AppointmentControl;
interface uses SysUtils, Classes, Controls, Themes; type TAppointmentControl = class(TGraphicControl) public constructor Create(Owner: TComponent); override; published property OnMouseDown; end; procedure Register; implementation procedure Register; begin RegisterComponents('Marabu', [TAppointmentControl]); end; constructor TAppointmentControl.Create(Owner: TComponent); begin inherited Create(Owner); ControlStyle := ControlStyle + [csReplicatable]; Width := 165; Height := 117; if ThemeServices.ThemesEnabled then ControlStyle := ControlStyle - [csOpaque] else ControlStyle := ControlStyle + [csOpaque]; end; end. Freundliche Grüße |
Re: Mausbotschaft von CollectionItem an Komponente übergeben
Hi Marabu,
werde ich sofort testen und am Montag gebe ich Bescheid ob es so funktioniert. Vielen Dank und Schönes Wochenende Uwe |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:45 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