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.programmingpages.com/?r=latiumsoftwarecomenpascal
http://top100borland.com/in.php?who=20
Please vote. It's just a few seconds that REALLY make the difference.
Regards,
Ernesto De Spirito
eds2008 @ 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-2006 & 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://tech.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/cd_products.html#CoolDBUtilities
* 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/cd_products.html#HierarchyTree
* 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.htm
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/cd_products.html#CoolControls).
http://www.versiontracker.com/dyn/moreinfo/win/29989
* 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://linuxmafia.com/faq/Essays/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/en/file.php?id=p31
________________________________________________________________________
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? eds2008 @ latiumsoftware.com
________________________________________________________________________
Latium Software http://www.latiumsoftware.com/en/index.php
Copyright (c) 2002 by Ernesto De Spirito. All rights reserved.
________________________________________________________________________
|