Pascal Newsletter #31
The full source code examples of this issue are available for download.
![]() |
![]() |
Pascal Newsletter #31 - 10-JAN-2002 INDEX 1. A FEW WORDS FROM THE EDITOR 2. SOLVING LINEAR EQUATIONS WITH DELPHI USING THE GAUSS METHOD 3. MAKING AN APPLICATION A TCP/IP CLIENT (WITH SAMPLE CODE)... 4. DESIGNING 'SKINNED' DELPHI APPS 5. FORUMS 6. DELPHI ON THE NET - Components, Libraries and Utilities . Shareware/Commercial . Freeware - Articles, Tips and Tricks - Tutorials - Other Links ________________________________________________________________________ 1. A FEW WORDS FROM THE EDITOR I'm very sorry for the delay in publishing this issue, but I had some personal problems these weeks, fortunately solved by this time. Well, this issue will be brief because I'm almost on vacation and I'm preparing it almost on the rush. I'd like to thank those who are helping us get more subscribers. I hope in the future it translates into more contributions for the newsletter to make it more interesting. By the way, if you solved a particular programming problem, I'd like to invite you to share your code in this newsletter like Victory Ferndandes, S.S.B. Magesh Puvananthiran and Charl Linssen and doing in this issue. My thanks to them. In the next issue we'll have material from Alirio Gavidia. I'd also like to thank Dave Murray for taking care of the "Delphi on the Net" section, bringing you links to new Delphi content on the Internet. There are many interesting things for this issue. I'd like to recommend you the tutorial "How To Ask Questions The Smart Way". Please give us a hand to help us reach 10,000 subscribers in the next months. One way you can help us is by sending this link to your friends: http://www.latiumsoftware.com/en/pascal/delphi-newsletter.php Another way you can help us is by voting for us in any or some of these rankings to help give more visibility to our web site and thus increase the number of subscriptions to this newsletter: http://www.sandbrooksoftware.com/cgi-bin/TopSite2/rankem.cgi?id=latium http://news.optimax.com/topdelphi/links.exe/click?id=70C517ECAE6E http://www.top219.org/cgi-bin/vote.cgi?delphi&83 http://top100borland.com/in.php?who=20 http://top200.jazarsoft.com/delphi/rank.php3?id=latium Please vote. It's just a few seconds that REALLY make the difference. Regards, Ernesto De Spirito eds2004 @ latiumsoftware.com ________________________________________________________________________ JfControls Library. Multi-language. Multi-appearance. Skins. Privileges. More than 40 integrated and customizable components. Impressive GUI. Centralized resources administration. Multiple programming problems solved. For Delphi 3-7 and C++ Builder 3-6. http://www.jfactivesoft.com/ ________________________________________________________________________ 2. SOLVING LINEAR EQUATIONS WITH DELPHI USING THE GAUSS METHOD Victory Fernandes <victory @ e-net.com.br> sent us his application MatriX Version 1.2 for solving linear equations using the Gauss method for reducing a matrix. The source code is too big to be attached to the newsletter, so we put them available for download at: http://www.latiumsoftware.com/download/GaussSRC.zip (~174Kb) The compiled executable is also available for download: http://www.latiumsoftware.com/download/Gauss.zip (~421Kb) Both downloads include a ReadMe file explaining the project. ________________________________________________________________________ 3. MAKING AN APPLICATION A TCP/IP CLIENT (WITH SAMPLE CODE)... By S.S.B. Magesh Puvananthiran <sesba @ hotmail.com> Some Sample Code... =================== This article is intended to show how we can use the TClientSocket component in Delphi as a TCP/IP client against any TCP/IP server. The server could be written in Delphi using TServerSocket component or any piece of code that acts as a TCP/IP server. In my case, I'm interacting with a Java code acting as a TCP/IP server. In my project, I'm just sending a bunch of bytes to that Java server and the Java server reads the bytes and does some tasks, sending a different bunch of bytes as a response to the Delphi client. In this article, let me give you some sample code I used in that project since some people asked me to send the source code for this socket communication by sending separate e-mails. I appreciate them for their interest. Here U Go!! Enjoy!!! My project uses nearly nine forms and all of them need to interact with the Java server at least once. So I added a DataModule and put a TClientSocket component there. The following is the code for that: unit DataMod; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, OleServer; type TdmDataModule = class(TDataModule) csClientSocket: TClientSocket; procedure csClientSocketError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure csClientSocketRead(Sender: TObject; Socket: TCustomWinSocket); procedure DataModuleDestroy(Sender: TObject); private { Private declarations } public FWaiting : boolean; { Public declarations } end; var dmDataModule: TdmDataModule; implementation {$R *.DFM} procedure TdmDataModule.csClientSocketRead(Sender: TObject; Socket: TCustomWinSocket); //Reading data back from server thru socket var Buffer : array [0..4095] of char; BytesReceived : integer; MemoryStream : TMemoryStream; begin while FWaiting do begin MemoryStream := TMemoryStream.Create; try // This time delay depends on the network traffic and also you // can put the time delay between reads. I've just put some 200 // milliseconds for my application before it starts from the // server. Sleep(200); while True do begin BytesReceived := Socket.ReceiveBuf(Buffer,SizeOf(Buffer)); if (BytesReceived <= 0) then Break else begin MemoryStream.Write(Buffer,BytesReceived); end; end; FWaiting := False; MemoryStream.Position := 0; // XMLResponse is a global StringList I'm using in my // application to convert the bytes received into string // You can use other ways to get the contents of a MemoryStream XMLResponse.LoadFromStream(MemoryStream); finally MemoryStream.Free; end; end; end; procedure TdmDataModule.csClientSocketError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); // Whenever you get a specific type of error while running the client // you will be given a messagedlg showing that the error has occured; // at that time you have to check whether the server is running // correctly or not and if needed make the server run properly and // then say OK. // Then csClientSocket.Open will try to reconnect to the server. So at // this time if some transaction is in the middle you have to send the // same stuff again after reconnecting. begin case ErrorEvent of eeGeneral : begin if MessageDlg('Error Connecting to Java server!' + #13 + 'Check the server status and try again!!', mtInformation, [mbOk], 0) = mrOk then csClientSocket.Open end; eeConnect : begin if MessageDlg('Error Connecting to Java server?' + #13 + 'Check the server status and try again!!', mtInformation, [mbOk], 0) = mrOk then csClientSocket.Open end; eeSend : begin if MessageDlg('Error Connecting to Java server?' + #13 + 'Check the server status and try again!!', mtInformation, [mbOk], 0) = mrOk then csClientSocket.Open end; eeReceive : begin if MessageDlg('Error Connecting to Java server?' + #13 + 'Check the server status and try again!!', mtInformation, [mbOk], 0) = mrOk then csClientSocket.Open end; eeAccept : begin if MessageDlg('Error Connecting to Java server?' + #13 + 'Check the server status and try again!!', mtInformation, [mbOk], 0) = mrOk then csClientSocket.Open end; end; end; procedure TdmDataModule.DataModuleDestroy(Sender: TObject); begin //Closing the socket connection csClientSocket.Close; end; end. Once you are done with the DataModule, you can include this DataModule in the units where you need to interact with the server, thereby you can avoid writing code to read data back from the server in various places of the project. You can set the Host/Address and Port Number of the server to communicate at runtime through runtime parameters (I assume Delphi people are aware of that runtime parameters). Then, in the project's main form's FormCreate event, write the following code to connect to the server, i.e. set the IP address and port number of the server in the TClientSocket component and set Active to True. //Connecting to the Java server on a particular port try with dmDataModule.csClientSocket do begin if Active then Active := False; // Getting the Address or Host Name of the server through the // runtime parameters Host := ParamStr(1); // Getting the Port Number of the server at which the server // listens through the runtime parameters Port := StrToInt(ParamStr(2)); // Making the connection active Active := True; end; except on ESocketError do begin MessageDlg('Unable to Connect to Java Server ' + #13 + 'Please Try Again!', mtInformation, [mbOk], 0); exit; end; end; Once you are connected to the server, you can use either the TClientSocket's SendText or SendStream method to send the data to the server. For example: procedure Send; begin // Checking whether the socket connection is ready or not // If not , the error handling part of the TClientSocket will be // activated if csClientSocket.Active then begin // Sending the text through the socket connection csClientSocket.Socket.SendText('The string to send'); // Setting a flag to wait until the server sends the response back dmDataModule.FWaiting := True; while dmDataModule.FWaiting then Application.ProcessMessages; end; end; ________________________________________________________________________ 4. DESIGNING 'SKINNED' DELPHI APPS By Charl Linssen <charl @ atomasoft.com> Hi there folks. I wrote this tiny tutorial for people who are trying to write a skinned Delphi application. Why would you want to do this? Well, take WinAmp for instance, an MP3 player most of us know. The program is 100% skinned, and although it is probably written in C/C++ you can tell right away that there are no TButtons on the main form. Obviously, this is done because it looks great. But unfortunately, it also greatly increases file (and download) size. Therefore, you should only skin your app when it really adds up to the program. For every button and label and anything else, you have to make an image. Then another one for the OnClick, and perhaps yet another one for the OnMouseMove. Again, when not necessary, don't skin your app. But if you think 'blah blah let's get to the code' I won't bother you with advice any more. If you want to skin your app, you may also want to get rid of Windows standard rectangular window shape. That can be done rather easily by specifying a number of points (X,Y) and inserting the SetWindowRgn procedure: const RgnPoints : array[1..12] of TPoint = ((X:9;Y:6), (X:177;Y:6), (X:184;Y:13), (X:9;Y:49),(X:4;Y:43), (X:4;Y:11)); { Just a sample: this will probably look like hell :) } var Rgn : HRGN; begin Rgn := CreatePolygonRgn(RgnPoints, High(RgnPoints), ALTERNATE); SetWindowRgn(Handle, Rgn, True); end; Now, this code shouldn't be hard to understand. For every RgnPoint a line is drawn from RgnPoints[I-1] to RgnPoints[I]. From the last coordinate -in this case (4,11)- a line is drawn back to the first one (9,6). This may be a bit hard to understand, but just copy it and paste the last part in the FormCreate event (the RgnPoints array should be where Form1 is declared). Back to the actual skinning =========================== When (if) I skin an app, I simply put a TImage on the form with the background image, and then place all components on it. You may also want to consider a TImage, on top of it a TPanel, and on top of the panel all your components. This may come in hand with some things. Of course, when doing this, you won't be able to resize the form. But that can also be fixed easily. You just take separate pictures for the top left, the top right, bottom left and bottom right. Then you use the OnPaint event to draw all necessary elements between those images. Well, that's it for this time folks, I hope I can find the time to write more useful tutorials. If you have any questions about this one, feel free to mail me at <charl @ atomasoft.com>. Also, be sure to visit my site at http://www.FutureAI.com, it's about Artificial Intelligence. Cya! // Charl ________________________________________________________________________ 5. FORUMS Delphi ====== If you know much of Delphi but you are still far from being a guru this forum is for you. This is the only forum for intermediate-level Delphi programmers on the Web (Delphi hackers are also welcome :-)). The forum now has more than 475 members, while it maintains its low traffic: http://groups.yahoo.com/group/delphi-en If you want to join the group, the best way is to subscribe from the web since you can access the special features available at the web site (a Yahoo! ID is required and you can get yours free by registering as a Yahoo! user), but if you don't want to register or if you don't have full Internet access you also can subscribe by email: http://groups.yahoo.com/group/delphi-en/join delphi-en-subscribe@yahoogroups.com Components ========== This is a forum for searching/recommending software components (VCL and CLX components, ActiveX objects, DLL libraries, shared objects, etc.), as well as utilities, tutorials, information, etc. The forum is rather new and currently has a bit more than 70 members and almost no messages: http://groups.yahoo.com/group/components I hope you join the forum to help us build a larger group. You can subscribe from the web or --more easily-- by email: http://groups.yahoo.com/group/components/join components-subscribe@yahoogroups.com ________________________________________________________________________ 6. DELPHI ON THE NET By Dave Murray Components, Libraries and Utilities =================================== Shareware/Commercial -------------------- * CoolDBUtilities v. 1.04a - For Delphi 2-6 and BCB 3-5 Ever released major updates of your programs or databases they use? Tired to send megabytes over the Internet? Tired to update fields or indexes manually? Just try CoolDBUtilities package for these purposes and all these time consuming tasks will be more like fun than work. Update, check, rebuild, pack and sort your databases, and more... http://www.cooldev.com/cooldbutils.html * HierarchyTree v. 1.03 by Cooldev.com You can use HierarchyTree package to visually build the hierarchies. Easy way to show relations between various items. No coding required. Variety of ways to display hierarchy members. Features include run-time drag-n-drop support, scrolling, ability to print, save and load the controls. For Delphi 3-6 and BCB 3-5. http://www.cooldev.com/htree.html * EasyCompression Library v.1.11 by AidAim Software. SW $55, SWS $95. Easy in use stream replacements with transparent compression and encryption. One stream is used for both compression and decompression, better ratio than WinZip and WinRar, no DLL, small footprint 45K-100K, full sources, strong encryption-Rijndael, comprehensive help and demos. http://www.aidaim.com/products/products.php#ECL * Discover for Delphi - by Cyamon Software. Shareware ($30) Discover is an analysis tool that shows interactively, in real-time and directly in the source code which code blocks have executed at least once and which have never been executed. No source code modifications are required and Discover can export coverage data. http://www.cyamon.com/discover1.html Freeware -------- * CoolDBDialogs v. 1.01 by Sonket Dev and CoolDev.com The package contains five dialogs to work with your databases. It's small but neat and easy to use piece of code with some nice advanced features like design time preview etc. For Delphi 3-5 and BCB 3-4. Requires CoolControls (http://www.cooldev.com/coolcontrols.html). http://www.cooldev.com/cooldbdialogs.html * DUnit 5.0 A testing framework inspired by JUnit Java framework designed for Extreme Programming. The library also includes a port of the Java Collections library using Delphi interfaces. http://dunit.sourceforge.net/ * Delphi Fundamentals 2.0 Collection of Delphi code units. Includes maths, strings, datetime, streams and now internet libraries. http://fundementals.sourceforge.net/ Articles, Tips and Tricks ========================= * Delphi Database Programming Course - by Zarko Gajic Free online database programming course for beginner Delphi developers focused on ADO techniques. http://delphi.about.com/library/weekly/aa010101a.htm A new chapter has been added in the last two weeks: Chapter 22 "Transactions in Delphi ADO database development" explains how to to insert, delete or update a lot of records collectively so that either all of them get executed or if there is an error then none is executed at all. This chapter will show you how to post or undo a series of changes made to the source data in a single call. http://delphi.about.com/library/weekly/aa010202a.htm * How Borland embedded Mozilla in Kylix 2 - by Darren Kosinski Explains how the Mozilla browser was used to provide the HTML preview feature within the Kylix 2 IDE. Borland investigated a few different ways of embedding Mozilla and ultimately settled on a simple solution that can be used to embed almost any application within another. http://community.borland.com/article/0,1410,28199,00.html * Access and control a NT service - by Bertrand Goetzmann The unit in this article shows how we can start or stop an NT service or getting the location of its binary implementation from Delphi. http://www.delphi3000.com/articles/article_2960.asp * Populate column of DBGrid PickList for easy data entry - by S Issac A function to populate the DBGrid PickList to have auto selection of added field value when the grid is used to display a table. http://www.delphi3000.com/articles/article_2961.asp * Panel showing Enabled/Disabled in Children - by Daniel Wischnewski Component code that simply extends the Delphi Panel to properly show the Enabled State (True/False) within its children. http://www.delphi3000.com/articles/article_2962.asp * How to get field values of a dataset as comma text? - by Sunish Issac Getting the unique field values (strings) as comma text can be a big advantage in populating any TStrings descendant. These functions implement this with respect to a table and also on TBDEDataset. http://www.delphi3000.com/articles/article_2963.asp * How to print a file through the printer port? - by Sven Kissner http://www.swissdelphicenter.ch/torry/showcode.php?id=940 * How to Prevent Windows Shut Down? - by Thomas Stutz http://www.swissdelphicenter.ch/torry/showcode.php?id=939 * How to hide minimized MDI child windows? - by Thomas Stutz http://www.swissdelphicenter.ch/torry/showcode.php?id=938 * How to change each button's hint on the TDBNavigator? - by S János http://www.swissdelphicenter.ch/torry/showcode.php?id=918 * How to Save/Load a TStringGrid to/from a file? - by Thomas Stutz http://www.swissdelphicenter.ch/torry/showcode.php?id=941 * Always operate numeric keypad as if NumLock is engaged? - by P Below http://www.swissdelphicenter.ch/torry/showcode.php?id=953 * How to get a TFont's property from a font handle? - by P Below http://www.swissdelphicenter.ch/torry/showcode.php?id=952 * How to search for text in a TListview? - by Thomas Stutz http://www.swissdelphicenter.ch/torry/showcode.php?id=947 * How to change resource strings at run-time? - by P Below http://www.swissdelphicenter.ch/torry/showcode.php?id=946 * How to copy the clipboard to a stream and restore it again? - P Below http://www.swissdelphicenter.ch/torry/showcode.php?id=945 * How to read a binary file + display byte values as ASCII? - P Below http://www.swissdelphicenter.ch/torry/showcode.php?id=944 * How to fastly retrieve the high-order word from 32bit var? - Martin http://www.swissdelphicenter.ch/torry/showcode.php?id=942 * How to read data from another MDIChild form? - by Carlos Borrero http://www.swissdelphicenter.ch/torry/showcode.php?id=849 * System Tray Delphi Part 2 - by Zarko Gajic Once you have placed a program's icon in the Tray, it's time to show a popup menu near the icon and have the icon reflect the state of your application - even animate if you want to! http://delphi.about.com/library/weekly/aa122501a.htm * How to create/read from a structured storage file - by Colin Pringle How to create a structured storage file Part 2 shows how to read a structured storage file using COM. http://www.delphi3000.com/articles/article_2939.asp * Right-aligned Edit Field - by Daniel Wischnewski Editbox component which alows you to right-align the text. http://www.delphi3000.com/articles/article_2940.asp * How to use (Win)DOS routines in win32 console apps - P Koutsogiannis Have you ever tried to use the gotoxy or keypress function in your Win32 applications? http://www.delphi3000.com/articles/article_2941.asp * Taking a screen shot - by Daniel Wischnewski Sometimes you want to take a screen shot, however Windows becomes very slow with big data amounts. The solution is to make many small screen shots and paste the result together. It's not light speed, however often faster than taking the whole screen at once. http://www.delphi3000.com/articles/article_2942.asp * Custom statusbar shows hints without any coding - by Kevin Gallagher A statusbar component that show tooltips/hints automatically in all versions of Delphi. (Delphi 6 already has this.) http://www.delphi3000.com/articles/article_2946.asp * How to use extended Windows dialogs - by Mike Shkolnik How to use Windows's dialogs from shell32.dll. (Find Files, Find Computer, Select Icon, Shutdown, etc) http://www.delphi3000.com/articles/article_2947.asp * "Barcode" checksum by modulus 10 - by Mike Shkolnik How can I calculate a checksum by modulus 10 used in barcodes? http://www.delphi3000.com/articles/article_2948.asp * Adding Explorer Bar - by Khalid A. Creating custom Explorer Bars (Band object) within IE 5+. http://www.delphi3000.com/articles/article_2950.asp * Adding Explorer MenuItem - by Khalid A. Creating custom Explorer MenuItem band object in IE 5+. http://www.delphi3000.com/articles/article_2951.asp * Adding Explorer ToolBar Btn - by Khalid A. Adding a custom toolbar button to IE 5+. http://www.delphi3000.com/articles/article_2954.asp * How to really make a resource file - by Martin Ellis Creating a sort of uncompressed Zip file to store all the files required for a game or other program that requires additional files. http://www.delphi3000.com/articles/article_2955.asp * Change user password for specified server/domain? - S Grossenbacher http://www.swissdelphicenter.ch/torry/showcode.php?id=925 * How to show controls with rounded corners? - by P. Below http://www.swissdelphicenter.ch/torry/showcode.php?id=921 * How to Toggle Caps Lock & Num Lock? - by Thai Huynh http://www.swissdelphicenter.ch/torry/showcode.php?id=926 * How to get the text of a StatusBar? - by Thomas Stutz Getts the text in a status bar in any window, even other apps. http://www.swissdelphicenter.ch/torry/showcode.php?id=935 * How to list all app's ctrls & menus in a TTreeView? - by Martin http://www.swissdelphicenter.ch/torry/showcode.php?id=922 * Check if control is partially covered by another window - by B Sateli http://www.swissdelphicenter.ch/torry/showcode.php?id=931 Tutorials ========= * How To Ask Questions The Smart Way - by Eric S. Raymond The answers you get to technical questions depends as much on the way you ask the questions as on the difficulty of the answer. This guide teaches you how to ask questions in a way that is likely to get you a satisfactory answer. http://www.tuxedo.org/~esr/faqs/smart-questions.html * Delphi For Fun Delphi tutorials with full source based around solving interesting puzzles or problems. Includes simple animated physics programs, Towers of Hanoi, a Maze generator, etc. http://www.delphiforfun.org/Programs/ * Primer on Multithreading - by Martin Harvey Online guide, explains most of the basics and a few more advanced techniques. Also available as an HTML Help file. http://www.pergolesi.demon.co.uk/prog/threads/ToC.html * Implementing Professional Drag & Drop Support in VCL/CLX applications A BorCon 2001 and BorCon UK 2001 paper by Brian Long. Explores simple VCL/CLX drag & drop, before progressing into more troublesome tasks, such as adding custom drag images to the drag cursor (as done by Windows Explorer when dragging files and folders. http://www.blong.com/Conferences/BorCon2001/DragAndDrop/4114.htm * Deep Sea Fishing In Delphi - by Brian Long VCL Secrets And Practical Use Of The Win32 API, a DCon 2000 tutorial. Uncovers gems from the VCL/RTL that are less well known, but potentially very useful. http://www.blong.com/Conferences/DCon2000/DeepSeaFishing/Fishing.htm * Web Development in Delphi - by Madrigal Technologies An overview of using WebBroker to produce web-based applications. http://www.madrigal.com.au/papers/webdev/delphi/delphi.htm * Scripting your Delphi Applications - by Madrigal Technologies This tutorial covers the MS ActiveScript control, the interfaces it exposes and ways to exploit its features in Delphi applications. http://www.madrigal.com.au/papers/scripting/scripting.htm * Writing Solid Delphi Code - by Madrigal Technologies (aka Fundamentals of Bug Prevention in Delphi) This tutorial covers a selection of proven techniques that you can use to avoid introducing bugs into your software. They range from automated unit testing to smaller tips and tricks. Included is the source code for an automated unit testing framework used in the article. http://www.madrigal.com.au/papers/solidcode/page1.htm Other Links =========== * BDE Support page Provides a single repository for BDE support information, tools, and links to other BDE-related content on the web. http://www.bdesupport.com/index.html * The Helpware Group Support for MS HTML Help 1.x and MS Help 2.0, FrontPage and Delphi. Also includes the Delphi HTML Help Kit (Freeware) - Add 3 lines of code to your main form and you have successfully converted your entire application from WinHelp to HTML Help. http://helpware.net/index.html * Componenti C Builder / Delphi Library of freeware components for C Builder and Delphi. http://www.ciemmesoft.com/componenti/defaulting.asp * Microtower A site of resources for game development, focusing on topics related to Delphi, DelphiX, DirectX and and alternative APIs. Includes a message board to share you knowledge with other developers, links to related sites and DMX a shareware VCL wrapper for DirectX. http://www.microtower.com/ ________________________________________________________________________ If you haven't received the full source code examples for this issue, you can get them from http://www.latiumsoftware.com/download/p0031.zip ________________________________________________________________________ This newsletter is provided "AS IS" without warranty of any kind. Its use implies the acceptance of our licensing terms and disclaimer of warranty you can read at http://www.latiumsoftware.com/en/legal.php where you will also find a note about legal trademarks. Articles are copyright of their respective authors and they are reproduced here with their permission. You can redistribute this newsletter as long as you do it in full (including copyright notices), without changes, and gratis. ________________________________________________________________________ Main page: http://www.latiumsoftware.com/en/pascal/delphi-newsletter.php Group home page: http://groups.yahoo.com/group/pascal-newsletter/ Subscribe/join: pascal-newsletter-subscribe@yahoogroups.com Unsubscribe/leave: pascal-newsletter-unsubscribe@yahoogroups.com Problems with your subscription? eds2004 @ latiumsoftware.com ________________________________________________________________________ Latium Software http://www.latiumsoftware.com/en/index.php Copyright (c) 2002 by Ernesto De Spirito. All rights reserved. ________________________________________________________________________ |
The full source code examples of this issue are available for download.
![]() |
Errors? Omissions? Comments? Please contact us!






