![]() |
Re: Hamsterlaufrad ääh Mauslaufrad
Zitat:
Hast Du denn schon...
Delphi-Quellcode:
...probiert?
type
TZeichenblatt = class(TImage) private procedure WMMouseWheel(var Message: TWMMouseWheel); message = WM_MOUSEWHEEL; procedure CMMouseWheel(var Message: TCMMouseWheel); message = CM_MOUSEWHEEL; //... end; //... procedure TZeichenBlatt.WMMouseWheel(var Message: TWMMouseWheel); begin with TMessage(Message) do begin TCMMouseWheel(Message).ShiftState := KeysToShiftState(Message.Keys); Result := Perform(CM_MOUSEWHEEL, WParam, LParam); end; end; procedure TZeichenBlatt.CMMouseWheel(var Message: TCMMouseWheel); begin //... end; |
Re: Hamsterlaufrad ääh Mauslaufrad
Huhu,
hab noch nicht aufgegeben ... aber der Tipp mit dem "TWMMouseWheel", "WM_MOUSEWHEEL", u.s.w. liefert nur die Fehlermeldungen "undefinierter Bezeichner"; übersteigt auch meinen begrenzten Programmierhorizont. In der Dephi-Hilfe ist auch nix näheres dazu zu finden und meine Delphibiebel von Doberenz (Programmierenlernen mit BD7, und das Kochbuch zu BD7) schweigen sich auch aus. :pale: Können die Fehlermeldungen daran liegen dass meine Personal 7 Version zu billig war? Aber ich glaub es nicht, gibt es wirklich keinen easy einfachen Trick mit normalen Mitteln auf das ONMousWheelEvent zuzugreifen? Gruß Schneck |
Re: Hamsterlaufrad ääh Mauslaufrad
Zitat:
|
Re: Hamsterlaufrad ääh Mauslaufrad
Hallo,
großes Dankeschön für den coolen geheimen Messages-Tipp, fetzt funzt es FAST! :wink: Da ist aber noch ein großes Problem: Auf das Mauslaufraddrehen reagiert nun endlich das Programm, aber NICHT wenn ich genau über der Komponente TZeichenBlatt bin, sondern irgendwo weiter oben links, ich bin dann nichteinmal mehr über dem Formular, aber beim MausWheelen reagierte es fröhlich weiter und weiter rechts und unten geht nix?! Weis da noch jemand Hilfe? Mein orginaler Quelltext schaut jetzt so aus:
Delphi-Quellcode:
Hat jemand vielleicht auch einen guten Link, wo ein FastAnfänger auf verständliche Weise etwas über das da lernen kann, was da oben im Quelltext steht. Die Messages-Unit ist nichteinal in der Delphi-Hilfe enthalten; und ich hab keine Ahnung was die WM... und CM... und LParam und und und sind. Woher weiß wer sowas?
...
uses SysUtils, Classes, Controls, ExtCtrls, ... Messages; ... type TZeichenBlatt = class(TImage) private ... procedure WMMouseWheel(var Message: TWMMouseWheel); message WM_MOUSEWHEEL; procedure CMMouseWheel(var Message: TCMMouseWheel); message CM_MOUSEWHEEL; ... procedure TZeichenBlatt.WMMouseWheel(var Message: TWMMouseWheel); begin with TMessage(Message) do begin TCMMouseWheel(Message).ShiftState := KeysToShiftState(Message.Keys); Result := Perform(CM_MOUSEWHEEL, WParam, LParam); end; end; procedure TZeichenBlatt.CMMouseWheel(var Message: TCMMouseWheel); begin Canvas.TextOut(100,20,Format('WheelDelta = %d',[Message.WheelDelta])); Canvas.TextOut(100,50,Format('xPos = %d; yPos = %d',[Message.XPos,Message.YPos])); end; ... Gruß Schneck |
Re: Hamsterlaufrad ääh Mauslaufrad
Zitat:
Zum Problem: sieh Dir mal folgendes Beispiel an...
Delphi-Quellcode:
...wie man schon an der Nomenklatur erkennt, ist FWheelAccumulator eine private Variable der Klasse.
procedure TZeichenBlatt.CMMouseWheel(var Message: TCMMouseWheel);
var MousePos: TPoint; IsNeg: Boolean; procedure MouseWheelUp(); begin //... DoScroll(WHEEL_DELTA); end; procedure MouseWheelDown(); begin //... DoScroll(-WHEEL_DELTA); end; begin MousePos := SmallPointToPoint(Message.Pos); Inc(FWheelAccumulator, Message.WheelDelta); while (Abs(FWheelAccumulator) >= WHEEL_DELTA) do begin IsNeg := FWheelAccumulator < 0; FWheelAccumulator := Abs(FWheelAccumulator) - WHEEL_DELTA; if (IsNeg) then begin if (FWheelAccumulator <> 0) then FWheelAccumulator := -FWheelAccumulator; MouseWheelDown(); end else MouseWheelUp(); end; end; Gruss Nico ps: hab hier kein Delphi zum Testen, sorry |
Re: Hamsterlaufrad ääh Mauslaufrad
Hallo Nico,
der neue Code funktioniert gut, das Problem ist damit aber nicht behoben. Ich hab ein bischen herumgetestet und jetzt kann ich es genauer beschreiben: Das Programm reagiert auf das Mauslaufraddrehen nur dann, wenn ich mit der Maus über einem Gebiet bin, das mein ZeichenBlatt ausfüllen würde, wenn es die Positionskoordinaten (Left und Top) nicht vom Formular sondern vom Bilschirm hätte. Also wenn ich das Formular (auf dem sich z. B. irgendwo links oben mein ZeichenBlatt befindet) als Vollbild vergrößere, dann stimmt alles relativ gut überein, hier ist nur eine vertikale Diskrepanz in der Größenordnung der Formularkopfleistenhöhe vorhanden (das Programm reagiert bereits wenn ich z. B. um die Formularkopfleistenhöhe höher oben als der obere Rand des ZeichenBlattes bin); wenn ich das Formular aber verkleinere und z. B. nach links unten schiebe, hab ich immernoch das Porblem dass ich mit der Maus auf dem Bildschirm rechts oben sein muss um eine Reaktion auf das Mausraddrehen zu erhalten, auch wenn das Formular ganz wo anders ist, geschweige denn das ZeichenBlatt. Igendwie glaubt das Programm, dass der Parent vom ZeichenBlatt nicht das Formular sonder der Bildschirm ist. Meine Testtexte schreibt das Programm aber brav ins Canvas vom ZeichenBlatt. :freak: Oh Schreck ein Schneck |
Re: Hamsterlaufrad ääh Mauslaufrad
edit: siehe unten
|
Re: Hamsterlaufrad ääh Mauslaufrad
OK, Delphi ist installiert und es sieht nicht mehr so aufwendig aus...
Laut der Hilfe sollte es ausreichen DoMouseWheel (von TControl geerbt) zu überschreiben:
Delphi-Quellcode:
type
TZeichenBlatt = class(TImage) protected function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; override; published property OnMouseWheel; end; function TZeichenBlatt.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; begin //... hier die Aktionen VOR einem eventuellen OnMouseWheel[Down|Up] Result := inherited DoMouseWheel(Shift, WheelDelta, MousePos); //... hier die Aktionen NACH einem eventuellen OnMouseWheel[Down|Up] end; Gruss Nico |
Re: Hamsterlaufrad ääh Mauslaufrad
Hallo Nico,
der neue Code ist viel cooler, den würd ich auch besser verstehen, mein Compiler tut das aber nicht. :gruebel: Ich hab jetzt meine Komponente total auf Minimaltestversion abgespeckt, und der vollständige Code steht unten: Alles was die Kompo soll ist beim Mauslaufradwheelen eine Botschaft rausgeben ... aber nix und wiedernix! Hast Du noch eine Ahnung was da faul sein kann?
Delphi-Quellcode:
unit MZBlatt_TEST1;
interface uses Classes, ExtCtrls, WinTypes, Dialogs; type TZeichenBlatt_TEST1 = class(TImage) private protected function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; override; public 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; function TZeichenBlatt_TEST1.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; begin ShowMessage('Vorher: DräDichDräDichRäädchen'); Result := inherited DoMouseWheel(Shift, WheelDelta, MousePos); ShowMessage('Nacher: HasteDichGutGeräätMeinRäädchen'); end; end. Der Schneck verreckt :pale: |
Re: Hamsterlaufrad ääh Mauslaufrad
Hi Schneck!
Ist nur so ne Frage, hast du wenn du das Zeichenblatt auf deine Form droppst auch nochmal ein Event für das erstellte Object geschrieben, denn wenn kein Event erstellt wurde kann auch der Code in der Komponente nicht ausgeführt werden, hoffe ich du verstehst was ich meine ;) mfg phlux :hi: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 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