| Autor |
Beitrag |
TheHuette
      
Beiträge: 81
|
Verfasst: 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
      
Beiträge: 105
Windows 7
DelphiXE Prof.
|
Verfasst: 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
      
Beiträge: 1481
WIN2k, WIN XP
D6 Personal, D2005 PE
|
Verfasst: Do 11.11.04 12:39
Delphi-Quelltext 1:
| Muss ich das über Events lösen? |
volltreffer:
ScrollBox1MouseWheelUp
und
ScrollBox1MouseWheelDown
einfacher gehts doch kaum oder? 
_________________ Patrick
im zweifelsfall immer das richtige tun!!!
|
|
TheHuette 
      
Beiträge: 81
|
Verfasst: Do 11.11.04 14:29
| Zitat: | | einfacher gehts doch kaum oder? |
...anscheinend trotzdem noch zu schwer für mich kleinen Newbie  . 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
      
Beiträge: 105
Windows 7
DelphiXE Prof.
|
Verfasst: 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 
      
Beiträge: 81
|
Verfasst: Fr 12.11.04 09:36
_________________ Früher hatten die Menschen Angst vor der Zukunft. Heute muss die Zukunft Angst vor den Menschen haben. (Werner Mitsch)
|
|
TheHuette 
      
Beiträge: 81
|
Verfasst: 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:
Delphi-Quelltext 1: 2:
| procedure ScrollboxMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); |
Implementiert:
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure ScrollboxMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); begin 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 Tino: 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
      
Beiträge: 105
Windows 7
DelphiXE Prof.
|
Verfasst: Fr 12.11.04 14:50
Also das klappt definitiv:
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 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 
      
Beiträge: 81
|
Verfasst: Fr 12.11.04 15:11
hmmmja....danke...
...aber soweit war ich auch schon...
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 if ScrollBox.VertScrollBar.IsScrollBarVisible then ScrollBox.ScrollBy(0, -1); end;
procedure ScrollBoxMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); begin if ScrollBox.VertScrollBar.IsScrollBarVisible then ScrollBox.ScrollBy(0, 1); end; |
Delphi-Quelltext 1:
| FormX.OnMouseWheel := ScrollBox1MouseWheel; |
eignet sich besser als
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
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: 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): 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 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 
      
Beiträge: 81
|
Verfasst: 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  . 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
      
Beiträge: 105
Windows 7
DelphiXE Prof.
|
Verfasst: 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
      
Beiträge: 105
Windows 7
DelphiXE Prof.
|
Verfasst: Fr 12.11.04 17:13
| TheHuette hat folgendes geschrieben: |
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 if ScrollBox.VertScrollBar.IsScrollBarVisible then ScrollBox.ScrollBy(0, -1); end;
procedure ScrollBoxMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); begin 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
      
Beiträge: 105
Windows 7
DelphiXE Prof.
|
Verfasst: 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 
      
Beiträge: 81
|
Verfasst: Do 18.11.04 16:28
Sorry, dass ich euch seit meinem letzten beitrag so schamlos ignoriere  , 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
      
Beiträge: 105
Windows 7
DelphiXE Prof.
|
Verfasst: 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 
      
Beiträge: 81
|
Verfasst: 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)
|
|