Welcome to Foxite.COM Community Weblog Sign in | Join | Help

Vector Drawings with Visual Foxpro and GDI+

Last October my friend Cesar Chalom asked me to prepare a sample project utilizing some pure GDI+ code in order to demonstrate it in the Brazilian's Conference participants. I kept my promise and I did prepare a simple Visual Foxpro demo project with "drawing" functionality. Since then I have received many emails from participants of the conference asking to publish this demo project.
So here it is... In this laconic project you will see the amazing capabilities of the VFP handling large complex mathematical calculations in "a speed of light" . In this demo project you will find also, two classes for trigonometric and polygon calculations. Very useful indeed. If your project needs any kind of 2D drawing don't look elsewhere.

 

Click inside a polygon and voila!. Since you have finished designing your window you can  export your shape into an XML file!

Tip: You can browse the .\Files\Shapes.dbf and modify the points of the existing polygons. Don't hesitate to add new polygons (like the previous ones) but be careful to have closed shapes.

Dowload Project

Any feedback on this demo project would be greatly appreciated.


VFP Can Do Anything You Can Imagine...

 

posted by vassilag | 2 Comments

Programming Visual Foxpro with Master Pages (...in mind)

Long ago I promised you that I would give you a series of posts about the work behind ProfilSmart. This is the first installment of this series and today I will try to give you a deeper look into Profilsmart's forms.

Usually I try to be very careful when I create a new application. I have always in my mind that what understands a user as "application" is just the user interface (UI) so I am very scholastic designing the UI.
 Three years ago I found myself to spend almost half (40% - 45%) of my time creating new forms and playing with GUI controls. I don't know whether it was my laziness or the need that made me to create a "strange" form then. Playing with the colors or the controls on a form for a corporate team maybe it is a pleasant occupation but when you are the only developer in the company and you have to wear a dozen of hats every day, you have to find solutions and efficient ways to turn your development into a really rapid one.
My very first thought was to create a set of Form classes with typical GUI controls and functionality that could be inherited and used in every need. Very soon a better idea came to mind and it was then that I tested to have a single form as "skeleton" and different container objects for the specific cases. So instead to load different forms across my application I created a "Master Page" with a pleasant color scheme, the navigation controls while a "sub form" was called according the occassion.

Very Soon my application in "design mode" was looking like this:

 


...Hey this is an empty form! How can this be your 12 months work ???


Ok let's dive a bit deeper...

The form has a custom method called cAddPanel. The code of the method looks like the listing:
(Since Profilsmart is a commercial close source application I can't publish the exact code here but I hope you get an idea)

Function cAddPanel
Lparameters tcPanelName

IF ! VARTYPE(&tcPanelName)="O" THEN
 
 IF VARTYPE(thisform.cfrmpanel)="C" then
  lcObjectName = "thisform." + thisform.cFrmPanel
  EVALUATE(lcObjectName + ".OnBeforeClose()")
 ENDIF

 thisform.cRemoveAll()
 thisform.AddObject(tcPanelName,tcPanelName)
 lcObjectName = "thisform." + tcPanelName

 this.cFrmPanel = tcPanelName
 WITH &lcObjectName
  IF NOT .cNoResize
   .top = this.xpanel_guide1.Top
   .left = this.xpanel_guide1.Left
   .width = this.xpanel_guide1.Width
   .height = this.xpanel_guide1.Height
  ELSE
   .Top = .cMyTop
   .Left = .cMyLeft
  ENDIF

  .cActivate()
  .visible = .t.
  IF tnKeyValue < 0 THEN
   .cAddNew()
  ELSE
   .cPrimaryKeyValue = tnKeyValue
   .cRequery()
  ENDIF
 
  .Refresh
 ENDWITH
ENDIF

thisform.Refresh


As you can see the method accepts the name of the panel (container object) and then loads the container. In the form we have an xpanel_guide1 object (A simple shape obj Visible=.F.) that works as a proxy and the container takes its place.

In addition the form has a property called cFrmPanel that keeps the name of the current container.

After the new container's creation the cAddPanel function calls a couple of methods for new objects's setup.

 

Every container has a property called cNextPanel that holds the name of the next panel. This is easily configurable at design time while the form's Next button is clicked the cShowNext method is called.


Function cShowNext
LOCAL lcObjectName, lbCheck, lcNextPanel


IF VARTYPE(thisform.cfrmpanel)="C" then
 lcObjectName = "thisform." + thisform.cFrmPanel
 EVALUATE(lcObjectName + ".OnBeforeNext()")
 IF PEMSTATUS(thisform,thisform.cFrmPanel,5)
  WITH &lcObjectName
   IF VARTYPE(.cNextPanel)="C" AND NOT EMPTY(.cNextPanel)
    lcNextPanel = .cNextPanel
    lbCheck = (Vartype(lcNextPanel)="C")
   ENDIF
  ENDWITH
 ENDIF
ENDIF

IF lbCheck
 thisform.cAddPanel(lcNextPanel) 
ENDIF


Let's imagine that you have to code a 4 pages wizard form. All you have to do is to create a new form based on the xBaseform class and to fill 4 containers with the appropriate controls. In the first container you write in the cNextpanel property the name of the second panel, in the second the name of the third and so on...
You run the form and your wizard is ready!


Continuing to throw here listings with code I am sure that very soon you will leave this page with headache. Stand by one minute and let's see what are the benefits of this approach.

 1. It is really easy to have a consinstent User interface accross the whole application.
 2. Having solved basic form functionality (resize code, close buttons, navigation controls etc...) your development time is reduced many times.
 3. When you want to make an application wide change (form's layout, form's colors , theme support etc.) you have to change a single point!
 4. From my metrics it is faster to load a container than to call a brand new form at runtime.
 5. You can have more simplistic UI elements in different containers instead of a crowded form.
 
In my own framework the form does not know anything about Business objects or data. I don't use form's DataEnvironment and the form's BindControls property is by default to .F.

The containers have custom methods that handle the data.



This is a typical supplier's form at runtime:


In the next post of the series we will examine the container objects.

See you!

 

 

 

 

 

 

 

 

 

 

 

 

posted by vassilag | 1 Comments

CodeFocus Magazine - Sedna Beyond VFP9

I just downloaded the special edition of CodeFocus magazine dedicated to VFP Sedna. The whole magazine is really SUPER with articles from Rick Schummer, Yair Alan Griver, Markus Egger, Rick Strahl, Craig Boyd, Bo Durban, Doug Hennig, Mike Yeager, Kevin Goff, John Miller and others,  it is full of many community tips and great articles about our next development tool VFP Sedna!

Explore the next version of Visual Foxpro here: http://www.code-magazine.com/focus/Index.aspx

Don't miss that you can download the electronic version of the magazine in pdf format.

Enjoy!

 

 

posted by vassilag | 0 Comments

The last of the tagged

Having spent most of my time with MSDN support center and various "offline" works lately I missed the fun of the "Tag" game. I just read the Cesar's post and I saw that I am tagged too!!! Now I have to tell you 5 things you don't know about me:

1. I downloaded my first bits from my brain to a Schneider CPC 464 (Amstrad) at the age of twelve in the beginning of 1987. My first computer was a Christmas gift from my parents and of course my first programming language was BASIC.

2. My college diploma says that I am a hardware specialist but I can't imagine myself doing something else than programming. Working since 1993 for Themelio Software (a company which develops software for window/door fabricators) I have written 4 times the same - vertical market - application with various tools (Visual Basic, Powerbuilder, Visual Foxpro). Of course my favorite programming tool is Visual Foxpro. Recently I had the idea to rewrite the GDI part of ProfilSmart utilizing the new GDI+ classes of SednaX project but thinking the total amount of work I left it very soon. Maybe my next try will be a 3D solution in another life.

3. In my personal life I am not married, I don't smoke and I like listening Depeche Mode, The Cure, New Order, U2 and other 80's bands.

4. I don't like cooking but ... only eating!!!
 
5. I love MS Flight Simulator. Actually I live for the moment where I can fly my favourite Cessna in a 3D google earth style world with real road traffic!!!


After more than 30 minutes of blog surfing I found that the entire VFP blogoshere has been tagged!  but continuing this so "productive" (I spent more than 2 hours writting this post) game I am  tagging:

Whil Hentzen (Actually from Whil I would like to know a single thing: When he plans to release the entire MySQL book?)

Malcolm Greene (He doesn't have a blog but I would like to join the blogosphere soon)

Andy Kramek / Marcia Akins

Ed Leafe

As for the rest of the VFP fellows please don't feel that you are not my friends but I saw in your blogs that you are already tagged!

 

 

posted by vassilag | 0 Comments

MSDN Renewal? A wild story!

I really tried hard to avoid sending my first post of the year with complaints but I didn't win...
All started on November 7 (please keep this date), my current MSDN Subscription was going to expire on November 30, having in mind that they need about 20 days to deliver I ordered to a local store a Visual Studio 2005 Team Edition with Premium MSDN subscription package. The price for the package was 2,556 Euros (about $3,200) .

As Murphy could predict, my package came to me a couple of days after of my MSDN subscription's expiration. (If I remember well, it was December 4) I opened the package and tried to renew my MSDN subscription via Microsoft MSDN site. I got a message saying that they could not renew my subscription because there was no active subscription in my name at that time. I said ok - the same had happened the previous year also - so I sent an email to MSDN Support explaining the situation. Some minutes later I received an email saying "Thank you for contacting MSDN. I wish to inform that if you can fax in a copy of your PID  and proof of payment we can activate your subscription for you. "

I filled the activation card, photocopied the invoice from the reseller and I sent them by fax. For the next few days there was no any response when I decided to send another email saying "please tell me do you need something else?" they replied that they need the same documents by email!
 To make a long story short, from that day I have been sending the same emails and faxes in order to renew my subscription and until today (16th of January) nothing has happened!
Last friday I sent an email to MSDN Support saying "did you receive my last email? do you need something else?" There was no any response! Until now, Nobody from the MSDN "Support" center have thought that a customer who pays 2,556 euros deserves, at least, just an email!

Just think of it for a while I have paid more than 3k dollars to the world's largest software company I am asking help for more than a month now and  there is no any result!!!

If your M$DN Subscription is going to expire (and you think that it deserves to renew - I don't think so anymore) try to renew on time!

Happy New Year !!!

 

 [Update: Finally my subscription activated on Jan 22.]

posted by vassilag | 3 Comments

ProfilSmart 3.0 is finally here!

After months of work and a whole month behind the schedule, we finally shipped earlier today the third version of ProfilSmart. It is a true client/server application with a MySQL ( or MS Sql Server 2005)  as backend database. The whole app is written in VFP utilizing a 2 1/2 tier framework (more on this in a later post).


This newest version has no differences in the UI or any more features than the previous one but I tried to rewrite thousands of queries against local dbf files, as SPT calls against a distant database server. That was a dramatic change in the existing application and as I didn't know anything about MySQL my first thoughts were to migrate my database only in the SQL Server. Visiting many clients at their site very soon I discovered that an unbelievable high percentage of their PCs do not meet the MS requirements for a SQL Server 2005 Express installation. (I saw many pcs running windows XP without SP2!) As I have written again in the past the majority of our customers do not know about service packs, windows update and etc... So it is really tough for us to convince them that they have to pay a technician for maintaining the pcs in a healthy state. The MySQL database was a good alternative choice for a backend as it can be installed very easily in older machines too.

Having by side the draft chapters of the  MySQL Client-Server Applications with Visual FoxPro, the whole process was a great experience for me as I had to rewrite thousands lines of code, I had to modify many parts of the existing framework and of course I had to solve many new problems that they didn't exist before. My best moment was when I had to populate my listview-like controls with photograhs stored in the database. In the previous versions of ProfilSmart the photographs were pure files lying on the disk and in the dbf was stored only the paths. Because I didn't want to have all these photographs a so easy CopySource for everybody, I decided to put them in the database. In a typical installation there about 10,000 elements of alouminium with photographs. At first I created a blob field (medium BLOB in the MySQL) in the same table with other characteristics of these parts. Very soon I realised that transfering 10 - 20 records over the LAN was a considerable pain ( Seconds are Hours* ) for the user. So I broke the table and I saved the photos in a second table of the database but even then, the amount of data over the wire was huge. Finally I remembered Andy Kramek saying that you can combine a remote database with dbfs! So my app transfers only once all the photos from the database in local dbfs in BLOB fields for every terminal and now all the photographs appear instantly! - Great Tip!

I plan to give you a long serie of posts with some technical details about the making of the ProfilSmart in the near future. I hope to be helpful for the community to know the Hows and Whys of the making of a real application. Please feel free to send me your thougths or comments about this, in order to help me prepare something more helpful.

Stay tuned!

* Joel's Spolsky book - User interface for programmers - Highly recommended!

 

 

posted by vassilag | 2 Comments

A VFP treasure at your next click

The majority of you maybe already knows about PortalFox. For those of you who don't, PortalFox Is a Free Portal for Spanish-speaking developers, located at http://www.portalfox.com.

I dare to write for PortalFox because I am really excited with the wealth and the tips that fellow developers can find there. I don't know too much about the guys (and gals) who run the site but there you can find the best articles from the whole VFP universe, in one place. It is a great resource for every VFP developer and you shouldn't miss it.

Even if you don't know the spanish language you can find an english version of the site here.

This site alone could be a good reason to start learning Spanish -;)

Well done guys - Keep Foxing!


 

posted by vassilag | 4 Comments

Lazy programmer translates all his forms automatically

Recently I was trying to make ProfilSmart translatable. In other words all program texts on forms, classes, messageboxes, reports etc. must be in the language that the user prefers. I have to admit that this is a very very boring procedure. If you ever have tried something like that you understand what I mean. Even I have downloaded Steven's INTL Toolkit I preferred to do the job manually.
At first, program forms have all the captions in greek. I was lucky enough to have used only sublclassed labels. So I created a Message_id property in my base label class. After that I created a table LangText (REC_ID Integer, GR_Text , EN_Text, FR_Text ...) in order to keep there every string of the program. My thought was to have a table with the messages and in each control a message_id number that corresponds to the appropriate record. The translation will take place "on the fly" in the SetCaption method after label's Init Event.

Moving the label captions from controls into LangText table one by one very soon I realised that this procedure will take months! So I decided to spend a couple of hours to create this routine:

*======================================================================

*| Purpose...... Sets the correct message_id to all Labels of the class/form

*| Author....... Vaggelakos

*| Created...... August 18, 2006

*| About........

*| Mod List.....

*======================================================================

LOCAL lcClassName, lcProp, lnMsgLine, lnCaptionLine, lnCaptionStart, lnCountOfFiles, lnCounter

LOCAL ARRAY laPropLines[1]

lcClassName = "Form1.Scx"

STORE 0 TO lnMsgLine, lnCaptionLine, lnCaptionStart, lnCountOfFiles

IF NOT USED("LangText")

      USE langText IN 0

ENDIF

IF NOT USED(JUSTFNAME(lcClassName))

      USE (lcClassName) IN 0

ENDIF

SELECT (lcClassName)

GO top

SCAN

      IF ALLTRIM(baseclass)="label"

            lcProp = Properties

            lnCaptionStart = AT("Caption",lcProp)

            STORE 0 TO lnMsgLine, lnCaptionLine

            IF lnCaptionStart > 0 THEN

                  *We have a Caption

                  lnCountofLines = GetWordCount(Properties,CHR(10))

                  DIMENSION laPropLines[lnCountofLines]

                  laPropLines[1] = GetwordNum(properties,1,CHR(13))

                  IF SUBSTR(laPropLines[1],1,7) = "Caption"

                        lnCaptionLine = 1

                  ENDIF

                  FOR lnCounter = 2 TO lnCountofLines

                        laPropLines[lnCounter] = CHR(13) + GetwordNum(properties,lnCounter,CHR(13))

                        IF SUBSTR(laPropLines[lnCounter],1,7) = "Caption"

                              lnCaptionLine = lnCounter

                        ENDIF

                        IF SUBSTR(laPropLines[lnCounter],3,7) = "Caption"

                              lnCaptionLine = lnCounter

                        ENDIF

                        IF SUBSTR(laPropLines[lnCounter],3,10) = "message_id"

                              lnMsgLine = lnCounter

                        ENDIF

                  ENDFOR

                  IF lnCaptionLine > 0 THEN

                        lcString = SUBSTR(laPropLines[lnCaptionLine],AT("=",laPropLines[lnCaptionLine])+1)

                        lcString2Find = GETWORDNUM(&lcString,1,["])

                        SELECT LangText

                        LOCATE FOR ALLTRIM(Gr_Text) == ALLTRIM(lcString2Find)

                        IF FOUND()

                              lnMessage_id = Record_id

                        ELSE

                              APPEND BLANK

                              Replace Record_id WITH RECNO()

                              Replace gr_Text WITH lcString2Find

                              lnMessage_id = Record_id

                        ENDIF

                        IF lnMsgLine > 0 THEN

                              lcString = SUBSTR(laPropLines[lnMsgLine],AT("=",laPropLines[lnMsgLine])+1)

                              laPropLines[lnMsgLine] = SUBSTR(laPropLines[lnMsgLine],1,AT("=",laPropLines[lnMsgLine]))+ " " + ALLTRIM(STR(lnMessage_id))

                              ***Update Properties Field

                              lcProp = ""

                              FOR lnCounter = 1 TO lnCountofLines

                                    lcProp = lcProp +laPropLines[lnCounter]

                              ENDFOR

                              SELECT (lcClassName)

                              Replace Properties WITH lcProp

                        ELSE

                              lcNewLine = CHR(13)+CHR(10) + "message_id = "+ ALLTRIM(STR(lnMessage_id))

                              ***Update Properties Field

                              lcProp = ""

                              FOR lnCounter = 1 TO lnCountofLines - 1

                                    lcProp = lcProp +laPropLines[lnCounter]

                              ENDFOR

                              lcProp = lcProp + lcNewLine

                              lcProp = lcProp + laPropLines[lnCountofLines]

                              SELECT (lcClassName)

                              Replace Properties WITH lcProp

                        ENDIF

                  ENDIF

            ENDIF

      ENDIF

      SELECT (lcClassName)

ENDSCAN

Wait Window "Done!"

CLOSE DATABASES


That's It! what I wanted all the texts from every control are transferred into langtext table in seconds! Keep in mind that the routine checks if the text string is already in the table and updates the message_id property correctly.

After that it was a matter of minutes to create a wrapper method that finds all the forms (and all the classes) of the project and calls this routine for every form or class.

All of my visual controls are now translatable!
Thanks to the nature of the Visual Foxpro source files this routine saved me months of work!

Important: Since this procedure dives into your form/class file keep a BACKUP copy before you run it!

VFP can do anything you can imagine!

Ta Leme 

posted by vassilag | 0 Comments

Stiff asks, great programmers answer

Really interesting post. Worth reading... here

(Via Jeff Atwood)

posted by vassilag | 2 Comments

Visual Foxpro Success Stories!

Much of our success as Fox programmers is celebrated in the back offices, out of the public eye. It is often difficult to cite the success to management and clients when the stories are virtually invisible to the outside world.

Michael Hogan is preparing a Visual Foxpro Success stories site these days. The FoxProSuccess.com site is intended to be a resource for the community to let the world know what a productive community can do with a vital tool like Visual FoxPro. We hope to gather success stories from guest writers into this central repository.

Success can be measured in many ways: On time and On Budget, Exceeding client expectations, sales and client retention, increases in productivity, saving a project that was DOA with other technologies, large multi-user support, integrating new or interesting technologies, etc.

You can contact Michael at mhogan at Ideatellc.com - please email him if you have a success story to tell, or can let us know about a peer with a success story of her own. If you need a ghost writer, Michael will write or edit the story for you, and he will edit all posts for grammar and brevity when necessary.

In your stories, please include information that illustrates the particular success of the project - estimated number of users, estimated increase in productivity, time of developement - whatever supports your definition of success for that project.

Our home page will be created within a couple of weeks, and more sections will be added to the site as time goes on. Expect refactoring of the site, and a more user-friendly submission process.

Thank you in advance for your contributions to the community!


 

posted by vassilag | 0 Comments

VFP does Mp3 too!

Last weekend my girlfriend wanted to set a new mp3 song as ringtone in her mobile phone. So She opened up her brand new Sony VAIO (chocked by preinstalled software) and tried to find the appropiate application for cropping an mp3. She didn't want to have a 4 min song as  ringtone, instead she wanted to create a new file with just a small portion (10-15sec) of the original song. At first she asked me "How can I do sth like this?" I replied "Just open Visual Foxpro and I will show you"  She said  "Aaahh you have overdone it with VFP! My super laptop is full of utilities, there must be something here for something so simple...". I said OK and I switched on the tv because Brasil's match have just begun. 90 minutes later I found her trying while several windows lying on the screen. She couldn't find something so when I said "OK open Visual Foxpro" she gave up. I launched Visual Foxpro and immediately the Command Window appeared. I typed 5 commands:

lcFile = FiletoStr("C:\music\a.mp3")

lnFileLen = Len(lcFile)

lnSizePerSec = lnFileLen / 200 && 3.20 Total song time in sec.

lcNewFile = Substr(lcFile, lnSizePerSec * 20, lnSizePerSec * 15)

? StrToFile(lcNewFile, "c:\music\new.mp3")

and Voila! a new mp3 file was there as she wanted!

VFP does ringtones too!

Ofcourse this really simple case has nothing extraordinary from programmer's view. Everyone could create a similar "program" with its favourite programming tool BUT here there is a detail. I didn't create any program! All these commands were executed  directly from VFP's magical command window! 

 I have never seen a similar command window in any other language. If you know something that I have missed please let me know

P.S Don't forget VFP can do anything you can imagine!

posted by vassilag | 2 Comments

Where the tools have no name?

Microsoft did it again. MS is going to release .Net Framework 2.0 bundled with WinFX under the name .Net Framework 3.0!
As Somasegar writes on his blog: "The .NET Framework 3.0 is still comprised of the existing .NET Framework 2.0 components, including ASP.NET, WinForms, ADO.NET, additional base class libraries and the CLR..."

it is supposed that microsoft would disappear the DLL Hell with .Net framework but now it is clear that they are not in the right path. I can't imagine myself waiting 1 hour to uninstall .Net Framework 2.0 and then another hour just to install the same DLLs.!

As you can see in the comments of the Somasegar's post .Net developers are not so happy with this decision.

See also here.

BTW, If you have not heard it already, you can vote for the new name of SednaX project here. (Isn't it more democratic?)

 

posted by vassilag | 0 Comments

VFP can do anything you can imagine...

Last week I blogged about ProfilSmart but I couldn't expect so positive comments. I received many emails mainly from members of Profox emailing list and I promised to prepare a video in order to give you a better idea of the whole app.

So here it is. You can download a 2.5MB WMV file from here.

If you any problem with the WMV you can download a packaged EXE file that contains the camtasia player winhin from here.

Watch the video and please let me know your comments.

Visual Foxpro can do anything you can imagine!

P.S: In my last post I forgot to mention that I found invaluable help in the API reference site of Anatoliy Mogylevets. The subscription is worth many times more than Anatoliy is charging.

 

posted by vassilag | 0 Comments

What I have done with VFP, GDI+, and a ton of help from VFP Community (OR why VFP is COOL)

My company develops software for a very special market. We write code for window fabricators (They who build real windows and doors, not operating systems :-) )
I say that we have to deal with a very special customer group because (at least in my country) the users of our applications very often don't have any previous computer experience at all. So our application must have a very clear intuitive interface and on the other hand, must cover very complex needs.


Some features of the appliaction are: Cost calculations, Quotation printouts, Cutting length calculations, Automatically created Price lists, Bar optimization, and many more...  All these features require powerful data handling mechanisms and VFP gives them to us very generously. (We have tried the same project in the past with Visual Basic, PowerBuilder and C++  but sooner or later all these tries failed because we couldn't succeed an acceptable balance between Budget - Time and Features ).


VFP is our Weapon. Our application utilizes a hand made framework inspired basically by the book Build Your Own Framework with Visual FoxPro by Kenneth Chazotte.In addition, I have stolen the code (and ideas) from many base classes from the book MegaFox: 1002 Things You Wanted to Know About Extending VFP by Marcia Akins, Andy Kramek and Rick Schummer. All these under the guidelines of the Advanced Object Oriented Programming with Visual FoxPro 6.0 by Markus Egger. Of course I can't list here all the books that I have read in order to write this applcation but please forgive me and let me mention two more books that gave me a tremendous help. First the book Hacker's Guide to Visual FoxPro 7.0 by Tamar E. Granor, Ted Roche, Doug Hennig, Della Martin and the book Deploying Visual FoxPro Solutions by Rick Schummer, Rick Borup and Jacci Adams.

In November 2004 we shipped the first version of ProfilSmart that introduced a modern interface inspired heavily by Windows XP. All the controls of the application are written in pure VFP code.

 The feedback from our customer base was so encouraging that In April 2006 we shipped the second version of our application that gives the ability to the user to draw its own models very easily. Utilizing  thousands lines of GDI+ code VFP with the FFC classes (unfortunately we don't have explored the GDI+ classes from SednaX yet) gave us the ability to focus our attention (and code) into a higher level of the system coding. So I have made a full CAD like package with nothing more but VFP and GDI+ DLLs. Favor to Craig Boyd, Cesar Chalom , FoxTalk magazine , Walter Nicholls and many other members of the VFP community, Our customers are more than satisfied.

Unfortunately the most recent parts of  the application are available only in greek language at the moment.

In the near future we prepare a LAN version with SQL Server 2005 as a backend database and a PDA version with C# code. All these in an harmonic cooperation that brings technology into every manufacturing company (even here in Greece).

I am writing all these because first of all I would like to express my deepest thanks to all these people that helped me implement a huge system (coding more than 160 KLOC for a single developer is not a funny occupation)  and then because I believe that my case reveals a real example of a modern application in response to all those people that say  VFP is a dead language or it is an old fashioned database or or etc... I don't want to feed all the battles about VFP here, but  I strongly recommend to other people of the VFP community to show real examples of their applications in order to understand the non VFP people the power of Visual FoxPro.

 

posted by vassilag | 3 Comments
Attachment(s): PrfsmartScreens.zip

Hierarchical Drop Down Combo without Activex

Recently while I was working on a new application and trying to find an efficient way for selecting an option from a ComboBox I remembered the article of Predrag Bosnic in the FoxTalk magazine (December 2002 - you are a subscriber, Isn't it?) that explains the making of a combined ComboBox control with a Treeview ActiveX. For some (mysterious) reasons, I dislike activeX controls. Instead of them, I prefer to build or use only pure VFP controls. So I decided to make one on my own.

Definitely, my control has serious limitations over Predrag's ComboTree view control (images, deep nesting level,drag n drop, etc...) but for now I can live with it.

My scope is to make it public in order to improve it. The control has code / ideas from Megafox book (Andy Kramek, Marcia Akins, Rick Schummer),  Craig Boyd,  Predrag Bosnic, Art Bergquist  and I would like to say a big THANK you to all of them. Also, I would like to thank Tasos Bazotis and Fay Bazoti for their contribution.


Download the following zip file try it and please don't hesitate to send me your comments. Any feedback would be greatly appreciated.

Download zip


P.S : Please show mercy, as it is my first try to make public some code bits.

posted by vassilag | 0 Comments
More Posts Next page »