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/)
-   -   Delphi Mausbotschaft von CollectionItem an Komponente übergeben (https://www.delphipraxis.net/83655-mausbotschaft-von-collectionitem-komponente-uebergeben.html)

uwewo 5. Jan 2007 12:43


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:

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;
Nun möchte ich auch MouseDown, MouseUp usw. übergeben.
Ich denke mal, daß ich mit folgendem Source auf dem richtigen Weg bin.

Delphi-Quellcode:
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;
Die Zuweisung

Delphi-Quellcode:
procedure TDateLine.UpdateItem(Item : TDateItem);
begin
if Item <> nil then
    begin
     with Item.FControlDateItem do
      begin
...      
       OnMouseDown := ItemMouseDown;
      end;
    end;    
end;
funktioniert natürlich nicht da noch die Parameter
(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

uwewo 6. Jan 2007 14:28

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

uwewo 10. Jan 2007 08:07

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

uwewo 12. Jan 2007 11:29

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

marabu 12. Jan 2007 12:06

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

Grüße vom marabu

uwewo 12. Jan 2007 12:41

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:
  TControlDateItem = class(TGraphicControl)
  private
   procedure MouseDown(Button: TMouseButton; Shift: TShiftState;X, Y: Integer); override;
...
end;
Die procedure MouseDown wird auch aufgerufen reagiert allerdings nur auf mittlere und rechte Maustaste.

Delphi-Quellcode:
procedure TControlDateItem.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
  Y: Integer);
begin
  inherited;
  ShowMessage('Mouse Down');
end;
Das verwirrt mich etwas.

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

marabu 12. Jan 2007 13:48

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:
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.
Wenn ich diese Komponente in meinem Testprogramm nutze, dann wird jede Maustaste korrekt ausgewertet.

Freundliche Grüße

uwewo 13. Jan 2007 16:29

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