Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Eigene Scrollbar verwenden
Renegade - Do 16.07.09 14:55
Titel: Eigene Scrollbar verwenden
Nach Jahrelanger Abstinenz habe ich wieder ein Delphi-projekt angefangen.
Das ganze läuft soweit ganz gut - nur habe ich jetzt ein Problem an dem ich schon seit 3 Tagen dran hänge und nicht weiter komme.
Ich entwickel gerade für mich eine Jukebox-Software welche auf einem Shuttle X50 laufen soll. Das Ding ist mit einem Touchscreen ausgerüstet und bietet keine sooo große Auflösung. Deswegen ist es für mich wichtig diverse Steuerkomponenten selbst zu erstellen damit die mit dem Finger bedienbar sind.
Nun nutze ich eine tListView um mir meine MP3-Titel anzeigen zu lassen. Die Anpassung habe ich soweit hinbekommen. Das einzige was mit nicht gelingen will ist die Benutzung einer eigenen Scrollbar.
Ich denke ich habe in diesem Forum jeden Thread zu dem Thema gelesen und die Lösung nicht gefunden. Auch die Schweitzer konnten mir nicht weiter helfen.
Ich nutze als alternative Scrollleiste eine eigene Ableitung der tALScrollbar. Das ist eine freie Scrollleisten-Komponente.
Nun gibt es zwei Sachen die ich nicht hin bekomme.
1. Das verstecken der "original" Scrollleisten.
Ich habe dafür zwar folgenden Code gefunden der auch "funktioniert":
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: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41:
| type TForm1 = class(TForm) ListView1: TListView; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private FListViewWndProc: TWndMethod; procedure ListViewWndProc(var Msg: TMessage); public FShowHoriz: Boolean; FShowVert: Boolean; end; var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ListViewWndProc(var Msg: TMessage); begin ShowScrollBar(ListView1.Handle, SB_HORZ, FShowHoriz); ShowScrollBar(ListView1.Handle, SB_VERT, FShowVert); FListViewWndProc(Msg); end;
procedure TForm1.FormCreate(Sender: TObject); begin FShowHoriz := True; FShowVert := False; FListViewWndProc := ListView1.WindowProc; ListView1.WindowProc := ListViewWndProc; end;
procedure TForm1.FormDestroy(Sender: TObject); begin ListView1.WindowProc := FListViewWndProc; FListViewWndProc := nil; end; |
Die Sache hat nur einen Haken. Das Scrollen mit dem Mausrad funktioniert dann nicht mehr.
2. Ich bekomme das Partout nicht sauber auf die Reihe mit meinem Scrollbar das Listview sauber zu steuern.
Sämtliche Versuche mit tListview.Scroll und SetScrollPos sind bisher fehlgeschlagen.
Ich weiß nicht was ich wo übersehe. Evtl. kann mit einer von Euch auf die Sprünge helfen.
Ich meine mal gelesen zu haben das man einem Listview ein eigenes Scrollbar zuweisen kann. Ich kann dazu nur nichts finden.
Besten Dank im Voraus.
Lannes - Do 16.07.09 19:40
Hallo,
die Größe der Scrollbars kann über eine WinApi-Funktion verändert werden, das gilt dann aber für alle Anwendungen auf dem System.
Sonst fällt mir da noch ListView.TopItem ein.
Zum Thema Mausrad => WM_MOUSEWHEEL abfangen.
Renegade - Do 16.07.09 21:04
Lannes hat folgendes geschrieben : |
die Größe der Scrollbars kann über eine WinApi-Funktion verändert werden, das gilt dann aber für alle Anwendungen auf dem System. |
Das hatte ich auch noch im Kopf - nur ist das natürlich keine Lösung für mein Problem ;)
Lannes hat folgendes geschrieben : |
Sonst fällt mir da noch ListView.TopItem ein. |
Werde ich mir morgen ansehen. Sagt mir bisher noch nichts.
Lannes hat folgendes geschrieben : |
Zum Thema Mausrad => WM_MOUSEWHEEL abfangen. |
In die Richtung habe ich auch schon gedacht. Besten Dank für das WM_MOUSEWHEEL - hatte ich mit meinen Suchbegrifen bisher nicht gefunden.
Bleibt aber immer noch das Problem wie ich meine Scrollbar mit dem Listview abgleiche. Ich habs zwar noch nicht herausgefunden wie ich die Scrollbar 1:1 auf das Listview umgesetzt bekomme - aber ungefähr funktioniert das schon. Was ich aber überhaupt noch nicht herausgefunden habe wie der Weg anders herum funktioniert - sprich wie ich die Scollbar neu Positioniere wenn ich mit der Tastatur in der Listvew navigiere.
Ich werde morgen mal ein wenig Code von meinen Ansätzen von heute posten. Die habe ich noch nicht gelöscht. Evtl. findet da jemand einen Fehler drin.
Lannes - Do 16.07.09 23:31
Hallo,
wenn man mit den Pfeiltasten die ListView scrollt, kann anschließend mit TopItem das obere Item abgefragt werden.
Mit der Info kannst Du dann die Scrollbar neu positionieren.
Renegade - Fr 17.07.09 10:51
Sodele - mit den Anregungen von
Lannes habe ich ein Problem schon mal gelöst. Meine Scrollleiste bewegt nun das Listview und umgekehrt. Ich habe das ganze folgender maßen gelöst.
Nach einigem hin und her habe ich mir gedacht wen interessieren in diesem Fall eigentlich die x,y-Positionen der Controls. Man kann doch auch mit den Items arbeiten - und zwar so:
Delphi-Quelltext
1: 2:
| MyScrollbar.Min:=0; MyScrollBar.Max:=Listview.items.count-1; |
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TFmForm.MyScollbarScroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); begin Listview.Items[MyScrollbar.Position].MakeVisible(false); end; |
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TFmForm.ListviewKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin MyScrollbar.Position:=ListView.Selected.Index; end; |
Funktioniert tadellos.
Jetzt muss ich mich noch um das Scrollrad kümmern...
Renegade - Fr 17.07.09 11:27
So das Problem mit dem Scrollrad ist nun auch gelöst.
Da ich zum verstecken der original Scrollbars schon nen Handler für die Messages habe:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm1.ListViewWndProc(var Msg: TMessage); begin ShowScrollBar(ListView1.Handle, SB_HORZ, FShowHoriz); ShowScrollBar(ListView1.Handle, SB_VERT, FShowVert); FListViewWndProc(Msg); end; |
musste die nur noch so erweitert werden das die WM_MOUSEWHEEL Messages abgearbeitet werden.
Quick and dirty:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure tForm1.ListViewWndProc(var Msg: TMessage); begin ShowScrollBar(LvTitel.Handle, SB_HORZ, false); ShowScrollBar(LvTitel.Handle, SB_VERT, false); If Msg.Msg=WM_MOUSEWHEEL then begin If TWMMOUSEWHEEL(Msg).WheelDelta>0 then MyScrollbar.Position:=MyScrollBar.Position-5; If TWMMOUSEWHEEL(Msg).WheelDelta<0 then MyScrollbar.Position:=MyScrollBar.Position+5; end; FListViewWndProc(Msg); end; |
Nochmal vielen Dank an
Lannes der mich auf die richtige Spur gebracht hat.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!