Uitbreiden van de huidige User Interface Designer in DiAS DMS/CRM.

Maat: px
Weergave met pagina beginnen:

Download "Uitbreiden van de huidige User Interface Designer in DiAS DMS/CRM."

Transcriptie

1 owered by TCPDF (www.tcpdf.org) Academiejaar Faculteit Ingenieurswetenschappen en Architectuur Valentin Vaerwyckweg Gent Uitbreiden van de huidige User Interface Designer in DiAS DMS/CRM. Masterproef voorgedragen tot het behalen van het diploma van Master in de industriële wetenschappen: informatica Nick BRONSELAER Promotoren: dr. Leen BROUNS Wim BAELEN (C&C) Begeleiders: Ilse HEIRWEGH (C&C) Miguel DERESE (C&C) Frederick LOYSON (C&C) Eline VAN DEN BERGHE (C&C)

2

3 owered by TCPDF (www.tcpdf.org) Academiejaar Faculteit Ingenieurswetenschappen en Architectuur Valentin Vaerwyckweg Gent Uitbreiden van de huidige User Interface Designer in DiAS DMS/CRM. Masterproef voorgedragen tot het behalen van het diploma van Master in de industriële wetenschappen: informatica Nick BRONSELAER Promotoren: dr. Leen BROUNS Wim BAELEN (C&C) Begeleiders: Ilse HEIRWEGH (C&C) Miguel DERESE (C&C) Frederick LOYSON (C&C) Eline VAN DEN BERGHE (C&C)

4

5 Woord Vooraf Voor we beginnen zou ik graag een paar mensen danken. Vooreerst mijn oprechte dank aan mijn ouders voor het geloof en financiële steun die ze mij hebben gegeven. Vervolgens wil ik ook mijn promotoren en begeleiders bedanken. Leen Brouns wil ik bedanken voor haar steun en advies. Wim Baelen wil ik bedanken voor zijn advies en de mogelijkheid die hij mij gaf om deze masterproef te voltooien. Helga Naessens wil ik bedanken voor het nalezen van deze scriptie en het advies dat ze gaf. Natuurlijk wil ik ook Liesbeth Mabilde, Ilse Heirwegh, Frederick Loyson en de rest van de werknemers bij C&C bedanken voor de hulp die ze mij gaven als er problemen waren. Ten slotte wil ik ook nog mijn vrienden Elias Van den Broeck, Céline Erauw, Pieter De Bisschop en Jan de Bisschop bedanken voor de ontspannende en luchtige momenten. ii

6

7 Inleiding Als student Master of Science: industriële wetenschappen - informatica moet er om af te studeren een thesis geschreven worden. Wat u hier zal lezen is het resultaat van de thesis: Uitbreiden van de huidige User Interface Designer in DiAS DMS/CRM. DIAS is een archiefprogramma voor Computers & Comunnications. De User Interface Designer is hier een onderdeel van. Deze User Interface Designer is heel primitief en gebruiksonvriendelijk. Er ontbreken meerdere functies die tegenwoordig vanzelfsprekend worden gevonden zoals multiselection. Het doel van de masterproef is deze designer uit te breiden en gebruiksvriendelijk te maken. De designer is geschreven in C# en maakt gebruik van de.net controls van Windows. De databank maakt gebruik van OpenEdge Progress 4GL. In deze thesis wordt er eerst uitleg gegeven over de User Interface Designer en zijn belangrijkste klassen. Vervolgens bekijken we de databank en ten slotte worden de uitbreidingen behandeld. iv

8

9 Inhoudsopgave Woord Vooraf Inleiding ii iv I De User Interface Designer 1 1 Doelstelling Wat Doel Belangrijke klassen Solution DIASBase DIASUI DIASUIControls II Databank 6 3 Progress 4GL Wat Hoe Tabellen III Uitbreidingen 9 4 Undo/Redo Hoe Memento pattern Tabbladen Oriëntatie Font & Kleur Kindtab vi

10 6 Vormen Eerste poging Tweede poging Subtypes Nieuwe Layout Oude Layout Databank PropertyGrid Wrapper FilteredPropertyGrid Versiebeheer Analyse Databank Aanpassingen UID Openen Problemen Testgebruikers Scrolling Probleem Oplossing Conditioner Voorbereiding Conditioner & Conditie Kleine Uitbreidingen Zoekbalk Titel en Tooltip Zoom IV Andere Na uitbreidingen Handleiding Testen Besluit 45 V Bijlagen 48 vii

11 Deel I De User Interface Designer 1

12 Hoofdstuk 1 Doelstelling 1.1 Wat De User Interface Designer (UID) is een onderdeel van de Digital Information and Archiving applicatie (DIAS DMS/CRM) van het softwarebedrijf Computers & Communications (C&C). Dias DMS/CRM stelt de gebruikers in staat om data te verzamelen in één groot archief. Deze data gaan van info over klanten tot rekeningen. De UID wordt ingezet om iedereen zijn eigen gepersonaliseerde bladspiegel te laten maken om deze data te lezen en in te voeren. De UID stelt de gebruiker in staat om eigen layouts te definiëren voor de weergave van: documenten projecten zoekvensters detailfiches Doel De UID is nog vrij primitief en er missen een paar cruciale mogelijkheden om hem gebruiksvriendelijk te maken: undo / redo resize van componenten via drag en drop sorteren van de controls in het paneel multiselecteren van elementen in de UID verticale tabbladen tabbladen voor kleur en font... Het de bedoeling om een gebruiksvriendelijke UID te maken die voor een beginner intuïtief te gebruiken is. 2

13 Hoofdstuk 2 Belangrijke klassen 2.1 Solution Om alles duidelijker te maken, wordt er eerst een beeld geschetst van hoe de code eruit ziet. Zo kan er later naar verwezen worden zonder verwarring. De solution van de DIAS bestaat uit verschillende projecten. De UID gebruikt er drie: DIASBase DIASUI DIASUIControls Nu wordt er gekeken naar de belangrijkste klassen uit deze drie projecten 2.2 DIASBase In DIASBase bevinden zich de algemene klassen. UIComponent beschrijft de componenten die worden gebruikt in de UID. Hier worden de properties, events en values meegegeven aan een component. DiasProperties is een geserialiseerde klasse die wordt gebruikt indien een component extra properties nodig heeft. UITabFolder bevat alle gegevens van een tabfolder zoals zijn hoogte, titel,... De componenten, tabfol- UILayout beschrijft hoe een formulier eruit ziet. ders, settings,... worden allemaal hierin opgeslagen. UIObject is het object dat je aanmaakt met de UID. Dit bevat een layout, een (sub)type en de securitysettings UIRenderer zorgt ervoor dat de aangemaakte objecten worden gebruikt in DIAS. 3

14 DIASManManager voor het opvragen van proxy-, cache- en andere objecten, evenals vertalingen. Deze klasse voldoet aan het singleton-pattern en kan enkel opgeroepen worden via de public static Instance. 2.3 DIASUI Hier bevinden zich alle panelen en vensters die kunnen aangepast worden via de UID. Ook de UID zelf bevindt zich hier. vwuidesigner beschrijft de UID. Het bevat een UIObject en de bruikbare componenten voor dit object. Het heeft ook een paneel waarop je de componenten kan plaatsen. frmuiobjects bevat het formulier dat gebruikt wordt indien je een gemaakt UIObject wilt openen. frmnewlayout bevat het formulier waarmee je een nieuw UIObject aanmaakt. Je kan een type en subtype kiezen en vervolgens bepalen of het object tabbladen heeft of niet. 2.4 DIASUIControls Hier bevinden zich alle custom controls en panelen die gebruikt worden over de hele solution. BasePanel is het paneel zonder tabbladen. Dit paneel wordt gebruikt bij de vwuidesigner indien er gekozen is om geen tabbladen te gebruiken. Dit bevat de events, controls en settings van alles wat geplaatst is. TabbedPanel is een afgeleide klasse van BasePanel en wordt gebruikt indien er wel tabbladen nodig zijn. Dit bevat dus alles wat een BasePanel bevat + de events en data nodig om de tabbladen te onderhouden. 4

15 Figuur 2.1: De UID 5

16 Deel II Databank 6

17 Hoofdstuk 3 Progress 4GL 3.1 Wat Progress 4GL is een ontwikkelingstaal en -omgeving gericht op het maken van zakelijke applicaties. De taal is bedacht en wordt onderhouden door Progress Software Corporation (PSC). De taal, doorgaans geclassificeerd als een vierde generatie programmeertaal, gebruikt een engelsachtige syntaxis om het ontwikkelen van applicaties te vergemakkelijken.[1] De naam is gewijzigd in 2006 van PROGRESS (of Progress 4GL) naar OpenEdge Advanced Business Language (OpenEdgeABL).[2] OpenEdge ABL helpt ontwikkelaars om snel een applicatie te ontwikkelen met een geïntegreerde relationele database en ontwikkeltool. De gemaakte applicaties draaien op meerdere computersystemen (Unix, Windows) en bieden toegang tot een scala aan populaire gegevensbronnen (zoals XML, ODBC, etc.), zonder dat ontwikkelaars de onderliggende lagen hoeven te begrijpen. OpenEdge ABL en de OpenEdge database worden door een value-added reseller gebruikt om een uniek product te genereren. Door de eenvoudige gebruikersinterface, zal de eindgebruiker de onderliggende technische lagen vaak niet eens zien. 3.2 Hoe Progress 4GL gebruikt een imperatieve programmeerstijl om toegang te krijgen tot een database, in plaats van embedded (SQL) expressies. De imperatieve stijl kenmerkt zich door het gebruik van FOR EACH expressies en FIND expressies. Daarnaast is er een variatie van expressies beschikbaar om formulieren te definiren en te gebruiken. Om binnen de expressies gebruik te kunnen maken van flow control bestaan er IF..THEN..ELSE statements en DO...WHILE statements. Hier is een voorbeeld van een query. FOR EACH u i o b j e c t WHERE u i o b j e c t. objectname EQ \ 0\ AND (STRING( SubTypes ) MATCHES 1 OR STRING( SubTypes ) MATCHES 0 ) BY SubTypes DESCENDING 0 en 1 zijn variabelen die worden meegegeven. 7

18 3.3 Tabellen In bijlage op pagina 49 bevindt zich het schema voor de databank. Dit is hoe de databank eruit zag voor de veranderingen. Er zijn een aantal velden toegevoegd, voornamelijk in UITabfolder en UIObject. In UITabFolder zijn de velden toegevoegd die nodig waren om de kleurveranderingen, oriëntatie en kindtab te veranderen (zie pagina 15). In UIObject is het veld Subtype dan weer veranderd in Subtypes(zie pagina 22). Er is ook een tabel aan toegevoegd door de implementatie van versiebeheer (zie pagina 28) 8

19 Deel III Uitbreidingen 9

20 Hoofdstuk 4 Undo/Redo 4.1 Hoe Om een Undo/Redo functionaliteit te bekomen was het snel duidelijk wat er nodig zou zijn. Er moet een object aanwezig zijn dat de veranderde data verzamelt en een container om al deze objecten op te slaan. Een stack is de perfecte container om deze data op te slaan door zijn last in, first out manier van ophalen. Om al deze objecten en containers op een ordelijke manier te gebruiken werd er gekozen om het memento pattern te gebruiken. 4.2 Memento pattern Figuur 4.1: UML van het memento pattern Het memento pattern is een design pattern specifiek gemaakt om een object in een vorige staat te kunnen herstellen. Het patroon bevat 3 grote objecten. De schepper (Originator) Het moment (Memento) De bewaarder (CareTaker) Figuur 4.1 toont de UML van dit pattern. De schepper is het object dat de momenten aanmaakt en een bepaalde staat kan teruggeven uit deze momenten. Het moment is een object dat een staat bijhoudt. Door dit moment later op te halen kan deze staat hersteld worden. De bewaarder houdt één of meerdere momenten bij en heeft ook een schepper. De bewaarder kan aan de schepper vragen om een moment van zijn staat te maken. Vervolgens zal de bewaarder verder werken en zich naar een andere 10

21 staat begeven. Indien de bewaarder zijn vorige staat terug wilt, kan hij aan de schepper vragen zijn staat terug te zetten. [3] Dit is een goed patroon, maar om het compatibel en overzichtelijker te maken is er besloten om een paar aanpassingen te doen.[4] Figuur 4.2: UML van het gewijzigde memento pattern Op figuur 4.2 is te zien dat er een aantal uitbreidingen en veranderingen hebben plaatsgevonden. Om te beginnen is er de Memento-interface. In de originele interface bevat deze enkel een getter en setter om een staat terug te geven. Deze interface is te generisch. Een interface die een gedrag beschrijft is handiger dan een die enkel eigenschappen beschrijft. Daarom hebben we de Restore-methode toegevoegd. De Restore-methode wordt gebruikt om de staat die meegegeven wordt te herstellen naar de opgeslagen staat. De methode geeft ook een Memento terug. Dit is nodig om de Redo-functionaliteit te implementeren. Er zijn 2 manieren waarop we deze momenten zouden kunnen implementeren. State Based Action Based State Based is meer gebaseerd op het originele patroon. Deze zal de gehele staat opslaan in het moment, inclusief de variabelen die niet veranderd zijn sinds de laatste staat. Deze manier is voor de programmeur gemakkelijk aangezien er maar één klasse moet gemaakt worden. Er is echter een groot nadeel aan verbonden. Door het feit dat je alle variabelen moet opslaan, neemt deze methode veel geheugen in. Dit is acceptabel indien er weinig variabelen zijn of als er maar weinig momenten moeten aangemaakt worden. De vwuidesigner is relatief groot en aangezien er een Undo/Redo functionaliteit geïmplementeerd wordt, zal er voor elke actie die gebeurt een moment worden opgeslaan. Deze methode is dus niet bruikbaar. Action Based maakt gebruik van meerdere implementaties van de Mementointerface. Voor elke actie die er kan gedaan worden, moet er een andere interface 11

22 zijn. Hier is een voorbeeld van het moment dat moet worden opgeslaan als je een component verwijdert. class RemoveComponentMemento : ComponentMemento private S t r i n g name ; private Point l o c a t i o n ; private UIComponent comp ; private S t r i n g parent ; public RemoveComponentMemento ( S t r i n g name, UIComponent comp ) this. name = name ; l o c a t i o n = new Point ( comp. Left, comp. Top) ; this. comp = comp ; this. parent = comp. ParentName ; public override IMemento<BasePanel> Restore ( IUIPanel t a r g e t ) IMemento<IUIPanel> i n v e r s e = new AddComponentMemento ( name ) ; Control p = t a r g e t. getparent ( parent ) ; i f ( p == null ) p = t a r g e t ; t a r g e t. AddComponent ( p, comp, l o c a t i o n ) ; t a r g e t. Refresh ( ) ; return i n v e r s e ; Hier worden enkel de nodige variabelen opgeslaan die nodig zijn om de actie ongedaan te maken. In geval van verwijderen wordt de naam, de component, de locatie van de component en zijn vader opgeslaan. Dit heeft natuurlijk veel minder geheugen nodig en is dus performanter. In de Restore-methode wordt er een nieuw moment aangemaakt. Dit is het tegenovergestelde moment dan hetgene dat hersteld wordt. Dit moment wordt teruggegeven om de Redo-functionaliteit te implementeren. Een ander moment dat wordt geïmplementeerd is het CompoundMemento. Dit is een verzamelklasse voor momenten. Stel dat je meerdere componenten in één keer verandert. Dit moet gezien worden als één moment. Voor elke component zal zijn moment moeten worden toegevoegd aan de CompoundMemento. public void BeginCompoundDo ( ) i f ( tempmemento!= null ) throw new I n v a l i d O p e r a t i o n E x c e p t i o n ( Previous memento wasn t commited. ) ; complex tempmemento = new CompoundMemento<T>() ; public void EndCompoundDo ( ) i f ( tempmemento == null ) throw new I n v a l i d O p e r a t i o n E x c e p t i o n ( Ending complex memento ) ; a non e x i s t i n g Do ( tempmemento ) ; tempmemento = null ; 12

23 Om deze momenten toe te voegen wordt eerst de BeginCompoundDo-Methode gebruikt. Deze zal een nieuw CompoundMemento-object aanmaken. Vervolgens worden alle aparte momenten in dit CompoundMemento gestoken. Als alle momenten verwerkt zijn, wordt de EndCompoundDo-methode opgeroepen. Deze zal het CompoundMemento-object opslaan en vervolgens terug op null zetten. Om al deze momenten op te slaan, wordt er gebruik gemaakt van een speciale stack, een RoundStack. De stack kan gezien worden als een cirkelvormige container die op het last in, first out (LIFO) principe werkt. Op het moment dat de container vol is wordt het oudste object verwijderd en maakt het plaats voor het nieuwe. Dit is noodzakelijk bij programma s waar lang in kan worden gewerkt zonder af te sluiten. Aangezien er bij elke actie momenten worden gecreëerd, gaan deze na verloop van tijd enorm veel geheugen gaan gebruiken als het aantal niet wordt beperkt. In de schepper zijn er ook aanpassingen gedaan. Om te beginnen worden de momenten nu hier opgeslaan in plaats van in de bewaarder. Er kan dus gezegd worden dat de schepper nu zowel bewaarder als schepper is. Dit komt door het feit dat de bewaarder in de UID de vwuidesigner is. Deze klasse is al groot genoeg. In plaats van dat er in de caretaker een container van momenten en een schepper moeten beheerd worden, is dit nu nog enkel in de schepper. De schepper maakt en bewaart de momenten. De caretaker geeft de opdracht aan de schepper om ze te maken, verwijderen en uit te voeren. Deze momenten worden opgeslaan in RoundStacks. Om de momenten in RoundStacks te steken wordt de Do-methode gebruikt. public void Do( IMemento<T> m) i f ( inundoredo ) throw new I n v a l i d O p e r a t i o n E x c e p t i o n ( I n v o l k i n g do w i thin an undo/ redo a c t i o n. ) ; i f ( tempmemento == null ) Do (m) ; else tempmemento. Add(m) ; private void Do ( IMemento<T> m) redostack. Clear ( ) ; undostack. Push (m) ; De Do-methode wordt opgeroepen vanuit de vwuidesigner. Deze zal eerst checken of de methode niet werd opgeroepen in een Undo/Redo actie. Vervolgens zal deze checken of er een CompoundMemento aangemaakt is, m.a.w. de BeginCompoundDo-Methode is aangeroepen geweest. Indien er een Compound- Memento is zal het moment worden toegevoegd aan het CompoundMemento, 13

24 anders wordt het moment opgeslagen in de undostack. public void Undo ( ) i f ( tempmemento!= null ) throw new I n v a l i d O p e r a t i o n E x c e p t i o n ( The complex memento wasn t commited. ) ; inundoredo = true ; IMemento<T> top = undostack. Pop ( ) ; redostack. Push ( top. Restore ( s u b j e c t ) ) ; inundoredo = f a l s e ; Als de Undo-Methode wordt gebruikt, wordt er eerst gekeken of er nog een Compoundmemento in gebruik is. Vervolgens begint de Undo/Redo functionaliteit. Het laatste moment wordt van de stapel gehaald en wordt hersteld. Het moment dat wordt gecreëerd hierdoor, wordt vervolgens op de Redostapel gezet. 14

25 Hoofdstuk 5 Tabbladen In de DIAS-applicatie zijn tabbladen een onderdeel van het paneel. Het zijn voor de gebruikers geen controls zoals in Visual Studio. Er waren bijgevolg beperkingen op de tabbladen. De tabbladen konden niet verticaal geplaatst worden en de header kon op de titel na ook niet veranderd worden. Er was ook geen mogelijkheid om in een tabblad een paneel en een kindtab te plaatsen. De tabbladen zijn niet de controls die standaard in de Windowsbibliotheek zitten. C&C maakt gebruik van DevExpress. Dit is een bibliotheek met controls die uitgebreid en aangepast zijn met meer mogelijkheden voor de programmeur en sneller en gebruiksvriendelijker voor de gebruiker. Hierdoor verloopt het programmeren anders dan met de Windowsbibliotheek. Hieronder beschrijven we de aanpassingen die geïmplementeerd werden in het kader van dit eindwerk. 5.1 Oriëntatie Om de oriëntatie van de headers te veranderen, is er een veld bij UITabFolder geplaatst. Dit veld bevat de waarde HORIZONTAL of VERTICAL. Om een tabcontrol verticaal te plaatsen in Windows, wordt er gebruik gemaakt van de Alignment property. Voor de DevExpress-control is dit iets ingewikkelder. Windows this. tabcontrol1. Alignment = System. Windows. Forms. TabAlignment. L e f t ; DevExpress DiASTabControl t c = new DiASTabControl ( ) ; t c. HeaderLocation = DevExpress. XtraTab. TabHeaderLocation. L e f t ; t c. HeaderOrientation = DevExpress. XtraTab. TabOrientation. V e r t i c a l ; Om te beginnen is er HeaderLocation. Deze variabele zorgt ervoor dat de headers zich aan de linkse kant van de tabfolder bevinden. HeaderOrientation zorgt er dan weer voor dat de tekst verticaal staat. DiasTabControl is een klasse afgeleid van DevExpress.XtraTab.XtraTabControl. Hierdoor kunnen er later nog uitbreidingen gemaakt worden. 15

26 5.2 Font & Kleur Om kleur en/of font van de header te veranderen kan er via een rechtermuisklik een propertiesmenu geopend worden (frmtabpageprop). Hierin kan de gebruiker via een FontDialog en ColorDialog de properties veranderen. Windows private void ChangeFontAndColor ( DiASTabPage tab, frmtabpageprop frmat, UITabFolder u i t f ) tab. Font = frmat. HeaderFont ; u i t f. Font = frmat. HeaderFont ; tab. ForeColor = frmat. HeaderForeColor ; u i t f. T i t l e C o l o r = frmat. HeaderForeColor ; tab. BackColor = frmat. HeaderBackColor ; u i t f. HeaderColor = frmat. HeaderBackColor ; DevExpress private void ChangeFontAndColor ( DiASTabPage tab, frmtabpageprop frmat, UITabFolder u i t f ) tab. Appearance. Header. Font = frmat. HeaderFont ; u i t f. Font = frmat. HeaderFont ; tab. Appearance. Header. ForeColor = frmat. HeaderForeColor ; u i t f. T i t l e C o l o r = frmat. HeaderForeColor ; tab. Appearance. Header. BackColor = frmat. HeaderBackColor ; u i t f. HeaderColor = frmat. HeaderBackColor ; Een verschil in de DevExpress-control is dat alle properties, die met uiterlijk te maken hebben, zich bevinden onder Appearance. De waarde wordt zowel in tab als in uitf opgeslaan. Dit komt doordat uitf hetgene is dat in de databank wordt opgeslaan en tab hetgene is dat gezien wordt en waar de events op kunnen gebeuren. 5.3 Kindtab Een van de grootste problemen was dat er geen controls en tabbladen tesamen in een tabblad konden worden geplaatst. Dit probleem is opgelost door gebruik te maken van een Panel en Splitter. Een Splitter is een control die gebruikt wordt om de grootte te veranderen van twee andere, naast elkaar gedockte, controls. In dit geval is dit tussen het geplaatste Panel en de tabcontrol. DiASTabPage p = ( ( ( System. Windows. Forms. ContextMenuStrip ) ( ( ( System. Windows. Forms. ToolStripItem ) ( sender ) ). as DiASTabControl ). SelectedTabPage as DiASTabPage ; i f ( p == null ) return ; System. Windows. Forms. Panel TopHeader = makepanel ( VERTICAL, TopHeader + AantalPanelen ) ; System. Windows. Forms. S p l i t t e r s p l i t t e r = new System. Windows. Forms. S p l i t t e r ( ) ; s p l i t t e r. BackColor = System. Drawing. Color. White ; 16

27 s p l i t t e r. Name = s p l i t t e r 1 ; s p l i t t e r. TabStop = f a l s e ; s p l i t t e r. Dock = DockStyle. L e f t ; DiASTabControl t c = new DiASTabControl ( ) ; t c. PanelName = TopHeader. Name ; t c. HeightPanel = TopHeader. Width ; t c. Name = TABCTRLFOR + p. Name ; t c. HeaderLocation = DevExpress. XtraTab. TabHeaderLocation. L e f t ; t c. HeaderOrientation = DevExpress. XtraTab. TabOrientation. V e r t i c a l ; t c. Dock = DockStyle. F i l l ; t c. ContextMenuStrip = this. contextmenustriptab ; t c. Images = this. imagelist1 ; p. C o n t r o l s. Add( t c ) ; p. C o n t r o l s. Add( s p l i t t e r ) ; p. C o n t r o l s. Add( TopHeader ) ; De panelen krijgen de naam TopHeaderX. X is het aantal panelen die al geplaatst zijn. De naam moet uniek zijn, omdat de geplaatste controls in het paneel een correcte parentname moeten hebben. Indien de naam niet uniek is, weet het programma niet in welke container het de controls moet plaatsen. De extra variabelen die nodig zijn om dit te kunnen opslaan zijn de naam en de hoogte of breedte van het paneel. Aangezien vroegere layouts gemaakt zijn zonder de optie om een paneel toe te voegen, moet er nog steeds een mogelijkheid zijn deze panelen te verstoppen. Om dit mogelijk te maken is er nog een variabele toegevoegd aan de UITabFolder. 17

28 Hoofdstuk 6 Vormen Om de layouts duidelijker en properder te maken, is het nodig om vormen en figuren toe te voegen. De rechthoek was al aanwezig, maar in veel omstandigheden is een lijn of een ovaal gewenst. Om deze vormen op een gemakkelijke manier toe te voegen is er gebruik gemaakt van Microsoft Power Packs. Deze bibliotheek bevat controls voor het toevoegen van lijnen en vormen. Er zijn twee pogingen gedaan om deze vormen toe te voegen. 6.1 Eerste poging Figuur 6.1: Deel van de werkbalk om vormen toe te voegen In een eerste poging om vormen toe te voegen werd gekozen om shapes via de werkbalk te selecteren en zo op de layout te tekenen. Zoals op figuur 6.1 te zien is, werd er gebruik gemaakt van drie radiobuttons. Indien er een werd geselecteerd, werd de multiselect uitgeschakeld en in plaats daarvan kon de geselecteerde figuur getekend worden. Voor er werd getekend kon ook de kleur en dikte van de omtrek veranderd worden. Elke vorm heeft zijn eigen klasse, de klassen waren zelf afgeleid uit 2 klassen: LineShape = Lijn SimpleShape RectangleShape = Rechthoek OvalShape = Ovaal of Ellips Deze shapes zijn niet afgeleid van System.Windows.Forms.Control. Hierdoor kan je deze shapes niet rechtsreeks op de layout tekenen. Er moet dus nog een soort wrapper tussenkomen. Deze wrapper is een ShapeContainer. De ShapeContainer is wel afgeleid van Control en kan dus op de layout geplaatst worden. 18

29 Problemen Door het feit dat de vormen niet afgeleid zijn van Control, waren er een paar problemen omdat deze figuren at runtime geplaatst moeten kunnen worden. Om te beginnen kon de klasse UIControl van DIAS zelf niet gebruikt worden. Hierdoor werkten veel van de basisopdrachten die de controls al hadden niet op de vormen. Om deze problemen op te lossen moesten vele events van de controls aangepast en toegevoegd worden op de ShapeContainer. Dit leidde dan weer tot veel licht verschillende dubbele code. Een ander probleem was enkel zichtbaar wanneer er met tabbladen werd gewerkt. Doordat de shapes op ShapeContainers moeten geplaatst worden, moet er dus voor elk tabblad ook een ShapeContainer zijn. Op zichzelf is dit geen probleem, maar deze vormen moeten verplaatsbaar zijn. Doordat de vormen niet 100 procent werken als controls was het veranderen van parent een waarschijnlijk mogelijk, maar onnodig lastig karwei. Na bespreking met de externe promotor en begeleiders is ervoor gekozen om deze manier te laten vallen. Mede omdat alles erg onoverzichtelijk en overladen dreigde te worden. 6.2 Tweede poging Om alle code zo proper mogelijk te houden is de beslissing genomen om de vormen als componenten toe te voegen. Dit had als nadeel dat de vormen moeilijker te vinden waren (opgelost door een andere uitbreiding, zie 12.1). Een ander nadeel was dat het niet meer vanzelfsprekend was om de richtingscoefficiënt van een lijn te laten veranderen door te slepen. Dit werd uiteindelijk vervangen door 2 componenten, een horizontale en verticale lijn. Aangezien het in officiële documenten niet nodig is om schuine lijnen te hebben is dit niet verder meer bekeken. Hier is voorbeeldcode van de verticale lijn. public p a r t i a l class c t r l L i n e V e r t i c a l : Panel private LineShape l i n e ; private ShapeContainer s c ; public c t r l L i n e V e r t i c a l ( ) I n i t i a l i z e C o m p o n e n t ( ) ; Height = ; Width = 3 0 ; s c = new ShapeContainer ( ) ; s c. Parent = this ; l i n e = new LineShape ( ) ; l i n e. Parent = s c ; l i n e. S t a r t P o i n t = new Point ( Width /2, 0) ; l i n e. EndPoint = new Point ( Width /2, Height ) ; s c. Shapes. Add( l i n e ) ; s c. SendToBack ( ) ; this. SizeChanged += new EventHandler ( r e s i z e ) ; 19

30 private void c t r l L i n e V e r t i c a l V i s i b l e C h a n g e d ( object sender, EventArgs e ) this. SendToBack ( ) ; s c. SendToBack ( ) ; private void r e s i z e ( object sender, EventArgs e ) Panel t = ( Panel ) sender ; l i n e. S t a r t P o i n t = new Point ( Width / 2, 0) ; l i n e. EndPoint = new Point ( Width / 2, Height ) ; Width = 3 0 ; protected override void OnPaint ( PaintEventArgs e ) base. OnPaint ( e ) ; this. SendToBack ( ) ; Color bordercolor = this. ForeColor ; BackColor = Color. Transparent ; l i n e. BorderColor = bordercolor ; De functie SendToBack wordt gebruikt zodat de vorm altijd op de achtergrond geplaatst wordt. Mocht dit niet het geval zijn, dan zou je de componenten die in de vorm staan niet meer kunnen bereiken. Problemen Een probleem bij deze oplossing was het instellen van de achtergrondkleur van de ovaal. Aangezien de component afgeleid is van Panel zal de property Background de gehele achtergrond veranderen, niet enkel de ovaal. Een eerste poging om dit op te lossen was de property Background overschrijven. Dit leek allemaal goed in theorie, maar in praktijk was dit niet haalbaar. Dit komt doordat de property heel veel wordt opgevraagd achter de schermen. Bij het verslepen van de control werd telkens weer het hele paneel ingekleurd. Uiteindelijk is de beslissing gevallen om een extra property toe te voegen aan de figuur. Dit wordt gedaan aan de hand van de DiasProperty klasse. public DIASBase. BaseObjects. DIASProperties P r o p e r t i e s get i f ( p r o p s == null ) LoadProperties ( 0 ) ; return p r o p s ; public void LoadProperties ( decimal d ) i f ( p r o p s == null p r o p s. OwningObject == 0) p r o p s = new C t r l O v a l P r o p e r t i e s ( d ) ; p r o p s. ValueChanged += new ChangedEventHandler ( props ValueChanged ) ; p r o p s. GetFromDB ( ) ; i f ( p r o p s. OwningObject > 0) 20

31 s e t C o l o r ( ) ; p r o p s. GetFromDB ( ) ; private void props ValueChanged ( object sender, EventArgs e ) s e t C o l o r ( ) ; [ S e r i a l i z a b l e ] public class C t r l O v a l P r o p e r t i e s : DIASProperties Kan d i t n i e t l a t e n z i e n Door een DiasProperties-object toe te voegen aan de component kan de property FillColor van OvalShape gebruikt worden. Het volgende probleem dat kwam opsteken was dat de wijziging van kleur pas zichtbaar was nadat er opgeslaan werd. Dit probleem werd opgelost door een event aan te maken. Een geserialiseerde klasse kan normaal geen events bevatten, maar hier is een omweg voor gebruikt. public delegate void ChangedEventHandler ( object sender, EventArgs e ) ; [ N o n S e r i a l i z e d ] private ChangedEventHandler changed ; public event ChangedEventHandler ValueChanged add changed += value ; remove changed = value ; NonSerialized kan enkel op velden gebruikt worden. Daarom moeten we de handler apart declareren zodat er NonSerialized op kan toegepast worden. 21

32 Hoofdstuk 7 Subtypes Als er een nieuwe layout wordt gemaakt in de UID, moest er één type en één subtype gekozen worden. Bijvoorbeeld: Indien je een opvolglayout wilt maken bedoeld om telefoongesprekken te volgen, is het type opvolg en subtype telefoongesprek. Dit zorgde ervoor dat er voor elk subtype een aparte layout gemaakt moest worden. Het is mogelijk dat sommige van deze subtypes dezelfde layout gebruiken. Er is een kopieerfunctie voorzien, maar deze meer dan twee keer toepassen is eigenlijk teveel werk. Zeker als er later aanpassingen moeten gemaakt worden, is dit niet gewenst. Daarom is er een aanpassing gedaan zodat een gemaakte layout toepasbaar is voor verschillende subtypes. 7.1 Nieuwe Layout Om te beginnen is de combobox vervangen door een lijst (zie figuur 7.1). In deze lijst bevinden zich alle subtypes voor het gekozen type. Indien er een nieuwe layout gemaakt wordt zonder een subtype te kiezen, wordt automatisch het subtype -standard- meegegeven. Aangezien de bruikbare controls voor verschillende subtypes vaak verschillend zijn, moeten deze aangepast worden. Enkel de controls die bruikbaar zijn voor alle mogelijke subtypes worden getoond. 7.2 Oude Layout Er zijn een paar aanpassingen nodig in de GUI om een opgeslagen layout te openen. Er is een kolom Aantal toegevoegd. Hierin staat voor hoeveel subtypes deze layout gebruikt wordt. Onder Subtype worden deze subtypes uitgeschreven gescheiden door //. Er is ook de mogelijkheid om de subtypes te veranderen tijdens het maken van de layout. Hiervoor kan er via een knop in de taakbalk een venster geopend worden (zie figuur 7.3). In dit venster wordt de naam en het type van de layout getoond en kunnen in de lijst de subtypes veranderd worden. 22

33 7.3 Databank Figuur 7.1: Een nieuwe layout maken Om deze subtypes op te slaan zijn er enkele regels afgesproken. De subtypes worden opgeslaan in één lange string. De separator hiertussen werd door C&C bepaald en is (char)3. In C# worden de subtypes opgeslaan als decimals. Dit betekent dat deze geconverteerd moeten worden naar strings om ze op te slaan in de databank. Deze strings moeten in AMERICAN format staan. Dit wilt zeggen dat de komma een punt moet worden. Dit wordt gedaan met volgend commando. S t r i n g subtype=commonfunctions. GetObjString ( t ) ; De conversie moet natuurlijk ook omgekeerd gebeuren. Dit wordt gedaan via; decimal subtype = decimal. Parse ( t, CommonFunctions. USCultureInfo ) ; Natuurlijk moeten de oude subtypewaarden geconverteerd worden naar de subtypes tabel. Hiervoor is er een progress-script geschreven. FOR EACH UIObject WHERE SubTypes= : ASSIGN SubTypes=o b j s t r i n g ( SubType obj ). END. Deze layouts moeten geladen worden in DIAS. Indien er bijvoorbeeld naar contacten gezocht wordt en er wordt voor een bepaald subtype gekozen, dan moet een layout getoond worden dat dit subtype bevat in zijn lijst. Dit was één van de eerste pogingen om een query te schrijven en er zijn een paar pogingen gedaan om in Progress een substring te zoeken in een lijst. Hier zijn enkele pogingen. 23

34 SubTypes MATCHES *1* OR SubTypes MATCHES *0* SubTypes CONTAINS 1 OR SubTypes CONTAINS 0 De eerste poging was relatief correct, maar er waren complicaties. Deze kreeg nog steeds niet het gewenste resultaat doordat de standaard layouts eerst werden getoond. Hierdoor zijn er een paar aanpassingen gedaan en dit is het eindresultaat. this. Proxy. g e t u i o b j e c t ( string. Format ( FOR EACH u i o b j e c t WHERE u i o b j e c t. objectname EQ \ 0\ AND (STRING( SubTypes ) MATCHES 1 ) BY SubTypes DESCENDING, objectname, CommonFunctions. GetObjString ( subtype ) ), 0, true, out ds, out errnb, out errparam ) ; i f ( ds. TTUIObject. Count == 0) this. Proxy. g e t u i o b j e c t ( string. Format ( FOR EACH u i o b j e c t WHERE u i o b j e c t. objectname EQ \ 0\ AND (STRING( SubTypes ) MATCHES ) BY SubType obj DESCENDING, objectname ), 0, true, out ds, out errnb, out errparam ) ; De query is dus in 2 gesplitst en indien er geen layouts zijn met het gewenste subtype, wordt de standaard layout opgehaald. Vervolgens is 0 ook geworden. Dit komt door de omzetting van decimal naar string. Figuur 7.2: Een layout openen 24

35 Figuur 7.3: Subtypes veranderen 25

36 Hoofdstuk 8 PropertyGrid Het bestaande propertygrid bevat zowel de events als de properties van de geselecteerde control(s). De events zijn scriptjes die zelf kunnen geschreven worden om bijvoorbeeld sommige controls te verstoppen zolang er niets is ingevuld. Er werd gevraagd om deze propertygrid op te splitsen in twee grids, één voor de properties en één voor de events. Om dit te realiseren moet er gebruik gemaakt worden van de BrowsableAttributes property van het grid. Het probleem is dat de standaard propertygrid maar één attribute toestaat, maar aangezien er meerdere zijn moet deze propertygrid uitgebreid worden. Er is ook van de gelegenheid gebruik gemaakt om niet alleen categorieën te gebruiken, maar ook properties zelf Wrapper Om te beginnen wordt er een wrapperklasse geschreven. Deze klasse bevat een referentie naar het object dat moet getoond worden in het propertygrid. Bijkomend bevat het ook een referentie naar alle properties die moeten getoond worden. Standaard bevat deze lijst alle properties die getoond kunnen worden. Deze klasse implementeert de interface System.ComponentModel.ICustomTypeDescriptor. Dit is noodzakelijk omdat de functie TypeDescriptor.GetProperties() wordt gebruikt om de properties van het geselecteerde object op te vragen. 8.2 FilteredPropertyGrid De normale propertygrid heeft enkel BrowsableAttributes. De nieuwe heeft er vier, namelijk: BrowsableAttributes: overschreven van PropertyGrid. HiddenAttributes: alle properties waarvan hun attributen zich bevinden in deze collectie zijn verstopt. BrowsableProperties: alle properties in deze collectie worden getoond. HiddenProperties: alle properties in deze collectie worden niet getoond. 1 Deze code is gebaseerd op [5] 26

37 Er worden drie functies overschreven. Zoals hierboven vernoemd, wordt BrowsableAttributes overschreven. Ook SelectedObject en SelectedObjects moeten overschreven worden. Deze moeten herschreven worden omdat ze moeten rekening houden met de wrapperklasse. Hier is code van hoe de properties worden opgevuld: private void ShowAttribute ( A t t r i b u t e a t t r i b u t e ) i f ( m Wrappers [ 0 ]!= null ) i f ( m Wrappers [ 0 ]. S e l e c t e d O b j e c t!= null ) P r o p e r t y D e s c r i p t o r C o l l e c t i o n f i l t e r e d o r i g i n a l p r o p e r t y d e s c r i p t o r s = TypeDescriptor. G e t P r o p e r t i e s ( m Wrappers [ 0 ]. S e l e c t e d O b j e c t, new A t t r i b u t e [ ] a t t r i b u t e ) ; i f ( f i l t e r e d o r i g i n a l p r o p e r t y d e s c r i p t o r s == null f i l t e r e d o r i g i n a l p r o p e r t y d e s c r i p t o r s. Count == 0) new ArgumentException ( A t t r i b u t e not found, a t t r i b u t e. ToString ( ) ) ; throw foreach ( P r o p e r t y D e s c r i p t o r p r o p e r t y d e s c r i p t o r in f i l t e r e d o r i g i n a l p r o p e r t y d e s c r i p t o r s ) ShowProperty ( p r o p e r t y d e s c r i p t o r ) ; private void ShowProperty ( P r o p e r t y D e s c r i p t o r property ) i f (! m P r o p e r t y D e s c r i p t o r s. Contains ( property ) ) m PropertyDescriptors. Add( property ) ; Telkens één van de vier properties verandert, wordt de private functie Refresh- Properties() opgeroepen. Deze bouwt een lijst met alle properties die moeten getoond worden en geeft die door aan de wrapper. Deze wrapper is verbonden met het propertygrid. 27

38 Hoofdstuk 9 Versiebeheer Voor het uitwerken van dit onderdeel van deze masterproef, werden aanpassingen aan een layout als zeer storend ervaren. De aangepaste layout kon namelijk niet uitgecheckt worden.dit wil zeggen dat aanpassingen meteen zichtbaar waren van zodra er op save geklikt werd. Bijgevolg zag een collega, die deze layout op dat moment gebruikte, controls verdwijnen of tevoorschijn komen. Om dit op te lossen, wordt er aan versiebeheer gedaan. 9.1 Analyse Versiebeheer is geen eenvoudige feature, daarom is er eerst een analyse uitgevoerd. Met een gebrek aan voorkennis en werkwijze van het bedrijf werd de eerste analyse afgewerkt (te vinden in Bijlage). In deze analyse werden velden toegevoegd aan reeds bestaande databanktabellen. Hierdoor werd er tijd bespaard door minder databankwerk. Tijdens de bespreking is er veel van gedachten gewisseld over de manier waarop er te werk wordt gegaan bij C&C en is er een nieuwe analyse gemaakt(ook te vinden in Bijlage). Er komt een nieuwe databanktabel bij. Er komen dus ook nieuwe procedures en nieuwe klassen in C#. 9.2 Databank Om te beginnen moet de layout van de databank aangepast worden. In de oude layout heeft elk object precies één layout. In de bespreking is er bepaald om een extra tabel toe te voegen. Deze tabel UILayoutVersion bevat het layoutversienummer en de foreign keys (relaties) met de controls, tabbladen en settings. De tabel bevat ook of de versie is ingecheckt. Vroeger waren de foreign keys van UILayout. Deze zijn dus verhuisd. Er is een veld toegevoegd aan UILayout, namelijk testusers. Dit is een lijst met gebruikers die altijd de laatste versie van een layout zullen zien. Deze gebruikers zullen dus de incheck-variabele negeren en altijd de laatste versie zien. Aangezien er een nieuwe tabel is, moeten er een paar zaken veranderen. Om te beginnen zijn er de indexen. Bijvoorbeeld: in de oude layout was in een UITabfolder zijn Name en zijn uilayoutobj uniek. Dit is niet meer het geval. Dus moet deze aangepast worden. Een tweede zaak zijn de triggers. Deze worden 28

39 Figuur 9.1: Relaties nieuwe databank gebruikt om alles properder en makkelijker te creëren en op te kuisen. Hier is een voorbeeld van een paar Delete-triggers. TRIGGER PROCEDURE FOR DELETE OF UILayoutVersion. / d e l e t e s e t t i n g s / FOR EACH U IS ett ing WHERE UI Se tti ng. UILayoutVersion obj EQ UILayoutVersion. UILayoutVersion obj EXCLUSIVE: DELETE U I S e t t i n g. END. / d e l e t e t a b f o l d e r s /... / d e l e t e components /... / d e l e t e o b j e c t /... l i b / r e c o r d d e l. i &TABLE=UILayoutVersion &Obj=UILayoutVersion. UILayoutVersion obj TRIGGER PROCEDURE FOR DELETE OF UILayout. / d e l e t e s e t t i n g s / FOR EACH UILayoutVersion WHERE UILayoutVersion. UILayout obj EQ UILayout. UILayout obj EXCLUSIVE: DELETE UILayoutVersion. END. l i b / r e c o r d d e l. i &TABLE=UILayout &Obj=UILayout. UILayout obj Tot slot moeten ook nog de procedures aangepast worden. Deze worden gebruikt om data uit de databank te halen en er ook in op te slaan. Dit wordt gedaan door middel van datasets. Het eerste dat gedaan moet worden zijn de datasetdefinities veranderen. Hier is een voorbeeld van de definitie van de nieuwe UILayout (alle volgende voorbeelden zullen van UIlayout zijn. UILayoutVersion wordt niet getoond omdat er meer velden zijn en het heeft connecties met te veel andere tabellen). 29

40 DEFINE TEMP TABLE TTLayout NO UNDO LIKE UILayout. DEFINE TEMP TABLE TTLayoutVersion NO UNDO LIKE UILayoutVersion. DEFINE DATASET dsuilayout FOR TTLayout, TTLayoutVersion DATA RELATION r e l v e r s i o n FOR TTLayout, TTLayoutVersion RELATION FIELDS ( UILayout obj, UILayout obj ) De dataset van UILayoutversion is natuurlijk groter omdat daar ook de controls, tabfolders en settings aan gekoppeld moeten worden. Nadat alle datasetdefinities geschreven zijn, moeten de procedures aangepast worden. Er zijn drie soorten procedures. Dataset ophalen met behulp van ID Dataset ophalen met behulp van query Dataset in databank opslaan Dataset ophalen met behulp van ID Hier staat niet alle code afgeprint, om de leesbaarheid te bevorderen. l i b / d e f d s u i l a y o u t. i DEFINE INPUT PARAMETER duilayout obj NO UNDO LIKE UILayout. UILayout obj. DEFINE OUTPUT PARAMETER DATASET FOR dsuilayout. DEFINE OUTPUT PARAMETER ierrnb AS INTEGER NO UNDO. DEFINE OUTPUT PARAMETER szerrparam AS CHARACTER NO UNDO.... ASSIGN szprepare = SUBSTITUTE( FOR EACH UILayout WHERE UILayout. UILayout obj EQ &1 NO LOCK,STRING( duilayout obj ) ). CREATE QUERY pquery. pquery : SET BUFFERS(BUFFER UILayout :HANDLE). ASSIGN fok = pquery :QUERY PREPARE( s z p r e p a r e ) NO ERROR. / e r r o r i n v u l l e n / CREATE DATA SOURCE pdslayout. ASSIGN pdslayout :QUERY = pquery. DEFINE DATA SOURCE dsversion FOR UILayoutVersion. BUFFER TTLayout : handle :ATTACH DATA SOURCE( pdslayout,?,?,? ). BUFFER TTLayoutVersion : handle :ATTACH DATA SOURCE(DATA SOURCE dsversion :HANDLE,?,?,? ). ASSIGN fok = DATASET dsuilayout : FILL ( ) NO ERROR. / e r r o r i n v u l l e n / DELETE OBJECT pquery. DELETE OBJECT pdslayout. Om te beginnen wordt de datasetdefinitie geïncludeerd. Vervolgens gaat men de in- en uitvoerparamaters declareren. Hierna wordt de query gemaakt en wordt de foutopvang gedaan. Ten laatste wordt de data in de dataset gestoken en teruggegeven. 30

41 Dit is de meest gebruikte manier om zaken uit te databank te halen. Het wordt gebruikt als je via een ID één bepaald object uit de databank wilt halen, bijvoorbeeld als je een gekozen layoutversie wilt openen. Dataset ophalen met behulp van query l i b / d e f d s u i l a y o u t. i DEFINE INPUT PARAMETER szprepare AS CHARACTER NO UNDO. DEFINE INPUT PARAMETER inumrec AS INTEGER NO UNDO. DEFINE INPUT PARAMETER fnolobs AS LOGICAL NO UNDO. DEFINE OUTPUT PARAMETER DATASET FOR dsuilayout. DEFINE OUTPUT PARAMETER ierrnb AS INTEGER NO UNDO. DEFINE OUTPUT PARAMETER szerrparam AS CHARACTER NO UNDO. DEFINE VARIABLE fok AS LOGICAL NO UNDO. RUN common/ g e t r e c o r d. p (INPUT UILayout :U, INPUT szprepare, INPUT inumrec, INPUT fnolobs, OUTPUT TABLE TTLayout, OUTPUT ierrnb, OUTPUT szerrparam ). IF ierrnb NE 0 THEN RETURN. FOR EACH TTLayout NO LOCK: / toevoegen S e c u r i t y r e c o r d s / FOR EACH UILayoutVersion WHERE UILayoutVersion. UILayout obj EQ TTLayout. UILayout obj NO LOCK: CREATE TTLayoutVersion. BUFFER COPY UILayoutVersion TO TTLayoutVersion. END. END. Ook hier wordt eerst de definitie geïncludeerd en vervolgens de in- en uitvoerparameters gedeclareerd. Het grote verschil hier is dat de query een invoerparameter is. Deze wordt dan via get record-methode gebruikt om de data op te halen. Vervolgens wordt de dataset opgevuld met de correcte gegevens. Deze methode wordt gebruikt indien je meerdere objecten wilt ophalen of één object niet op basis van zijn ID. Een voorbeeld hiervan is het weergeven van de lijst met layouts. Dataset in databank opslaan Hier staat niet alle code afgeprint, om de leesbaarheid te bevorderen. l i b / d e f d s u i l a y o u t. i DEFINE INPUT PARAMETER duser obj AS DECIMAL NO UNDO. DEFINE INPUT OUTPUT PARAMETER DATASET FOR dsuilayout.... FIND FIRST TTLayout EXCLUSIVE NO ERROR. IF NOT AVAIL( TTLayout ) THEN DO: ASSIGN ierrnb = RETURN. 31

42 END. FIND FIRST UILayout WHERE UILayout. UILayout obj EQ TTLayout. UILayout obj EXCLUSIVE NO ERROR. IF NOT AVAIL( UILayout ) THEN CREATE UILayout. BUFFER COPY TTLayout EXCEPT UILayout obj TO UILayout. / update LayoutVersion / FOR EACH TTLayoutVersion WHERE TTLayoutVersion. UILayout obj EQ TTLayout. UILayout obj EXCLUSIVE BY u i l a y o u t v e r s i o n o b j DESC: FIND FIRST UILayoutVersion WHERE UILayoutVersion. UILayoutVersion obj EQ TTLayoutVersion. UILayoutVersion obj EXCLUSIVE NO ERROR. IF AVAIL u i l a y o u t v e r s i o n THEN DO:... ELSE DO : CREATE u i l a y o u t v e r s i o n. BUFFER COPY TTLayoutVersion EXCEPT UILayoutVersion obj UILayout obj TO UILayoutVersion. u i l a y o u t v e r s i o n. u i L a y o u t o b j = u i l a y o u t. u i l a y o u t o b j. BUFFER COPY UILayoutVersion TO TTLayoutVersion. / update temp t a b l e / END. END. ASSIGN TTLayout. UILayout obj = UILayout. UILayout obj. / update d a t a s e t / Het begin is hier weer hetzelfde. Vervolgens wordt er gecheckt of de tabelrij al bestaat. Indien niet wordt er een nieuwe gecreëerd. Hierna wordt de dataset in deze rij gekopieerd. Een laatste iets dat moet gebeuren is de al bestaande rijen een correcte id geven. Om dit vlot te laten gebeuren is er besloten om de UILayout obj van de reeks bestaande rijen te kopiëren naar UILayoutVersion obj. 9.3 Aanpassingen UID Om deze databankwijziging te kunnen gebruiken in de UID, moeten er een paar zaken veranderen. Er is een nieuwe klasse UILayoutVersion gecreëerd die veel functionaliteit van de vroegere UILayout overneemt. Anderzijds moet bijna overal waar vroeger UILayout voor werd gebruikt, aangepast worden zodat dit UILayoutVersion wordt. Grotere wijzigingen worden hieronder besproken. 9.4 Openen Aangezien een UIObject nu verbonden is met een UILayoutVersion en niet meer met een UILayout, moet er in frmuiobjects ook een verandering gebeuren. Er is nu een object voor elke versie van een bepaalde layout. Indien deze zouden 32

43 worden gebruikt om het menu te vullen, zouden er enorm veel mogelijkheden zijn. Dit is niet overzichtelijk. Daarom is besloten om de layouts te gebruiken in plaats van de objecten. Er is maar één probleem hiermee. De data in de layouts is niet uniek genoeg om een layout te herkennen. Hierdoor moet er de mogelijkheid zijn om aan data te geraken van de laatste versie die gemaakt is. Het is hier dat er een probleem is ontstaan. Bij de eerste poging werd er bij elke opgevraagde layout een functie getlatest- Version opgeroepen. public L i s t <UILayoutVersion> g e t V e r s i o n s ( ) L i s t <UILayoutVersion> v e r s i o n s = new L i s t <UILayoutVersion >() ; dsuilayoutversiondataset dsdata = null ; int errnb = 0 ; string errparam = ; DIASMan. I n s t a n c e. Proxy. g e t u i l a y o u t v e r s i o n s ( string. Format ( FOR EACH UILayoutVersion WHERE UILayoutVersion. UILayout obj EQ 0, CommonFunctions. GetObjString ( o b j ) ), 0, true, out dsdata, out errnb, out errparam ) ; i f ( errnb!= 0) throw new Exception (DIASMan. I n s t a n c e. FormatErrorMessage ( errnb, errparam ) ) ; foreach ( dsuilayoutversiondataset. TTLayoutVersionRow row dsdata. TTLayoutVersion ) v e r s i o n s. Add(new UILayoutVersion ( row ) ) ; v e r s i o n s = v e r s i o n s. OrderByDescending ( x => x. Major ). ThenByDescending ( x => x. Minor ). ToList<UILayoutVersion >() ; in i f ( dsdata!= null ) CommonFunctions. ClearDataSet ( dsdata ) ; dsdata. Dispose ( ) ; dsdata = null ; return v e r s i o n s ; public UILayoutVersion g e t L a s t V e r s i o n ( ) L i s t <UILayoutVersion> v e r s i o n s = g e t V e r s i o n s ( ) ; return v e r s i o n s [ 0 ] ; In deze functie halen we eerst alle versies op en vervolgens geven we degene met het hoogste versienummer terug. In de getversions-methode gebruiken we de procedure met query omdat de layoutversions worden opgehaald met behulp van de uilayout obj en niet met uilayoutversion obj. Daarna worden alle versies in een lijst gestoken en wordt deze met behulp van Linq[6] gesorteerd op het versienummer. Het grote probleem bij deze poging was dat voor elke layout telkens weer een call naar de databank moet gedaan worden. Hierdoor onstaat er een groot performantieprobleem. Deze methode is dus niet bruikbaar. 33

44 Hierna is besloten om een soort lightklassen te maken. Deze klassen zouden de data bevatten van de objecten, versies en layouts, maar geen logica. Deze zouden gevuld worden met een dataset en bijhorende procedures, waarbij alle gegevens voor elke layout in één call worden opgevraagd. Hierdoor verbeteren we de performantie en houden enkel de noodzakelijke gegevens bij om geheugen te besparen. We vullen nu frmuiobjects op met de LightUILayout en maken hier gebruik van de lijst met versies die op voorhand zijn opgeslagen om zonder databankcalls de laatste versie te krijgen. Nadat de layout is gekozen, wordt er een nieuw venster geopend. Dit venster lijkt op frmuiobjects, maar in plaats van LightUILayouts worden hier UILightLayoutVersions getoond. Als er een versie is gekozen om aan te passen, wordt er via de UILayoutVersion obj, die werd opgeslaan in de lightklasse, een call gedaan naar de databank om het correcte object op te halen. 9.5 Problemen Er waren een paar problemen met allemaal dezelfde oorzaak. De problemen waren het verdwijnen van tabfolders en componenten na het opslaan, het niet compleet verwijderen van objecten in de database, etc. Al deze problemen hadden hun oorsprong in het niet veranderen van de triggers en indexen. Aangezien dit enkel in theorie werd gezien tijdens de lessen databanken, werd dit vergeten. Hierdoor waren de delete-triggers niet in orde, werd er geen unieke id aan een nieuwe versie gegeven en waren sommige zaken uniek die niet meer uniek mochten zijn. Een probleem dat losstond van het vorige stelde zich bij het ophalen van een gemaakte layout in DIAS. Subtypes zijn door een vorige uitbreiding aanpasbaar na het maken van een object. Nu er ook versies zijn, wil dit zeggen dat een vorige versie meer subtypes kan bevatten dan een nieuwere versie. Aangezien bij het laden van layouts alle objecten worden opgehaald met het correcte subtype en daar de laatst ingecheckte versie wordt getoond, werd er soms een layout getoond die niet meer het correcte subtype bevatte. Dit is opgelost door de gekozen recente layout te checken en indien deze niet het juiste subtype heeft, wordt hij op een blacklist gezet en nemen we de volgende layout. 9.6 Testgebruikers Om een nieuwe versie en testgebruikers toe te voegen, maakt men gebruik van onderstaand menu. De testgebruikers worden in de databank opgeslagen als een lange string van hun ID s met (char)3 als separator. Deze ID s worden gebruikt om de bovenstaande lijst te vullen. Elk item van de lijst heeft als tag zijn ID. Indien men een nieuwe testgebruiker wilt toevoegen, moet men in de textbox boven de lijst diens naam typen. Deze textbox bevat autocompletion. Hierdoor kan men een naam terugvinden, ook als hem niet volledig gekend is. public void AutoComplete ( ) AutoItem = new AutoCompleteStringCollection ( ) ; foreach ( User u in DIASMan. I n s t a n c e. Cache. Users. Values ) 34

45 AutoItem. Add( u. Name) ; txbadduser. AutoCompleteCustomSource = AutoItem ; Figuur 9.2: Menu voor versiebeheer 35

46 Hoofdstuk 10 Scrolling Sommige klanten willen in plaats van een formulier met tabs, alles op één groot blad. Om dit mogelijk te maken moet het in de UID mogelijk zijn om te scrollen terwijl je de controls verplaatst Probleem De eerste oplossing die geprobeerd werd, was het gebruiken van de autoscrollproperty van het paneel waar de controls zich op bevinden. Dit werkte indien je de controls verplaatste door drag & drop, maar wanneer je de control wou verplaatsen via zijn properties werkte dit niet. Het probleem was dat de autoscrollposition niet werd meegerekend. Pogingen om dit op te lossen zijn allemaal mislukt en daarom is er overgegaan op een andere optie Oplossing De autoscrollproperty van het paneel is afgezet en de property is aangezet op de tabpagina waarin het paneel zich bevindt. Dit zorgt ervoor dat de autoscrollpositie verdwijnt. De positie op het paneel is nu vast en de autoscrollpositie die normaal problemen geeft voor het paneel vallen weg omdat het paneel gedockt is in de tabpagina. Om automatisch te kunnen scrollen, wordt er gekeken of de linkermuisknop is ingeklikt en waar zijn positie is. Als zijn positie bovenaan het scherm is, wordt er naar boven gescrolled en als het zich onderaan bevindt, is het naar beneden. Natuurlijk moet er ook rekening gehouden worden met de grootte van het paneel. Indien de scrollbalk helemaal naar beneden is gescrold moet het paneel vergroten. Dit lijkt makkelijker dan het is, want hoe wordt er gecheckt waar de scrollbalk is? Om dit te doen is er gebruik gemaakt van Win32 [7]. [ DllImport ( user32 ) ] private s t a t i c extern int G e t S c r o l l I n f o ( I n t P t r hwnd, int nbar, ref SCROLLINFO s c r o l l I n f o ) ; [ DllImport ( user32. d l l ) ] public s t a t i c extern void mouse event ( int dwflags, int dx, int dy, int dwdata, int dwextrainfo ) ; 36

47 // t h i s w i l l cause a v e r t i c a l s c r o l l // h e i g h t >0 = naar onder public s t a t i c void V S c r o l l ( int h e i g h t ) mouse event (0 x0800, 0, 0, height, 0) ; public struct SCROLLINFO public int c b S i z e ; public int fmask ; public int min ; public int max ; public int npage ; public int npos ; public int ntrackpos ; // g e t i f s c r o l l b a r i s down public s t a t i c bool ReachedBottom ( S c r o l l a b l e C o n t r o l pan ) SCROLLINFO s c r o l l I n f o = new SCROLLINFO( ) ; s c r o l l I n f o. c b S i z e = Marshal. SizeOf ( s c r o l l I n f o ) ; s c r o l l I n f o. fmask = 0 x10 0x1 0x2 ; G e t S c r o l l I n f o ( pan. Handle, 1, ref s c r o l l I n f o ) ; //nbar = 1 > V S c r o l l b a r return ( s c r o l l I n f o. max == s c r o l l I n f o. ntrackpos + s c r o l l I n f o. npage ) ( s c r o l l I n f o. max == s c r o l l I n f o. ntrackpos + s c r o l l I n f o. npage 1) ; De functie ReachBottom geeft true terug wanneer de scrollbalk helemaal beneden staat. De functie VScroll wordt gebruikt als zekerheid. De functie hoeft er niet gebruikt te worden, maar ze geeft zekerheid dat de scrollbalk meebeweegt met de muis. Om de hoogte van het paneel aan te passen,wordt volgende code gebruikt. i f ( p.y > this. Height b o r d e r s e n s i t i v i t y ) i f ( S c r o l l A i d. ReachedBottom ( p a n e l C o n t r o l ) ) pan elc ontr ol. AutoScrollMinSize = new S i z e ( p a n e l C o n t r o l. AutoScrollMinSize. Width, pa nelc ontr ol. AutoScrollMinSize. Height + s c r o l l s e n s i t i v i t y ) ; i f ( p a n e l C o n t r o l. V e r t i c a l S c r o l l. Value <= p a n e l C o n t r o l. V e r t i c a l S c r o l l. Maximum s c r o l l s e n s i t i v i t y ) p a n e l C o n t r o l. V e r t i c a l S c r o l l. Value += s c r o l l s e n s i t i v i t y ; de snelheid of gevoeligheid van het scrollen kan aangepast worden in de taakbalk. De hoogte van het paneel is altijd zo hoog als de laagste control plus een bepaalde marge. Als de laagste control verwijderd wordt, wordt ook de hoogte opnieuw berekend. 37

48 Hoofdstuk 11 Conditioner Soms is het gewenst dat een control enkel zichtbaar is als een andere control is ingevuld of aangevinkt. Om zaken zoals dit te regelen is er de mogelijkheid tot scripting in de UID gestoken. Dit heeft wel een groot nadeel. Het is namelijk niet gebruiksvriendelijk. Mensen zonder een achtergrond in programmeren zullen het moeilijk hebben om dit te snappen en te gebruiken. Dit heeft tot gevolg dat het scriptingonderdeel van de layouts gevraagd wordt aan de medewerkers van C&C. Dit is tijd dat nuttiger kan worden gebruikt en dus verloren gaat. Daarom moet er een andere, gebruiksvriendelijkere oplossing komen. Dit leidt tot een conditioner. De conditioner is gebaseerd op een al bestaande conditioner ergens anders in de DIAS-software. Wegens tijdgebrek is deze conditioner niet volledig af. De reeds bestaande conditioner is volledig aangepast, maar het deel dat van de conditie het resultaat maakt, is nog niet geïmplementeerd Voorbereiding Om de conditioner te kunnen testen en snel implementeerbaar te maken, is ervoor gekozen om het enkel te implementeren voor de property IsMandatory. Deze property is een boolean, maar de conditie is een string, bijgevolg moet deze property worden aangepast. Er moet ook een GUI gemaakt worden zodat de conditie kan worden aangepast. Het is deze GUI die al deels bestaat in een ander onderdeel van DIAS. Om van deze GUI gebruik te kunnen maken, moet je in de propertygrid van de UID deze kunnen oproepen. Dit wordt op de volgende manier bereikt. [ Browsable ( true ) ] [ Category ( DIAS ) ] [ Editor ( typeof ( DIASBase. UIObjects. UID. Condition ), typeof ( System. Drawing. Design. UITypeEditor ) ) ] public S t r i n g IsMandatory Deze stukken code moeten boven de property-implementatie worden geplaatst, waar een conditie gewenst is. Browsable geeft aan of de property zichtbaar is. 38

49 In Category kan er een categorie genoemd worden onder welk de property zich zal bevinden. De editor geeft aan met welke klasse dat property kan aangepast worden. In dit geval is dit de klasse Condition. Deze klasse is afgeleid van de klasse UITypeEditor en moet twee methoden declareren. De eerste methode is GetEditStyle. Deze bevat de manier waarop het propertyveld eruit ziet in de grid. Er zijn drie mogelijkheden: Niets (default) Dropdown (geeft een dropdownlijst met mogelijke waarden) Modal (mogelijkheid om venster te openen) Het is de derde waarde die nodig zal zijn. De tweede methode is EditValue. In deze methode wordt het venster geopend en wordt de waarde aan de property gegeven Conditioner & Conditie Figuur 11.1: De originele conditionbuilder Aan de conditioner is niet veel veranderd, maar één van de verandering zorgt voor veel problemen. Er is namelijk een veld toegevoegd om een property van de controls te geven zoals checked, text, etc. Het veld toevoegen was niet zo moeilijk. De correcte properies bij de juiste controls weergeven was iets moeilijker, maar ging relatief vlot. Het is het omgekeerde dat lastig is en ook een reden waarom dit niet voltooid is. Hoe ga je zonder een hele if/else-structuur de property van een control ophalen uit een variabele die de naam heeft van de property. Zoals vernoemd is een if/else-structuur best mogelijk, maar indien je moet rekening houden met de aard van de control (checkbox, textbox, radiobutton,...) en de verschillende properties is dit niet overzichtelijk. Bij de vorige conditioner was er geen propertyveld en werd de conditie vertaald bij het ophalen van de data in de databank. Dit is hier niet mogelijk omdat de databank de waarden niet kent van vele van deze properties. Wegens tijdsgebrek is er niet verder gezocht naar een betere oplossingen en is de conditioner hier gestopt. De mogelijkheid om een conditie te maken is er, maar niet de vertaling naar een boolean. 39

50 Hoofdstuk 12 Kleine Uitbreidingen 12.1 Zoekbalk Figuur 12.1: Het zoekpaneel Er was gevraagd het mogelijk te maken om te sorteren en zoeken in de toolbox met de controls. Hiervoor is er een extra paneel toegevoegd dat kan worden verstopt door op de verrekijker te klikken in de taakbalk. Er zijn 3 manieren waarop deze toolbox ordelijker kan worden gemaakt. De eerste is groeperen van de controls en de tweede is sorteren van de controls. private void cbsortby SelectionChangeCommitted ( object sender, EventArgs e ) ComboBox cb = ( ComboBox) sender ; i f ( cb. S e l e c t e d I n d e x == 0) //Name l v C o n t r o l s. ListViewItemSorter = new ListViewNameComparer ( ) ; else i f ( cb. S e l e c t e d I n d e x == 1) // Type 40

51 l v C o n t r o l s. ListViewItemSorter = new ListViewTypeComparer ( ) ; public class ListViewNameComparer : IComparer public ListViewNameComparer ( ) public int Compare ( object x, object y ) ListViewItem xitem = ( ListViewItem ) x ; ListViewItem yitem = ( ListViewItem ) y ; return S t r i n g. Compare ( xitem. Text, yitem. Text ) ; De derde manier is zoeken. Dit wordt gedaan via reguliere expressies. foreach ( ListViewItem l v i in a l l I t e m s ) i f ( Regex. IsMatch ( l v i. Text,. + t x t S e a r c h. Text +., RegexOptions. IgnoreCase ) ) founditems. Add( l v i ) ; 12.2 Titel en Tooltip Figuur 12.2: Titel & Tooltip Deze verandering was moeilijker dan oorspronkelijk gedacht. Dit komt door het Translationobject dat dit venster heeft. Een Translationobject is een object dat voor één zin, meerdere vertalingen bijhoudt. Het is niet toegelaten dat één component, in dit geval een tabblad, twee Translationobjecten heeft. Het is namelijk niet mogelijk om dit in de databank op te slaan zonder een veld toe te voegen. Dit is de reden waarom het samengevoegd was. De eerste poging om dit probleem op te lossen was een veld toe te voegen in de databank. Dit liep relatief vlot tot de definities van alle andere Translationobjecten moesten worden aangepast. Dit waren er veel en daarom is de beslissing gevallen om het veld terug te verwijderen. De tweede en laatste poging was het origineel samengevoegd bericht te behouden. Het bericht zou vervolgens voor het uitschrijven en bewaren, gesplitst en 41

52 terug samengevoegd worden. Op deze manier is er nog steeds maar één Translationobject per component en hoeven er geen databankveranderingen plaats te vinden Zoom Er zijn veel mensen die via windows hun scherm laten uitzoomen omdat ze de tekst te klein vinden. Dit zorgde ervoor dat alle afstanden in de zelfgemaakte layouts veranderden. Labels werden onder controls getekend, controls stonden veel te dicht bij elkaar,... Om dit te corrigeren moeten we eerst zien te achterhalen wat de zoom is. Dit kunnen we vinden door de dots per inch(dpi) op te vragen.[8] public double getzoom ( System. Drawing. Graphics g ) f l o a t dpix ; dpix = g. DpiX ; i f ( 110 <= dpix && dpix <= 130) return ; else i f ( dpix > 130) return ; else return 1. 0 ; Vervolgens moeten alle breedte-, hoogte- en locatievariabelen vermenigvuldigd worden met deze zoom. Bij het opslaan moet de zoom natuurlijk eerst weer verwijderd worden. Anders is het mogelijk de zoom op elkaar te stapelen en dit is niet gewenst. De methode getzoom() wordt geplaatst in DIASMan zodat alle klassen die deze functie nodig hebben deze kunnen gebruiken. 42

53 Deel IV Andere 43

54 Hoofdstuk 13 Na uitbreidingen 13.1 Handleiding Tijdens het werk aan de uitbreidingen is er ook een handleiding geschreven. Aangezien er vele nieuwe features in de UID zijn geplaatst, is dit een noodzakelijk werk. In deze handleiding staan alle grote en de meeste kleine veranderingen aangeduid en uitgelegd door middel van tekst en screenshots. Deze handleiding is te vinden in de bijlagen. Op het einde van het coderen is deze handleiding overlopen met een collega die niet is gespecialiseerd in programmeren Testen Bij C&C worden alle testen uitgevoerd door het programma te gebruiken. Hierdoor zijn de meeste testen gebeurd door zelf de code te builden en de UID te gebruiken. Zoals hierboven vernoemd, is er uitleg gegeven aan een collega. Deze collega heeft voor en na de uitleg ook de UID gebruikt en heeft alle fouten en onhandigheden in een excelbestand ingevoerd. Zo kon het excelblad overlopen worden om de overige bugs eruit te halen. 44

55 Besluit In het algemeen ben ik zeer tevreden met het resultaat. Er zijn geen zware complicaties opgetreden. Hierdoor waren de kerntaken, beschreven in het uitgebreid voorstel, relatief vlug uitgewerkt. Dit heeft mij de gelegenheid gegeven om aan andere zaken te werken zoals het versiebeheer. Het is bij deze uitbreiding dat ik het meest heb geleerd. Er moest namelijk veel met PROGRESS gewerkt worden. Aangezien vele zaken zoals procedures en indexen enkel theorie waren in de cursus, heb ik deze nu in praktijk kunnen toepassen. De conditioner was een extra feature die ook gestart werd, maar niet kon afgewerkt worden door de complicaties beschreven op blz 38. Dit toont dat elk werk nog voor verbetering vatbaar is. De ideen werden aangereikt, en mits extra tijd voor (o.a.) grootschalige testen, zal deze conditioner ook ingepast kunnen worden in het voorliggende geheel. Tot slot: er werd een werkend programma afgeleverd, dat veel meer mogelijkheden bezit dan zijn voorganger. 45

56 Lijst van figuren 2.1 De UID UML van het memento pattern UML van het gewijzigde memento pattern Deel van de werkbalk om vormen toe te voegen Een nieuwe layout maken Een layout openen Subtypes veranderen Relaties nieuwe databank Menu voor versiebeheer De originele conditionbuilder Het zoekpaneel Titel & Tooltip Schema van de oude databank

57 Bibliografie [1] J Sadd. OpenEdge Development: Progress 4GL Handbook. Red. door Progress Software Corporation. isbn: ISBN [2] G Kassabgi. Special Edition : Using Progress. Red. door Que Publishing. isbn: [3] LLC Data & Object Factory. Memento url: com/patterns/patternmemento.aspx. [4] Sean Yixiang Lu. Generic Memento Pattern for Undo-Redo in C# url: Pattern-for-Undo-Redo-in-C. [5] bsargos. Filtering properties in a PropertyGrid url: codeproject. com / Articles / / Filtering - properties - in - a - PropertyGrid. [6] Ahmad Mageed. Sort with two criteria, string ascending, int ascending url: http : / / stackoverflow. com / questions / / sort - with-two-criteria-string-ascending-int-ascending. [7] King King. How to know if RichTextBox vertical Scrollbar reached the max value? url: stackoverflow. com/ questions/ / how- to- know- if- richtextbox- vertical- scrollbar- reached- themax-value. [8] David Heffernan. How to get Windows Display setting? url: http: / / stackoverflow. com / questions / / how - to - get - windows - display-settings. 47

58 Deel V Bijlagen 48

59 Oud databankschema Figuur 1: Schema van de oude databank 49

60 Handleiding uitbreidingen UID Lente 2014

61 Inhoudstafel Inleiding... 1 NOODZAKELIJK INDIEN UPDATE JUIST GEÏNSTALLEERD Taakbalk Subtypes Nieuwe layout Open layout Veranderen at runtime De Toolbox Tabbladen Vertical tabbladen Uitzicht Eigenschappen Tabvolgorde Ouder veranderen Versiebeheer Openen Verwijderen Beheer Functionaliteit Undo/redo Multiselect veranderen Resize Tooltip Delete Scrolling Tabindexering Afstand label... 9

62 Inleiding In deze handleiding worden de veranderingen van de UID uit de doeken gedaan. Het is aangeraden om de handleiding Administrator Manual 2013 te lezen voor u dit leest, omdat hier enkel de nieuwe mogelijkheden besproken worden. NOODZAKELIJK INDIEN UPDATE JUIST GEÏNSTALLEERD Voor je begint te werken met Dias, moeten er twee zaken gedaan worden. Het databank script laten runnen zodat alles correct is opgevuld Alle layoutsopnieuw laten saven. Om dit te doen ga je naar de UID en klik je in de taakbalk op. 1 Taakbalk 1) Zie 5.2 2)Zie 3 3)Zie 2.3 4) Zie 6.7 5) Zie 6.1 6) Zie 6.6 2Subtypes 2.1 Nieuwe layout 1

63 Zoals u kan zien is de selectiebox vervangen door een selectielijst. Het is nu mogelijk om een layout meerdere subtypes te geven zodat u niet dezelfde layout meerdere keren hoeft te maken. Indien er geen subtype(s) geselecteerd is, zal Standaard als subtype gelden. 2.2 Open layout Hier is een nieuwe kolom toegevoegd, namelijk Aantal. Deze kolom geeft aan hoeveel subtypes de layout beschrijft. Onder subtype worden de meerdere subtypes gescheiden door //. 2

64 2.3 Veranderen at runtime Indien je het subtype nog wilt veranderen als je de layout hebt aangemaakt, kunt u op klikken in de taakbalk. Dit zal bovenstaand venster openen. Hier ziet u de naam, het type en de meerdere subtypes van de layout. Hier kunt u, net zoals u een nieuwe layout maakt, andere subtypes selecteren. 3

65 3 De Toolbox Het is mogelijk om te zoeken en sorteren in de toolbox. Het zoekveld is enkel zichtbaar wanneer gewenst. Om het zoekveld te tonen of te verstoppen klikt u op in de taakbalk. Groepeer zorgt ervoor dat de componenten gegroepeerd worden volgens de geselecteerde norm. Je hebt drie normen: Algemeen, Type en Alfabetisch. Algemeen zet de componenten apart die niet uniek zijn voor de layout en dus meerdere keren gebruikt kunnen worden. Type plaatst de controls in groepen volgens het soort component en alfabetisch zet de controls tesamen volgens hun eerste letter of cijfer. Sorteren kan op twee normen: Naam en Type. Beide zijn alfabetisch, maar het eerste is op naam van de component, de tweede is op het type van de component. Via zoek kan je zoeken naar een component volgens drie normen: Naam, Type en Code. U hoeft enkel te selecteren waarop u wilt zoeken en de zoekterm in het tekstveld eronder schrijven. Er zijn ook enkele extra componenten toegevoegd. Deze zijn allemaal Algemeen en zijn extra vormen om een mooiere layout te kunnen maken. De extra componenten zijn: Lijn (Horizontaal) Lijn (Verticaal) Ovaal Elk van deze componenten heeft een extra property lijndikte meegekregen, deze is te vinden onder"control specific"in het propertyvenster 4

66 4 Tabbladen 4.1 Vertical tabbladen Om een verticaal tabniveau toe te voegen klik je enkel op tab niveau toevoegen (Verticaal). De andere opties hebben dezelfde functionaliteit als voorheen. 4.2 Uitzicht De tabbladen plakken niet meer aan elkaar. Er is nu plaats voorzien waar u componenten kan plaatsen. Deze plaats kan verstopt worden onder eigenschappen(zie onder) 4.3 Eigenschappen 5

67 Er zijn enkele nieuwe eigenschappen toegevoegd. De eerste is Verstop paneel. Zoals hierboven vernoemd laat deze optie toe om het extra paneel, tussen 2 tabs, te verstoppen. Indien de tab geen kindtabs heeft is deze optie overbodig. Een tweede optie is Lettertype & kleur. Deze laat toe om het lettertype en kleur van de tabheader te kiezen. Een voorbeeld wordt ernaast weergegeven. De derde en laatste optie is Kleur header. Deze laat toe de achtergrondkleur van de tabheader te veranderen. De knop zelf zal de gekozen kleur krijgen als voorbeeld. 4.4 Tabvolgorde Vroeger kon je de tabvolgorde enkel veranderen via eigenschappen. Nu is het ook mogelijk deze te verslepen naar de goede plaats. 4.5 Ouder veranderen Je kan ook de tab verplaatsen naar een andere tablijn zoals zijn ouder of kind. Dit doe je door op "TabOuder veranderen" te klikken en in volgend scherm zijn nieuwe ouder te kiezen. Kinderen zullen niet zichtbaar zijn, aangezien je hiernaar niet kan verplaatsen. 5 Versiebeheer Er is nu de mogelijkheid om verschillende versies te maken van je layouts. Zo kan je een layout aanpassen zonder dat andere mensen meteen de nieuwe layout te zien krijgen. 6

68 5.1 Openen Zoals je hierboven kan merken, is het openen van een layout gewijzigd ten opzichte van de vroegere situatie. In het eerste venster kies je zoals vroeger het type layout en krijg je van de laatst aangemaakte versie zijn nummer, naam(omschrijving) en subtypes te zien. Indien er maar één versie bestaat zal deze meteen geopend worden. Indien er echter meerdere zijn, zal je in een nieuw venster deze versies te zien krijgen. Hierin zie je het versienummer, zijn aantal subtypes en de subtypes zelf, zijn omschrijving, of het een systeemlayout is en of de versie is ingecheckt. 5.2 Verwijderen Zoals in de toolbalk te zien, zijn er twee verwijdericonen. De vuilbak zal de layoutversie verwijderen, de map met vuilbak zal de hele layout met alle versies verwijderen. 7

69 5.3 Beheer Onder instellingen vind je een nieuwe tab versiebeheer. Hierin kan je verschillende instellingen aanpassen. Ten eerste kan je de versie uit- of inchecken. Je kan ook een nieuwe versie aanmaken. Deze versie moet hoger zijn dan de vorige. De lijst met gebruikers zijn de gebruikers die de laatste versie te zien zullen krijgen en niet de laatst uitgecheckte versie. 6 Functionaliteit 6.1 Undo/redo Je kan bepaalde zaken ongedaan maken, zoals verwijderen,toevoegen en veranderen van componenten. Je kan undo oproepen door op gebruiken. Redo kan gebruikt worden door op te klikken in de taakbalk of de shortcutctrl-z te te klikken of shortcutctrl-y te gebruiken. 6.2 Multiselect veranderen Het is mogelijk om multiselect te gebruiken om een property op meerdere componenten inéén keer te veranderen. 6.3 Resize Componenten kan je resizen door te slepen. U hoeft dus niet meer via de properties de waardes handmatig in te geven. Hier kan ook gebruik van gemaakt worden als er meerdere componenten zijn geselecteerd. 6.4 Tooltip Er kan via het propertiesveld een tooltip worden toegevoegd aan de component. Bij sommige velden zal deze tooltip enkel zichtbaar zijn als je over de label blijft stilstaan. 8

70 6.5 Delete Je kan componenten verwijderen door de te verwijderen componenten te selecteren en op de deletetoets te drukken. 6.6 Scrolling Indien je een paneel kiest zonder tabbladen, dan zal het paneel zich automatisch vergroten indien je een control langs de zijkant verplaatst. Je kan de snelheid van het scrollen aanpassen in de toolbalk. 6.7 Tabindexering Zoals te zien in de toolbalk heeft de tabindexering nu 3 mogelijkheden. De eerste twee zijn alle controls en tabs automatisch indexeren volgens positie. Verticaal zal eerst naar beneden gaan en vervolgens de controls ernaast, Horizontaal doet het omgekeerde. Manueel is zoals het vroeger was. De keuze wordt bewaard en indien je savet zal de tabvolgerde worden aangepast indien het op horizontaal of verticaal staat. De tabindexering is heel gevoelig op de hoogte van de controls. Hier moet je dus goed op letten. Indien het lijkt dat de tabindexering niet correct is, kijk zeker na of de controls op dezelfde hoogte staan. 6.8 Afstand label In het propertgrid kan je de afstand tussen het label en de control aanpassen. Dit kan zowel horizontaal als verticaal. Dit is respectief LabelDistance X en LabelDistance Y. 9

71 Eigen analyse Database veld Version => String; Conversie van string naar double om versie te vergelijken is gemakkelijk. Conversie van decimal, double naar string => laat de 0 vallen bv 1.0 -> 1 Via script alles op 1.0 zetten in het begin. Veld in UIObject of UILayout? UILayout: zo houdt je in het openobject menu steeds maar één mogelijkheid. UILayout moet ook veld Actief krijgen: Dit dient om te weten welk van de layouts gebruikt wordt buiten het testen. Dit veld mag maar bij 1 layout van hetzelfde object actief zijn. In UIObject moet de mogelijkheid er zijn om meerdere layouts op te halen: - Lijst met UILayout-obj - ////////UILayout krijgt een veld UIObject_obj; (of objects) In C# In vwuidesigner: Bij setting veld version toevoegen. Hier staat de versie vermeld en een knop om een nieuwe versie op te geven. Er moet een mogelijkheid zijn om terug te keren naar een vorige layout, maar de versie blijft hetzelfde. Zo kan je terug vertrekken van een oude layout, maar kan je de versies niet verknoeien. Nieuw versie venster: Hier kan je een nieuwe versie opgeven. Deze moet groter zijn dan de laatste versie en mag enkel bestaan uit cijfers en punten. Ook worden alle versie opgesomd en kan je de actieve versie kiezen.

72 In frmuiobject (het open venster): Kolom versie bijzetten. Laatste of actieve versie laten zien. In UIObject: Indien je een uiobjectophaald via frmuiobject moet de laatste versie getoond worden. In de meeste andere gevallen moet de actieve getoond worden. Hier moeten dus 2 ophaalfuncties zijn string prep = string.format("for EACH uilayoutwhere uilayout.active EQ yesand (STRING(1) MATCHES ( * +uilayout.uilayout_obj+ * ) 1 is de lijst met uilayout_obj. In de reguliere expressie moet uilayut.uilayout_obj een string zijn geen decimal DEFINE VARIABLE imaxas INTEGER no-undo. FOR EACHuiLayout (WHEREUIobject_obj =1) BREAK BY uilayout.uilayout_obj: ACCUMULATEversion(MAXIMUM BY uilayout.uilayout_obj). IF LAST-OF(uiLayout.uiLayout_obj) THEN DO: ASSIGNimax=(accum maximum version). END. END. FOR EACH uilayout where version=imax

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double.

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double. Algemeen C# Variabele Een variabele is een willekeurige waarde die word opgeslagen. Een variabele heeft altijd een datetype ( De soort waarde die een variabele bevat). Datatypes Een datatype is de sort

Nadere informatie

public Bier ( string N, double P, Brouwerij B) { Naam = N; AlcoholPerc = P; Brouwer = B;

public Bier ( string N, double P, Brouwerij B) { Naam = N; AlcoholPerc = P; Brouwer = B; Beschouw bijvoorbeeld de twee onderstaande klassen, waarvan de attributen en eigenschappen geannoteerd zijn met bijkomende XML-annotaties: using System ; using System. Xml ; using System. Xml. S e r i

Nadere informatie

Voor de database wordt een Access 2000 bestand gebruikt, met voorlopig 1 tabel:

Voor de database wordt een Access 2000 bestand gebruikt, met voorlopig 1 tabel: Eenvoudig voorbeeld. Er wordt verondersteld dat er met VS 2008 EXPRESS gewerkt wordt. Voor de database wordt een Access 2000 bestand gebruikt, met voorlopig 1 tabel: (Sommige schermafdrukken zijn afkomstig

Nadere informatie

Een eerste applicatie

Een eerste applicatie Een eerste applicatie 2.1 Inleiding Programmeren in Visual Basic.NET doe je niet alleen door regels met code te schrijven. Je begint met het ontwerpen van een venster in de design mode met allerlei controls,

Nadere informatie

SQL is opgebouwd rond een basisinstructie waaraan één of meerdere componenten worden toegevoegd.

SQL is opgebouwd rond een basisinstructie waaraan één of meerdere componenten worden toegevoegd. BASISINSTRUCTIES SQL SQL : Structured Query Language is een taal gericht op het ondervragen van een relationele database en die aan veel klassieke databasemanagementsystemen kan worden gekoppeld. SQL is

Nadere informatie

Klassen & objecten, overerving, abstracte klassen, debuggen, interfaces, formulieren, polymorfie, statische methoden, event-handlers

Klassen & objecten, overerving, abstracte klassen, debuggen, interfaces, formulieren, polymorfie, statische methoden, event-handlers 1 Inhoud Klassen & objecten, overerving, abstracte klassen, debuggen, interfaces, formulieren, polymorfie, statische methoden, event-handlers 2 Geluidsbronnen simulator, deel 2 Inleiding De weergave versnellen

Nadere informatie

Sparse columns in SQL server 2008

Sparse columns in SQL server 2008 Sparse columns in SQL server 2008 Object persistentie eenvoudig gemaakt Bert Dingemans, e-mail : info@dla-os.nl www : http:// 1 Content SPARSE COLUMNS IN SQL SERVER 2008... 1 OBJECT PERSISTENTIE EENVOUDIG

Nadere informatie

Les 15 : updaten van gegevens in de database (deel2).

Les 15 : updaten van gegevens in de database (deel2). Les 15 : updaten van gegevens in de database (deel2). In de volgende reeks lessen zal alle vorige leerstof uitgebreid aan het bod komen. Zie ook de vorige lessen en documenten om informatie op te zoeken

Nadere informatie

Gebruikershandleiding CEN Editor

Gebruikershandleiding CEN Editor Gebruikershandleiding CEN Editor Ministerie van Verkeer en Waterstaat Directoraat-Generaal Rijkswaterstaat Rijksinstituut voor Kust en Zee/RIKZ S O F T W A R E S O L U T I O N S Versies: Versie Datum Toelichting

Nadere informatie

Open SQL Server Management Studio en log in als Administator. Je ziet dan wat je in figuur 2.1 ziet.

Open SQL Server Management Studio en log in als Administator. Je ziet dan wat je in figuur 2.1 ziet. Hoofdstuk 2 Een ASP.NET applicatie met ADO.NET opzetten In dit hoofdstuk ga je een eenvoudige website opzetten, waarbij je een aantal gegevens uit een database ophaalt. Je moet je kennis van ADO.NET dus

Nadere informatie

Maak een pivot uit een Generic.List

Maak een pivot uit een Generic.List Maak een pivot uit een Generic.List Introductie in extensions, reflection en code generation Nivo: 400 Introductie In bepaalde gevallen komt het voor dat je een Generic.List van een specifieke class hebt,

Nadere informatie

SQL datadefinitietaal

SQL datadefinitietaal SQL datadefinitietaal We kunnen er het schema van de database mee bepalen: metadata toevoegen, wijzigen en verwijderen uit een database. Basiscommando's: CREATE : toevoegen van metagegevens DROP : verwijderen

Nadere informatie

Fun met webparts in ASP.Net

Fun met webparts in ASP.Net Fun met webparts in ASP.Net Deel 2:User controls en Webparts door Bert Dingemans, e-mail : info@dla-os.nl www : http:// 1 Inhoudsopgave FUN MET WEBPARTS IN ASP.NET... 1 DEEL 2:USER CONTROLS EN WEBPARTS...

Nadere informatie

NHibernate als ORM oplossing

NHibernate als ORM oplossing NHibernate als ORM oplossing Weg met de SQL Queries Wat is ORM? ORM staat in dit geval voor Object Relational Mapping, niet te verwarren met Object Role Modeling. ORM vertaalt een objectmodel naar een

Nadere informatie

Handleiding: Rapportages Publicatiedatum: 12 mei 2010 (versie 1.0) Pagina 1 van 22 pagina s. Handleiding Rapportages

Handleiding: Rapportages Publicatiedatum: 12 mei 2010 (versie 1.0) Pagina 1 van 22 pagina s. Handleiding Rapportages Pagina 1 van 22 pagina s. Handleiding Rapportages Pagina 2 van 22 pagina s. Inhouds Opgave Rapportages... 3 Rapportdefinities... 4 Importeren & Exporteren... 5 Bedrijfslogo aanpassen... 8 De rapport editor

Nadere informatie

Technische nota AbiFire5 Rapporten maken via ODBC

Technische nota AbiFire5 Rapporten maken via ODBC Technische nota AbiFire5 Rapporten maken via ODBC Laatste revisie: 29 juli 2009 Inhoudsopgave Inleiding... 2 1 Installatie ODBC driver... 2 2 Systeeminstellingen in AbiFire5... 3 2.1 Aanmaken extern profiel...

Nadere informatie

Handleiding voor Zotero versie 2.0

Handleiding voor Zotero versie 2.0 Handleiding voor Zotero versie 2.0 Michiel Wolda De handleiding voor Zetero is geschreven voor de lezers van het boek Deskresearch: Informatie selecteren, beoordelen en verwerken: tweede editie (Van Veen

Nadere informatie

Programmeren: Visual Basic

Programmeren: Visual Basic PETERSTUYVESANT COLLEGE INFORMATICA 2009-2010 Programmeren: Visual Basic Algemene Kennis: 01. Programmeren Programmeren is het schrijven van een computerprogramma, een concrete verzameling instructies

Nadere informatie

Werking van de Office Connector, en het oplossen van fouten.

Werking van de Office Connector, en het oplossen van fouten. Werking van de Office Connector, en het oplossen van fouten. De Office Connector zorgt ervoor dat de Microsoft Officeomgeving gebruikt kan worden als ontwerp en genereeromgeving voor documenten waarbij

Nadere informatie

SQL manipulatietaal. We kunnen er data mee toevoegen, wijzigen en verwijderen uit een database.

SQL manipulatietaal. We kunnen er data mee toevoegen, wijzigen en verwijderen uit een database. SQL manipulatietaal We kunnen er data mee toevoegen, wijzigen en verwijderen uit een database. Basiscommando's: INSERT : toevoegen van gegevens DELETE : verwijderen van gegevens UPDATE : wijzigen van gegevens

Nadere informatie

Release Notes. Afdrukdatum: 2008/10/06

Release Notes. Afdrukdatum: 2008/10/06 Release Notes Afdrukdatum: 2008/10/06 Dit document beschrijft vanuit technisch oogpunt de aanpassingen in Hi-Ant aan de betreffende versie. Deze tekst is geenszins bedoeld als document naar de eindgebruiker,

Nadere informatie

HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Module 4 Programmeren

HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Module 4 Programmeren HOOFDSTUK 3 3.1 Stapsgewijs programmeren De programmeertalen die tot nu toe genoemd zijn, zijn imperatieve of procedurele programmeertalen. is het stapsgewijs in code omschrijven wat een programma moet

Nadere informatie

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, 13.30 15.30 uur

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, 13.30 15.30 uur Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, 13.30 15.30 uur 1. deze opgave telt voor 30% van het totaal. Schrijf een compleet programma, dat door de gebruiker vanaf

Nadere informatie

icafe Project Joeri Verdeyen Stefaan De Spiegeleer Ben Naim Tanfous

icafe Project Joeri Verdeyen Stefaan De Spiegeleer Ben Naim Tanfous icafe Project Joeri Verdeyen Stefaan De Spiegeleer Ben Naim Tanfous 2006-2007 Inhoudsopgave 1 2 1.1 Programmeertaal PHP5..................... 2 1.2 MySQL database......................... 3 1.3 Adobe Flash...........................

Nadere informatie

Release Notes. Afdrukdatum: 2008/11/13

Release Notes. Afdrukdatum: 2008/11/13 Release Notes Afdrukdatum: 2008/11/13 Dit document beschrijft vanuit technisch oogpunt de aanpassingen in Hi-Ant aan de betreffende versie. Deze tekst is geenszins bedoeld als document naar de eindgebruiker,

Nadere informatie

DELPHI VOOR ELEKTRONICI. Deel 2: Een rekenmachine programmeren CURSUS

DELPHI VOOR ELEKTRONICI. Deel 2: Een rekenmachine programmeren CURSUS DELPHI VOOR ELEKTRONICI CURSUS Deel 2: Een rekenmachine programmeren Herman Bulle met dank aan Anton Vogelaar In het vorige artikel hebben we de programmeeromgeving van Delphi geïntroduceerd en zijn er

Nadere informatie

Offective > CRM > Vragenlijst

Offective > CRM > Vragenlijst Offective > CRM > Vragenlijst Onder het menu item CRM is een generieke vragenlijst module beschikbaar, hier kunt u zeer uitgebreide vragenlijst(en) maken, indien gewenst met afhankelijkheden. Om te beginnen

Nadere informatie

6. Het maken van een database

6. Het maken van een database 6. Het maken van een database 6.1. Inleiding In hoofdstuk 5 heb je de oefendatabase gemaakt doormiddel van een script. In dit hoofdstuk ga je zelf een database maken en deze vullen met tabellen. Hiervoor

Nadere informatie

Automatisering voor Financiële Dienstverleners. Werken met Queries en Merge Documenten. For more information visit our website at www.pyrrho.

Automatisering voor Financiële Dienstverleners. Werken met Queries en Merge Documenten. For more information visit our website at www.pyrrho. Automatisering voor Financiële Dienstverleners Werken met Queries en Merge Documenten For more information visit our website at www.pyrrho.com Date: Document Nr: 30 maart, 2007 UBizzMerge, Versie 4.0 Status:

Nadere informatie

Mach3Framework 5.0 / Website

Mach3Framework 5.0 / Website Mach3Framework 5.0 / Website Handleiding Mach3Builders Inhoudsopgave 1 Inloggen...5 1.1 Ingelogd blijven...6 1.2 Wachtwoord vergeten...7 2 Applicatie keuzescherm...8 2.1 De beheeromgeving openen...9 3

Nadere informatie

Dynamiek met VO-Script

Dynamiek met VO-Script Dynamiek met VO-Script Door Bert Dingemans DLA Ontwerp & Software bert@dla-architect.nl Inleiding Op de SDGN nieuwsgroep voor Visual Objects ontstond laatst een draad van berichten over de nieuwe libraries

Nadere informatie

MA!N Rapportages en Analyses

MA!N Rapportages en Analyses MA!N Rapportages en Analyses Auteur Versie CE-iT 1.2 Inhoud 1 Inleiding... 3 2 Microsoft Excel Pivot analyses... 4 2.1 Verbinding met database... 4 2.2 Data analyseren... 5 2.3 Analyses verversen... 6

Nadere informatie

Tekenen met Floorplanner

Tekenen met Floorplanner Overzicht Het scherm 1. Zoom 2. Opslaan 3. Verdieping tab 4. Undo / Redo 5. Constructiemenu 6. Bibliotheek 7. Tekenvlak Eigenschappenmenu s De plattegrond wordt opgebouw uit verschillende elementen: ruimtes,

Nadere informatie

Wat is nieuw in deze handleiding: Dit is een nieuwe handleiding welke nieuwe functies beschrijft.

Wat is nieuw in deze handleiding: Dit is een nieuwe handleiding welke nieuwe functies beschrijft. Doel Module Fronter 92 Dit document is gemaakt door Fronter Ltd fronter.com. Het document mag alleen gekopieerd of digitaal verspreid worden volgens contract of in overeenstemming met Wat is nieuw in deze

Nadere informatie

De tekstverwerker. Afb. 1 de tekstverwerker

De tekstverwerker. Afb. 1 de tekstverwerker De tekstverwerker De tekstverwerker is een module die u bij het vullen van uw website veel zult gebruiken. Naast de module tekst maken onder andere de modules Aankondigingen en Events ook gebruik van de

Nadere informatie

Formulieren maken met Dreamweaver CS 4/CS 5

Formulieren maken met Dreamweaver CS 4/CS 5 Formulieren maken met Dreamweaver CS 4/CS 5 In deze handleiding leer je om een formulier en elementen die je binnen een formulier kunt gebruiken, te ontwerpen met Dreamweaver. Het uitgangspunt is dat dit

Nadere informatie

Beheer van databanken

Beheer van databanken Beheer van databanken Wim De Proost Jan Jochems Pieter Van den Akkerveken Departement Handelswetenschappen en Bedrijfskunde Bachelor Informatica 3 de jaar Academiejaar 2011-2012 2 Inhoud INLEIDING... 3

Nadere informatie

Hoofdstuk 16: Grafieken en diagrammen: hoe

Hoofdstuk 16: Grafieken en diagrammen: hoe Hoofdstuk 16: Grafieken en diagrammen: hoe 16.0 Inleiding Wanneer je de betekenis van een serie nummers in een presentatie wilt weergeven, zal je ondervinden dat een diagram de meest effectieve manier

Nadere informatie

Informatica. Objectgeörienteerd leren programmeren. Van de theorie met BlueJ tot een spelletje met Greenfoot... Bert Van den Abbeele

Informatica. Objectgeörienteerd leren programmeren. Van de theorie met BlueJ tot een spelletje met Greenfoot... Bert Van den Abbeele Informatica Objectgeörienteerd leren programmeren Van de theorie met BlueJ tot een spelletje met Greenfoot... Bert Van den Abbeele http://creativecommons.org/licenses/by-nc-nd/3.0/legalcode Objectgeörienteerd

Nadere informatie

Central Station. CS website

Central Station. CS website Central Station CS website Versie 1.0 18-05-2007 Inhoud Inleiding...3 1 De website...4 2 Het content management systeem...5 2.1 Inloggen in het CMS... 5 2.2 Boomstructuur... 5 2.3 Maptypen... 6 2.4 Aanmaken

Nadere informatie

Deel 1: PowerPoint Basis

Deel 1: PowerPoint Basis Deel 1: PowerPoint Basis De mogelijkheden van PowerPoint als ondersteunend middel voor een gedifferentieerde begeleiding van leerlingen met beperkingen. CNO Universiteit Antwerpen 1 Deel 1 PowerPoint Basis

Nadere informatie

Automating Complex Workflows using Processing Modeler

Automating Complex Workflows using Processing Modeler Automating Complex Workflows using Processing Modeler QGIS Tutorials and Tips Author Ujaval Gandhi http://google.com/+ujavalgandhi Translations by Dick Groskamp This work is licensed under a Creative Commons

Nadere informatie

Objectgeorïenteerd werken is gebaseerd op de objecten die door het systeem gemanipuleerd worden.

Objectgeorïenteerd werken is gebaseerd op de objecten die door het systeem gemanipuleerd worden. Herhaling Objectgeorïenteerd werken is gebaseerd op de objecten die door het systeem gemanipuleerd worden. De basisbouwsteen is het object; een geïntegreerde eenheid van data en operaties werkend op deze

Nadere informatie

Dynamische gebruikersbeslissingen in SAP Workflow

Dynamische gebruikersbeslissingen in SAP Workflow Dynamische gebruikersbeslissingen in SAP Workflow Inleiding Een gebruikersbeslissing in een SAP Workflow definitie biedt de mogelijkheid om een optiescherm aan de gebruiker aan te bieden. Hiermee kan de

Nadere informatie

Formulieren maken met Dreamweaver CS 4

Formulieren maken met Dreamweaver CS 4 Formulieren maken met Dreamweaver CS 4 In deze handleiding leer je om een formulier en elementen die je binnen een formulier kunt gebruiken, te ontwerpen met Dreamweaver. Het uitgangspunt is dat dit zoveel

Nadere informatie

Gebruik van raadpleeg- en downloadservices in GIS desktop software

Gebruik van raadpleeg- en downloadservices in GIS desktop software Gebruik van raadpleeg- en downloadservices in GIS desktop software Inhoud ArcGIS... 2 Gebruik WMS in ArcGIS... 2 GetFeatureInfo request... 6 Gebruik WFS in ArcGIS... 7 WFS service toevoegen... 7 Enkel

Nadere informatie

HTA Software - Klachten Registratie Manager Gebruikershandleiding

HTA Software - Klachten Registratie Manager Gebruikershandleiding HTA Software - Klachten Registratie Manager Gebruikershandleiding Inhoudsopgave Hoofdstuk 1: Opstarten en inloggen, overzicht startscherm, uitleg symbolen Hoofdstuk 2: aanmaken relaties Hoofdstuk 1: Opstarten

Nadere informatie

Als een PSD selecties bevat, deelt de lijn van het programma zich op met de verschillende antwoorden op het vraagstuk.

Als een PSD selecties bevat, deelt de lijn van het programma zich op met de verschillende antwoorden op het vraagstuk. HOOFDSTUK 3 3.1 Stapsgewijs programmeren In de vorige hoofdstukken zijn programmeertalen beschreven die imperatief zijn. is het stapsgewijs in code omschrijven wat een programma moet doen, net als een

Nadere informatie

Snel op weg met Solid Edge ST5

Snel op weg met Solid Edge ST5 Snel op weg met Solid Edge ST5 Dit document helpt u, om na installatie van Solid Edge ST5, snel aan de slag te kunnen met de software. Beschreven staat welke instellingen u kunt aanpassen om een betere

Nadere informatie

Object Oriented Programming

Object Oriented Programming Object Oriented Programming voor webapplicaties Door Edwin Vlieg Waarom OOP? Basis uitleg over OOP Design Patterns ActiveRecord Model View Controller Extra informatie Vragen OOP Object Oriented Programming

Nadere informatie

Dieper in Visual Basic.Net

Dieper in Visual Basic.Net Visual Basic.NET Dieper in Visual Basic.Net 7.1 Inleiding Dit hoofdstuk is bedoeld om je wat handiger te maken in het programmeren in Visual Basic. Je leert geen nieuwe programmeervaardigheden, maar je

Nadere informatie

Net2 kaarten bedrukken

Net2 kaarten bedrukken kaarten bedrukken kaarten bedrukken - Welke methode? Er bevinden zich twee pakketen om kaarten te bedrukken in de software. Een basis vast formaat dat al aanwezig is in de software sinds 2003 (V3.16) en

Nadere informatie

Technisch ontwerp. Projectteam 6. Project "Web Essentials" 02 april 2009. Versie 2.1.0

Technisch ontwerp. Projectteam 6. Project Web Essentials 02 april 2009. Versie 2.1.0 Projectteam 6 Faculteit Natuur en Techniek Hogeschool Utrecht Projectleider: Hans Allis, hans.allis@student.hu.nl Technisch ontwerp Project "Web Essentials" 02 april 2009 Versie 2.1.0 Teamleden: Armin

Nadere informatie

User accounts maken in een Wandy Hotspot, d.m.v. een batch.

User accounts maken in een Wandy Hotspot, d.m.v. een batch. User accounts maken in een Wandy Hotspot, d.m.v. een batch. Bij het in gebruik nemen van een Wandy Hotspot is het aanmaken van gebruikers een tijdrovende klus. Om snel veel accounts aan te maken hebben

Nadere informatie

Handleiding RS Form! 1.0.4

Handleiding RS Form! 1.0.4 Handleiding RS Form! 1.0.4 Inhoud 1. Controlepaneel... 3 2. Forms Manager... 4 2.1 Nieuwe form aanmaken... 4 2.2 Nieuwe fields toevoegen... 7 2.3 Wijzigen/verwijderen bestaande Forms, Fields... 10 Versie

Nadere informatie

Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, 11.00-13.00 uur

Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, 11.00-13.00 uur Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, 11.00-13.00 uur 1. (2 punten per deelvraag) Deze opgave bestaat uit een aantal tekstvragen. Houd het antwoord kort: een

Nadere informatie

Handicom. Symbol for Windows. Image Manager. (Versie 4) Handicom, 2011, Nederland

Handicom. Symbol for Windows. Image Manager. (Versie 4) Handicom, 2011, Nederland Handicom Symbol for Windows Image Manager (Versie 4) Handicom, 2011, Nederland Inhoud Inleiding... 2 1. Image Manager hoofdscherm...3 1.1 Onderdelen van het venster...3 1.2 Het scherm veranderen...3 1.2.1

Nadere informatie

1. Inleiding... 2 1.1. Inleiding SQL... 3 1.1.1. Inleiding... 3 1.1.2. Database, databaseserver en databasetaal... 4 1.1.3. Het relationele model...

1. Inleiding... 2 1.1. Inleiding SQL... 3 1.1.1. Inleiding... 3 1.1.2. Database, databaseserver en databasetaal... 4 1.1.3. Het relationele model... 1. Inleiding... 2 1.1. Inleiding SQL... 3 1.1.1. Inleiding... 3 1.1.2. Database, databaseserver en databasetaal... 4 1.1.3. Het relationele model... 4 1.1.4. Wat is SQL?... 6 1.1.5. Verschillende categorieên

Nadere informatie

Gebruikers Handleiding

Gebruikers Handleiding Gebruikers Handleiding (De SQL module) Versie 2.14 Pagina 2 van 14 Versie 2.14 Inhoudsopgave NGP SQL...5 Het Menu... 6 De instellingen... 7 De database informatie... 9 Het Script... 10 Pagina 3 van 14

Nadere informatie

Een unit test is geen integratie test. Niet het hele systeem, maar onderdelen van een systeem worden getest.

Een unit test is geen integratie test. Niet het hele systeem, maar onderdelen van een systeem worden getest. WAT IS EEN UNIT TEST? Een unit test is een test om de functionaliteit van stukken code te controleren. Een goede unit test waarborgt een consistente werking van een klein onderdeel (een unit ) van de broncode.

Nadere informatie

Kleine cursus PHP5. Auteur: Raymond Moesker

Kleine cursus PHP5. Auteur: Raymond Moesker Kleine cursus PHP5 Auteur: Raymond Moesker Kleine cursus PHP PHP is platform en CPU onafhankelijk, open source, snel, heeft een grote userbase, het is object georiënteerd, het wordt omarmd door grote bedrijven

Nadere informatie

Instructie Roosterwebsite (ical/ics-bestand) Last updated: 07 Februari 2011

Instructie Roosterwebsite (ical/ics-bestand) Last updated: 07 Februari 2011 Instructie Roosterwebsite (ical/ics-bestand) Last updated: 07 Februari 2011 Deze instructie is bedoeld voor studenten en docenten die hun rooster op willen nemen in HvA Webcalendar,Outlook 2007/2010, Windows

Nadere informatie

U ziet de progressie van de download aan de groene blokjes in het balkje helemaal onder aan de pagina.

U ziet de progressie van de download aan de groene blokjes in het balkje helemaal onder aan de pagina. Gegevens exporteren en bewerken vanuit GRIEL Stap 1. Selecteer de juiste gegevens en download deze 1. Stel het datumfilter in op de gewenste periode. Druk op ververs. 2. Maak met behulp van het filter

Nadere informatie

EBUILDER HANDLEIDING. De Ebuilder is een product van EXED internet www.exed.nl. info@exed.nl EXED CMS UITLEG

EBUILDER HANDLEIDING. De Ebuilder is een product van EXED internet www.exed.nl. info@exed.nl EXED CMS UITLEG EBUILDER HANDLEIDING De Ebuilder is een product van EXED internet www.exed.nl info@exed.nl 1 INHOUDSOPGAVE Inleiding Een korte introductie over het Ebuilder» Navigatie» Snelnavigatie Pagina s Hier vind

Nadere informatie

Je kan vanuit de RV SiteBuilder steeds terugkeren naar het controlepaneel, via de knop rechts bovenaan.

Je kan vanuit de RV SiteBuilder steeds terugkeren naar het controlepaneel, via de knop rechts bovenaan. RV SiteBuilder openen Log in op je controlepaneel met de gegevens die je van ons hebt ontvangen. Eens ingelogd, klik je helemaal onderaan, in de sectie Software/Services, op het RV SiteBuilder icoontje.

Nadere informatie

Wat zijn de verschillen tussen SPSS 9 en SPSS 10?

Wat zijn de verschillen tussen SPSS 9 en SPSS 10? Wat zijn de verschillen tussen SPSS 9 en SPSS 10? 1.1 De data-editor / het definiëren van variabelen 1.2 Het openen van bestanden 1.3 Output lezen 1.4 Mogelijke problemen 1.1.1 De data-editor Het grootste

Nadere informatie

Software-Ontwikkeling I Academiejaar 2006-2007

Software-Ontwikkeling I Academiejaar 2006-2007 Software-Ontwikkeling I Academiejaar 2006-2007 Project: Bibliotheekbeheer 1 1. Digitale bibliotheek a. Inleiding Bibliotheken houden onder meer hun collecties van uitleenbare artikels bij in digitaal formaat.

Nadere informatie

ArcGIS Mobile ADF. Smart Client Applicaties voor ArcGIS Server Eva Dienske, Wim Ligtendag

ArcGIS Mobile ADF. Smart Client Applicaties voor ArcGIS Server Eva Dienske, Wim Ligtendag ArcGIS Mobile ADF Smart Client Applicaties voor ArcGIS Server Eva Dienske, Wim Ligtendag Agenda Wat is de Mobile ADF? Architectuur Demo Wat is de mobile ADF? Ontwikkeltoolkit voor mobiele (Smart Client)

Nadere informatie

Excel Controller. Handleiding Excel Controller Wizard

Excel Controller. Handleiding Excel Controller Wizard Excel Controller Handleiding Excel Controller Wizard 1 Inhoud Inleiding... 3 Eigen SQL... 3 Stap 1 Eigen SQL... 3 Stap 2 Testen SQL... 8 Stap 3 Wizard... 11 Stap 4 Parameters... 13 Voorbeeld Eigen Parameter...

Nadere informatie

HANDLEIDING INFOGRAPHIC SOFTWARE Versie 2.3 / jan 2014

HANDLEIDING INFOGRAPHIC SOFTWARE Versie 2.3 / jan 2014 HANDLEIDING INFOGRAPHIC SOFTWARE Versie 2.3 / jan 2014 Inhoudsopgave 1. Inleiding... 3 2. Systeemvereisten... 3 3. Installeren van de software... 4 4. Programma instellingen... 5 5. Importeren van een

Nadere informatie

Handleiding: Whitelabel Customersite

Handleiding: Whitelabel Customersite ARGEWEB B.V. Handleiding: Whitelabel Customersite Controlportal.nl Argeweb Support 8-1-2009 Handleiding voor het gebruik maken van de Whitelabel Customersite op controlportal.nl, door Resellers van Argeweb.

Nadere informatie

Handleiding DIAS scanning. 1. Opstarten. Start eerst DIAS op en daarna het DIAS scanprogramma.

Handleiding DIAS scanning. 1. Opstarten. Start eerst DIAS op en daarna het DIAS scanprogramma. Handleiding DIAS scanning 1. Opstarten Start eerst DIAS op en daarna het DIAS scanprogramma. Indien u het scanprogramma toch probeert te gebruiken zonder dat DIAS is opgestart zult u zien dat het DIAS

Nadere informatie

REDACTEUREN HANDLEIDING

REDACTEUREN HANDLEIDING V1.2 8/5/2009 Vertaling: John Sim 2 Inhoudsopgave De inhoud van een document bewerken... 11 Een nieuwe document aanmaken... 12 Het aanmaken van een nieuwe document gaat als volgt:... 12 Een pagina publiceren...

Nadere informatie

Hoe te werken met Word en SmarTeam?

Hoe te werken met Word en SmarTeam? Hoe te werken met Word en SmarTeam? Nikhef number: Item number: Date: 09/09/2010 Page: 1 of 17 23001-MT-00008 AA1330 Status: In Work Revision: A.4 Project: Bedrijf Intern Technical Departments Department:

Nadere informatie

Hoofdstuk 4: Nieuwe objecten

Hoofdstuk 4: Nieuwe objecten Programmeren in Microsoft Visual Basic 2010 Express, lessenserie voor het voortgezet onderwijs HAVO/VWO David Lans, Emmauscollege, Vespucci College, Marnix Gymnasium Rotterdam, december 2011 Hoofdstuk

Nadere informatie

Handleiding helpdesk. Datum: 08-10-2014 Versie: 1.0 Auteur: Inge van Sark

Handleiding helpdesk. Datum: 08-10-2014 Versie: 1.0 Auteur: Inge van Sark Datum: 08-10-2014 Versie: 1.0 Auteur: Inge van Sark Inhoudsopgave Inhoudsopgave... 2 1. Beheer helpdesk... 3 1.1. Settings... 3 1.2. Applicaties... 4 1.3. Prioriteiten... 5 1.4. Gebruik mailtemplates...

Nadere informatie

Een website maken met databasetoegang.

Een website maken met databasetoegang. Hoofdstuk 5 Een website maken met databasetoegang. In dit hoofdstuk gaan we het weblog dat je in hoofdstuk 4 hebt gemaakt verder uitbreiden. Een belangrijk onderdeel wordt toegevoegd aan de applicatie,

Nadere informatie

Plannen opladen in FMIS

Plannen opladen in FMIS Plannen opladen in FMIS 1. Algemeen De ruggengraat van het FMIS is de geografische boomstructuur waarin het GO! patrimonium is ondergebracht. Elk object in deze structuur kan gekoppeld worden met een brede

Nadere informatie

ASRemote WebService. Via deze webservice kunt u:

ASRemote WebService. Via deze webservice kunt u: ASRemote WebService De ASRemote WebService is een SOAP Webservice die softwarematige communicatie met Exact Globe mogelijk maakt vanaf een willekeurige locatie op het internet. Via deze webservice kunt

Nadere informatie

Website maker. Bezoek je domein om de Website maker in te stellen. De volgende melding zal zichtbaar zijn.

Website maker. Bezoek je domein om de Website maker in te stellen. De volgende melding zal zichtbaar zijn. Aan de slag met de Bezoek je domein om de in te stellen. De volgende melding zal zichtbaar zijn. Volg de url 'administratie paneel' om in te loggen en de vervolgens in te stellen. Als eerst krijg je de

Nadere informatie

Inventor ilogic: Logisch toch!?! Peter Van Avondt Autodesk Technical Specialist Northern Europe

Inventor ilogic: Logisch toch!?! Peter Van Avondt Autodesk Technical Specialist Northern Europe Inventor ilogic: Logisch toch!?! Peter Van Avondt Autodesk Technical Specialist Northern Europe Doelstelling Deze hands-on sessie zal gebruikers introduceren in de ilogic fundamenten die de bouwstenen

Nadere informatie

Release Notes CheQpoint 2.0. Versie 61. Efficiency through innovation

Release Notes CheQpoint 2.0. Versie 61. Efficiency through innovation Release Notes CheQpoint 2.0 Versie 61 Efficiency through innovation 1 (KEAN) Verbeterde kantoorselectie indien kantoren gekoppeld aan niet-bestaande groep Wanneer een kantoor gekoppeld was aan een niet-bestaande

Nadere informatie

Rapporten. Labels en Rapporten in Atlantis 1. Atlantis heeft twee manieren om output te genereren: 1. labels 2. rapporten (reports)

Rapporten. Labels en Rapporten in Atlantis 1. Atlantis heeft twee manieren om output te genereren: 1. labels 2. rapporten (reports) Labels en Rapporten in Atlantis 1 Atlantis heeft twee manieren om output te genereren: 1. labels 2. rapporten (reports) Rapporten Een rapport is eigenlijk altijd een tekst bestand, die vorm wordt gegeven

Nadere informatie

Deel 2 S7 Graph Ont4 - GA3

Deel 2 S7 Graph Ont4 - GA3 Deel 2 S7 Graph Ont4 - GA3 Deel 2 : Graph 09/05 1 Wanneer er in een installatie een sequentiële beweging geprogrammeerd moet worden is het interessant om gebruik te maken van S7 Graph. De progammastructuur

Nadere informatie

Powerpoint presentatie College 5 Gilbert van Lierop & Farshad Salamat

Powerpoint presentatie College 5 Gilbert van Lierop & Farshad Salamat Powerpoint presentatie College 5 Gilbert van Lierop & Farshad Salamat Wat is een database? Een verzameling van georganiseerde data Een database bestaat uit applicaties, SQL en het DBMS Watis eendbms? EenDBMS

Nadere informatie

Selenium IDE Webdriver. Introductie

Selenium IDE Webdriver. Introductie Selenium IDE Webdriver Het Wielsem 10, 5231 BW s- Hertogenbosch, telefoon 073-6409311 e- mail info@testwork.nl internet http://www.testwork.nl 1 Inhoudsopgave 1 Inhoudsopgave... 2 2 Selenium IDE... 3 3

Nadere informatie

Beginselen van programmeren Practicum 1 (Doolhof) : Oplossing

Beginselen van programmeren Practicum 1 (Doolhof) : Oplossing Beginselen van programmeren Practicum 1 (Doolhof) : Oplossing Introductie In dit document geven we een mogelijke oplossing voor het eerste practicum. Deze oplossing gebruikt verschillende klassen en overerving,

Nadere informatie

DrICTVoip.dll v 2.1 Informatie en handleiding

DrICTVoip.dll v 2.1 Informatie en handleiding DrICTVoip.dll v 2.1 Informatie en handleiding Nieuw in deze versie : Koppeling voor web gebaseerde toepassingen (DrICTVoIPwebClient.exe) (zie hoofdstuk 8) 1. Inleiding Met de DrICTVoIP.DLL maakt u uw software

Nadere informatie

Korte uitleg gebruik Jira als bevindingregistratie systeem

Korte uitleg gebruik Jira als bevindingregistratie systeem MEMO Korte uitleg gebruik Jira als bevindingregistratie systeem Aan : Jira gebruikers Datum : 26 juli 2010 Van : Sogeti Jira beheer Versie : 1.1 INLEIDING Deze verkorte uitleg van het gebruik van Jira

Nadere informatie

Datastructuren: stapels, rijen en binaire bomen

Datastructuren: stapels, rijen en binaire bomen Programmeermethoden Datastructuren: stapels, rijen en binaire bomen week 12: 23 27 november 2015 www.liacs.leidenuniv.nl/ kosterswa/pm/ 1 Inleiding In de informatica worden Abstracte DataTypen (ADT s)

Nadere informatie

In een klassendiagram worden klassen beschreven in termen

In een klassendiagram worden klassen beschreven in termen Sander Hoogendoorn is Partner bij Ordina Patterns voor het gebruik van referenties in bedrijfsklassen G O E D G E B R U I K VA N R E F E R E N T I E S In de dagen dat applicaties voornamelijk bestonden

Nadere informatie

Illustration 1. Handleiding Uploaden van foto's in Phoca Gallery

Illustration 1. Handleiding Uploaden van foto's in Phoca Gallery Handleiding Uploaden van foto's in Phoca Gallery Voordat je begint Je hebt een mapje met foto's, niet al te groot, want dan duurt het uploaden zo lang. Ik resize ze altijd naar 1024x768. Daar gebruik ik

Nadere informatie

SAN v3. Update document 2010. uitgebracht door OCEN

SAN v3. Update document 2010. uitgebracht door OCEN SAN v3 Update document 2010 uitgebracht door OCEN Inhoudsopgave. Inleiding...3 1 Navigatie...4 1.1 Navigatie: het menu...4 1.2 Navigatie: dashboard...4 1.3 Navigatie: kruimelpad...4 1.4 Navigatie: iconen

Nadere informatie

Zorgmail handleiding. Inhoud

Zorgmail handleiding. Inhoud Inhoud 1. Beginnen met Zorgmail pag. 2 2. Het instellen van Zorgmail pag. 2 3. Het gebruik van Zorgmail m.b.t. Artsen pag. 3 4. Het aanpassen van de lay-out van Zorgmail pag. 4 5. Werken met Zorgmail pag.

Nadere informatie

Programmeren in Excel VBA. Karel Nijs 2010/09

Programmeren in Excel VBA. Karel Nijs 2010/09 Programmeren in Excel VBA Karel Nijs 2010/09 Leswijze Eerst wat theorie Begeleid met (korte) oefeningen MsExcel 2003 Online hulp: http://www.ozgrid.com/vba/ http://msdn.microsoft.com/en-us/library/sh9ywfdk(vs.80).aspx

Nadere informatie

File Uploads met standaard ASP.NET

File Uploads met standaard ASP.NET File Uploads met standaard ASP.NET In deze tutorial gaan we een aspx pagina maken (met codebehind), waarmee je een bestand kan uploaden naar de webserver. Noot: de hier beschreven code gaat niet in op

Nadere informatie

Zelftest Programmeren in Java

Zelftest Programmeren in Java Zelftest Programmeren in Java Document: n0883test.fm 22/01/2013 ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium TRAINING & CONSULTING INLEIDING BIJ DE ZELFTEST PROGRAMMEREN IN JAVA Deze test

Nadere informatie

Vakgroep CW KAHO Sint-Lieven

Vakgroep CW KAHO Sint-Lieven Vakgroep CW KAHO Sint-Lieven Objecten Programmeren voor de Sport: Een inleiding tot JAVA objecten Wetenschapsweek 20 November 2012 Tony Wauters en Tim Vermeulen tony.wauters@kahosl.be en tim.vermeulen@kahosl.be

Nadere informatie

Swhite bvba Frankrijklei 104 bus 3.1 2000 Antwerpen. support@flux.be flux.be. Flux webdesign. Versie 1.0.2

Swhite bvba Frankrijklei 104 bus 3.1 2000 Antwerpen. support@flux.be flux.be. Flux webdesign. Versie 1.0.2 Swhite bvba Frankrijklei 104 bus 3.1 2000 Antwerpen support@flux.be flux.be Flux webdesign Versie 1.0.2 Inhoudstafel 1. Inleiding... 3 2. Starten... 3 3. Menu... 4 4. Pagina s... 5 4.1. Bewerk de pagina...5

Nadere informatie