AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Hamsterlaufrad ääh Mauslaufrad

Ein Thema von Schneck · begonnen am 22. Jun 2004 · letzter Beitrag vom 12. Jul 2004
Antwort Antwort
Seite 2 von 3     12 3   
NicoDE
(Gast)

n/a Beiträge
 
#11

Re: Hamsterlaufrad ääh Mauslaufrad

  Alt 23. Jun 2004, 19:45
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?
  Mit Zitat antworten Zitat
Schneck

Registriert seit: 22. Jun 2004
18 Beiträge
 
Delphi 7 Personal
 
#12

Re: Hamsterlaufrad ääh Mauslaufrad

  Alt 23. Jun 2004, 21:58
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. 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
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#13

Re: Hamsterlaufrad ääh Mauslaufrad

  Alt 23. Jun 2004, 23:01
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.
  Mit Zitat antworten Zitat
Schneck

Registriert seit: 22. Jun 2004
18 Beiträge
 
Delphi 7 Personal
 
#14

Re: Hamsterlaufrad ääh Mauslaufrad

  Alt 24. Jun 2004, 19:18
Hallo,
großes Dankeschön für den coolen geheimen Messages-Tipp, fetzt funzt es FAST! 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
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#15

Re: Hamsterlaufrad ääh Mauslaufrad

  Alt 24. Jun 2004, 19:37
Zitat von Schneck:
Woher weiß wer sowas?
Mischung aus Zufall, Erfahrung und in-DP-gelesen

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
  Mit Zitat antworten Zitat
Schneck

Registriert seit: 22. Jun 2004
18 Beiträge
 
Delphi 7 Personal
 
#16

Re: Hamsterlaufrad ääh Mauslaufrad

  Alt 24. Jun 2004, 22:25
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.

Oh Schreck
ein Schneck
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#17

Re: Hamsterlaufrad ääh Mauslaufrad

  Alt 24. Jun 2004, 23:21
edit: siehe unten
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#18

Re: Hamsterlaufrad ääh Mauslaufrad

  Alt 25. Jun 2004, 00:19
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
  Mit Zitat antworten Zitat
Schneck

Registriert seit: 22. Jun 2004
18 Beiträge
 
Delphi 7 Personal
 
#19

Re: Hamsterlaufrad ääh Mauslaufrad

  Alt 25. Jun 2004, 16:12
Hallo Nico,
der neue Code ist viel cooler, den würd ich auch besser verstehen, mein Compiler tut das aber nicht. 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
  Mit Zitat antworten Zitat
Benutzerbild von phlux
phlux

Registriert seit: 4. Nov 2002
Ort: Witten
1.335 Beiträge
 
Delphi 6 Personal
 
#20

Re: Hamsterlaufrad ääh Mauslaufrad

  Alt 25. Jun 2004, 17:26
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
Christian "phlux" Arndt
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 06:06 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