Seite 1 von 1

(EDIT) 2 Listicons zusammenführen [kosmetische Frage offen]

Verfasst: 14.11.2008 12:55
von PurePi
:? Der u.a Beitrag sollte eigentlich ein weiterer Beitrag zum folgenden Thread sein.... :? :
http://www.purebasic.fr/german/viewtopi ... t=listicon
Wäre wohl sinnvoll wenn ihn mal einer der MODs verschieben würde
(sonst fehlt hier irgendwie der Zusammenhang)

Habe mich für die Variante mit den 2 Listicons entschieden.
War nicht so aufwendig wie ich anfangs dachte (s. Code)
Allerdings hat die Sache noch ein (eher kosmetisches) Problem:
Beim vertl. Scrollvorgang laufen die Zeilen (je nach Scrollrichtung) um +1 / -1 auseinander. Nach loslassen der Maus sind die Zeilen dann wieder in sysnc.
Die verwendete (old)CallBack Procedure habe ich aus einem anderen Thread "abgezogen" (mit einer "nromalen" CallBack Procedure hat`s nicht funktioniert).
Ich muß aber gestehen, dass ich nicht so genau verstehe was da mit SetWindowLong_ "abgeht".
Falls jemand eine Idee hat, wie man die Zeilen während des Scrollvorgangs "in sysnc" hält, wäre es schön

Code: Alles auswählen

; 2 Listicons "in Sync halten"
; Verwendte User LIBs
; PureLVSORT (von Gnozal)

Enumeration
  #Window_0
  #ListIcon_1
  #ListIcon_0
EndEnumeration

Global oldCallback 


  ; ######## Gadgets erzeugen und mit Daten befüllen ###################
  
    If OpenWindow(#Window_0, 162, 29, 958, 700, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      
     ListIconGadget(#ListIcon_0, 25, 45, 175, 580, "Spalte1", 150, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
     ListIconGadget(#ListIcon_1, 200, 45, 725, 595, "Spalte2", 100, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
      
    EndIf
   For i=2 To 10
   
    AddGadgetColumn(#ListIcon_1, i, "Spalte"+Str(i+1), 100)
   Next 
   counter=1
   While counter <100
    AddGadgetItem(#ListIcon_0, -1, "Konto"+Str(counter))
    AddGadgetItem(#ListIcon_1, -1, "Wert"+Str(counter))
    For i=0 To 9
     SetGadgetItemText(#ListIcon_1, counter-1, "Zeile "+ Str(counter) + " / Spalte "+Str(i+2), i)
    Next
    counter=counter+1
   Wend 
  EndIf


Procedure WindowCallback(hWnd,Msg,wParam,lParam) 
  
  If IsGadget(#ListIcon_0)
   ShowScrollBar_(GadgetID(#ListIcon_0),#SB_VERT,#False)
  EndIf
  
  Select Msg 
   Case #WM_VSCROLL 
    TopIndex = SendMessage_(GadgetID(#ListIcon_1), #LVM_GETTOPINDEX,0,0)
    PureLVSORT_ScrollToRow(#ListIcon_0, TopIndex) 
   
   Case #WM_MOUSEWHEEL 
   ; to be.... coded
   EndSelect 
    ProcedureReturn CallWindowProc_(oldCallback, hWnd, Msg, wParam, lParam) 
EndProcedure 

oldCallback=SetWindowLong_(GadgetID(#ListIcon_1), #GWL_WNDPROC, @WindowCallback()) 

Repeat ; Start of the event loop

  Event = WaitWindowEvent() ; This line waits until an event is received from Windows
  
  WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
  
  GadgetID = EventGadget() ; Is it a gadget event?
  
  EventType = EventType() ; The event type
  
  If Event = #PB_Event_Gadget
    
    If GadgetID = #ListIcon_0
    
     SetGadgetState(#ListIcon_1, GetGadgetState(#ListIcon_0))
     SendMessage_(GadgetID(#ListIcon_1),#LVM_ENSUREVISIBLE,GetGadgetState(#ListIcon_0),#True) 

    ElseIf GadgetID = #ListIcon_1
     
     SetGadgetState(#ListIcon_0, GetGadgetState(#ListIcon_1))
     SendMessage_(GadgetID(#ListIcon_0),#LVM_ENSUREVISIBLE,GetGadgetState(#ListIcon_1),#True)
    EndIf
    
  EndIf

Until Event = #PB_Event_CloseWindow ; End of the event loop

End