Visual Foxpro 8.0 is net uit en biedt ons tal van nieuwe mogelijkheden. Eén daarvan is het collection object. Je kunt een collection object gebruiken om een groep gerelateerde objecten samen te brengen in een collection. Je kunt door een collectie heen 'scannen' met het FOR EACH commando. Door vervolgens het collection object uit te breiden met specifieke methodes kun je er een mediator van maken.
Wat is een mediator?
Dit is een soort observer die de interactie tussen twee of meer objecten regelt. De objecten hoeven hierdoor geen kennis van elkaar te hebben; ze moeten alleen weten wie hun mediator is. Een mediator maakt het mogelijk om objecten "los" te koppelen en de communicatie over en weer kan hierdoor eenvoudig variëren.
De mediator zorgt voor een gemeenschappelijk en gecentraliseerd (en subclassable) point of entry, gedrag en gedragsmanagement, met een gemeenschappelijke interface.
Stel, we hebben een toolbar actief met daarop navigatie buttons zoals Volgende, Vorige, Eerste en Laatste. Daarnaast hebben we twee schermen actief die beide gebruikmaken van hun eigen, private datasessie en die naar verschillende tabellen kijken. We zouden graag willen dat de toolbar zich aanpast aan het actieve form, dus als het laatste record is bereikt binnen een form, worden de buttons Volgende en Laatste gedeactiveerd, etc.
De aanname in dit geval is dat het Refresh event van de toolbar de buttons (de-)activeert op basis van de status van de geselecteerde alias van het actieve scherm. In het Activate event van de schermen stuur je dan een message naar de mediator, bv
This.oMediator.Action("SCREENACTIVATE")
In Action method van de de mediator moet dan code staan om de juiste actie te ondernemen richting - in dit geval - toolbar.
Als je in de toekomst besluit de toolbar te vervangen door een andere toolbar, of je besluit een andere mediator te installeren of je wilt op basis van de message ook nog andere objecten refreshen ipv alleen de toolbar, dan kun je dat eenvoudig realiseren zonder rekening te moeten houden met de afhankelijkheden van de objecten onderling.
Voorbeeld
In het 1e stukje code wordt een collection gemaakt waar de objecten in worden gestopt, waar de mediator later zijn werk op moet doen:
LOCAL loCollection
loCollection = CREATEOBJECT("Collection")
*- Adding objects assuming they are there
loCollection.Add(form1)
loCollection.Add(form2)
loCollection.Add(Toolbar1)
*- Activate method form code
This.oMediator.Action("SCREENACTIVATE")
De Action-method van de mediator kan dan als volgt zijn werk doen:
*- Action method mediator
LPARAMETERS tcAction
DO CASE
CASE tcAction = "SCREENDEACTIVATE"
*- Actions for deactivation
CASE tcAction = "SCREENACTIVATE"
*- Action for screenactivate message
FOR EACH loObject IN This
IF UPPER(loObject.BaseClass) = "TOOLBAR"
loObject.Refresh()
ENDIF
NEXT
ENDCASE
Met dit eenvoudige voorbeeld hoop ik u op het juiste spoor te hebben gezet voor zowel het gebruik van het mediator pattern als een mogelijke toepassing van het nieuwe collection object.
Gerben Kessen is eigenaar en oprichter van Wantit B.V., een bedrijf dat gespecialiseerd is in maatwerksoftware, training en consultancy in Visual Foxpro. Gerben is een Microsoft Certified Professional en heeft een lange historie als Foxpro ontwikkelaar. U kunt hem bereiken via gerben.kessen@wantit.nl of www.wantit.nl