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

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

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

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

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

Beitrag 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.
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

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

Beitrag 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:
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

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

Beitrag 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
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

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

Beitrag 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:
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

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

Beitrag von hjbremer »

der entsprechende Api Befehl ist

#LVM_SCROLL

aber leider ist das mit etwas Aufwand verbunden, Beispiele gibt es hier im Forum
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

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

Beitrag 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. :(
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

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

Beitrag 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
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

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

Beitrag 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.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

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

Beitrag 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:
Antworten