AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Mausbotschaft von CollectionItem an Komponente übergeben
Thema durchsuchen
Ansicht
Themen-Optionen

Mausbotschaft von CollectionItem an Komponente übergeben

Ein Thema von uwewo · begonnen am 5. Jan 2007 · letzter Beitrag vom 13. Jan 2007
Antwort Antwort
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#1

Mausbotschaft von CollectionItem an Komponente übergeben

  Alt 5. Jan 2007, 13:43
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
Miniaturansicht angehängter Grafiken
dateline_963.jpg  
Uwe
  Mit Zitat antworten Zitat
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Mausbotschaft von CollectionItem an Komponente übergeben

  Alt 6. Jan 2007, 15:28
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
Uwe
  Mit Zitat antworten Zitat
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Mausbotschaft von CollectionItem an Komponente übergeben

  Alt 10. Jan 2007, 09:07
Kennt vielleicht jemand eine ähnliche Komponente, wo ich es mir anschauen kann wie es dort gelöst wurde.

Uwe
Uwe
  Mit Zitat antworten Zitat
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Mausbotschaft von CollectionItem an Komponente übergeben

  Alt 12. Jan 2007, 12:29
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
Uwe
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Mausbotschaft von CollectionItem an Komponente übergeben

  Alt 12. Jan 2007, 13:06
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
  Mit Zitat antworten Zitat
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Mausbotschaft von CollectionItem an Komponente übergeben

  Alt 12. Jan 2007, 13:41
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
Uwe
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Mausbotschaft von CollectionItem an Komponente übergeben

  Alt 12. Jan 2007, 14:48
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
  Mit Zitat antworten Zitat
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Mausbotschaft von CollectionItem an Komponente übergeben

  Alt 13. Jan 2007, 17:29
Hi Marabu,

werde ich sofort testen und am Montag gebe ich Bescheid ob es so funktioniert.

Vielen Dank und Schönes Wochenende

Uwe
Uwe
  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 04:49 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