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 Bescheuertes Mausrad! (https://www.delphipraxis.net/25208-bescheuertes-mausrad.html)

Schneck 2. Jul 2004 20:14


Bescheuertes Mausrad!
 
Hallo,

seit einer kleinen Ewigkeit such ich nach einem Weg, das Mauslaufrad in einer von TImage abgeleiteten Komponente verwenden zu können. Hiermit versuch ich in diesem Forum mein Glück in einem zweiten Anlauf. Bei meinem ersten Versuch erhielt ich viele gute Tipps, aber noch keinen Durchbruch. Vielleicht kann mir ja doch noch jemand helfen?! Bisher bin ich folgende zwei Wege gegangen:
  • Ich versuchte das Ereignis durch überschreiben der DoMouseWheel-Funktion auszulösen, die meine Komponente von TImage und diese weiter von TControl geerbt haben sollte.
  • Ich versuchte das Ereignis durch die Windows-Message WM_MOUSEWHEEL auszulösen
Beim Überschreiben der DoMouseWheel-Funktion passiert beim MousWheelen überhaupt nix.
Beim WM_MOUSEWHEEL-Messagen passiert schon etwas, aber nicht das richtige: das Ereignis wird nur ausgelöst, wenn ich mit der Maus an einer Stelle bin, an der sich meine abgeleitete Komponente befinden würde, wenn das Form-Fenster auf dem sie sitzt, im Vollbildmodus wäre und keinen Titelbalken hätte, wenn ich das Fenster aber verkleinere und verschiebe, dann reagiert das Mausrad, wenn ich beispielweise mit der Maus nichteinmal über dem Formularfester bin. Undsoweiterundsofortundundunduffichbinamende :kotz: Beim Überschreiben der Click-Methode gibt es keine Probleme. Aber versucht es mal selbst aus, unten ist der vollständige SourceCode zum kopieren ...

Damit sich ein ExpertenSuperProfi meiner ohne viel Mühe annehmen kann hier meine komplette Komponente Versuch 1:

Delphi-Quellcode:
unit MZBlatt_TEST1;

interface

uses
   Classes, ExtCtrls, WinTypes, Dialogs, Controls, Messages;

type
  TZeichenBlatt_TEST1 = class(TImage)
  private
  protected
    function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    constructor Create(aOwner: TComponent); override;
  published
    property OnMouseWheel;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Test', [TZeichenBlatt_TEST1]);
end;

constructor TZeichenBlatt_TEST1.Create(aOwner: TComponent);
begin
  inherited create(aOwner);

end;

procedure TZeichenBlatt_TEST1.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  inherited MouseDown(Button, Shift, X, Y);
  ShowMessage('Funzt gut: MoiseleKlickGehtSupertoll');
end;

function TZeichenBlatt_TEST1.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean;
begin
    ShowMessage('Nix tut sich Vorher: DräDichDräDichRäädchen');
    Result := inherited DoMouseWheel(Shift, WheelDelta, MousePos);
    ShowMessage('Nix tut sich Nacher: HasteDichGutGeräätMeinRäädchen');
end;

end.
Und hier meine komplette Komponente Versuch 2:

Delphi-Quellcode:
unit MZBlatt_TEST1;

interface

uses
   Classes, ExtCtrls, WinTypes, Dialogs, Controls, Messages;

type
  TZeichenBlatt_TEST1 = class(TImage)
  private
  protected
    procedure WMMausli(var Message: TWMMouseWheel); message WM_MouseWheel;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    constructor Create(aOwner: TComponent); override;
  published
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Test', [TZeichenBlatt_TEST1]);
end;

constructor TZeichenBlatt_TEST1.Create(aOwner: TComponent);
begin
  inherited create(aOwner);
end;

procedure TZeichenBlatt_Test1.WMMausli(var Message: TWMMouseWheel);
begin
    ShowMessage('Mäuli an der faschen Stelle: DräDichDräDichRäädchen');
end;

procedure TZeichenBlatt_TEST1.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  inherited MouseDown(Button, Shift, X, Y);
  ShowMessage('Funzt guuut: MoiseleKlickGehtSupertoll');
end;

end.

Ich bin mit meinem Wissen am Ende.
Freu mich über jeden Tipp!
Schneck

SirThornberry 2. Jul 2004 21:15

Re: Bescheuertes Mausrad!
 
Hab grad einfach mal vesucht die Mousewheelmessage abzufangen und hat geklappt
Delphi-Quellcode:
type
  TOwnImg = class(TImage)
  private
    procedure FOnMouseWheel(var AMsg: TWMMouseWheel); message WM_MOUSEWHEEL;
  end;
[...]
procedure TOwnImg.FOnMouseWheel(var AMsg: TWMMouseWheel);
begin
  //das was passieren soll wenns mousewheel betätigt wird
end;

NicoDE 2. Jul 2004 21:26

Re: Bescheuertes Mausrad!
 
Komisch dass es bei ihm nicht funktioniert... (laut Profil hat er ja auch Delphi 7 ... Updates, andere Komponenten auf der Form?)

SirThornberry 2. Jul 2004 21:31

Re: Bescheuertes Mausrad!
 
Naja, ich habs gar nicht erst mit überschreiben probiert, geht doch viel einfacher die message selbst abzufangen...

Schneck 3. Jul 2004 11:51

RienNeWaPlü
 
Danke der Anteilnahme...

Ich weiß auch nicht was los ist. Jedenfalls Danke der Information, dass es auf anderen Rechnern geht. Bei mir läuft Windows XP Home inkl. ServicePack 1, Delphi 7 Personal hab ich vor ca. 1/2 bis 3/4 Jahr gekauft, bisher abeer nie registrieren lassen und auch nicht upgedatet. Kann es daran liegen? Wie geht das mit dem Registrieren überhaupt und kann ich als Billignutzer der Personal-Version überhaupt updaten, wie steht's mit den Update 7.1?
Jedenfalls hab ich den Code von SirThornberry 1:1 ausprobiert, und immer der gleiche Fehler :evil: Ich habe eine billige 2-Tastenmaus mit Rad (wär cool, wenn sie keines hätte, das würde vieles erklären :lol: ) und unten steht sowas wie Logitech ... sollte alles ok sein?!

Was empfieht Ihr:
Aufgeben?
Delphi neu installieren?
Updaten?
Irgendwelche Einstellungen ändern?
Coputer auf den Müll und ab in den Urwald?

Schneck
ist ratlos

w3seek 3. Jul 2004 12:34

Re: Bescheuertes Mausrad!
 
WM_MOUSEWHEEL messages werden nur dann geschickt wenn das control den Eingabefokus hat, egal wo sich die Maus befindet!

Christian Seehase 3. Jul 2004 13:45

Re: Bescheuertes Mausrad!
 
Moin SirThornberry,

wenn Du es mit Deiner D7 EE probiert hast, scheint es ein Problem der Personal Versionen zu sein.
Weder mit D6 PE, noch mit D7 PE wird die WM_MOUSEWHEEL Routine aufgerufen, bei D5 Pro funktioniert es hingegen :shock: :gruebel:

Schneck 4. Jul 2004 20:45

Re: Bescheuertes Mausrad!
 
Auch wenn's nicht mein Problem gelöst hat:
Mittlerweile zeifle ich nicht mehr an meinen bescheidenen Programmierkenntnissen, sondern eher an meiner Delphiversion! Sollte jemand mit seiner D7 PE Version beim MouseWheelen bei einer abgeleiteten Komponente Erfolg haben, bitte mich wissen lassen, dann muß ich meine Weltanschauung nochmals überdenken ...
Danke all Euren Beiträgen,
hab sehr viel dazugelernt
Schneck :cheers:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:55 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