Autor Beitrag
Renegade
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 358

Win XP Pro, Win 7 Beta
BDS 2006
BeitragVerfasst: Do 16.07.09 14:55 
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":
ausblenden volle Höhe 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
   { Private declarations }
    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); // process message
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FShowHoriz := True; // show the horiz scrollbar
  FShowVert := False; // hide vert scrollbar
  FListViewWndProc := ListView1.WindowProc; // save old window proc
  ListView1.WindowProc := ListViewWndProc; // subclass
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ListView1.WindowProc := FListViewWndProc; // restore window proc
  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.

_________________
Sokrates (468 v.Chr. - 399 v.Chr.)
"Es ist keine Schande, nichts zu wissen, wohl aber, nichts lernen zu wollen."
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Renegade Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 358

Win XP Pro, Win 7 Beta
BDS 2006
BeitragVerfasst: Do 16.07.09 21:04 
user profile iconLannes hat folgendes geschrieben Zum zitierten Posting springen:
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 ;)


user profile iconLannes hat folgendes geschrieben Zum zitierten Posting springen:
Sonst fällt mir da noch ListView.TopItem ein.


Werde ich mir morgen ansehen. Sagt mir bisher noch nichts.

user profile iconLannes hat folgendes geschrieben Zum zitierten Posting springen:
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.

_________________
Sokrates (468 v.Chr. - 399 v.Chr.)
"Es ist keine Schande, nichts zu wissen, wohl aber, nichts lernen zu wollen."
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Renegade Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 358

Win XP Pro, Win 7 Beta
BDS 2006
BeitragVerfasst: Fr 17.07.09 10:51 
Sodele - mit den Anregungen von user profile iconLannes 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:

ausblenden Delphi-Quelltext
1:
2:
MyScrollbar.Min:=0;
MyScrollBar.Max:=Listview.items.count-1;

ausblenden 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;

ausblenden 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...

_________________
Sokrates (468 v.Chr. - 399 v.Chr.)
"Es ist keine Schande, nichts zu wissen, wohl aber, nichts lernen zu wollen."
Renegade Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 358

Win XP Pro, Win 7 Beta
BDS 2006
BeitragVerfasst: 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:

ausblenden 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); // process message
end;


musste die nur noch so erweitert werden das die WM_MOUSEWHEEL Messages abgearbeitet werden.

Quick and dirty:

ausblenden 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); // process message
end;


Nochmal vielen Dank an user profile iconLannes der mich auf die richtige Spur gebracht hat.

_________________
Sokrates (468 v.Chr. - 399 v.Chr.)
"Es ist keine Schande, nichts zu wissen, wohl aber, nichts lernen zu wollen."