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 ( 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 ( 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

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

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

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

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

return an ; } private I L i s t l i j s t ;

return an ; } private I L i s t l i j s t ; In bovenstaande code werd de binding t e k s t. DataBindings. Add(new Binding ( Text, l i j s t, ) ) ; gebruikt om de eigenschap Text van het object tekst (dwz. tekst.text) te binden aan het object lijst.

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

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

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

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

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

Informatie & Databases

Informatie & Databases Informatie Wat is informatie en waaruit het bestaat? Stel op een kaart staat het getal 37 geschreven. Wat kun je dan zeggen van het cijfer 37? Niets bijzonders, toch? Alleen dat het een getal is. Gaat

Nadere informatie

Labo 2 Programmeren II

Labo 2 Programmeren II Labo 2 Programmeren II L. Schoofs K. van Assche Gebruik Visual Studio 2005 om een programma te ontwikkelen dat eenvoudige grafieken tekent. Deze opgave heb je vorig academiejaar reeds in Java geïmplementeerd.

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

Technische nota AbiFire Rapporten maken via ODBC

Technische nota AbiFire Rapporten maken via ODBC Technische nota AbiFire Rapporten maken via ODBC Laatste revisie: 23 januari 2018 Inhoudsopgave 1 Inleiding... 2 2 Systeeminstellingen in AbiFire... 3 2.1 Aanmaken extern profiel... 3 2.2 Toewijzing extern

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

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

HANDLEIDING PROGRAMMEREN IN PASCAL (LAZARUS)

HANDLEIDING PROGRAMMEREN IN PASCAL (LAZARUS) HANDLEIDING PROGRAMMEREN IN PASCAL (LAZARUS) Vereiste voorkennis Voldoende kennis van het besturingssysteem (in deze handleiding wordt uitgegaan van Windows) De basisprincipes van programmeren Vereiste

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

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

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

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

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

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

Access voor beginners - hoofdstuk 25

Access voor beginners - hoofdstuk 25 Access voor beginners - hoofdstuk 25 Handleiding van Auteur: OctaFish Oktober 2014 Werken met Klassemodules Tot nu toe heb ik in de cursus Access veel gewerkt met formulieren, en met procedures en functies.

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

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

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

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

Een gelinkte lijst in C#

Een gelinkte lijst in C# Een gelinkte lijst in C# In deze tutorial ga demonstreren hoe je een gelinkte lijst kan opstellen in C#. We gaan een klasse schrijven, die een gelijkaardige functionaliteit heeft als een ArrayList, namelijk

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

Visual Basic.NET. Visual Basic.NET. M. den Besten 0.3 VB. NET

Visual Basic.NET. Visual Basic.NET. M. den Besten 0.3 VB. NET Visual Basic.NET M. den Besten 0.3 VB. NET Inhoud Voorwoord Deel 1 Visual Basic.NET 1.1 Inleiding...13 1.2 De programmeertaal Visual Basic.NET...14 1.3 Microsoft Visual Basic 2010 Express Edition...15

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

Beschrijvings SW gebruikers handleiding (V1.1) Voor Apple Macintosh computers Voor Macintosh Computer

Beschrijvings SW gebruikers handleiding (V1.1) Voor Apple Macintosh computers Voor Macintosh Computer Annotation SW User s Guide Beschrijvings SW gebruikers handleiding (V1.1) Voor Apple Macintosh computers Voor Macintosh Computer 2011. 5 PenAndFree Co.,Ltd 0 Deze handleiding beschrijft alle functies die

Nadere informatie

Query SQL Boekje. Fredrik Hamer

Query SQL Boekje. Fredrik Hamer Query SQL Boekje Query SQL Boekje Fredrik Hamer Schrijver: Fredrik Hamer Coverontwerp: Fredrik Hamer ISBN: 9789402162103 Fredrik Hamer Inhoudsopgave A. Aanhef bepalen 17 Aantal 18 Aantal dagen tussen

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

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

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

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

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

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

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

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

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

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

Macro s. 4.2 Een macro maken

Macro s. 4.2 Een macro maken 4.2 Een macro maken Een macro is een reeks van commando s die u kunt maken en die een programma uitvoeren. Wanneer u de macro in zijn geheel uitvoert, dan worden de acties opeenvolgend uitgevoerd. Elk

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

Tips & Trucs ARCHICAD : Bestaande ARCHICAD 21 projecten omzetten naar ARCHICAD 22

Tips & Trucs ARCHICAD : Bestaande ARCHICAD 21 projecten omzetten naar ARCHICAD 22 Tips & Trucs ARCHICAD 22 001: Bestaande ARCHICAD 21 projecten omzetten naar ARCHICAD 22 In deze Tip & Truc wordt beschreven hoe ARCHICAD 21 projecten omgezet kunnen worden naar ARCHICAD 22. Maak eerst

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

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

Programmeren in C# Interfaces. Hoofdstuk 23

Programmeren in C# Interfaces. Hoofdstuk 23 Programmeren in C# Interfaces Hoofdstuk 23 Programmeren in C# 2 Gradaties overerving Klassieke overerving Iets functioneels uitbreiden Code duplicatie Niet teveel aanpassingen aan bestaande code Objecten

Nadere informatie

HANDLEIDING PROGRAMMEREN IN PASCAL (LAZARUS)

HANDLEIDING PROGRAMMEREN IN PASCAL (LAZARUS) HANDLEIDING PROGRAMMEREN IN PASCAL (LAZARUS) LES 4 In deze les gaan we een eenvoudig dobbelspelletje maken: Allereerst krijgt de speler de gelegenheid zijn/haar naam in te vullen en daarna op OK te klikken

Nadere informatie

AN1034-NL Net2 kaarten bedrukken

AN1034-NL Net2 kaarten bedrukken n A kaarten bedrukken - Welke methode? 26/11/2007 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 een

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

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

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

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

Programmeren (1) Examen NAAM:

Programmeren (1) Examen NAAM: Schrijf al je antwoorden op deze vragenbladen (op de plaats die daarvoor is voorzien) en geef zowel klad als net af. Bij heel wat vragen moet je zelf Java-code schrijven. Hou dit kort en bondig. Je hoeft

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

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

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

Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 6 november 2015, uur

Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 6 november 2015, uur Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 6 november 2015, 11.00-13.00 uur Schrijf op elk ingeleverd blad je naam. Schrijf op het eerste blad ook je studentnummer en het aantal ingeleverde

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

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

Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni, 2010

Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni, 2010 Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar 2009-2010 16 juni, 2010 **BELANGRIJK** 1. Schrijf je naam onderaan op elk blad. 2.

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

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

MADASTER PLATFORM. IFC export in BIM software. Archicad 21 & Revit 2019

MADASTER PLATFORM. IFC export in BIM software. Archicad 21 & Revit 2019 MADASTER PLATFORM IFC export in BIM software Archicad 21 & Revit 2019 Juni 2018 Inleiding Deze handleiding dient ter ondersteuning van het importeren van uw gebouw naar het Madaster platform. Om u bestand

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

Midi PDF Bladmuziek lezer

Midi PDF Bladmuziek lezer Inleiding. Ruim 20 ordners aan bladmuziek, meeste daarvan uitgeprint van een PDF. Even snel een nummer opzoeken wil dan ook niet, terwijl ik alles wel op alfabetische volgorde heb. Dat was het niet helemaal

Nadere informatie

Programmeren: Visual Basic

Programmeren: Visual Basic PETERSTUYVESANT COLLEGE INFORMATICA 2009-2010 Programmeren: Visual Basic Document Afbaking 01. VERSCHILLENDE PROGRAMMEERTALEN 02. PROGRAMMEER PAKKETTEN 03. GUI 03.1 GUI ELEMENTEN 03.2 GUI EIGENSCHAPPEN

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

Mijn eerste ADO.NET applicatie

Mijn eerste ADO.NET applicatie Hoofdstuk 2 Mijn eerste ADO.NET applicatie ADO staat voor ActiveX Database Objects. Dit is een verzameling klassen die onderdeel uitmaken van het.net framework, waarmee je verbinding kunt maken met een

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

Met een LightSwitch applicatie een OData service uit de Windows Azure Marketplace consumeren

Met een LightSwitch applicatie een OData service uit de Windows Azure Marketplace consumeren Met een LightSwitch applicatie een OData service uit de Windows Azure Marketplace consumeren Om eens wat ervaring op te doen met de Windows Azure Marketplace heb ik een publieke en gratis databron gekozen

Nadere informatie

Programmeren in C++ Efficiënte zoekfunctie in een boek

Programmeren in C++ Efficiënte zoekfunctie in een boek Examen Software Ontwikkeling I 2e Bachelor Informatica Faculteit Wetenschappen Academiejaar 2010-2011 21 januari, 2011 **BELANGRIJK** 1. Lees eerst de volledige opgave (inclusief de hints/opmerkingen)!

Nadere informatie

Web Presence Builder. Inhoud

Web Presence Builder. Inhoud Web Presence Builder Inhoud Inhoud... 1 Wat is Web Presence Builder?... 2 Het categoriescherm... 2 De eerste stappen naar een eigen website... 3 Onderwerp selecteren en website naam aanpassen... 3 Vooraf

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

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

Naam project Lost And Found Animals Lokaal gehost Percentage van het totaal geleverde werk 1 Cindy Jansen 50% 2 Eline Steyvers 50%

Naam project Lost And Found Animals Lokaal gehost Percentage van het totaal geleverde werk 1 Cindy Jansen 50% 2 Eline Steyvers 50% Naam project Lost And Found Animals Url Lokaal gehost Groepsleden Percentage van het totaal geleverde werk 1 Cindy Jansen 50% 2 Eline Steyvers 50% 1. Beveiliging in de toepassing Naam gebruiker Wachtwoord

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

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

Handleiding CMS-systeem website

Handleiding CMS-systeem website Handleiding CMS-systeem website Algemeen!Belangrijk! Wijzigingen die gedaan worden in het systeem kunnen niet zomaar ongedaan worden gemaakt. Eenmaal een pagina of iets anders verwijderd, zal deze niet

Nadere informatie

Android apps met App Inventor 2 antwoorden

Android apps met App Inventor 2 antwoorden 2014 Android apps met App Inventor 2 antwoorden F. Vonk versie 1 11-11-2014 inhoudsopgave Mollen Meppen... - 2 - Schrandere Scholier... - 15 - Meteoor... - 21 - Dit werk is gelicenseerd onder een Creative

Nadere informatie

Koppeling met een database

Koppeling met een database PHP en MySQL Koppeling met een database 11.1 Inleiding In PHP is het eenvoudig om een koppeling te maken met een database. Een database kan diverse gegevens bewaren die met PHP aangeroepen en/of bewerkt

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

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

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

Handleiding CMS. Auteur: J. Bijl Coldfusion Consultant

Handleiding CMS. Auteur: J. Bijl Coldfusion Consultant Handleiding CMS Auteur: J. Bijl Coldfusion Consultant Inhoudsopgave 1.0 Inleiding 3 2.0 Introductie CMS en websites 4 3.0 Inloggen in beheer 5 4.0 Dashboard 6 4.1 Bezoekers totalen 6 4.2 Bezoekers 7 4.3

Nadere informatie

Handleiding. CardAccess Database Utility CA4000. Aanvullende informatie. Versie: 1.0

Handleiding. CardAccess Database Utility CA4000. Aanvullende informatie. Versie: 1.0 Handleiding CardAccess Database Utility CA4000 Aanvullende informatie Versie: 1.0 Algemene informatie Wijzigingen voorbehouden. Kijk op onze support site http://support.aras.nl/ voor actueel nieuws en

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

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

Content tips & tricks

Content tips & tricks Content tips & tricks E-learning vormt de basis van je lessen en als docent steek je veel tijd in het ontwikkelen en vormgeven van deze content. Met deze handleiding maken we dit proces net even makkelijker

Nadere informatie

Installatie SQL Server 2014

Installatie SQL Server 2014 Installatie SQL Server 2014 Download de SQL Server Express net advanced Services van de website: https://www.microsoft.com/en-us/download/details.aspx?id=42299 klik op Download. Als u een 64 bit variant

Nadere informatie

Handleiding. Serviceportal. Versie 1.2 Datum

Handleiding. Serviceportal. Versie 1.2 Datum Handleiding Serviceportal Versie 1.2 Datum 04-04-12 Inhoud 1 Inloggen... 3 2 Transportdocumenten... 4 2.1 Zoeken naar documenten... 4 2.2 Downloaden van alle documenten op factuurnummer... 6 2.3 Order

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

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

Tips & Trucs ARCHICAD 103: Eigenschappen weergeven met behulp van de Graphic_Overrides

Tips & Trucs ARCHICAD 103: Eigenschappen weergeven met behulp van de Graphic_Overrides Tips & Trucs ARCHICAD 103: Eigenschappen weergeven met behulp van de Graphic_Overrides In deze Tip & Truc wordt beschreven hoe de Graphic Overrides ingesteld kunnen worden. Gebruik Graphic Overrides om

Nadere informatie

Programmeerstructuren met App Inventor

Programmeerstructuren met App Inventor Programmeerstructuren met App Inventor Kevin Krul, Universiteit Utrecht Roncalli, Bergen op Zoom Inhoud: Les 1: Introductie tot App Inventor, when statement en variabelen. Les 2: Introductie if-statement

Nadere informatie