Seite 1 von 2

Zwei ListIcons verbunden - Nur warum Scrollt es Falsch ???

Verfasst: 11.05.2010 17:21
von al90
Hi,

Hab ein kleines problem beim benutzen der ScrollBars. Immer wenn ich eine benutze, dann bewegt sich die
andere viel zu schnell. Und wenn sie erstmal nach unten "abgefahren" ist, tut sich garnichts mehr. Aber ich
kann den Fehler einfach nicht finden. Mit PureLVSort klappt es aber zumindest in der Vertikalen Richtung.

Was läüft hier schief ? Habt Ihr ne idee dazu ?

Code: Alles auswählen

Global OldSubclass1, OldSubclass2

Procedure ListIconProc1(Handle, Message, wParam, lParam)

  If Message=#WM_VSCROLL Or Message=#WM_HSCROLL
    vert=GetScrollPos_(GadgetID(0),#SB_VERT)
    horz=GetScrollPos_(GadgetID(0),#SB_HORZ)
    SendMessage_(GadgetID(1), #LVM_SCROLL, horz, vert)
;    PureLVSORT_ScrollToRow(1,vert)
  EndIf

  ProcedureReturn CallWindowProc_(OldSubclass1, Handle, Message, wParam, lParam)

EndProcedure

Procedure ListIconProc2(Handle, Message, wParam, lParam)

  If Message=#WM_VSCROLL Or Message=#WM_HSCROLL
    vert=GetScrollPos_(GadgetID(1),#SB_VERT)
    horz=GetScrollPos_(GadgetID(1),#SB_HORZ)
    SendMessage_(GadgetID(0), #LVM_SCROLL, horz, vert)
;    PureLVSORT_ScrollToRow(0,vert)
  EndIf

  ProcedureReturn CallWindowProc_(OldSubclass2, Handle, Message, wParam, lParam)

EndProcedure

OpenWindow(0, 160, 160, 812, 600, "ListIcons")
ListIconGadget(0, 5, 5, 400, 590, "Column", 800, #PB_ListIcon_FullRowSelect)
ListIconGadget(1, 407, 5, 400, 590, "Column", 800, #PB_ListIcon_FullRowSelect)

For x = 1 To 300
  AddGadgetItem(0, -1, "Testzeile "+Str(x))
  AddGadgetItem(1, -1, "Testzeile "+Str(x))
Next x

OldSubclass1 = SetWindowLong_(GadgetID(0), #GWL_WNDPROC, @ListIconProc1())
OldSubclass2 = SetWindowLong_(GadgetID(1), #GWL_WNDPROC, @ListIconProc2())

Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow

Re: Zwei ListIcons verbunden - Nur warum Scrollt es Falsch ?

Verfasst: 11.05.2010 17:35
von NicTheQuick
Ich kann das unter Linux ja schlecht testen, aber ich vermute einfach mal, dass du da Pixel und Zeilen durcheinander wirfst.
So wie ich das verstanden habe, gibt GetScrollPos_() immer Pixel zurück, aber mit #LVM_SCROLL musst du zumindest beim horizontalen Scrollen aufpassen, da dort anscheinend ganze Spalten gescrollt wird und nicht pixelweise.

Re: Zwei ListIcons verbunden - Nur warum Scrollt es Falsch ?

Verfasst: 11.05.2010 17:48
von al90
NicTheQuick hat geschrieben:Ich kann das unter Linux ja schlecht testen, aber ich vermute einfach mal, dass du da Pixel und Zeilen durcheinander wirfst.
So wie ich das verstanden habe, gibt GetScrollPos_() immer Pixel zurück, aber mit #LVM_SCROLL musst du zumindest beim horizontalen Scrollen aufpassen, da dort anscheinend ganze Spalten gescrollt wird und nicht pixelweise.
Habs mir gerade nochmal Debuggen lassen. GetScrollPos_() gibt den Index und nicht die Pixel zurück. Aber Du könntest
recht damit haben, das #LVM_SCROLL in Pixel arbeitet. Auf die möglichkeit wäre ich jetzt nicht gekommen. Jetzt frage
ich mich nur, was könnte man alternativ benutzen ? PureLVSort ist ja nicht schlecht, unterstützt aber leider nur Vertikal. :roll:

Re: Zwei ListIcons verbunden - Nur warum Scrollt es Falsch ?

Verfasst: 11.05.2010 18:59
von bobobo
wenn es getscrollpos gibt gibt es normalerweise auch setscrollpos .. schau mal hin

Code: Alles auswählen

Global OldSubclass1, OldSubclass2

Procedure ListIconProc1(Handle, Message, wParam, lParam)

  If Message=#WM_VSCROLL Or Message=#WM_HSCROLL
    vert=GetScrollPos_(GadgetID(0),#SB_VERT)
    
    horz=GetScrollPos_(GadgetID(0),#SB_HORZ)
    ;SendMessage_(GadgetID(1), #LVM_SCROLL, horz, vert)
    SetScrollPos_(GadgetID(1),#SB_VERT,vert,#True)
   SetScrollPos_(GadgetID(1),#SB_HORZ,horz,#True)
;    PureLVSORT_ScrollToRow(1,vert)
  EndIf

  ProcedureReturn CallWindowProc_(OldSubclass1, Handle, Message, wParam, lParam)

EndProcedure

Procedure ListIconProc2(Handle, Message, wParam, lParam)

  If Message=#WM_VSCROLL Or Message=#WM_HSCROLL
    vert=GetScrollPos_(GadgetID(1),#SB_VERT)
    horz=GetScrollPos_(GadgetID(1),#SB_HORZ)
    ;SendMessage_(GadgetID(0), #LVM_SCROLL, horz, vert)
;    PureLVSORT_ScrollToRow(0,vert)
    SetScrollPos_(GadgetID(0),#SB_VERT,vert,#True)
    SetScrollPos_(GadgetID(0),#SB_HORZ,horz,#True)

  EndIf

  ProcedureReturn CallWindowProc_(OldSubclass2, Handle, Message, wParam, lParam)

EndProcedure

OpenWindow(0, 160, 160, 812, 600, "ListIcons")
ListIconGadget(0, 5, 5, 400, 590, "Column", 800, #PB_ListIcon_FullRowSelect)
ListIconGadget(1, 407, 5, 400, 590, "Column", 800, #PB_ListIcon_FullRowSelect)

For x = 1 To 300
  AddGadgetItem(0, -1, "Testzeile "+Str(x))
  AddGadgetItem(1, -1, "Testzeile "+Str(x))
Next x

OldSubclass1 = SetWindowLong_(GadgetID(0), #GWL_WNDPROC, @ListIconProc1())
OldSubclass2 = SetWindowLong_(GadgetID(1), #GWL_WNDPROC, @ListIconProc2())

Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
und nu fehlt vermutlich irgend ein gadgetupdate oder sowas

Re: Zwei ListIcons verbunden - Nur warum Scrollt es Falsch ?

Verfasst: 11.05.2010 20:02
von al90
bobobo hat geschrieben:wenn es getscrollpos gibt gibt es normalerweise auch setscrollpos .. schau mal hin
Ja soweit hab ich es inzwichen auch. Allerdings jetzt richtig mit Structure.

Code: Alles auswählen

Global OldSubclass1, OldSubclass2, SCROLL.SCROLLINFO

Procedure ListIconProc1(Handle, Message, wParam, lParam)

  If Message=#WM_VSCROLL Or Message=#WM_HSCROLL
    SCROLL\cbSize=SizeOf(SCROLLINFO)
    SCROLL\fMask=#SIF_POS
    GetScrollInfo_(GadgetID(0),#SB_VERT,@SCROLL)
    SetScrollInfo_(GadgetID(1),#SB_VERT,@SCROLL,#True)
    GetScrollInfo_(GadgetID(0),#SB_HORZ,@SCROLL)
    SetScrollInfo_(GadgetID(1),#SB_HORZ,@SCROLL,#True)
  EndIf

  ProcedureReturn CallWindowProc_(OldSubclass1, Handle, Message, wParam, lParam)

EndProcedure

Procedure ListIconProc2(Handle, Message, wParam, lParam)

  If Message=#WM_VSCROLL Or Message=#WM_HSCROLL
    SCROLL\cbSize=SizeOf(SCROLLINFO)
    SCROLL\fMask=#SIF_POS
    GetScrollInfo_(GadgetID(1),#SB_VERT,@SCROLL)
    SetScrollInfo_(GadgetID(0),#SB_VERT,@SCROLL,#True)
    GetScrollInfo_(GadgetID(1),#SB_HORZ,@SCROLL)
    SetScrollInfo_(GadgetID(0),#SB_HORZ,@SCROLL,#True)
  EndIf

  ProcedureReturn CallWindowProc_(OldSubclass2, Handle, Message, wParam, lParam)

EndProcedure

OpenWindow(0, 160, 160, 812, 600, "ListIcons")
ListIconGadget(0, 5, 5, 400, 590, "Column", 800, #PB_ListIcon_FullRowSelect)
ListIconGadget(1, 407, 5, 400, 590, "Column", 800, #PB_ListIcon_FullRowSelect)

For x = 1 To 300
  AddGadgetItem(0, -1, "Testzeile "+Str(x))
  AddGadgetItem(1, -1, "Testzeile "+Str(x))
Next x

OldSubclass1 = SetWindowLong_(GadgetID(0), #GWL_WNDPROC, @ListIconProc1())
OldSubclass2 = SetWindowLong_(GadgetID(1), #GWL_WNDPROC, @ListIconProc2())

Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
und nu fehlt vermutlich irgend ein gadgetupdate oder sowas
Denke ich auch mal. Nur wer könnte sowas wissen ? Keiner mehr da der ne idee hat ??? :praise:

Re: Zwei ListIcons verbunden - Nur warum Scrollt es Falsch ?

Verfasst: 11.05.2010 20:48
von hjbremer
der entsprechende Api Befehl ist

#LVM_SCROLL

aber leider ist das mit etwas Aufwand verbunden, Beispiele gibt es hier im Forum

Re: Zwei ListIcons verbunden - Nur warum Scrollt es Falsch ?

Verfasst: 11.05.2010 21:01
von al90
hjbremer hat geschrieben:der entsprechende Api Befehl ist

#LVM_SCROLL
Den hatte ich ja auch zuerst benutzt. Scheint aber nicht zu gehen. Habs auch schon mit

Code: Alles auswählen

SendMessage_(GadgetID(), #LVM_ENSUREVISIBLE, pos, #True/#False)
probiert. Ebenfalls Pustekuchen. :roll:
aber leider ist das mit etwas Aufwand verbunden, Beispiele gibt es hier im Forum
Hab das Bord schon ein paar mal durchsucht, bislang aber nichts passendes gefunden. Leider. :(

Re: Zwei ListIcons verbunden - Nur warum Scrollt es Falsch ?

Verfasst: 11.05.2010 21:41
von hjbremer
hier nur eine Anregung die im Grunde nix mit dem Problem zu tun hat, zeigt aber wie man Pixelwerte umrechnen könnte.
das ausrechnen der Werte vom Scrollbalken zur Posi der Listeneinträge ist der kleine Aufwand den ich meinte :mrgreen:

Beispiel: LVM_GETTOPINDEX von links und rechts holen, differenz in pixel errechnen und diesen Wert mittels LVM_SCROLL an das andere Lv senden.

Code: Alles auswählen

Procedure.i LvScrollMitte(lvid, item)
  
SendMessage_(lvid, #LVM_GETITEMRECT, 0, r.RECT) 
listitemhh = r\bottom - r\top          

listmitte = SendMessage_(lvid, #LVM_GETCOUNTPERPAGE, 0, 0) / 2                                  
listtop   = SendMessage_(lvid, #LVM_GETTOPINDEX, 0, 0)                   

listabstand2 = listitemhh * item 
listabstand1 = listitemhh * (listtop + listmitte)           
listdiff     = listabstand2 - listabstand1                  

SendMessage_(lvid, #LVM_SCROLL, 0, listdiff)      

EndProcedure
eine Alternative wäre SendMessage_(GadgetID(1), #WM_VSCROLL, #SB_LINEDOWN, 0)
aber auch hier ist einiger Rechen und Abgleichaufwand nötig

Re: Zwei ListIcons verbunden - Nur warum Scrollt es Falsch ?

Verfasst: 11.05.2010 22:16
von Fluid Byte
Such mal im Englischen Forum. Dort gibt es bereits ein Beispiel netmaestro.

Ich glaub "listicon scroll" sollte ein paar relevante Ergebnisse bringen.

Re: Zwei ListIcons verbunden - Nur warum Scrollt es Falsch ?

Verfasst: 11.05.2010 22:49
von al90
@hjbremer

Ja das könnte gehen. Ich experimentiere mal weiter damit. Danke. :allright:

@Fluid Byte

Werde ich machen. Auch dir Danke für den Tip. :allright: