Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Articles
Recherche: 

Breaking the barrier between VFP & .NET
Michel Fournier, December 1, 2003
Visual FoxPro and .NET are two great environments to build business applications with. But, fantastic they are when you combine them together in order to increase the strenght of the flexibility to respond to your client needs. In this article, I will demonstrate a case study in regards to a new ser...
Summary
Visual FoxPro and .NET are two great environments to build business applications with. But, fantastic they are when you combine them together in order to increase the strenght of the flexibility to respond to your client needs. In this article, I will demonstrate a case study in regards to a new service of the Universal Thread for the user group community.
Description
Visual FoxPro and .NET are two great environments to build business applications with. But, fantastic they are when you combine them together in order to increase the strenght of the flexibility to respond to your client needs. In this article, I will demonstrate a case study in regards to a new service of the Universal Thread for the user group community.

The needs

A phone call came here from a good friend of mine. Jean-René Roy, president of the Montreal FoxPro User Group, wanted to improve the flexiblity of their user group Web site by taking advantages of the Universal Thread User Group Meeting Tracker data.

The vision was simple: "Why would I want to enter the data twice within two different environments when I could benefit of that from one and only place?" Then, suddenly, within a few seconds, it came as a reality. "Oh, by using the UGMT data, that mean we could then also be able to improve our Web site content by getting additional related content."

Then, as dynamic as my vision could be, I replied: "Huuummmm, that means you will always have your data up to date as whenever a speaker would update his biography and his picture, for example, on the Universal Thread, you would have it updated immediately on your Web site." Interesting, isn't it?

Technology used

The Universal Thread makes use of various technologies in order to deliver and respond to its client needs. Originally all done in Visual FoxPro, the product has constantly evolved over the years and now offers and makes use of some .NET technology as well. Relying on solid frameworks, such as West Wind Web Connection on Fournier Transformation's own, the Universal Thread represents a great example of breaking the barrier between VFP & .NET in order to benefit of the strenght of both environments.

Web Service

Among its infrastructure, the Universal Thread, since about a year, has migrated its Web Service to .NET. The migration was done within a few days. The advantages of maintaing versions that .NET offers over VFP is great. No longer do I have the need to go on the server or to build some kind of automation in order to upload a new version of the Web Service into the server. Once ready, a simple FTP of two DLL files is necessary in order to have the new version live.

Once a new version is sent to the server, on the first hit, it will take a few additional seconds for the server to recognize and load the new version. But all that is done automatically. So, it's not a big deal.

The intellisense of the VS.NET environment within the Web Service project provides great benefits. The availability of the server objects in the development environment allows many great things such as the ability to see the properties and methods of the server request object, for example, such as HttpContext.Current.Request.ServerVariables("REMOTE_ADDR").

The venue of the Universal Thread Web Service also allowed us to respond to additional needs. Our returned data, available as a XML string can also be requested as a DataSet.

A .NET Web Service also allows an easier mechanism of authentication such as we do on the Web by the use of cookies. A simple command such as System.Web.HttpContext.Current.Response.Cookies("Session").Value = "1234" would be enough to enable a cookie which would be available on all upcoming hits.

Note that .NET users need to instantiate the cookie container in order to have it encapsulated in the environment on all upcoming requests. This can be done by the following command:

' Create the cookie container
loUT.CookieContainer = New System.Net.CookieContainer
The Universal Thread Web Service is also built within a wrapper approach. That means it doesn't deal with any business nor data objects. It acts as a wrapper by simply forwarding the request to another engine and waits for the response before sending it back to the client. As a Web Service is a static and disconnected environment, we have built it so it is really small and simply mostly only contains one line per method. So, once the methods defined, we practically never have to touch the Web Service whenever we want to update the content we return and so on.

The following represents an example of two methods of the Web Service which contains their equivalent when needed to send a DataSet:

   <WebMethod()> _
   Public Function GetUserGroupMeeting(ByVal tdStartDate As Date, ByVal tdEndDate As Date, _
    ByVal tnUserGroup As Integer) As String
      Return Me.GetData("1," + Me.GetDate(tdStartDate) + "," + Me.GetDate(tdEndDate) + "," + _
       tnUserGroup.ToString, 5)
   End Function


   <WebMethod()> _
   Public Function GetUserGroupMeetingDataSet(ByVal tdStartDate As Date, ByVal tdEndDate As Date, _
    ByVal tnUserGroup As Integer) As DataSet
      Return Me.GetDataSet("1," + Me.GetDate(tdStartDate) + "," + Me.GetDate(tdEndDate) + "," + _
       tnUserGroup.ToString, 5)
   End Function


   <WebMethod()> _
   Public Function GetUserGroupSpeaker(ByVal tdStartDate As Date, ByVal tdEndDate As Date, _
    ByVal tnUserGroup As Integer) As String
      Return Me.GetData("5," + Me.GetDate(tdStartDate) + "," + Me.GetDate(tdEndDate) + "," + _
       tnUserGroup.ToString, 5)
   End Function


   <WebMethod()> _
   Public Function GetUserGroupSpeakerDataSet(ByVal tdStartDate As Date, ByVal tdEndDate As Date, _
    ByVal tnUserGroup As Integer) As DataSet
      Return Me.GetDataSet("5," + Me.GetDate(tdStartDate) + "," + Me.GetDate(tdEndDate) + "," + _
       tnUserGroup.ToString, 5)
   End Function
The GetData() function is where the Web Service is forwarding the request to the VFP application. The first process is to verify the authentication of the user. Once that is done, a request is launched, by the use of the GetXML() function, to the VFP application.
   ' This query the Universal Thread server for specific XML transactions
   ' expC1 Query
   ' expN1 Web Service process to call
   '       1 Universal Thread
   '       2 Federated Community
   '       4 .NET Zone
   '       5 Visual FoxPro Zone
   '       6 User Group Meeting Tracker
   Private Function GetData(ByVal tcQuery As String, Optional ByVal tnProcess As Integer = 1) As String
      Me.CheckLogin()
      Dim lcServer As String
      Dim lcHtml As String
      lcServer = Me.cUrl + tnProcess.ToString() + "," + Me.cUser + ","
      lcHtml = GetXML(lcServer + tcQuery)
      Me.CheckForError(lcHtml, False)
      Return lcHtml
   End Function
The GetDataSet() function is similar to GetData(). The only difference is that it will convert the XML string received from VFP into a DataSet.
   ' This query the Universal Thread server for specific XML transactions
   ' Is it similar to GetData but it returns a DataSet
   ' expC1 Query
   ' expN1 Web Service process to call
   '       1 Universal Thread
   '       2 Federated Community
   '       4 .NET Zone
   '       5 Visual FoxPro Zone
   '       6 User Group Meeting Tracker
   Private Function GetDataSet(ByVal tcQuery As String, Optional ByVal tnProcess As Integer = 1) _
    As DataSet
      Me.CheckLogin()
      Dim lcServer As String
      Dim lcHtml As String
      lcServer = Me.cUrl + tnProcess.ToString() + "," + Me.cUser + ","
      lcHtml = GetXML(lcServer + tcQuery)
      Me.CheckForError(lcHtml, False)
      Return ImportXML(lcHtml)
   End Function
GetXML() is responsible to issue a query string to a Web Service where the WWC framework will take over the request and process a XML string as a return:
   ' Get the XML
   ' expC1 Url
   Private Function GetXML(ByVal tcUrl As String) As String
      Dim loReq As System.Net.WebRequest
      Dim lcHtml As String
      loReq = System.Net.WebRequest.Create(tcUrl)
      Dim loResponse As System.Net.WebResponse = loReq.GetResponse()
      Dim loStream As Stream = loResponse.GetResponseStream()
      Dim loStreamReader As StreamReader = New StreamReader(loStream)
      lcHtml = loStreamReader.ReadToEnd()
      Return lcHtml
   End Function

As the engine called to process the business and data objects is resident in memory, the database connection, the opening of tables and the initialization of many objects is already done once its receive the Web Service request. So, as the environment is already loaded, the respond time is excellent.

The client application

The need on the client side was to build an ASP.NET application to control the Web site. Within that context, it was easy to implement the various requests the user group needed.

A user group project was created and the codehind was built in VB.NET. A reference to the Universal Thread Web Service was added and the creation of several aspx pages was done in order to grab the content for the upcoming meetings, the previous meetings and the speakers list in regards to the MFUG user group.

Many aspx pages are calling the same function in order to display the speakers profiles. So, the method was removed from each related aspx page and placed into a Function.vb file defined as Shared so it is visible in all aspx pages. In fact, the speakers profile is one beauty of this service. It is the most used function and it can be used for various purposes such as listing all speakers who have already presented for the user group or simply to be used to list the board of directors.

In order to deliver a speaker's profile, the speaker need to have a Universal Thread account and update the related information. From the account setup, under Identification and Biography, the speaker will find everything needed to update his profile. The related fields are the company name, the email, the Web site and the biography. The biography can be entered in English, French, Spanish and Portuguese.

The following steps can be executed in order for a speaker to update his profile on the Universal Thread:

  1. If you do not have a Universal Thread account, you can create one from the main page or click here to go directly
  2. From the top of the main page, click on Account setup or click here to go directly
  3. Click on Identification to update your company name, email and Web site
  4. Click on Biography to update your biography
To upload your picture, send a 90*117 pixels picture of you in JPG format to picture@universalthread.com. The dimensions include a one pixel black border.

Here is an example of a speaker's profile:

Here is the AddSpeaker() method which is the standard now used on several Web sites such as the Universal Thread, the Universal Thread Magazine, the Montreal FoxPro User Group, the Montreal SQL Server User Group and the DevTeach Web sites:

Public Class _Function

   ' Add a speaker
   ' expN1 Speaker ID
   ' expL1 If the speaker picture is available
   ' expC1 Speaker name
   ' expC2 Speaker bio
   ' expC3 Speaker company
   ' expC4 Speaker email
   ' expC5 Speaker url
   Public Shared Function AddSpeaker(ByVal tnSpeakerID As Integer, ByVal tlPicture As Boolean, _
    ByVal tcName As String, ByVal tcBio As String, ByVal tcCompany As String, _
    ByVal tcEmail As String, ByVal tcUrl As String) As String
      Dim lcHtml As String
      Dim lcUniversalThread As String

      lcHtml = ""

      ' Universal Thread url
      lcUniversalThread = "http://www.universalthread.com/"

      If tnSpeakerID > 0 Then
         lcHtml = lcHtml + "<TABLE CELLSPACING=0 CELLPADDING=0>"
         lcHtml = lcHtml + "<TR VALIGN=TOP>"
         lcHtml = lcHtml + "<TD ALIGN=CENTER WIDTH=90>"
         If tlPicture Then
            lcHtml = lcHtml + "<IMG SRC=" + lcUniversalThread + "Photo/" + _
             tnSpeakerID.ToString().PadLeft(6, "0") + ".jpg>"
         Else
            lcHtml = lcHtml + "<IMG SRC=" + lcUniversalThread + "Photo/PictureNotAvailable.jpg>"
         End If
         lcHtml = lcHtml + "<TD> "
         lcHtml = lcHtml + "<TD WIDTH=100% Class=Normal12>"
         lcHtml = lcHtml + "<TABLE CELLSPACING=0 CELLPADDING=0>"
         lcHtml = lcHtml + "<TR VALIGN=TOP>"
         lcHtml = lcHtml + "<TD WIDTH=100  "
         lcHtml = lcHtml + "<FONT Class=HeaderSection>" + tcName + ", " + tcCompany + "</FONT>"
         lcHtml = lcHtml + "<TD WIDTH=80>"
         lcHtml = lcHtml + "<A HREF=mailto:" + Trim(tcEmail) + _
          " Class=Blue Title='Send an email to this person'>" + _
          "<IMG SRC=/Images/Email.gif WIDTH=32 HEIGHT=16 BORDER=0>"
         lcHtml = lcHtml + " "
         lcHtml = lcHtml + "<A HREF=" + tcUrl + " Class=Blue Title='Go to this Web site'>" + _
          "<IMG SRC=/Images/URL.gif WIDTH=32 HEIGHT=16 BORDER=0></A>"
         lcHtml = lcHtml + "<TR>"
         lcHtml = lcHtml + "<TD COLSPAN=2 Class=Normal12>"
         lcHtml = lcHtml + tcBio
         lcHtml = lcHtml + "</TABLE>"
         lcHtml = lcHtml + "</TABLE>"
      End If
      lcHtml = lcHtml + "<P>"
      Return lcHtml
   End Function

End Class
Basically, the process of adding a speaker's profile is really simple. The following represents a simple call to it. This code makes use of a DataSet so the call is done to GetUserGroupSpeakerDataSet() instead of GetUserGroupSpeaker(). A simple transfer into a view is done for further flexibility.
      ' Web service and environment initialization
      ' ...

      ' Get the upcoming user group meetings
      loData = loUT.GetUserGroupSpeakerDataSet(DateAdd("d", lnDaysBack * -1, Date.Today), _
       DateAdd("d", lnDaysNext, Date.Today), lnUserGroupID)

      ' Get it into a view
      Dim loView As DataView
      loView = loData.Tables("Temp").DefaultView

      ' Display the list of speakers
      lcHtml = ""

      For lnCompteur = 0 To loView.Count - 1 Step lnCompteur + 1
         lcHtml = lcHtml + _Function.AddSpeaker( _
          loView(lnCompteur).Row("ID"), _
          loView(lnCompteur).Row("Picture"), _
          loView(lnCompteur).Row("FirstName") + " " + loView(lnCompteur).Row("LastName"), _
          loView(lnCompteur).Row("Bio"), _
          loView(lnCompteur).Row("Company"), _
          loView(lnCompteur).Row("Email"), _
          loView(lnCompteur).Row("Url"))
         lcHtml = lcHtml + "<P>"
      Next
      SpeakerVFP.Text = lcHtml

The evolution

What started as a simple request to have their meeting data to be feeded from the Universal Thread evolved into additional services such as having their board of directors page to be layed out the same as any speaker is bound to. The only requirement was to make sure any member of the board of directors has their biography up to date on the Universal Thread.

Montreal is a bilingual city. So, the need to offer the site in English and French has always been a requirement. In order to provide full flexibility within that data, the Universal Thread applied some enhancements in order to offer the biography in foreign languages as well. So, when applicable, the biography can be entered in foreign fields as well. That means when someone switches languages on their Web site, within that board of directors page, they will get the biography in the related languages as well. The same is true for the speakers page for those who have multiple versions of their biography in their profile.

Usually, only one version of the biography is used. But, in this case, where the user group is providing content in French and English, this ability becomes quite useful. It could also be used on DevTeach site where the list of speakers presenting at the conference is also provided in French and English. On the Universal Thread, we have that need on the Universal Thread Magazine site where English, Spanish and Portuguese are supported. So, within the magazine team, we try to have all biographies translated in those three languages.

While at it, we decided to feed the user group Web site by providing them new methods for other needs such as the picture archive. As many user group as uploading their pictures to the Universal Thread, it is now easy to provide such a content as well. Within the same approach, the MFUG Web site now has a picture archive where the pictures are coming in from the Universal Thread so is the picture title and date of meeting.

The request to get all the necessary information to display the picture is really simple:

' Get the upcoming user group meetings
loData = loUT.GetUserGroupPictureDataSet(lnUserGroupID)
The method will return the picture file name on the Universal Thread server, the title and the date of the meeting.

To provide other content of interest for their members, we added new items in the menu for the list of Visual FoxPro news and the list of Visual FoxPro conferences.

The advantages

What is great about that is the site is practically maintained standalone. Basically, once the data is entered on the Universal Thread, the user group Web site is automatically updated. Which means, the content of the main page, for example, is reflecting the new submitted data for the upcoming meetings. Only a few maintenance is necessary for customized content such as the list of specific user group news of interest for their members.

The following describes the list of advantages within such a context:

  1. Data entry is done in one place only but respond to multiple Web sites
  2. Provide additional exposure for the user group as the data is also displayed on the Universal Thread
  3. User group Web site constantly updated dynamically as soon as the data is updated on the Universal Thread
  4. No need for the user group to maintain speaker's profile, biography, picture and related content
  5. Speaker's profile, biography, picture and related content updated on the user group Web site as soon as a speaker updates it on the Universal Thread

Considerations

This approach is nice but some considerations are present. Basically, it's like the Universal Thread Web site is now growing as per the MFUG traffic. This is in fact a reality. As, whenever a hit occurs on the MFUG Web site, one or multiple Web Service calls are being issued. That means, you need to analyze the expected traffic and see how that would influence your traffic load. As part of its line of services, the Universal Thread is doing a lot of work for the user group community. This is simply one add-on. User group Web sites also have, in most cases, a low traffic bandwidth. So, a few additional hits per day is not what would affect the Universal Thread server. But, if you would implement such infrastructure for your business, it might be good to consider it.

Of course, enhancements are possible. One of them is to use a Windows Service on the client server to query the Universal Thread server at specific interval and simply store the received data locally in XML file, for example. Then, the ASP.NET Web site application can simply include the XML string in the related pages. By that, you would be able to calculate exactly the amount of hits to your data server and you will also guarantee that when your client server is running, that the page will load in the browser. As you may know, sometimes, along the Internet route, failure may happen and that might result in a page not being able to load in the browser because the data server is unreachable.

The Windows Service is a great approach. It has been discussed on the Universal Thread in several threads in the .NET forum during the month of September and October. The UGMT Web Service page also includes a sample of a Windows Service which is querying the Universal Thread at specific interval to retrieve some data.

How to get it?

For user groups interested in getting the same, the Universal Thread provide some documentation and samples on putting it all together into its UGMT Web Service page.

References

Michel Fournier, Level Extreme Inc.
Michel Fournier is a professional, visionary, perfectionist, mostly known for his renowned realizations over the years, designer, architect, owner of the « Level Extreme Platform », formerly known as the « Universal Thread », recognized as one of the longest running Web sites of the planet, also known as a precursor to social networking, product manager, Internet serial entrepreneur, practiced Lean Startup techniques long before they were known, out of the box thinker, using the tenth man rule, specializes in building entire virtual data center solutions, has provided high end IT consulting worldwide, has owned and operated three companies, delivered worldwide renowned e-commerce Web sites, designed and architected two world class top level development frameworks, wrote over 100 IT articles for various sources, presented at user groups, conventions and corporations nationwide as well as in the US, has provided his contribution in political and legal issues to provide a better world, Owner and Senior IT Consultant at Level Extreme Inc., former Architect Software/Application & Project Manager, 7 times Microsoft Most Valued Professional for VB.NET, 7 times Microsoft Most Valued Professional for Visual FoxPro, Developers Choice award for best site at VFP DevCon 2000 Connections in New Orleans, featured in Acadie Nouvelle on October 2003.
More articles from this author
Michel Fournier, February 1, 2007
From the Level Extreme .NET Framework, this small class allows a developer to manipulate easily the content of a directory by the use of a dataset. With the setup of a few properties, a call to the method and the access to the object dataset, you can have access to the file properties of the directo...
Michel Fournier, August 1, 2001
It is interesting to see how something new can evolve. This is the case for the Universal Thread Magazine. We are now at our 3rd issue and we are already overbooked by scheduled articles and hot stuff we have to cover for the upcoming issues. Publishers are sending request for book reviews, wri...
Michel Fournier, October 1, 2002
UTMag/RapoZine team Editors Michel Fournier Claudio Lassala Co-editor Martín Salías Translation coordinators Claudio Lassala Martín Salías Translators Eduardo Vidigal Rodolfo Duarte Fábio Vazquez José Cavalcanti Moacyr Zalcman Fábio Vieira M...
Michel Fournier, May 1, 2006
In this article, Michel Fournier is providing a small introduction to manipulating XML data from VB.NET. The use of XML is now widely used for various purposes such as exchanging data between application, platforms and other environments. XML is a simple and very flexibile text format that can be ma...
Michel Fournier, October 1, 2001
In our daily things we do, sometimes we find ourselves in unexpected situations. Such situations, either in our personal life or from our professional work, require some adjustments in order to walk through them. The ability to take some time to take an overall look of what is happening, apply a bas...
Michel Fournier, March 1, 2007
In this small article, Michel discusses a problem he recently encountered when converting a dataset into XML to be used later on with a XSL transformation to export into an Excel sheet. When null values were present in the dataset, this was creating weird result. This article provides a quite alte...
Michel Fournier, February 1, 2006
This article discusses a simple banner fonctionalities function which can ease the display of banners on Web sites. If your Web site displays banners in GIF, JPG of Flash format, this function could be useful to you.
Michel Fournier, January 1, 2006
There are various ways to authenticate a user to a Web Service. This article discusses one way to do it by the use of Cookies. As it could the case with a Web page sending a cookie to the browser, the same can be used from within a Web Service.
Michel Fournier, February 1, 2006
This article is a follow up on the first part of this article which appeared on our January 2006 issue. In this one, Michel discussed further implementation of getting the authentication from a members table as well as setting up a session per user.
Michel Fournier, December 1, 2002
Over the years, I have been involved in several types of desktop and Web applications. Every time you start a new project, there is always something new you will learn. In this article, I would like to detail some of the issues which are to be considered when delivering a Web based application. Thos...
Michel Fournier, January 1, 2003
This article is a follow-up with more advanced details in regards to the first article of this series in our December issue which included a tip on dealing with stylesheets. This one allows you to customize your HTML code based on the user, assuming each user has some ways to setup some specific sty...
Michel Fournier, March 1, 2003
The first two articles of this series have been published in the issues of December 2002 and January 2003. In this one, I will talk about graphic issues, how to negotiate with a form to launch his transaction to either within the same window or a new one, how to gather values from one page to anothe...
Michel Fournier, April 1, 2003
In this article, I will proceed with considerations about HTTP server variables being received from a browser and about considerations for opening new windows in your Web application. Relying on the protocol or not When it first started, we didn't ask that question to ourselves as to know ...
Michel Fournier, April 1, 2009
This articles describes the use of CDO.Message to gain the ability to retrieve a URL as a MHT file. It also covers an interesting approach to retrieve a URL even if this one requires a login.
Michel Fournier, January 1, 2006
Data dictionaries has its use and also for Web applications. I see many developers building Web applications who forget about many structured that used to be in place when developping desktop applications. The same should apply for Web applications as it is no different. This article discusses some ...
Michel Fournier, June 1, 2003
DevTeach was held in Montreal from May 10-13, 2003. It presented a new breed of conference. Sessions included both presentation material and, whenever possible, hands-on training. DevTeach brought under the same roof the best speakers available for .NET, SQL Server and Visual FoxPro as well as Micro...
Michel Fournier, May 1, 2002
The Essential Fox conference was held this weekend in Independence, MO. Once again, the Universal Thread team was on site to do the official coverage of the event. It has been a great success, well planned by Russ Swall, the event owner, and his team and well appreciated by the attendees. A total of...
Michel Fournier, April 1, 2002
UTMag/RapoZine team Editors Michel Fournier Claudio Lassala Translation coordinators Claudio Lassala Martín Salías Translators Eduardo Vidigal Rodolfo Duarte Fábio Vazquez Claudio Rola José Cavalcanti Moacyr Zalcman Ricardo Soares Fábio Vieira ...
Michel Fournier, September 1, 2001
Ever wonder how to successfully and rapidly display HTML lists to your users? Well, we all probably already did. However, its implementation differs a lot from sites to sites as we all have our own different approaches. Delivering Visual FoxPro data to the Web as if you would be in Visual FoxPro is ...
Michel Fournier, November 1, 2001
A lot of things happened recently in the Visual FoxPro world and for related technologies. The Great Lakes Great Database Workshop was being held in Milwaukee from Sunday October 27 to Wednesday October 31. That conference which primaly focused on Visual FoxPro has covered a lot of technologies...
Michel Fournier, December 1, 2002
UTMag/RapoZine team Editors Michel Fournier Claudio Lassala Co-editor Martín Salías Translation coordinators Claudio Lassala Martín Salías Translators Eduardo Vidigal Rodolfo Duarte Fábio Vazquez José Cavalcanti Moacyr Zalcman Fábio Vieira M...
Michel Fournier, November 1, 2002
UTMag/RapoZine team Editors Michel Fournier Claudio Lassala Co-editor Martín Salías Translation coordinators Claudio Lassala Martín Salías Translators Eduardo Vidigal Rodolfo Duarte Fábio Vazquez José Cavalcanti Moacyr Zalcman Fábio Vieira M...
Michel Fournier, January 1, 2003
UTMag/RapoZine team Editors Michel Fournier Claudio Lassala Co-editor Martín Salías Translation coordinators Claudio Lassala Martín Salías Translators Rodolfo Duarte Fábio Vazquez Moacyr Zalcman Martín Salías Antonio Castaño Fabián Belo Rafae...
Michel Fournier, November 1, 2001
I have been following several threads on the Universal Thread recently about FTP from Visual FoxPro. I have used an ActiveX for a while to do such a task. I have found that years after years, the problem is that you have to maintain that ActiveX for your own workstation and for every servers or work...
Michel Fournier, July 1, 2002
UTMag/RapoZine team Editors Michel Fournier Claudio Lassala Co-editor Martín Salías Translation coordinators Claudio Lassala Martín Salías Translators Eduardo Vidigal Rodolfo Duarte Fábio Vazquez José Cavalcanti Moacyr Zalcman Fábio Vieira M...
Michel Fournier, January 1, 2006
With the beginning of the new year, Michel resumes some of the highlights of the Universal Thread and what is coming up for the new season.
Michel Fournier, March 1, 2006
When comes time to display the content of a memo field on a Web page, one common task we have to do is to hyperlink specific content. This article discusses about a technique which can be used to hyperlink various types of links as well as email addresses.
Michel Fournier, April 1, 2009
This article describes some basic techniques to manipulate some images in .NET. It covers image resizing, image cropping and the ability to save an image into a JPG high resolution format.
Michel Fournier, May 1, 2007
This short articles provides an approach of important data from an Excel sheet into your application without having the requirement of having Excel installed on the server.
Michel Fournier, August 1, 2002
UTMag/RapoZine team Editors Michel Fournier Claudio Lassala Co-editor Martín Salías Translation coordinators Claudio Lassala Martín Salías Translators Eduardo Vidigal Rodolfo Duarte Fábio Vazquez José Cavalcanti Moacyr Zalcman Fábio Vieira M...
Michel Fournier, July 1, 2001
Recently, I was having problems while working on several projects on my PC. The problems were happening when I had several applications open at the same time. When the problem occured, I had to reboot my PC and then was able to work for a few hours up to a few days until the next reboot. As I was wo...
Michel Fournier, June 1, 2002
UTMag/RapoZine team Editors Michel Fournier Claudio Lassala Co-editor Martín Salías Translation coordinators Claudio Lassala Martín Salías Translators Eduardo Vidigal Rodolfo Duarte Fábio Vazquez José Cavalcanti Moacyr Zalcman Fábio Vieira M...
Michel Fournier, September 1, 2002
UTMag/RapoZine team Editors Michel Fournier Claudio Lassala Co-editor Martín Salías Translation coordinators Claudio Lassala Martín Salías Translators Eduardo Vidigal Rodolfo Duarte Fábio Vazquez José Cavalcanti Moacyr Zalcman Fábio Vieira M...
Michel Fournier, January 1, 2001
Xitech (Europe) produces tools for the Windows software developer. They specialize in FoxPro Developer tools, data and code recovery and security. In this article, we will see an overview of 5 of their tools. You will find more details about each of them from Xitech documentation. To get Xitech cont...
Michel Fournier, April 1, 2006
This article discusses the ability to use Visual FoxPro to schedule a list of tasks to be executed at specific intervals. While there could be the approach of using the Windows Scheduler to execute those tasks, it is always interesting to be able to control everything from within VFP. A small VFP sc...
Michel Fournier, April 1, 2006
This article describes an overview of sending an email from VB.NET. It covers the basis of creating the email functionality in a class and using an instance of that class to define and send the email. The class includes the ability to send to multiple recipients as well as sending attachments. Sendi...
Michel Fournier, July 1, 2002
This is a follow up on my previous article on using SOAP protocol for authentication that appeared in our December 2001 issue. That article was mentioning the use of the SOAP header for authentication such as being able to identify the user for any upcoming hit to your Web Service as soon as the Log...
Michel Fournier, May 1, 2002
UTMag/RapoZine team Editors Michel Fournier Claudio Lassala Translation coordinators Claudio Lassala Martín Salías Translators Eduardo Vidigal Rodolfo Duarte Fábio Vazquez José Cavalcanti Moacyr Zalcman Fábio Vieira Martín Salías Antonio Castañ...
Michel Fournier, July 1, 2002
From recent discussions I had, with several persons from my team, about common patterns which occur in the evolution of the Universal Thread, I thought it would be nice to write an article about it. Basically, within the evolution of a product, there are some similitudes which are sometimes interest...
Michel Fournier, June 1, 2001
Welcome to our first issue of the Universal Thread Magazine. We kept receiving many requests to have such a media available on the Universal Thread, so we decided to release our first issue this month. Many people have mentioned an interest to either have such a magazine for the pleasure to read abo...
Michel Fournier, December 1, 2001
The Visual FoxPro Zone evolves As many of you may have seen, the Universal Thread Visual FoxPro Zone is evolving quite fast. In the last month, we added new content in it. As usual, the most popular option is the Toledo Wish List. Several entries are created every day. This is the place to co...
Michel Fournier, January 1, 2002
It's January 3rd, 2002, I am writing this editorial at 20h32 EST. The Christmas break is over but was it really a break? More and more, years after years, I keep seeing a lot of persons online during Christmas day or a few minutes before the new year. And, I mean, they are online as per their own ti...
Michel Fournier, January 1, 2004
In December 1993, a great history started when a small Web site known as the Visual FoxPro Yellow Pages started. Basically, a site providing ads for Visual FoxPro developers such as jobs and consulting services. Known also as the first Visual FoxPro site, it has evolved quite fast during the first t...
Michel Fournier, January 1, 2006
In the recent months, I have been involved in settings various projects at client sites, as well as for Level Extreme Web sites, which involved the support of uploading image files from an Internet browser. The process of supporting that capability in your application, either from a desktop of from ...
Michel Fournier, December 1, 2001
The Microsoft SOAP client provides access to any Web Service. Once the object is instantiated and the location of the WSDL file given, you are ready to go to access any method. Thus, based on what is supported by the Web Service, you can query to obtain various types of content such as string and bo...
Michel Fournier, February 1, 2002
On January 15th, 2002, an important joint took place for our magazine. The Universal Thread Magazine and RapoZine magazine, an online magazine available for the Portuguese developers community, joined to create UTMag/RapoZine. Effective from this issue, both magazines will offer the same technical c...
Michel Fournier, July 1, 2002
Show seconds in a readable format If you need to check elapsed time with seconds() or a datetime value, this function allows you to display the elapsed time in a human-readable format, that is, hours:minutes:seconds, instead of the total number of seconds. Just pass a number of seconds as...
Michel Fournier, September 1, 2002
Getting image width and height Probably the most flexible way to extract the width and height of an image is by the use of the image object. All is needed is to load the image in the object and get the values from the Width and Height properties. LOCAL loImage,lnWidth,lnHeight loIma...
Michel Fournier, August 1, 2002
Updating your DLL on IIS This has been a common question in the recent months on the Universal Thread. More and more, developers have the need to use a DLL under IIS. However, the fun part comes when you need to update it. As soon as it kicks in, you can't update your DLL anymore as it re...
Michel Fournier, November 1, 2002
Use MemLines() to wrap text lines When you need to wrap some text at a given width (say 75 characters per line), you do it easily with: SET MEMOWIDTH TO 75 lcMemo = lcNewMemo = "" _MLINE = 0 FOR i= 1 TO memlines(lcMemo) lcNewMemo = lcNewMemo ; + MLINE(lcMemo,1,_MLINE...
Michel Fournier, October 1, 2002
Extracting BMPs from general fields As a complement with last issue's article on image handling, yo can find useful this little function. If you got convinced that using general fields to handle images is a bad idea, you can decided go back to independent image files. But then you'll...
Michel Fournier, June 1, 2001
It was a year ago. The DevConnections team was holding the Visual FoxPro DevCon 2000, the SQL Server Connections and the DevCon 2000 in New Orleans, Louisiana from May 14 to 18, 2000. For the first time, attendees were able to attend sessions from more than one conference at the same time. This offe...
Michel Fournier, September 1, 2001
Is there a speed limit on the Internet? Probably not, because there is so much things we can do in a short time about delivering various type of content to the community. I remember a week ago we shared an idea about helping the promotion of user group activities around the world. A week ago it was ...
Michel Fournier, March 1, 2002
In the last month, we received dozens of emails from satisfied persons in regards for our initiative of opening the magazine and the Universal Thread in general for additional communities such as the Portuguese and Spanish communities. Regulars members of the Universal Thread, new members, Microsoft...