Uitbreiden van de huidige User Interface Designer in DiAS DMS/CRM.
|
|
- Barbara Peters
- 8 jaren geleden
- Aantal bezoeken:
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.
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 informatieVoor 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 informatiepublic 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 informatieEen 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 informatieSparse 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 informatiereturn 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 informatieLes 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 informatieKlassen & 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 informatieSQL 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 informatieHandleiding 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 informatieGebruikershandleiding 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 informatieInformatie & 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 informatieLabo 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 informatieSQL 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 informatieTechnische 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 informatieWerking 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 informatieProgrammeren: 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 informatieHANDLEIDING 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 informatieWat 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 informatie6. 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 informatieOffective > 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 informatieSQL 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 informatieTekenen 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 informatieNHibernate 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 informatieAccess 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 informatieOpen 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 informatieDynamiek 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 informatieUitwerking 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 informatieGebruik 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 informatieEen 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 informatieFun 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 informatieVisual 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 informatieBeheer 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 informatieBeschrijvings 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 informatieQuery 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 informatieMach3Framework 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 informatieTechnische 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 informatieMaak 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 informatieObject 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 informatieHoofdstuk 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 informatieicafe 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 informatieHandleiding: 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 informatieFormulieren 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 informatieFormulieren 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 informatieNet2 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 informatieMacro 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 informatieMA!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 informatieTips & 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 informatieDieper 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 informatieRelease 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 informatieProgrammeren 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 informatieHANDLEIDING 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 informatieAN1034-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 informatieJe 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 informatieKleine 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 informatieUser 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 informatieNet2 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 informatieProgrammeren (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 informatieAutomating 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 informatieCentral 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 informatieAutomatisering 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 informatieDerde 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 informatieExcel 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 informatieRapporten. 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 informatieExamen 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 informatieRelease 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 informatieObjectgeorï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 informatieMADASTER 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 informatieREDACTEUREN 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 informatieMidi 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 informatieProgrammeren: 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 informatieIllustration 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 informatieMijn 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 informatieDynamische 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 informatieMet 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 informatieProgrammeren 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 informatieWeb 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 informatieHoe 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 informatieHTA 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 informatieNaam 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 informatieWat 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 informatieHandleiding 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 informatieHandleiding 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 informatieAndroid 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 informatieKoppeling 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 informatieRelease 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 informatieInformatica. 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 informatieHOOFDSTUK 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 informatieHandleiding 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 informatieHandleiding. 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 informatieEBUILDER 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 informatieSelenium 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 informatieContent 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 informatieInstallatie 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 informatieHandleiding. 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 informatieSAN 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 informatieDeel 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 informatieTips & 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 informatieProgrammeerstructuren 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