MouseWheelUp/Down

Rund um die LCL und andere Komponenten
Antworten
Bernd
Beiträge: 27
Registriert: Mo 11. Jun 2007, 10:12
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

MouseWheelUp/Down

Beitrag von Bernd »

Hallo
Ich benötige das MouseWheelUp/Down Ereignis in einer Komponente. Nun habe ich dieses Ereignis nur auf dem Form gefunden. Dort funktioniert es auch, aber wenn ich mich mit dem Mauszeiger auf einer Komponente z.B. Label befinde, geht es nicht mehr, da diese Komponente kein MouseWheelUp/Down Ereignis kennt. Gibt es einen Weg, es überall z.B. auf pagecontrol und tabsheet zubenutzen.

Gruß Bernd

Lazarus 0.9.26

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: MouseWheelUp/Down

Beitrag von monta »

Wenns nicht anders geht...wieso nicht Mausposition auswerten, ob sie sich über der Komponente befindet und ansonsten unterdrücken?
Johannes

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: MouseWheelUp/Down

Beitrag von theo »

Kommt halt drauf an was du machen willst.
Prinzipiell ist das MouseWheel Zeug bereits in TControl drin und zum überschreiben bereit.

function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; dynamic;
function DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean; dynamic;
function DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean; dynamic;

Es kann aber gut sein, dass bei gewissen Controls das Widgetset das Event "schluckt". Müsste man halt mit abgeleiteten Klassen ausprobieren.

Bernd
Beiträge: 27
Registriert: Mo 11. Jun 2007, 10:12
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: MouseWheelUp/Down

Beitrag von Bernd »

Danke für die Bestätigung, dass es nicht so einfach geht. Ich möchte mehre Zahlenfelder mit dem Mausscrollrad erhöhen/vermindern, wenn ich mit dem Mauszeiger auf dem Feld stehe. Ist mehr eine technische Bedienhilfe in einem Programm, welches ein Messgerät steuert.

Ich hatte das Mousewheel Ereignis vom Form benutzt, aber wenn der Mauszeiger auf einer anderen Komponente steht passiert eben gar nichts, nur wenn er ins Form selbst zeigt wird es angesprungen. Ich dachte erst an so eine Art "Durchreiche", kann mir aber nicht vorstellen wie das gehen soll :-)

Ich versuche mal eine Komponete zu bauen, die von TControl abgeleitet ist und so etwas kann. Danke theo für den Hinweis, bin nur Hobbyprogrammierer in dieser Sache und überblicke nicht alle Zusammenhänge.
Stelle meine Lösung dann hier rein.

Bernd

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: MouseWheelUp/Down

Beitrag von theo »

Bernd hat geschrieben:Ich versuche mal eine Komponete zu bauen, die von TControl abgeleitet ist und so etwas kann.


Du brauchst nicht bei Adam und Eva anfangen. Das reicht z.B. völlig um ein Label mit MW Events zu kriegen:

Code: Alles auswählen

TWheelLabel=class(TLabel)
 protected
  function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; override;
  function DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean; override;
  function DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean; override;
 end;
 
implementation
 
...

Bernd
Beiträge: 27
Registriert: Mo 11. Jun 2007, 10:12
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: MouseWheelUp/Down

Beitrag von Bernd »

Hallo,
Entschuldigung, war ein paar Tage nicht da und kann das Thema heute erst wieder aufgreifen.

Ich hatte gerade meine Nase in die Bücher/Internet gesteckt und wollte dem Hinweis von theo nachgehen und bei "Adam und Eva" anfangen. Nun habe ich den letzten Eintrag von theo gelesen. Das sieht natürlich viel einfacher aus, ich will aber nicht nur mein Problem lösen sondern auch was lernen.

Nun habe ich aber ein großes Verständnisproblem bei der ganzen Vererbungsgeschichte.
Meine bisherige Annahme war, dass eine Klasse, die von einer anderen Klasse abgeleitet wird auch alle Eigenschaften erbt. Die Klasse TLabel wird aber auch von TControl ( über TGraphicControl -> TCustomLabel -> TLabel ) abgeleitet. Eigentlich müsste Sie die Eigenschaft OnMouseWheelUp usw. doch auch besitzen? Oder ist die "Erbschaft" irgentwo verloren gegangen. Sichtbar sind sie aber nicht mehr, können aber durch Funktionen aus den letzten Beitrag "überschrieben" werden. Da bin ich im Moment etwas durcheinander :(

Nun habe ich, wie theo vorschlägt, die neue Klasse TWheelLabel erzeugt und dem Form mitgegeben. Der Compiler hat nichts dagegen und übersetzt es auch ordentlich aber das Label wird beim Programmlauf nicht sichtbar. Da habe ich wohl noch etwas übersehen.

Code: Alles auswählen

 
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
  TWheelLabel=class(TLabel)
  protected
    function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; override;
    function DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean; override;
    function DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean; override;
  end;
 
var
  Form1 : TForm1;
  wl    : TWheelLabel;
 
implementation
 
{ TForm1 }
function TWheelLabel.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean;
 begin
 end;
function TWheelLabel.DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean;
 begin
 end;
function TWheelLabel.DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean;
 begin
 end;
 
 
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 wl := TWheelLabel.Create(form1);
 wl.Top:= 10;
 wl.Left:= 10;
 wl.Caption:= 'Wheeltest';
 wl.Visible:=true;
end;
 
initialization
  {$I unit1.lrs}
 
end.
 
 


Gruß Bernd

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: MouseWheelUp/Down

Beitrag von Christian »

Die kindklasse erbt auch alle Eigenschaften sie müssen nur nicht sichtbar sein was Theo in seinem beispiel macht ist ja nir sie wieder sichtbar zu machen...
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Bernd
Beiträge: 27
Registriert: Mo 11. Jun 2007, 10:12
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: MouseWheelUp/Down

Beitrag von Bernd »

OK, da muss ich noch mal nachlesen. Habe jetzt so eine ungefähre Ahnung.

Etwas ist mir noch unklar. Wenn ich eine neue Klasse wie z.B. diese TE erzeuge, bekomme ich sie im Form1 nicht zu sehen.

Code: Alles auswählen

 
  TE = class(TEdit);
 
var
  Form1 : TForm1;
  nE    : TE;
 
implementation
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 nE := TE.Create(Form1);
 nE.Top:= 30;
 nE.Left:=10;
 nE.Visible:=true;
 nE.AutoSize:=true;
end;
 
 


Es fehlt also noch was Wichtiges

Bernd

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: MouseWheelUp/Down

Beitrag von theo »

Bernd hat geschrieben:Es fehlt also noch was Wichtiges


Parent setzen.
ne.Parent:=Form1;

Sonst weiss es nicht wohin es gehört.
Create(Form1) sagt nur, wer für die Speicherfreigabe zuständig ist.
Zuletzt geändert von theo am Mo 26. Jan 2009, 11:43, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: MouseWheelUp/Down

Beitrag von theo »

Christian hat geschrieben:Die kindklasse erbt auch alle Eigenschaften sie müssen nur nicht sichtbar sein was Theo in seinem beispiel macht ist ja nir sie wieder sichtbar zu machen...



Durch die Ableitung erhalte ich Zugriff auf die Proteced Methoden welche von TControl geerbt wurden.
Ein Event (welches ich im OI sehe) ist das aber immer noch nicht. Dieses müsste man erst zur Verfügung stellen.
http://www.delphi-treff.de/tutorials/ob ... rs/page/8/

Ich sehe grad: Es geht auch anders: Es sind sogar die Properties in TControl schon da, nur halt protected:

Code: Alles auswählen

 
    property OnMouseWheel: TMouseWheelEvent read FOnMouseWheel write FOnMouseWheel;
    property OnMouseWheelDown: TMouseWheelUpDownEvent read FOnMouseWheelDown write FOnMouseWheelDown;
    property OnMouseWheelUp: TMouseWheelUpDownEvent read FOnMouseWheelUp write FOnMouseWheelUp;


Also sowas


Code: Alles auswählen

TWheelLabel=class(TLabel)
  published
    property OnMouseWheel;
    property OnMouseWheelDown;
    property OnMouseWheelUp:
  end;


müsste reichen um die Events benutzbar zu machen. Dadurch veröffentliche ich in der Ableitung die Events.
Wenn du die Komponente aber nicht installieren willst, ist die erste Variante praktischer.

Antworten