Wie "subclasst" man zwei Listicongadgets?

Anfängerfragen zum Programmieren mit PureBasic.
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Wie "subclasst" man zwei Listicongadgets?

Beitrag 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
Windows 11 - PB 6.03 x64
_________________________________
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

:(
Wieso seid ihr immer so schnell...

...ich komm' immer zu spät.
Ist mir schon letzte Woche aufgefallen.
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag 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 :(
Windows 11 - PB 6.03 x64
_________________________________
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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.
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

Sind die Userlibs auf http://pbosl.purearea.net/ eigentlich immer up to date? Oder muss man includen?
Windows 11 - PB 6.03 x64
_________________________________
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag 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
Windows 11 - PB 6.03 x64
_________________________________
Antworten