Autor Beitrag
TheHuette
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 81



BeitragVerfasst: Do 11.11.04 11:53 
Hi!
Hat irgendjemand ne einfache Lösung parat, wie ich eine Scrollbox mit dem Mousewheel scrollen kann? Muss ich das über Events lösen? Oder hat die vielleicht irgend ne Eigenschaft die ich übersehen habe? Es gibt doch bestimmt auch ne ähnliche Komponente, die sowas "von Haus" aus kann, oder? Ne Scrollbox, die sich nicht per Mousewheel scrollen lässt ist doch nur ne halbe Scrollbox :? Das müssen doch bestimmt schon ne ganze Menge von Leuten irgendwie gelöst haben. Kann im Web irgendwie nich viel Info finden.

_________________
Früher hatten die Menschen Angst vor der Zukunft. Heute muss die Zukunft Angst vor den Menschen haben. (Werner Mitsch)
Pille
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105

Windows 7
DelphiXE Prof.
BeitragVerfasst: Do 11.11.04 12:37 
Die ScrollBox kann das bereits von Haus aus. Du musst nur deinen MAuszeiger über einen der Rollbalken bewegen.

mfg Pille
patrick
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1481

WIN2k, WIN XP
D6 Personal, D2005 PE
BeitragVerfasst: Do 11.11.04 12:39 
ausblenden Delphi-Quelltext
1:
Muss ich das über Events lösen?					

volltreffer:
ScrollBox1MouseWheelUp
und
ScrollBox1MouseWheelDown

einfacher gehts doch kaum oder? :wink:

_________________
Patrick
im zweifelsfall immer das richtige tun!!!
TheHuette Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 81



BeitragVerfasst: Do 11.11.04 14:29 
Zitat:
einfacher gehts doch kaum oder?


...anscheinend trotzdem noch zu schwer für mich kleinen Newbie :wink: . Meine Scrollbox erstelle ich dynamisch und mir fehlts da glaub ich en bischen an Kenntnis, was den Umgang mit Events und Windows-Handles betrifft.

Ich weiss ja, dass hier Selbstdenken sehr groß geschrieben wird, aber bräuchte noch en bisken "Unter die Arme greifen".

Thx!

_________________
Früher hatten die Menschen Angst vor der Zukunft. Heute muss die Zukunft Angst vor den Menschen haben. (Werner Mitsch)
Pille
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105

Windows 7
DelphiXE Prof.
BeitragVerfasst: Do 11.11.04 17:14 
Wenn das Scroolen am Scrollbalken nicht ausreicht:

1. Ereignisroutine erstellen: procedure TForm1.ScrollBoxOnMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean)

2. ScrollBox dynamisch erstellen

3. Ereignis zuweisen: ScrollBox.OnMouseWheel := ScrollBoxOnMouseWheel;

mfg Pille

Nachtrag: OnMouseWheelUp, OnMouseWhellDown geht natürlich analog dazu.
TheHuette Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 81



BeitragVerfasst: Fr 12.11.04 09:36 
...ich kann dann doch die Prozedur dem OnMouseWheel-Event im OnCreate-Event des Formulars zuweisen, oder?

(hab's jetzt ersma mit ner zur Entwicklungszeit erstellten Scrollbox probiert)

ungefähr so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ScrollBox1: TScrollBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure ScrollBox1MouseWheel(Sender: TObject; Shift: TShiftState;
      WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
    procedure FormCreate(Sender: TObject);
  end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ScrollBox1.OnMouseWheel := TForm1.ScrollBox1MouseWheel;
end;

procedure TForm1.ScrollBox1MouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
  // hoch/runter scrollen
end;


bekomme dann folgenden Fehler:

ausblenden Delphi-Quelltext
1:
Fehler] Unit1.pas(71): Inkompatible Typen: 'TMouseWheelEvent' und 'Procedure'					


Wie ich das hoch/runter scrollen dann realisiere muss ich dann auch noch rausfinden. Und wenn das nur mit Hilfe von irgendwelchen Handles funktioniert, dann steh ich ersma wieder blöd da ( kennt da jemand irgend ein Tutorial zu?). Help! :wink:

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.

_________________
Früher hatten die Menschen Angst vor der Zukunft. Heute muss die Zukunft Angst vor den Menschen haben. (Werner Mitsch)
TheHuette Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 81



BeitragVerfasst: Fr 12.11.04 10:20 
Bei der zur Entwicklungszeit erstelleten Scrollbox habe ich zwar das scrollen noch nicht realisiert, aber ich habe es zumindest geschafft, dass auf das Mousewheel reagiert wird (allerdings mit Fokus-Problemen).

Wenn ich das jetzt auf meine etwas komplexere Anwendung( es wird über einen Button eine neue Form erzeugt und auf der Form eine Scrollbox) übertragen möchte bekomme ich beim Zuweisen der Prozedur an den Event folgende Fehlermeldung:

Zitat:
[Fehler] MsgDlgHTML.pas(413): Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'


Scrollbox.OnMouseWheel := ScrollBoxMouseWheel;

Im Interface-Teil:

ausblenden Delphi-Quelltext
1:
2:
procedure ScrollboxMouseWheel(Sender: TObject; Shift: TShiftState;
    WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);


Implementiert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure ScrollboxMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
  //hoch/runter scrollen
end;


"Mensch kriegt der Jung denn gar nix selber gebacken?" ;)
Sorry, aber muss das heute noch fertig kriegen und bin gerade etwas denk-blockiert glaube ich.

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.

_________________
Früher hatten die Menschen Angst vor der Zukunft. Heute muss die Zukunft Angst vor den Menschen haben. (Werner Mitsch)
Pille
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105

Windows 7
DelphiXE Prof.
BeitragVerfasst: Fr 12.11.04 14:50 
Also das klappt definitiv:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
type
  TForm1 = class(TForm)
    ScrollBox1: TScrollBox;
    procedure FormCreate(Sender: TObject);
  private
    procedure ScrollBox1MouseWheel(Sender: TObject; Shift: TShiftState;
      WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  ScrollBox1.OnMouseWheel := ScrollBox1MouseWheel;
end;

procedure TForm1.ScrollBox1MouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin

end;


Pille
TheHuette Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 81



BeitragVerfasst: Fr 12.11.04 15:11 
hmmmja....danke...

...aber soweit war ich auch schon...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure ScrollBoxMouseWheelDown(Sender: TObject;
  Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
  //Hier muss noch ne Stop-Bedingung rein, sonst ist es bis unendlich( bzw. integer-ende) scrollbar

  if ScrollBox.VertScrollBar.IsScrollBarVisible then
  ScrollBox.ScrollBy(0, -1); 
end;

procedure ScrollBoxMouseWheelUp(Sender: TObject;
  Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
  //Hier muss noch ne Stop-Bedingung( mit Hilfe einer Integer-Variable oder so) rein, sonst ist es bis unendlich( bzw. integer-ende) scrollbar

  if ScrollBox.VertScrollBar.IsScrollBarVisible then
  ScrollBox.ScrollBy(0, 1);
end;


ausblenden Delphi-Quelltext
1:
FormX.OnMouseWheel := ScrollBox1MouseWheel;					

eignet sich besser als
ausblenden Delphi-Quelltext
1:
ScrollBox1.OnMouseWheel := ScrollBox1MouseWheel;					


...mein Problem ist halt nur noch das in meine Anwendung einzubauen. D.h. wo/wie deklarieren? wo implementieren? etc.
Hab mittlerweile so ziehmlich alles ausprobiert, was ich mir vorstellen kann....aber wird schon noch...
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Fr 12.11.04 16:39 
Hallo Huette ;),

den Ereigniskopf hast du doch schonmal, fehlt also nur noch der Inhalt. So geht es zum Beispiel (vielleicht gibt es auch noch eine einfachere Lösung):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
procedure TForm1.ScrollBox1MouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
  //Wenn es dir falschrum scrollt dann benutze:
  //WheelDelta := -WheelDelta;
  with (Sender as TScrollBox).VertScrollBar do begin
    case WheelDelta > 0 of
      True:
        begin
          if (Position + WheelDelta) <= Range then
            Position := Position + WheelDelta
          else
            Position := Range;
        end;
      False:
        begin
          if (Position - WheelDelta) >= 0 then
            Position := Position + WheelDelta
          else
            Position := 0;
        end;
    end;
  end;
end;
Gruß Hape!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
TheHuette Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 81



BeitragVerfasst: Fr 12.11.04 16:51 
@wulfskin:

Sieht gut aus. Damit wären die Stop-Bedingungen auch geschaffen. Hab jetzt leider keine Zeit mehr zum testen because Feierabend :wink: . Wird aber nachgeholt.

Tschöö und schönes WE.

_________________
Früher hatten die Menschen Angst vor der Zukunft. Heute muss die Zukunft Angst vor den Menschen haben. (Werner Mitsch)
Pille
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105

Windows 7
DelphiXE Prof.
BeitragVerfasst: Fr 12.11.04 16:57 
TheHuette hat folgendes geschrieben:

...mein Problem ist halt nur noch das in meine Anwendung einzubauen. D.h. wo/wie deklarieren? wo implementieren? etc.


Deine selbst erstellten Routinen, auch wenn sien dann als Event zugewiesen werden schreibst du, genau wie in meinem Beispiel, in die private Sektion. Sollt auch von ausserhalb des Formulars darauf zugegriffen werden, kommt es in public. Oberhalb von private schreibst du nie etwas rein, dieser Bereich ist der IDE vorbehalten. Wenn du nicht weisst, wie die Routine richtig aussehen soll, erstelle einfach probeweise eine zur Entwurfszeit und kopiere diese dann. Vergiss nicht, die Deklaration im Interfaceteil nach private zu verschieben!

Pille
Pille
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105

Windows 7
DelphiXE Prof.
BeitragVerfasst: Fr 12.11.04 17:13 
TheHuette hat folgendes geschrieben:


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure ScrollBoxMouseWheelDown(Sender: TObject;
  Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
  //Hier muss noch ne Stop-Bedingung rein, sonst ist es bis unendlich( bzw. integer-ende) scrollbar

  if ScrollBox.VertScrollBar.IsScrollBarVisible then
  ScrollBox.ScrollBy(0, -1); 
end;

procedure ScrollBoxMouseWheelUp(Sender: TObject;
  Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
  //Hier muss noch ne Stop-Bedingung( mit Hilfe einer Integer-Variable oder so) rein, sonst ist es bis unendlich( bzw. integer-ende) scrollbar

  if ScrollBox.VertScrollBar.IsScrollBarVisible then
  ScrollBox.ScrollBy(0, 1);
end;




Das mit der Stopbedingung kann ich nicht nachvollziehen, die ScrollBox scrollt nur bis zum Ende ihrer augenblicklichen Größe und die richtet sich automatisch nach dem Inhalt. Die Abfrage nach der Sichtbarkeit der Scrollbars ist aus dem gleichen Grund ebenfalls überflüssig. Wenns nicht funktioniert muss woanders "der Wurm drin" sein.

Pille
Pille
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105

Windows 7
DelphiXE Prof.
BeitragVerfasst: Fr 12.11.04 17:26 
So, und zu guter letzt ist mir aufgefallen, dass das alles an der Aufgabenstellung vorbei geht. Die gesamte ScrollBox reagiert nämlich von Hause aus auf das Mausrad. Nicht reagieren tun die Komponenten, die in der ScrollBox enthalten sind. Wenn also der gesamte Bereich auf das Mausrad reagieren soll, muss das OnMousWhell für jede enthaltene Komponente gesetzt werden. Da dieses Ereignis normalerweise nicht sichtbar ist, bleibt wohl nichts anderes, als jeweils eine neue Komponente abzuleiten und das Ereignis sichtbar zu machen (s. Komponentenentwicklung).

Pille
TheHuette Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 81



BeitragVerfasst: Do 18.11.04 16:28 
Sorry, dass ich euch seit meinem letzten beitrag so schamlos ignoriere :roll: , aber kann zur Zeit leider nicht an der Sache weiterarbeiten...

Scrollbox reagiert doch "von Hause" aus auf das Mousewheel? Gibts dafür noch irgendeine Eigenschaft die man setzen muss oder so? Hab da ein HTMLabel drin und es tut sich nichts. Hat das was mit den von Pille angesprochenen Komponenten zu tun, für die ich noch zusätzlich den Event setzen muss?

Ich hatte es ja, wie erwähnt, schon am laufen( ohne einen Event für das HTMLabel zu setzen - nur für die Scrollbox). Es gibt nur noch Probleme mit der Integration in meine Anwendung( in welche Klassen rein packen etc.). Und beim Testen habe ich festgestellt, dass die Scrollbox dann unendlich nach oben/unten scrollfähig ist -> deswegen die Stop-Bedingung( die auch zu 90% funktioniert - hab bisher nur statische Integer-Werte benutzt -> müsste sich dann noch aus der HTMLabel-Höhe ergeben).

_________________
Früher hatten die Menschen Angst vor der Zukunft. Heute muss die Zukunft Angst vor den Menschen haben. (Werner Mitsch)
Pille
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105

Windows 7
DelphiXE Prof.
BeitragVerfasst: Fr 19.11.04 10:19 
Hallo,

1. Bei mir scrollt die Scrollbox definitiv nicht bis ins unendliche.
2. Wenn in der ScrollBox eine Komponente ist und sich die Maus über dieser Komponente befindet, werden die Mausereignisse von dieser Komponente und nicht von der ScrollBox verarbeitet.

Was hast du in deiner ScrollBox?

Pille
TheHuette Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 81



BeitragVerfasst: Sa 20.11.04 18:24 
Habe in meiner Scrollbox ein THTMLabel plaziert. Ist eine Komponente von TMSSoftware.

_________________
Früher hatten die Menschen Angst vor der Zukunft. Heute muss die Zukunft Angst vor den Menschen haben. (Werner Mitsch)