Seite 1 von 1

Wie "subclasst" man zwei Listicongadgets?

Verfasst: 23.05.2008 21:11
von marco2007
Hallo liebe Kollegen,

ich habe folgendes Problem:

Ich habe zwei Listicons (in Wirklichkeit sind`s zwei Egrids, aber egal).
Die Anzahl der Reihen sind immer gleich. Sprich: Entweder Scrollbar bei beiden oder bei keinem.

Ich möchte, daß sich beide Scrollbar immer synchron bewegen.
Scroll ich links, dann scrollt auch rechts und umgekehrt.
Srod (Esgrid-Programmierer) hat leider keine Zeit, hat mir jedoch folgende Tips gegeben:

- Beide Listicons subclassen
- #WM_VSCROLL, #WM_HSCROLL und SetScrollInfo_()

Subclass :(

Ich habe null Idee, wie das funktionieren soll.

Ich habe nur die zwei Listicons:

Code: Alles auswählen

Enumeration
  #Window
EndEnumeration

Enumeration
  #ListIcon_0
  #ListIcon_1
EndEnumeration

  If OpenWindow(#Window, 0, 0, 420, 190, "Scrollbar")
    If CreateGadgetList(WindowID(#Window))
      ListIconGadget(#ListIcon_0, 25, 25, 141, 140, "Artikel", 100)
      ListIconGadget(#ListIcon_1, 165, 25, 230, 140, "Column0", 100)
      AddGadgetColumn(#ListIcon_1, 1, "Column1", 100)
      AddGadgetColumn(#ListIcon_1, 2, "Column2", 100)
    EndIf
  EndIf
  
  For i=0 To 20
    AddGadgetItem(#ListIcon_0, -1, Str(i))
    AddGadgetItem(#ListIcon_1, -1, Str(i)+Chr(10)+"test")
  Next
  
Repeat
event=WaitWindowEvent()

Until event=#WM_CLOSE


Ich bin für jeden Tipp dankbar.

lg
Marco

Verfasst: 23.05.2008 21:30
von ts-soft

Verfasst: 23.05.2008 21:39
von RSBasic
:(
Wieso seid ihr immer so schnell...

...ich komm' immer zu spät.
Ist mir schon letzte Woche aufgefallen.

Verfasst: 23.05.2008 21:51
von marco2007
Hi,

Danke erst mal. Ich hatte das auch zuerst gefunden.
Ich dachte, daß paßt gar nicht -> ich denke es leider noch immer.

Das ist ja `ne ganz andere Liga :o

Da ist die WahnsinnsInclude und dann noch Dein Beispiel mit HiWord und ButtonEventCallback -> Mann, ich bin nur ein Mensch.

Kann man soetwas kapieren und schreibt man sowas in Trance?

lg
Marco

...und ich habe jetzt noch immer keine Ahnung, wie ich das anwenden soll :(

Verfasst: 23.05.2008 21:55
von ts-soft
Kümmere Dich nicht um das drum und dran, sondern nutze die Proceduren.
Beispiele sind da auch noch. Konzentriere Dich auf die Beispiele und spiele
damit, irgendwann fällt der Groschen und Du sagst Dir, man, so schwer wars
ja garnicht :wink:

Gruß
Thomas

Verfasst: 23.05.2008 23:45
von edel
In pbosl ist das als lib vorhanden, mit einer kleinen Hilfe, die
sollte aber voellig ausreichen. Ansonsten schauste suchste hier
im Forum mal nach SetWindowLong und Gwl_wndproc, sollte
einiges zu finden sein.

Verfasst: 24.05.2008 00:02
von marco2007
Sind die Userlibs auf http://pbosl.purearea.net/ eigentlich immer up to date? Oder muss man includen?

Verfasst: 24.05.2008 00:10
von ts-soft
Die sollten alle Funktionieren, habs aber nicht getestet. Ansonsten nimmste
nur die eine Lib und die Hilfe, evtl. noch die pbosl.res

Falls irgendwas nicht mehr geht, schickste DarkDragon mal ne PM, der wird
dann bestimmt versuchen den Fehler zu beseitigen.

Meist reicht ja eine Neukompilierung.

Verfasst: 24.05.2008 09:47
von marco2007
Hi,

Srod hat mir eine Lösung gegeben, wie man eins vom anderen abhängig macht. Man braucht den aktuellsten Code von Esgrid.

Code: Alles auswählen

Code vom Srod: 
;Scroll the first grid VERTICALLY and watch the second grid keep pace!

IncludePath "..\Source\"
 XIncludeFile "EsGRID.pbi"
IncludePath ""


;Utility function which calculates the vertical offsets between the two grids and scrolls
;the destination grid to match the first one.
Procedure MatchScroll(hWndO, hWndN)
 Protected result, topO, topN, diff, rc.RECT, scroll
 ;///INTERNAL EsGRID STRUCTURE and PROPERTY
   Protected *pointer.egridInfoStruc 
   *pointer = GetProp_(hWndN, @"egrid_ListPointer")
 ;/////////////////////////////////////////
 topO = SendMessage_(hWndO, #LVM_GETTOPINDEX,0,0)
 topN = SendMessage_(hWndN, #LVM_GETTOPINDEX,0,0)
 diff = topO-topN
 If diff
   rc\left=#LVIR_BOUNDS
   SendMessage_(hWndO, #LVM_GETITEMRECT, 0,rc)
   If rc\bottom>rc\top 
     scroll = diff*(rc\bottom-rc\top)
     ;///INTERNAL EsGRID FUNCTION
       egrid_removeeditgadgets(*pointer)
     ;///////////////////////////
     InvalidateRect_(hWndN,0,0)
     SendMessage_(hWndN, #LVM_SCROLL, 0, scroll)
     ;///INTERNAL EsGRID FUNCTION
       egrid_scrolloutvision(*pointer)
     ;///////////////////////////
   EndIf
 EndIf
EndProcedure


;Cellcallback function for the first grid.
;This will need changing if the two grids are to match each other exactly with vertical
;scrolling. At the moment the second grid will match the first.
;Attempt to alter this and an infinite loop will ensue!
Procedure.l MyCellCallBack(egrid, uMsg, *cellinfo.egridCellInfo)
 Protected result = #True
 Select uMsg
   Case #egrid_NotifyCellType  ;We use this message in order to trap multiple-cell selections etc.
     MatchScroll(GadgetID(1), GadgetID(2))
 EndSelect
 ProcedureReturn result
EndProcedure


;///////////////////////////////////////////////////////////////////////////////////////////////////////////////
;Create two grids.
If OpenWindow(0,0,0,640,600,"EsGRID demo - vertical scrolling.",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_Invisible) And CreateGadgetList(WindowID(0))
 egrid_CreateGrid(1, 20, 20, 280, 560,42,0, #egrid_GridLines|#egrid_ResizeColumnsTrue|#egrid_MultiLineText)
   egrid_CreateCellCallback(1, @MyCellCallBack())
   egrid_SetHeaderHeight(1, 42)
   egrid_SetOption(1, #egrid_SelectionBorderWidth, 2)
   For b=0 To 19 ;20 columns. 
     egrid_AddColumn(1,b,"Col " + Str(b),100)
   Next
   egrid_AddRows(1,-1, 100) ;Add 100 rows.
 
 egrid_CreateGrid(2, 320, 20, 280, 560,42,0, #egrid_GridLines|#egrid_ResizeColumnsTrue|#egrid_MultiLineText)
   egrid_SetHeaderHeight(2, 42)
   egrid_SetOption(2, #egrid_SelectionBorderWidth, 2)
   For b=0 To 19 ;20 columns. 
     egrid_AddColumn(2,b,"Col " + Str(b),100)
   Next
   egrid_AddRows(2,-1, 100) ;Add 100 rows.

 HideWindow(0,0)

 Repeat
   EventID = WaitWindowEvent()
   
   Select EventID
     
     Case #PB_Event_Gadget
   EndSelect
 Until EventID = #PB_Event_CloseWindow
EndIf
;/////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
Achja, der Grund warum ich das ganze brauche:
Ich hatte das ganze bis jetzt in einem Grid -> Scrollt man jedoch horizontal , sieht man nicht mehr die ersten Spalten.
Da die ersten Daten jetzt fix bleiben (horizontal) kann ich mit den zweiten horizontal scrollen.
Es ist im Prinzip wie in Excel, wo man Zeile 1-10 fixieren kann und ab Zeile 11 scrollen.

Es wäre natürlich super und wahrscheinlich einfacher,
wenn man die Breite der 2. Srollbar auf Null setzen könnte oder unsichtbar :mrgreen: ...

lg
Marco