Doel: weergave van de dagen van de week, waarbij iedere dag een reeks waarden bevat (orders). De dagen van een week zijn vertikaal gegroepeerd.

De dag wordt voorgesteld als een soort listbox, met op iedere lijn de weergave van een ordernummer. Maar ik wil niet alle Dag-Listboxen, met steeds dezelfde eigenschappen, op het scherm tekenen.
De orders worden er naartoe “gesleept” (vierkantje op schermafbeelding) en komen in de lijst als je ze loslaat boven de dag (maandag op schermafbeelding).
Als er meer orders in de listbox komen, moet hij “groeien”, dwz de hoogte van de listbox moet groter worden; en omgekeerd moet hij ook kunnen krimpen.
Bovendien: de Dag-Listbox moet meer kunnen dan een listbox, ik maak dus een afgeleide klasse bv myListbox, of zo. Beter: ik noemt die CPlanDay; het geeft de planning voor die dag weer.
VBox ordent een aantal van mijn Listboxes (objecten van CPlanDay) vertikaal tot een week.
Volgende vragen bleven me open toen dat gelukt was:
- Hoe maak ik een klasse die afgeleid is van een bestaande (Listbox)?
- Hoe maak ik de objecten van die klasse vanuit code; “on the run”?
- Hoe kan ik de extra mogelijkheden programmeren?
- Hoe bereik ik de bestaande mogelijkheden van de ouder-klasse Listbox?
Eerste poging:
De klasse:
' Gambas class file
INHERITS ListBox
STATIC PUBLIC lsbxMinHeight AS Integer = 40
STATIC PUBLIC lsbxMaxHeight AS Integer = 200
STATIC PUBLIC lsbxLineHeight AS Integer = 17
STATIC PUBLIC lsbxFontSize AS Integer = 9
STATIC PUBLIC iMonday AS Integer = 0
STATIC PUBLIC iTuesday AS Integer = 1
STATIC PUBLIC iWednesday AS Integer = 2
STATIC PUBLIC iThursday AS Integer = 3
STATIC PUBLIC iFriday AS Integer = 4
STATIC PUBLIC iSaturday AS Integer = 5
STATIC PUBLIC iSunday AS Integer = 6
PRIVATE iDay AS Integer = iMonday
PUBLIC SUB _new(OPTIONAL iDayNumber AS Integer)
IF (iDayNumber)
setDay(iDayNumber)
ENDIF
ME.Font.Size = lsbxFontSize
ME.Add("I just got birth")
END
PUBLIC SUB test()
Message.Info("hello")
END
PUBLIC SUB Drag()
ME.Remove(ME.Index)
ME.Height = ME.lsbxMinHeight + ME.Count * ME.lsbxLineHeight
END
PUBLIC SUB Drop()
ME.Add(Drag.Data)
DEBUG ME.Height & " > " & ME.lsbxMaxHeight
IF ME.Height < ME.lsbxMaxHeight
ME.Height = ME.lsbxMinHeight + ME.Count * ME.lsbxLineHeight
ENDIF
END
PUBLIC SUB Mousedrag()
IF Mouse.Left THEN
ME.Drag(ME[ME.Index].Text)
ENDIF
END
PUBLIC SUB setDay(iDayNumber AS Integer)
IF iDayNumber >= 0
IF iDayNumber <= 6
iDay = iDayNumber
ENDIF
ENDIF
END
PUBLIC SUB getDayNumber() AS Integer
RETURN iDay
END
PUBLIC SUB getDayName() AS String
SELECT iDay
CASE iMonday
RETURN "Monday"
CASE iTuesday
RETURN "Tuesday"
CASE iWednesday
RETURN "Wednesday"
CASE iThursday
RETURN "Thursday"
CASE iFriday
RETURN "Friday"
CASE iSaturday
RETURN "Saturday"
CASE iSunday
RETURN "Sunday"
END SELECT
END
De form waarin het gebruikt wordt:
...
DIM lsbxItem AS ListBox
DIM i AS Integer
aLine2 = NEW Variant[5]
FOR i = 0 TO 4
aLine2[i] = NEW CPlanDay(i, VBox2)
'aLine2[i].Test()
NEXT
...
Dat werkt echter nog niet: de dagen worden wel getekend, maar de drag en drop werkt niet (of enkel van de dag weg).
- Drop is een eigenschap die aangezet moet worden.
- De hierarchie moet juist aangesproken worden: SUPER keyword voor de parentklasse
- STATIC moet juist gebruikt worden (zonder "ME" prefix)
Hieronder een uitbreiding:
De klasse CPlanDay:
' Gambas class file
INHERITS ListBox
STATIC PUBLIC lsbxMinHeight AS Integer = 40
STATIC PUBLIC lsbxMaxHeight AS Integer = 200
STATIC PUBLIC lsbxLineHeight AS Integer = 17
STATIC PUBLIC lsbxFontSize AS Integer = 9
STATIC PUBLIC iMonday AS Integer = 0
STATIC PUBLIC iTuesday AS Integer = 1
STATIC PUBLIC iWednesday AS Integer = 2
STATIC PUBLIC iThursday AS Integer = 3
STATIC PUBLIC iFriday AS Integer = 4
STATIC PUBLIC iSaturday AS Integer = 5
STATIC PUBLIC iSunday AS Integer = 6
PRIVATE iDay AS Integer = iMonday
PRIVATE $hObserver AS Observer
PRIVATE $hDropObserver AS Observer
PUBLIC SUB _new(OPTIONAL iDayNumber AS Integer)
$hObserver = NEW Observer(ME) AS "Observer"
$hDropObserver = NEW Observer(ME) AS "Dropserver"
IF (iDayNumber)
setDay(iDayNumber)
ENDIF
ME.Font.Size = lsbxFontSize
ME.Drop = TRUE
ME.Height = lsbxMinHeight
' ME.Add(" - - - - " & ME.getDayName() & " - - - - - ")
END
PUBLIC SUB test()
Message.Info("hello")
END
PUBLIC SUB Observer_Drag()
ME.Remove(ME.Index)
SUPER.Height = lsbxMinHeight + SUPER.Count * lsbxLineHeight
END
PUBLIC SUB Observer_Drop()
SUPER.Add(Drag.Data)
DEBUG SUPER.Height & " > " & lsbxMaxHeight
IF SUPER.Height < lsbxMaxHeight
SUPER.Height = lsbxMinHeight + (ME.Count * lsbxLineHeight)
ENDIF
END
PUBLIC SUB Observer_Mousedrag()
ME.Drag(ME[ME.Index].Text)
ME.Remove(ME.Index)
END
PUBLIC SUB setDay(iDayNumber AS Integer)
IF iDayNumber >= 0
IF iDayNumber <= 6
iDay = iDayNumber
ENDIF
ENDIF
END
PUBLIC SUB getDayNumber() AS Integer
RETURN iDay
END
PUBLIC SUB getDayName() AS String
SELECT iDay
CASE iMonday
RETURN ("Monday")
CASE iTuesday
RETURN ("Tuesday")
CASE iWednesday
RETURN ("Wednesday")
CASE iThursday
RETURN ("Thursday")
CASE iFriday
RETURN ("Friday")
CASE iSaturday
RETURN ("Saturday")
CASE iSunday
RETURN ("Sunday")
END SELECT
END
De implementatie in gebruik:
...
PUBLIC SUB Form_Open()
DIM lsbxItem AS ListBox
DIM i AS Integer
DIM iWorkingDays AS Integer = 5
aLine2 = NEW Variant[iWorkingDays]
FOR i = 0 TO (iWorkingDays - 1)
aLine2[i] = NEW CPlanDay(i, VBox2)
NEXT
...