Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

NicoDE 23. Jun 2004 18:45

Re: Hamsterlaufrad ääh Mauslaufrad
 
Zitat:

Zitat von Schneck
ich glaub, ich muss aufgeben

Jetzt schon ?-)

Hast Du denn schon...
Delphi-Quellcode:
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;
...probiert?

Schneck 23. Jun 2004 20:58

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

NicoDE 23. Jun 2004 22:01

Re: Hamsterlaufrad ääh Mauslaufrad
 
Zitat:

Zitat von Schneck
aber der Tipp mit dem "TWMMouseWheel", "WM_MOUSEWHEEL", u.s.w. liefert nur die Fehlermeldungen "undefinierter Bezeichner";

In die uses-Liste die unit Messages aufnehmen.

Schneck 24. Jun 2004 18:18

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

Gruß Schneck

NicoDE 24. Jun 2004 18:37

Re: Hamsterlaufrad ääh Mauslaufrad
 
Zitat:

Zitat von Schneck
Woher weiß wer sowas?

Mischung aus Zufall, Erfahrung und in-DP-gelesen :D

Zum Problem: sieh Dir mal folgendes Beispiel an...
Delphi-Quellcode:
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;
...wie man schon an der Nomenklatur erkennt, ist FWheelAccumulator eine private Variable der Klasse.


Gruss Nico

ps: hab hier kein Delphi zum Testen, sorry

Schneck 24. Jun 2004 21:25

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

NicoDE 24. Jun 2004 22:21

Re: Hamsterlaufrad ääh Mauslaufrad
 
edit: siehe unten

NicoDE 24. Jun 2004 23:19

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

Schneck 25. Jun 2004 15:12

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:

phlux 25. Jun 2004 16:26

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.
Seite 2 von 3     12 3      

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