Delphi-PRAXiS

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 Ärger bei Scrollbox mit .Min, .Max und PageSize (https://www.delphipraxis.net/82272-aerger-bei-scrollbox-mit-min-max-und-pagesize.html)

delphin 9. Dez 2006 23:12


Ärger bei Scrollbox mit .Min, .Max und PageSize
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich frage mich schon seit Tagen, wo mein Denkfehler liegt. Vielleicht kann mir jemannd weiterhelfen.

Ich habe einen eigenen Scrollbalken erzeugt, der mir von einem vorhanden Bild den betreffenden Ausschnitt proportional anzeigen und beim Klicken mit Hilfe einer Scrollbox verschieben soll.

z.B.: gesamtes Bild = 100 Pixel, sichtbarer Ausschnitt = 50 Pixel

ergibt sich doch:

ScrollBar1.Min := 1; ScrollBar1.Max = 100; ScrollBar1.PageSize = 50 (oder ???)

Verschiebt man nun den Scrollbalken direkt mit der Maus ans Ende der Leiste erhält man bei Abfrage im OnScroll-Ereignis genau wie bei Abfrage im OnChange-Ereignis als ScrollBar1.Position das Ergebnis = 51; (wobei eigentlich 50 zu erwarten wäre!)

Wird aber noch besser: Klick man nun weiter mit der Maus auf die Pfeil-Runter Taste läuft die ScrollBar1.Position tätsächlich noch bis 100 !!! ohne den Balken weiter zu verschieben (wie auch - steht ja schon am Ende)

Wer kann mir das jemand erklären ???

delphin 10. Dez 2006 18:15

Re: Ärger bei Scrollbox mit .Min, .Max und PageSize
 
Hallo Leute,

hat den niemand das beschriebene Problem nachvollzogen??? Bin immernoch auf der Suche nach des Rätesels Lösung und brauchte mal einen kompetenten Rat von Euch.
Für eine Antwort wäre ich sehr dankbar.

Vielleicht kennt ja auch jemand eine Möglichkeit, wie man das OnScroll-Ereignis abfängt, um selbst Hand an zulegen.


Gruß Gerd

marabu 10. Dez 2006 21:47

Re: Ärger bei Scrollbox mit .Min, .Max und PageSize
 
Hallo Gerd,

alles ist in bester Ordnung. Deine Werte (Min=1, Max=100, Page=50) sind korrekt und das Verhalten des ScrollBar in meinen Augen auch. Dass die ScrollBox bei Pos=51 unten anschlägt ist völlig in Ordnung, da ja der ScrollRange für die zweite Page von 51 bis 100 geht. Dass du die Position bis hin zu Max weiter erhöhen kannst macht auch Sinn, wenn du statt Pixeln als Einheit mal die Zeilen eines Memo-Textes betrachtest. Nach dem ersten PageDown steht der Cursor in Zeile 51 und die ScrollBox hat ihre unterste Position erreicht. Du kannst jetzt den Cursor zeilenweise weiter nach unten fahren, aber die ScrollBox verharrt wo sie ist: am unteren Ende des ScrollBars.

Wenn du mit der Einheit Pixel arbeitest und in einem Bild gar keinen Cursor einsetzen möchtest, dann musst du in deinem Programm einfach verhindern, dass die Position größer als 51 wird. Das sollte im Ereignis OnScroll() problemlos möglich sein.

Gute Nacht

delphin 11. Dez 2006 09:29

Re: Ärger bei Scrollbox mit .Min, .Max und PageSize
 
Hallo marabu,

Danke für Deine Antwort. Für eine Textbox magst Du ja recht haben, wobei ich trotzdem der Meinung bin, wenn ich schon 50% von 100% sehe brauche ich auch nur noch die restlichen 50% nach unten scrollen.

Nun aber zu Deinen Lösungvorschlag: abfangen im OnScroll-Ereignis:

Hatte ich schon probiert und so ging es nicht:

Delphi-Quellcode:
procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer);
begin if (ScrollBar1.Position) > 50 then ScrollBar1.Position:=50;

end;

Tormentor32 11. Dez 2006 10:43

Re: Ärger bei Scrollbox mit .Min, .Max und PageSize
 
versuchs mal mit

Delphi-Quellcode:
procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer);
begin
  if Scrollpos > 50 then ScrollPos :=50;

end;
Durch das Ändern des Wertes Scrollpos sollte der gewünschte effekt eintreten

delphin 11. Dez 2006 15:13

Re: Ärger bei Scrollbox mit .Min, .Max und PageSize
 
Hallo,

besten Dank. Habe noch eine Möglichkeit im OnChange-Ereignis gefunden:

Geht offensichtlich auch so:

Delphi-Quellcode:
procedure TForm1.ScrollBar1Change(Sender: TObject);
begin if Scrollbar1.Position > 50 then ScrollBar1.Position:=50
end;
Um den ganzen Ärger zu entgehen habe ich noch an der Möglichkeit gearbeitet eine eigene Komponente zu erstellen und dass OnScroll-Ereignis abzufangen.

Folgendes ist das Resultat:

Delphi-Quellcode:
TmyScroll = class(TScrollBar)
        private
          //== Lösungsvorschlag hier aus der Delphipraxis !!! ============
          procedure WMVScroll(var Message: TWMScroll); message WM_VSCROLL;

          // Scrollen mit Wheel-Rad reagieren, wenn Focus auf Element
          procedure WMMouseWheel(var Msg: TWMMouseWheel); message WM_MOUSEWHEEL;

          // aufs Scrollen mit den Tasten reagieren, wenn Focus auf Element
          procedure WMKeyDown(var Msg:TWMKey); message WM_KEYDOWN;
       
  end;
leider funktioniert so aber WMVScroll nicht. Es erfolgt gar kein Aufruf.

Setzte ich die Procedure in den privaten Teil der Form1 klappt es aber. Wieso das ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:30 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