410 likes | 785 Views
SEM03 Having Fun with VFP (some samples from VFX). Rainer Becker Rainer.Becker@dFPUG.de. Rainer Becker. dFPUG Incorporated UG Portal.dfpug.de German DevCon Tenth time & price Localization Toolkit German, French, Czech (with Igor Vit) Visual Extend MVP, MCP Wizards & Builders.
E N D
SEM03Having Fun with VFP(some samples from VFX) Rainer Becker Rainer.Becker@dFPUG.de
Rainer Becker • dFPUG • Incorporated UG • Portal.dfpug.de • German DevCon • Tenth time & price • Localization Toolkit • German, French, Czech (with Igor Vit) • Visual Extend • MVP, MCP • Wizards & Builders
Mixed Topics &Basic Directions What are we talking about in general and in this session
Original Session description • There are a lot of concepts in VFP that are different from the official theory but help us with rapid application development. This session will show a set of examples when, where and why using VFP is a great advantage in software development, at least if you know what you are doing. Many of these subtitles might sound like contradictions in itself but maybe you can still use them in your day to day work, e.g. COM-servers made visible, database without integrity rules, VFP for Excel-users, read-only-access-methods, labels for checkboxes, segmented tables and other topics are presented in a fast paced tips & tricks fashion. • Session title might be misleading…
Topics • Concepts of Visual FoxPro in General • Concepts of Visual Extend in General • Contradictive Example: Visible COM-Servers • Thumb databases are more intelligent • Configuration with Dynamic Constants • Main Work is user interface – misc. Tipps
Concepts of Visual FoxPro and Visual Extend Just to remind you of some basic stuff
Visual FoxPro Capabilities • Free unlimited application distribution • Free unlimited database distribution • Free unlimited reportwriter distribution • Just add „MODI REPO ?“ to your menue • All in one tool (everything you need) • Partially via integration (Help, Install) • Fine-Tuned over a decade of development • Lifecylce extended to 2014 with VFP 9
Visual FoxPro Language • Hybrid programming language • Procedural (great for batch jobs) • Self-modifying code • Data-aware commands • Compiled commands for local database engine • Object-based (like Visual Basic) • But Using Containers instead of SimpleFrame • Object-oriented (with Business Objects) • Ignoring theory of total encapsulation
Visual FoxPro Database • Hybrid database commands • Fast Xbase table commands (records) • SQL (groups, CURrent Set of recORds) • Mixed use (xbase on cursor), but my favorite • Replace all a.val with b.val for seek( a.key, „b“) • „Compiled“ database access • Critic: no strict type checking in language • Vice versa: always database comand strings…
Visual FoxPro Special • OOP Special: • Awareness of parent and all other objects • Container subclassing incl. ActiveX-Controls • Ease of Redirection of subclassing • Not Collection-oriented only • PROG Special: • Evaluate, Macro, Excescript, Compile • Definition files are tables • Command window for direct execution
Visual Extend Capabilities • Proven framework with standard functions • Rich set to enhance enduser application • Builders for Rapid App. Development • Standardized Design & Layout • Standard forms for various tasks • Grid-Page for search, Edit-Pages for detail • Sourcecode included except Builders • No Business Objects, just 2-Tier-Apps
Rapid Application Development • 2 tiers are most often enough for a good and fast application of small to medium size • Customers often are not willing to pay much higher price for maybe lower maintenance cost in the future • Business functions can still be encapsulated in classes which are to be used by the GUI, but these do not have to be clean BOs
Rapid Application Conversion • If you do not try to re-invent the wheel conversion of FoxPro/Windows applications with the help of a framework is pretty fast-forward as you can take over tables, reports and batch-code • It is „kind of a re-write“ but not really as you can reuse your knowledge and rebuild the application very fast in VFP
Recommendation • Software-architecture is very interesting andthree-tiered appswith business objectsare very powerfull • But only if you can afford them or your client is willing to pay the way • Otherwise stick to RAD VFP / VFX is best suited for and build & sell apps
Visible COM-Servers You were always told to use Business Objects in the middle tier with the advantage they can be re-used via COM
Main object • COM-Server need one OLE-Public object • this does not have to be a business object • Most often BO are not best choice to be accessed directly from outside of the application! • It has to be an object • a wrapper for a BO is needed at least • Based on control or container • Called via createobject from other apps • Methods/properties are accessable so they have to be protected …
Access/Assign and Parameters • Protect Methods / Properties • Small Interface: Hide Properties / Methods • Extensive parameter checking in Methods • Add Assign-Methods to Properties • Assign- & Access-Methods • Vartype and allowed values (list, valid date) • Formatting (Uppercase, remove spaces) • Read-only properties • Internal access only (hidden property switch)
Additional Preparation • Check startmode INLIST( _vfp.startmode, 2,3,5 ) • disable automation server unattended mode =SYS(2335,1) • Integrate error handling =COMRETURNERROR • Should also be called from access/assign-methods • Set all your settings • Reminder: Press Strg+OK in Options dialog
Project Definition • Add a main program just to have it • Your test program is a good main program • Include Metadata-tables in project • Include Config.fpw in project • SCREEN = OFF (invisible VFP desktop) • RESOURCE=OFF (prevent foxuser creation) • ALLOWEXTERNAL=ON (additional config) • Make visible when needed
Application Execution • Example in Excel: • Dim loRef as Object • On Error Goto SomeError • Set loRef = createobject(„exe.obj“) • … other operations • Set loRef = Nothing • Excel developers love VFP-data-access as it is much easier for them then ODBC/ADO!
Application Rollout • Runtime Directory contains • <Yourserver>.exe • VFP8R.DLL, VFP8RENU.DLL • GDIPLUS.DLL • REGSVR32.EXE • MSVCR70.DLL to system32 • Regsvr32.exe vfp8r.dll • <Yourserver>.exe /regserver
Recommendation • We use WinWord, Excel, Outlook, Internet Explorer and other applications by calling them… • Why dont we provide the same VISIBLE function-ality to our customers? • Especially Excel-/Word developers are interested!=> additional market…
Intelligent Databases are a problem for programmers Why make your live even more complicated ?
Reasons for a dumb datastore • Switching backends is a nightmare if validations are additionaly stored in the database (including key generation/RI) • Temporary saving of invalid records is helpfull for a lot of users (lActive/lValid) • Synchronization is a disaster if records can only be added with correct parent/child-relations set
Recommendation • If you want to use different backends: • No valids, RI, triggers • No DBCX • Handle logic in apps • A lot of developers have good experience in practise with dumb datastores for switching and synchronisation …
Dynamic Constants Repetition how to use constants and additional ways to use Constants for later application configuration
Constants Basics • #DEFINE CONSTANT Value • Not working within „“ or ‚‘ • compared to &, example ?„W&B“ with m.b defined • But working within [ ] • #UNDEFINE CONSTANT • Only in program or current method • Use #INCLUDE or Class/Form dialog • Multiple levels of inclusion possible
Conditional Constants • #IF condition (constant or VFP function) • #ELSE, #ELIF cond, #ENDIF • #IFDEF, #IFNDEF constant • #ELSE, #ENDIF • Some examples • #INCLUDE Foxpro.h / Messagebox-example • #IF .F. for comments • Do not use DEFINE … #IF .F. (optimized) • Except for temporary exclusion of complete class
More exciting use for constants • Array dimensions and column names • laTemp( lnCounter, CONST_COL_NAME) • Translation of strings • lcMessage = CONT_MSG_TEXT • Replacement of commands • LOCATE FOR CONT_LOC_COND • Version dependent functionality • Both for VFP as well as own version • Comment out SUSPEND, DEBUG … • #DEFINE SUSPEND *, DEBUG * • Not working any more: Commentblock • See above, #DEFINE BeginComment #IF .F. not working
Real world examples • Example 1 / Profiler: Constants for Tablenames, Boundaries, Captions, Colors, Classes, Combined Messages • Example 2 / VFXSync: Constants for Steps / Messages, Metatablenames, Metafieldnames, Parameter lists, locate statements, logfilenames, aliases
In-Between-Code • Place constants before and after calls • #DEFINE BEFORE/AFTER/WITHIN * • #INCLUDE useroverwrite.h • Use running status-variable • For IF/ENDIF-blocks • To change running var within code • No need for calls to emtpy methods • Longer compilation time but faster runtime
Recommendation • You can increase the configurability of your sourcecode with constants • Only in case you really need to configure you change the header-file. • No performance penalty compared to table-driven or any other way to configure your apps
Main work is stillthe user-interface Most time is still spend of user interface design and validations
GUI-functions encapsulation • Very powerfull Textmerge()-function can be used in a variety of ways • Addressformatter • Addressabreviator (not IntelliSense) • Build in button-click and when done save as class for reuse on other forms • You do not have to go multi-tier, but still it is an advantage to use classes and subclassing – if you separate out user interaction (spagetthi-code!)
Source example TextMerge() • Format-Memofield contains various <<alias.fieldname>> in correct position plus hardcoded addtional information like country short code SELECT adressformat LOCATE FOR adressformat.country = lcCountry ; AND adressformat.active = .T. IF FOUND() lcFormat = adressformat.format lcFormat = TEXTMERGE( lcFormat ) IF NOT EMPTY( lcFormat ) lcMessage = "adress copied to clipboard" _CLIPTEXT = lcFormat ENDIF ENDIF
Recommendation • Important is not to clutter code all over your forms but to place them in a central place, might it be buttons in a classlib or a business object • Important is to allow for GUI-mode and just a function call with return value
Famous last words Use Visual FoxPro in the right way – for you and your applications
Fast development experience • With VFP alone as well as with additional tools and frameworks
Best tool for fast development • .NET is stillnot „ready“ • PHP / mySQLno option • VFP will be extended even further • Good option for now as 4 GL
Thank You! • Please do not forget the evaluation form! • Visit our websites www.dfpug.de portal.dfpug.de forum.dfpug.de wiki.dfpug.de www.visualextend.de www.visualfoxpro.de www.wizards-builders.com