Dynamiek met VO-Script



Vergelijkbare documenten
Een Data Driven toepassing op basis van Visual Objects en SQL Server

Kleine cursus PHP5. Auteur: Raymond Moesker

Sparse columns in SQL server 2008

Een website maken met databasetoegang.

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

Vakgroep CW KAHO Sint-Lieven

Versturen van vanuit een Delphi VCL toepassing

Programmeren: Visual Basic

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

Variabelen en statements in ActionScript

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

DrICTVoip.dll v 2.1 Informatie en handleiding

Aan het eind van deze lesbrief wordt uitgelegd wat het nut van OOP is en vind je een aantal oefenopdrachten.

Verder zijn er de nodige websites waarbij voorbeelden van objectgeoriënteerd PHP (of Objec Oriented PHP, OO PHP) te vinden zijn.

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

Gebruikers handleiding. Lizard Configuration Manager ToolTip. Installatie. Instellen. Initieel instellen

Microsoft Excel. It s all about Excel - VBA

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

Javascript oefenblad 1

Les 12 : database koppeling, opmaken van template, webstructuur en afdrukken van gegevens. (deel2).

Les 9: formulier controle met javascript.

Selenium IDE Webdriver. Introductie

UBC op Microsoft Windows 64-bits

Toegepaste notatiewijzen DLA software

vbg.vbnet.beginner Omgaan met files en directories binnen Visual Basic.NET

Genereren van een webapplicatie op basis van DLA

Kenmerken van DLArchitect

Acht stappen voor JSF

ASRemote WebService. Via deze webservice kunt u:

SUBSITE BEHEREN. 1. Verticale navigatie maken

Object Oriented Programming

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

Act! Company Builder Handleiding

VB Magazine Online /08 1 / 6

Een eerste applicatie

Fun met webparts in ASP.Net

SPSS VOOR DUMMIES+ Werken met de NSE: enkele handige basisbeginselen. Gebaseerd op SPSS21.0 & Benchmarkbestand NSE 2014

Kennis na het volgen van de training. Na het volgen van deze training bent u in staat:

Coligo conne ct. Gebruikershandleiding

Programmeren met databanken volgens het lagenmodel in C#

Op de Virtual Appliance is MySQL voorgeïnstalleerd. MySQL is momenteel de meest gebruikte database op het internet.

Bescherm je tegen onveilige websites

Introductie in C++ Jan van Rijn. September 2013

De Kleine WordPress Handleiding

GoogleMapsGoogleMapsGoogleMaps GoogleMapsGoogleMapsGoogleMaps GoogleMapsGoogleMapsGoogleMaps

HOOFDSTUK 1 INLEIDING... 1 HOOFDSTUK 3 OP WELKE MANIER KAN IK GEGEVENS IMPORTEREN IN MS EXCEL?... 7

Handleiding Coligo Connect installatie en gebruik

Opgaven. Python Assessment

Modeleren. Modelleren. Together UML. Waarvan maken we een model? overzicht les 14 t/m 18. ControlCenter 6.2

Inhoud. VBA Excel 2010

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

Netwerkbeheer Examennummer: Datum: 17 november 2012 Tijd: 10:00 uur - 11:30 uur

Installatiehandleiding Business Assistent

Handleiding Wordpress

Uursoortfinanciering importeren

uziconnect Installatiehandleiding

Planbord installatie instructies

Maximo Tips and Tricks

Programmeren met databanken volgens het lagenmodel in C#

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

TaskCentre Web Service Connector: Creëren van requests in Synergy Enterprise

Datastructuren Werkcollege Intro

Dieper in Visual Basic.Net

Foutcontrole met Javascript

Cursus RegCleaner <freeware>

Handleiding JCreator. Inhoud. Een Workspace en een eerste project maken

Organiseer uw verschillende SOAP services in één scenario

Release notes:

De plug-in is heel eenvoudig te installeren met een setup-programma. Waarna je een aantal menu opties in het tools menu er bij krijgt.

Handleiding. Documentbeheer. PlanCare 2. elektronisch cliënten dossier. G2 Paramedici het EPD voor paramedici. Handleiding. Declareren. Versie

IMP Uitwerking week 13

Hoofdstuk 4: Nieuwe objecten

PHP-OPDRACHT SITE BOUWEN

INSTALLATIE EXCHANGE CONNECTOR

Adelia Studio Nieuw in versie 12

Programmeren in C++ (deel 1)

Modelleren en Programmeren

Met deze module heeft u de mogelijkheid om gemakkelijk, snel en efficiënt uw documenten als naslag in Unit 4 Multivers te koppelen.

Programmeerstructuren met App Inventor

VKblog-importer : De gebruiksaanwijzing.

HANDLEIDING DMS Plugin Installatie, configuratie & werking

CAK Installatiehandleiding

Bijlage Inlezen nieuwe tarieven per verzekeraar

Wat kan er allemaal in Design Studio 1.4

Service Pack notes CRM SPE SP1

Aanmaken 3D riool mbv Generative Components

Trainingsomschrijving ACCESS 97 / 2000 / 2003NL

Workshop Office365-basis: opdracht Word-bestanden plaatsen en delen

4 ASP.NET MVC. 4.1 Controllers

Summa Cutter Tools. 1 Cutter tools. Met dit programma kunnen twee dingen geïnstalleerd worden:

Leereenheid Webdesign

Installatiehandleiding Business Assistent

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

Transcriptie:

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 bij VO-2.6. Een van deze libraries kwam speciaal aan de orde, VO-Script. Dit product heb ik in de afgelopen periode naar volle tevredenheid toegepast in een aantal VO-applicaties. In dit artikel wil ik dan ook ingaan op hoe VO-Script te gebruiken is. Installatie en werking Installatie van de library is eenvoudig. Het bestaat uit een Aef bestand dat geimporteerd kan worden in een project. Dit moet gecompileerd worden en je kunt de library gaan gebruiken. Dat betekent dan ook dat het gebruik van een extra DLL of iets dergelijks verder niet nodig is. Het enige wat je moet doen is de VO-Script library opnemen in je applicatie library list. De opzet van VO-Script is eenvoudig. Aan de functies van VO-Script wordt een tekst meegegeven waarin een stukje VO programma code is opgenomen. De library heeft een interface die bestaat uit een viertal functies te weten compilecode en compilescript en executecode en executescript. De script varianten zijn daarbij ook nog eenvoudige uitbreidingen op basis van een memoread waarbij een tekstfile gelezen wordt die vervolgens weer met behulp van de code varianten verder verwerkt worden. De compilecode doet iets vreemds, allereerst wordt de tekststrng met de programmacode omgezet naar een array waarin de regels opgenomen worden waarin de regels code opgenomen worden. Daarin zit dan nog een functie ervoor zorgt dat selectie en interatie functies als IF ENDIF en DO ENDDO worden omgezet naar meerdimensionale arrays. Vervolgens wordt deze array weer omgezet naar een tekststring. Dit is de return waarde van de functie. De tekststring, noem het gecompileerde code, wordt vervolgens als parameter meegegeven aan de executecode functie. Hierbinnen wordt de string weer omgezet naar een array die regel voor regel als codeblock uitgevoerd. Vandaar dat de omzet van iteraties en selecties naar een multidimensionale array verklaarbaar is. Reden voor het omzetten van programmacode naar een string van omgezette programmaregels is denk ik tweeledig. De eerste is dat de programmacode niet meer leesbaar is en dus gebruikt kan worden om scripts versleuteld te gebruiken. Daarnaast heeft de compilecode routine de mogelijkheid om de programmacode op correctheid te controleren. Waarbij de executecode sneller kan werken omdat compileren al heeft plaatsgevonden. In principe is dit alles wat te vertellen is over VO-Script. Er is nog te noemen dat er ook een class variant is voor de scripts. Echter mijn ervaringen met scripting zijn zodanig dat ik steeds meer mogelijkheden zag om scripts te gebruiken om mijn applicaties dynamiek te geven. In de rest van dit artikel wil ik ingaan op deze mogelijkheden. Hierbij worden voorbeelden gebruikt die ik heb toegepast in het ontwikkelen van een CASE tool. Code genereren De eerste opzet waarvoor ik VO-Script ben gaan gebruiken is voor het genereren van programma code. VO-Script is hiervoor een goed hulpmiddel. De scripts zijn aan te passen zonder dat de toepassing zelf veranderd hoeft te worden. Dit maakt de werking van een CASE tool flexibeler, omdat gebruikers vaak eigen programmeerstandaards (en zelfs ontwikkelomgevingen) hebben. Vanuit de applicatie wordt een script met behulp van de volgende methode aangeroepen. METHOD ExecuteText( ) CLASS WndScript LOCAL ccode AS STRING SELF:Pointer := Pointer{ POINTERHOURGLASS } ccode := odcactionmle:textvalue

ccode:=compilecode(ccode) IF!Empty(cCode) ExecuteCode(cCode, omainwindow) ENDIF SELF:Pointer := Pointer{ POINTERARROW } Zoals te zien is de code recht toe recht aan. Er zit één bijzonderheid in dat is de parameter die meegegeven wordt aan de ExecuteCode functie. De eerste parameter is de gecompileerde code in de vorm van een tekstvariabele. De tweede is een verwijzing naar het shellwindow van de actieve applicatie. Door deze parameter is het mogelijk om gebruik te maken van de GUI objecten die in de applicatie zitten, met name de windows, maar ook het menu van de applicatie. Hierdoor kunnen we vanuit het script windows openen en parameteriseren die binnen de applicatie zitten. Zo heb ik in mijn applicatie een aantal generieke windows opgenomen waarmee je uit lijstjes één of meerdere items kunt selecteren, een waarde invullen of een JaNee vraag stellen. In onderstaande afbeelding is te zien hoe een generiek window vanuit het script geopend en geinstantieerd is. Het bijbehorende VO-script ziet er als volgt uit: FUNCTION SybaseStatic(oShell) LOCAL aoptions LOCAL owndoptions

aoptions := {} Aadd(aOptions, "Create Tables ") Aadd(aOptions, "Create Constraints") Aadd(aOptions, "Drop Tables") owndoptions:=wndmultiselect{ oshell, aoptions } owndoptions:caption:="select the actions to execute" IF owndoptions:show() = 0 RETURN ENDIF aoptions:=owndoptions:result Het script laat een aantal eigenschappen van VO-script zien. Allereerst zie je dat een script met het woord function begint. Ook andere worden zoals procedure en method zijn mogelijk. Vervolgens is te zien dat je variabelen kunt declareren. Echter je kunt de objecten niet benoemen met AS. Dat komt doordat het script met behulp van macro s wordt verwerkt. Macro s zijn altijd late binding omdat ze tijdens runtime worden uitgevoerd. Dat betekent voor objecten dat er geen problemen zijn. De meeste objecten in VO zijn ook op basis van late binding opgezet om overerving te implementeren. Bij functies kunnen problemen optreden. Functies die strong typed zijn kunnen niet in het script opgenomen worden. Dit vanwege de early binding wat met macro s dus niet mogelijk is. Er is wel een eenvoudige workaround voor deze functies, neem in je VO-applicatie weak typed functies op als een schil om de strong typed functie met een iets andere naam. Als laatste is te zien dat de code in VO-script 100% VO is waarbij het eenvoudig is om gebruik te maken van zelf gedefinieerde objecten. DbServers openen Naast de toegang die je hebt tot de windows en menu s via het shellwindow kun je met VO-Script ook toegang krijgen tot je eigen DbServer objecten. Gewoon door ze te declareren als object en te bewerken in je script. In het code voorbeeld een stukje code met mijn eigen dbserver objecten. Hierbij is het belangrijk te weten dat dit objecten zijn waarin mijn eigen overervingsstructuur is opgenomen. Dus Classserver overerft van AbstractDbServer wat overerft van DbServer etc. LOCAL oclass // AS ClassServer LOCAL otf // AS TextFile LOCAL cline // AS STRING oclass:=classserver{} otf:=textfile{} otf:open(defaultfile("vocode.prg") oclass:makerelations() oclass:gotop() DO WHILE.NOT. oclass:eof cline:= "CLASS " + Alltrim(oClass:ClassName) oclass:propertyserver:gotop() DO WHILE.NOT. oclass:propertyserver:eof otf:writeline(cline) oclass:propertyserver:skip() ENDDO

oclass:skip(1) ENDDO Het voorbeeld laat zien hoe je met een DO-WHILE loop door het class object kunt lopen en vervolgens stukjes code kunt aanmaken die weggeschreven worden naar een textfile object. De navigatie kan gewoon met de standaard methoden zoals skip en gotop. Ook is in het voorbeeld te zien hoe ook eigen methoden aangeroepen kunnen worden (makerelations). DbServers aanpassen Binnen de CASE toepassing die ik ontwikkeld heb is een routine gemaakt waarbij je bij het openen van de applicatie een directory kunt opgeven waar de repository (een set DBF bestanden) staat. Geef je hier een niet bestaande directory op dan maakt de applicatie deze directory aan en maakt daarin vervolgens op basis van de interne structuur, zoals deze in mijn DbServer objecten zit, zelf aan. Hiermee is het mogelijk geworden om meerdere repositories naast elkaar te gebruiken. Echter er ontstond al snel behoefte aan extra functionaliteit. Zo is in het ene project behoefte aan extra eigenschappen voor bijvoorbeeld webpagina s terwijl in het andere project tijdens het modelleren meer behoefte bestaat aan extra projectmanagement gegevens. Het moest dus mogelijk zijn om extra velden toe te voegen en deze zichtbaar te maken binnen de toepassing. Nu was het een geluk dat ik de DbServer objecten al gebruikte als container voor allerlei zaken zoals: Validatie van invoer, Het tonen van controls op basis van voorwaarden Definiëren van een domein voor velden (voor comboboxen) Opbouw van databrowser objecten. Door gebruik te maken van VO-Script was het mogelijk om deze eigenschappen van mijn DbServer objecten aan te passen, en daarnaast om nieuwe eigenschappen toe te voegen aan het dbserver object. De opzet is eenvoudig. In de postinit methode wordt gecontroleerd of er een tekstbestand is met Server aanpassingen. Is dit het geval dan wordt het script uitgevoerd, waarbij het dbserver object als parameter wordt meegegeven. Dit script bestaat uit een DO CASE die voor ieder object kijkt of er aanpassingen zijn. Zie als voorbeeld het onderstaande script: FUNCTION LoadExtraInfo(oServer) LOCAL ccurrentserver AS STRING ccurrentserver := oserver:getclassname() DO CASE CASE ccurrentserver ="CLASSSERVER" oserver:setdisplayexpression("os:classname") oserver:setscriptexpression([savetrim(os:classname)]) oserver:returnfield := "CLASSNAME" // nieuw veld definieren oserver:addfielddescription( MDW, Naam medewerker, Geef de naam van de medewerker, C, 25, 0) //verplichte velden instellen oserver:addnotnullfield("classname") // default waarde instellen

oserver:addinitval("concrete",.t.) // sorteervolgorde instellen oserver:addorderinfo("classname", "Upper(CLASSNAME)", "Classname") // domein opgeven kan zowel statisch als een dbserverobject zijn oserver:addfielddomain("inhefrom", "CLASSSERVER") oserver:addfielddomain("layer", { { "Business domain", "1" }, { "Working Organisation", "2" }, { "Presentation", "3" } }) // instellen databrowser kolommen oserver:addbrowsercolumn("classname") oserver:addbrowsercolumn("layer"). Zoals te zien in de code is het mogelijk om de belangrijkste zaken voor velden binnen het DbServer object in te stellen en eventueel aan te passen. De opzet is dat er eerst een standaard script wordt uitgevoerd en dat vervolgens het tekstbestand met script wordt verwerkt. Hierdoor kunnen default instellen eventueel worden overschreven. Op basis van de instellingen zoals hierboven ingesteld worden allerhande zaken ingesteld zoals indexen en domeinen, maar ook databrowsers en invoer/bewerk windows. De applicatie is hiermee bijzonder dynamisch geworden.