Delphi-PRAXiS
Seite 1 von 3  1 23      

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 Hamsterlaufrad ääh Mauslaufrad (https://www.delphipraxis.net/24553-hamsterlaufrad-aeaeh-mauslaufrad.html)

Schneck 22. Jun 2004 20:50


Hamsterlaufrad ääh Mauslaufrad
 
Hallilallo,

ich bin ziemlich neu hier, hab mich bisher mehr schlecht als recht als Einzelkämpfer durchgeschlagen (es gibt gar nicht so viele Delphianer!) und bleib regelmäßig mal hier mal dort im Programmcode stecken ..., bin so etwa in der Phase eines ganz leicht fortgeschrittenen Anfängers.

Meine hoffnungslose Situation: Ich habe eine Komponente TZeichenBlatt von TImage abgeleitet. Wenn ich mit der Maus über die fertige Komponente fahre, soll beim Mausraddrehen gezoomt werden. Ich möchte nicht nur das OnMouseWheel Ereignis im Objektinspektor sehen, sondern ich möchte auch, dass das dann funktioniert, ohne dass ich eine entsprechende Procedure erst schreiben muss, NACHDEM ich meine Komponente auf Form1 plaziert habe; der Code soll schon im Quelltext der Komponente drinnen sein; ich glaube man sagt dazu, ein Ereignis zur Laufzeit realisieren (?).

Frage: Wie kann ich auf das OnMouseWheel Ereignis zugreifen? Das OnClick Ereignis ist ja bei TImage standartmäßig dabei, aber das OnMouseWheel nicht! Kann ich es irgendwie von TControl ableiten? Wie geht das? Hab auch schon untenstehendes versucht, aber auf das Mausrad ragiert nix!!!!!!!! Es tut sich überhaupt nix, nix, nix!-((( Wie kann ich tun, dass irgendetwas auf mein Mauslaufrad reagiert?

Ich hab sicher einen easycollen extrasimplen Fehler oder ein IQ-Problem!
Vielleich kann mir jemand helfen, damit ich nicht den ganzen Tag :wall:

Danke feste
Schneck



Delphi-Quellcode:

type
TMausAnzeige = procedure(Sender: TObject; Shift: TShiftState; X, Y: Integer) of Object;
TZeichenBlatt = class(TImage)
  private
    procedure MausDrehen(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
   ...
  protected
   ...
  public
   ...
  published
    Property OnMouseWheel;
   ...


...

procedure TZeichenblatt.MausDrehen(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
   if WheelDelta > 0 then ShowMessage('ää');
   Canvas.TextOut(10,10,'hjhjhhjhgjkghk');
   Handled := True;
end;

constructor TZeichenBlatt.Create(aOwner: TComponent);
begin
  inherited create(aOwner);
...
  OnMouseWheel := Mausdrehen;
..
end;

...

Skiron 22. Jun 2004 21:01

Re: Hamsterlaufrad ääh Mauslaufrad
 
Delphi-Quellcode:
...
protected
  procedure MeinVerstecktesOnMouseWheel(...)
  fOnMouseWheel: ...
published
  property OnMouseWheel: ...

constructor TZeichenBlatt.Create(...)
begin
  inherited OnMouseWheel := MeinVersteckesOnMouseWheel;
end;

procedure MeinVersteckesOnMouseWheel(...)
begin
  if assigned(OnMouseWheel) then
    fOnMouseWheel(...);
end;
Is etwas komisch geschrieben, aber hier die Erklärung:
du überschreibst zwar das alte OnMouseWheel, kannst es aber noch mit inherited ansprechen!
In deinem OnMouseWheel musst du halt noch eventuell das von Benutzer verwendete OnMouseWheel aufrufen!

Schneck 22. Jun 2004 21:20

Re: Hamsterlaufrad ääh Mauslaufrad
 
Hallo da bin ich wieder,

geht leider immer noch nicht, ist da noch was faul? Es tut sich immer noch nix...

Delphi-Quellcode:

type
  TMausAnzeige = procedure(Sender: TObject; Shift: TShiftState; X, Y: Integer) of Object;
  TZeichenBlatt = class(TImage)
  private
... protected
    fOnMouseWheel: TMouseWheelEvent;
    procedure MausDrehen(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
...
  public
    constructor Create(aOwner: TComponent); override;
...
  published
    property OnMouseWheel: TMouseWheelEvent Read fOnMouseWheel Write fOnMouseWheel;
...
  end;



...


procedure TZeichenblatt.MausDrehen(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
    if assigned(OnMouseWheel) then
    fOnMouseWheel(Sender, Shift, WheelDelta, MousePos, Handled);

   if WheelDelta > 0 then ShowMessage('ää');
   Canvas.TextOut(10,10,'hjhjhhjhgjkghk');
end;


...


constructor TZeichenBlatt.Create(aOwner: TComponent);
begin
  inherited create(aOwner);
...
  inherited OnMouseWheel := Mausdrehen;
end;

Skiron 22. Jun 2004 21:37

Re: Hamsterlaufrad ääh Mauslaufrad
 
Hast du schon mal probiert, ob das MouseWheel-Event vom Formular funzt?
Bei mir gabs mal das Problem, dass es da nicht funktioniert hat!
Am Source dürfte eigentlich nichts fehlen! (glaub ich halt!)

Schneck 22. Jun 2004 21:44

Re: Hamsterlaufrad ääh Mauslaufrad
 
Was heißt funzen:?:

Skiron 22. Jun 2004 21:52

Re: Hamsterlaufrad ääh Mauslaufrad
 
funzen = funktionieren

w3seek 23. Jun 2004 01:01

Re: Hamsterlaufrad ääh Mauslaufrad
 
nur zur information, WM_MOUSEWHEEL messages werden nur an das Fenster geschickt, das den Eingabefokus hat!

NicoDE 23. Jun 2004 01:10

Re: Hamsterlaufrad ääh Mauslaufrad
 
Zitat:

Zitat von w3seek
nur zur information, WM_MOUSEWHEEL messages werden nur an das Fenster geschickt, das den Eingabefokus hat!

Ich würde eher in Richtung Component-Messages (CM_Xxx) forschen (da die VCL die Nachrichten auch an die Komponenten/Childs verteilt) -> CM_MOUSEWHEEL ?

ps: CM_Xxx entsprechen nicht unbedingt 'durchgereichten' Windows-Nachrichten (das sind eher die CN_Xxx)

Schneck 23. Jun 2004 18:31

Re: Hamsterlaufrad ääh Mauslaufrad
 
ojeoje, da steig ich voll aus.

Und übigens, mein Form1 funzt schon, auch der Objektinspektor der Komponente TZeichenBlatt zeigt jetzt OnMouseWheel an, aber wenn ich beim OnMouseWheel-Ereignis vom Form1 eine Prozedur einfüge, funzt immer nur die Procedur vom Form1, auch wenn ich im OnMouseWheel vom ZeichenBlatt eine andere Procedure einfüge, diese wird immer ignoriert. :(

Danke jedenfalls für die vielen Tipps, ich glaub, ich muss aufgeben

Schnief Schneck

phlux 23. Jun 2004 18:40

Re: Hamsterlaufrad ääh Mauslaufrad
 
Hi! :hi:

Meines wissens nach musst du einfach mal für deine Kompo ein Nachrichtenfenster erstellen das dann die Msg vom Mausrad (ka wie die jetzt heißt) abfragt, dann noch gucken ob die Maus innerhalb deiner Kompo ist und schon kannst den Event drum herum basteln ;)

mfg phlux :hi:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:19 Uhr.
Seite 1 von 3  1 23      

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