Pascal Newsletter #33 - 04-MAR-2002
INDEX
1. A FEW WORDS FROM THE EDITOR
2. IN THE NEWS
- Delphi 6 Update Pack 2 available
- PocketStudio 1.1
- Name changes
- Borland to support .NET
- Vote for Borland!
- Delphi Informant Magazine Readers Choice Awards 2002
- RAD Windows Database Development Survey
- Antique Software: Turbo Pascal v5.5
- Borland updates the End User License Agreements
- VCL Scanner Web Service
- Programming Contest: Multi-threaded applications
3. HOW TO PROTECT YOUR SOFTWARE AGAINST PIRACY
4. SAVE POSITIONS OF TCOOLBAR BANDS
5. GOING UNDERCOVER IN DELPHI
6. SHOWING WINDOWS "OPEN FOLDER" DIALOG
7. FORUMS
8. 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
Hello folks,
Well - my first newsletter. I got the job from Ernesto, the guy that did
this before me. That is - now we do it together. I hope I will do a good
job.
If you want to comment on that, feel free to send me a message to the
email address shown below. Also, you can submit good articles and links.
We need you to improve this newsletter! As a reward, in the next issue
we'll be giving away a license of Greatis Print Suite, a set of
components for print and preview, provided by Greatis Software:
http://www.greatis.com/delphicb/printsuite/
Charl Linssen
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. IN THE NEWS
Delphi 6 Update Pack 2 available
================================
The second Update Pack is available for all editions of Delphi 6
(including the Open Edition) at
www.borland.com/devsupport/delphi/downloads/ds_registeredusers.html
It is recommended that you download and install this patch (you don't
need to have installed the Update Pack 1).
The Update Pack fixes some problems with Delphi 6 and contains some
little enhancements, but users of the Professional Edition will find
this Update Pack will allow them to build client-side applications that
consume W3C-compliant Web Services using SOAP, XML, WSDL and more! If
you want to learn more about this Update Pack:
http://community.borland.com/article/0,1410,28405,00.html
PocketStudio 1.1
================
Pocket Technologies, Inc. announces a new version of PocketStudio, their
Delphi-like IDE for Palm OS development, that now comes in 3 editions:
- PocketStudio Professional Version 1.1 (Download Only).... $ 199.99
- PocketStudio Professional Version 1.1 (Training Included) $ 249.99
- PocketStudio Standard version 1.1 (Download Only)........ $ 59.99
For more information, visit http://www.pocket-technologies.com
Name changes
============
Developer 21 is now vpsource.com, and Kylix Developer Network is now
CodeBake.com:
* vpsource.com
Portal for webmasters and programmers (Delphi, C++, VB, Pascal), also
vp webdesign and programming services, e-store. Many more!
http://www.vpsource.com
* CodeBake.com
A website designed for developers to exchange and share resources and
information about Kylix, Delphi and Linux. CodeBake.com's mission is
to provide quality information to the developer community by sharing
information and resources so that everyone can benefit.
http://www.codebake.com
Borland to support .NET
=======================
Last February 12, Borland announced Delphi and C++Builder will support
the Microsoft .NET Framework during the second half of 2002. These RAD
tools will support the Microsoft Intermediate Language (MSIL), allowing
developers to preserve their investments in RAD skills and source code.
* Borland .NET strategy
http://www.borland.com/net/
* Borland Unveils Product Strategy for Microsoft .NET Platform
Announces Delphi and C++Builder Support for Microsoft .NET Platform
http://www.borland.com/about/press/2002/net_platform.html
Vote for Borland!
=================
The Web Services Journal (http://www.sys-con.com/webservices/) is taking
votes for the First Annual WSJ Readers' Choice Awards. You can vote for
your favorite Web Services products in 17 categories:
http://www.sys-con.com/webservices/readerschoice
If you want to know which Borland products are nominated, and even vote
for them all together, go to http://www.borland.com/vote_borland.html
Delphi Informant Magazine Readers Choice Awards 2002
====================================================
The Delphi Informant Magazine (http://www.delphizine.com/) is also
taking votes for their 2002 Readers' Choice Awards. You can vote for
your favorite components and utilities in 21 categories:
http://www.delphizine.com/ballot2002/Default.asp
RAD Windows Database Development Survey
=======================================
Borland is conducting a customer survey about database development
support for their Windows RAD tools. Your answers would help Borland
guide their future efforts in support for database development in Delphi
and C++ Builder. It's just a simple questionnaire:
http://infopoll.net/Live/surveys/s15713.htm
Antique Software: Turbo Pascal v5.5
===================================
Yes, that's right. The old and beloved Turbo Pascal 5.5 is now available
for free download from Borland's web site:
http://community.borland.com/article/images/20803/tp55.zip
To learn more: http://community.borland.com/article/0,1410,20803,00.html
Borland updates the End User License Agreements
===============================================
Last January 15th, Borland acknowledged the End User License Agreements
(EULAs) of the newest Borland products (Delphi 6, C++Builder 6, Kylix 2
and JBuilder 6) was specific to major enterprise customers that buy
licenses in volume, very much forgetting individuals and companies that
buy licenses individually. Last February 13th Borland published the new
EULAs, which supersede the previous ones:
http://community.borland.com/article/0,1410,28401,00.html
VCL Scanner Web Service
=======================
This is a Web Services version of the VCL Scanner, the application that
generates a VCL class usage report based on the Delphi and C++ Builder
executables, DLLs and packages found on your hard disk. The source code
of this new version, both for the client and the server, is available
for download, and by using the program and sending the report to Borland
you get a chance to win a license of a Borland product!
http://community.borland.com/article/0,1410,28438,00.html
Programming Contest: Multi-threaded applications
================================================
The rules are easy: you have until March 29th to submit a multi-threaded
application (with full source code) that provides visual feedback of the
thread progress. You can develop it using any Borland development tool.
You can participate with as many submissions as you want. Submissions
should be posted to Borland's CodeCentral:
//codecentral.borland.com/codecentral/ccweb.exe/contest?contest_id=1
For more information about this contest:
http://community.borland.com/article/0,1410,28448,00.html
________________________________________________________________________
Greatis Print Suite Pro - An extremely convenient set of VCL components
which provides advanced print and preview features into Delphi and C++
Builder applications. Forget BeginDoc, EndDoc, NewPage and other low-
level printing procedures, just draw your print job and Print Suite will
handle the rest! >>>>> http://www.greatis.com/delphicb/printsuite/ <<<<<
________________________________________________________________________
3. PROTECTING YOUR SOFTWARE AGAINST PIRACY
By Fernando Martins <fmp.martins@megamail.pt>
Before I start, let me tell you that whatever protection system you use
it's just a matter of time until someone breaks it. So what you must
have in mind is: "what is the best protection system for this special
case?" You also must have in mind that the best you got is still
breakable.
Once I needed to develop an application where preventing piracy was a
must. I did some investigation and found out what were the possible
systems to prevent this. I also did some investigation on how to break
those same protection systems. Let me say that I got a bit disappointed.
I thought that mass protection systems would be better than they are...
Here's a summary of what I found among the most common:
- Anti-Copy: prevents the disk copy, CD in this case.
- Disk check: when application starts up checks for the original disk,
CD in this case.
- Hardware check-up: you plug-in some hardware on your RS-232 port and
check for it in your application from time to time.
- Key activation: the software requires a key to be activated.
Here's what I found out about breaking these systems:
- Anti-Copy: can be broken with a "clone copy" (bit-by-bit) of the
disc...
- Disk check: can be broken with a "clone copy" also...
- Hardware check-up: read too much complains about it interfering with
the system, and it also generates too much calls into your help-line,
plus read somewhere that this can be fooled through software also...
- Key activation: once the user registers, he can spread the key among
friends and everybody can activate the application. If someone takes
some time, he can break the code and create a patch to ignore
activation or create a key generator.
Looking at this, you must agree that it didn't look too good... After
thinking a while on each of these systems I concluded that:
- Anti-Copy: to easy to break.
- Disk check: to easy to break.
- Hardware check-up: causes to much troubles and can make customers to
become unsatisfied.
- Key activation: would be great if key proliferation could be
stopped.
So I stick on the key activation idea and gave it a second thought,
exploiting the pros and cons of this system. I simulated the regular use
of this system to better understand it:
1. Get the product
2. Install the product
3. Request key
4. User requests the key
5. User gets the key
6. User activates the product
Here's another way to do it:
1. Get the product from friend
2. Install the product
3. Request key
4. User asks friend for friend's key
5. User uses the friend's key
I concluded that it was definitely the best - having in mind what I
needed to protect this specific product - if I could prevent the key
from spreading. Preventing key spreading became my next goal.
I knew I needed something that could give me guarantees that the
application being activated was a legal copy and not a pirate one.
How could I guarantee this? How do you prove that what you own is
legal? How do you prove that you bought something? The answer was
easy: invoice. Every product sold comes with an invoice, which has
different data, like the invoice number, date and entity sold to.
My next step was using the invoice data when activating the product.
But invoice data "per se" was not enough, I mean, if someone gives a
copy of the product can also give the invoice data to activate the
product.
I simulated the piracy process again, using the invoice data:
1. Get the product from friend
2. Install the product
3. Request the invoice data
4. User requests the invoice data from friend
5. Request the key
6. User requests the key from friend
Now, this has the same hole that usual key activation has...
I knew that I needed to force the key request for all installed
products. That became my next goal. How could I force the user to
request a new key? After some more neuron work, I came up with the
answer: time.
On my simulations, both users, the legal an non-legal, did the same
steps to activate the product, but they didn't do it at the same
time... Time is continuous and non-repeating, so time was the answer.
What did I do with time then? Basically, I generated a key using it. To
activate the product you must have a key, which is generated using the
invoice data and the time you have installed the product in the system.
Here's how I made it work:
1. After product installed, an encryption of the current time - year,
month, day, hour, minute, second, millisecond - is saved somewhere in
the system. This is easy to do and there's a lot of ways to hide
something is the system.
2. Invoice data request.
3. Generate a "request-key" using the time from 1. and the invoice data
from 2.
3. Inform the user that it must request the activation key for the
"request-key".
4. Key for product activation request.
I had found the solution.
To request the activation key, the user must specify what is the
"request-key", which is guaranteed to be unique, since time is involved
and the algorithm I used makes sure of that. ;)
Here's a simulation of the legal case:
1. Buy product and receive invoice
2. Install the product
3. Request invoice data
4. Inform user what the "request-key" is
5. User requests the activation key referring the "request-key" and
the invoice data
6. User receives the key
7. User activates the product
It's quite simple, really, the only "visible" change from the original
key activation system is the "request-key" that the user must specify
when requesting the key.
But this is just half the solution, the other half is you controlling the
number of installations. But that is quite easy. Every time a key is
requested, you know who is requesting it, since the invoice data is
specified, so if you got a customer that has 154 key requests in one
month, there's something wrong... :)
I've also exploit the possible holes on the system:
1. A couple of non-legal installations may be done, the customer - or
"customer friend" - may say that the system crashed and must
reinstall... That will just work for a couple of non-legal
installations, since you may ask why that is the 98th key request
done this week or the 3rd this day...
2. Disk clone can be done. There are tools on the market that clone
hard-disks. But what the heck, you cannot prevent that.
3. Someone takes some time and patches the security or creates a key
generator. Like said in the beginning, there's no way to prevent
this...
This system does not work just as a piracy stopper, it also prevents it.
When the invoice data is requested, it's more unlike to someone to give
it away, since you can track the customer that gave the invoice data to
a friend, that gave it to a friend, that gave it to a friend... The
original customer knows he can get troubles with the law by giving that
information.
If you get some "customer" requesting its 10th activation key because
"We got a new computer that is faster and want the application running
on it.", you can say "Why have you bought 9 computers in the last 4
weeks?..."
If you get some "customer" requesting its 50th activation key because
"the system crashed and need to reinstall everything", you can say
"Maybe there's something wrong, I'll send someone there to take a
look at it. Please have your invoice in hand..."
If you get some "customer" requesting its 154th activation key, you
can say that unless proven to be the legal owner of the product you
will not give the activation key... The "customer" may say he is - he
even can be -, but unless he has the invoice, he cannot prove it...
And if you want to be a bit "nasty", you code a special key that will
show the "Do you know that non-legal software may give you 3 years in
jail?" and uninstalls the application from the system... The "customer"
will get the point. ;)
__________________
Editor's note: Before you make any comments on this article, please
read it twice. The author does never claim his solution is original,
that his is the ultimate or the best solution, that this solution is
applicable or convenient to all cases, or that this solution is
unbreakable...
________________________________________________________________________
Join our Delphi forum for intermediate-level Delphi programmers in
Yahoo! Groups >>>>> http://groups.yahoo.com/group/delphi-en <<<<<
________________________________________________________________________
4. SAVE POSITIONS OF TCOOLBAR BANDS
By Patrick de Kleijn http://www.patrick.nl/
This was fun to do.
Yesterday's Delphi3000.com Newsletter #76 dropped a line on a reader's
request for functions to restore the positions of TCoolBand objects at
run-time. Lacking a property to check how many band are in place
(something like CoolBar.Bands.Count) I thought of another way to test
if all bands are stored.
I have included the properties that tend to change mostly (Index and
Width) but it's easy to add other properties to the Set and Get clauses
which I marked in the comments.
Parse all available coolbands and write their properties to file:
Store(CoolBar1, 'c:\coolbar1.ini');
Parse all available coolbands and check for their properties by matching
IDs:
Restore(CoolBar1, 'c:\coolbar1.ini');
procedure Store(aCoolBar: TCoolBar; aFilename: string);
var I, ID: Integer;
aFile: TStringList;
begin
I := 0; ID := 0;
aFile := TStringList.Create;
{ Parse all available coolbands }
while I=I do // Make this an endless loop
begin
try
ID := aCoolBar.Bands.Items[I].ID;
except
{ Raise an EAbort exception to break out of the endless loop
when properties of all coolbands are written to file. We know
all coolbands are parsed when EListError is raised if we try
to collect properties of a coolband that does not exist }
on EListError do
begin
{ All done? Save! }
aFile.SaveToFile(aFilename);
aFile.Free;
Abort; // Crack the loop with EAbort
end;
end;
{ Write it's properties to file - Set }
aFile.Add(IntToStr(ID) + 'Index=' +
IntToStr(aCoolBar.Bands.Items[I].Index));
aFile.Add(IntToStr(ID) + 'Width=' +
IntToStr(aCoolBar.Bands.Items[I].Width));
I := I+1;
end;
end;
procedure Restore(aCoolBar: TCoolBar; aFilename: string);
var I, ID, J: Integer;
aFile: TStringList;
begin
I := 0; ID := 0;
aFile := TStringList.Create;
aFile.LoadFromFile(aFileName);
{ Parse all available coolbands }
while I=I do
begin
try
ID := aCoolBar.Bands.Items[I].ID;
except
on EListError do Abort;
end;
{ Restore properties from file - Get }
aCoolBar.Bands.Items[I].Index :=
StrToInt(aFile.Values[IntToStr(ID)+'Index']);
aCoolBar.Bands.Items[I].Width :=
StrToInt(aFile.Values[IntToStr(ID)+'Width']);
I := I+1;
end;
// Result := True;
end;
Enjoy! Regards,
Patrick de Kleijn
The Netherlands
________________________________________________________________________
5. GOING UNDERCOVER IN DELPHI
By Charl Linssen
By default, your application has a corresponding button in the taskbar.
You can switch to it using the [Alt] + [Tab] combination, and it shows
in the 'Close Program' window (when you press [Alt] + [Ctrl] + [Del]).
Suppose you don't want your application to show there, suppose you want
to hide it completely from the user.
In this tutorial I'll give you some code snippets to show you how that
is done.
>> Disable task switching
You can block [Alt] + [Tab] task switching, as well as other key
combinations like [Ctrl] + [Esc] using the SystemParametersInfo API.
This tricks Windows into thinking the screensaver is running.
procedure SystemKeys(Disable: Boolean);
var OldVal : LongInt;
begin
SystemParametersInfo
(SPI_SCREENSAVERRUNNING,
Word(Disable),
@OldVal,
0);
end;
After a call to SystemKeys(True) the program runs, but you are unable to
Alt-Tab to it nor switch to it in the task list. You can't invoke the
Start button, either.
>> Hiding the application's taskBar button
A major part in going undercover, is hiding your application's button
from the taskbar. That can be solved easily, by inserting the following
code into the OnCreate event:
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowWindow(Application.Handle, SW_HIDE);
SetWindowLong(Application.Handle, GWL_EXSTYLE,
GetWindowLong(Application.Handle, GWL_EXSTYLE)
or WS_EX_TOOLWINDOW );
ShowWindow(Application.Handle, SW_SHOW);
end;
>> Hide from the 'Close Program' box
Now that you've hid you app from task switching and the taskbar, it can
still be terminated, using the 'Close Program' box. That can be solved
_really_ easily. To do so, you have to remove your programs title, which
normally also shows in the taskbar button. That is done like this:
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.Title := '';
end;
When you combine these things and add a 'Form1.Hide', there's no way
that app is going to shut down (except when the computer is rebooted,
of course).
________________________________________________________________________
6. SHOWING WINDOWS "OPEN FOLDER" DIALOG
By Ernesto De Spirito
If you want to show the standard Open Folder dialog, you have to call
the API SHBrowseForFolder. I've seen components that encapsulate the
API call, but I really don't like to plug more and more components into
my Delphi IDE when the tasks could be easily implemented as functions in
a unit, so here you have a function BrowseForFolder which encapsulates
the complexities of the call to SHBrowseForFolder:
Syntax:
function BrowseForFolder(Title: string; RootCSIDL: integer = 0;
InitialFolder: string = ''): string;
Parameters:
Title: The caption of the label on the top of the Open Folder
dialog window
RootCSIDL (optional): The CSIDL of the special folder that defines the
subtree to browse. By default, it's the Desktop (CSIDL_DESKTOP = 0),
but you can limit the tree the user can browse using constants like
CSIDL_DRIVES, CSIDL_NETWORK, CSIDL_PERSONAL, CSIDL_PROGRAMS and in
general you can use any other value accepted by the API
SHGetSpecialFolderLocation (see the unit ShlObj).
InitialFolder (optional): The folder initially selected in the
treeview. By default it's the root folder (specified by the
RootCSIDL parameter, or the desktop if omitted).
Return value:
The function returns the full path of the folder selected by the user.
It returns the empty string ('') if the user canceled the dialog.
Compatibility:
The function is compatible with the Shell 4.0 version of Shell32.dll,
so it doesn't require IE 4.0 or superior.
Sample calls:
Folder := BrowseForFolder('Select destination folder:');
Folder := BrowseForFolder('Select destination folder:', CSIDL_DRIVES);
ShowMessage('Selected folder: "' + BrowseForFolder(
'Select destination folder:', 0, 'C:\Delphi') + '"');
The source code of the function is included in the example attached to
this newsletter.
________________________________________________________________________
7. 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 570 members and last February it had a nice level of
traffic with almost 250 messages:
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 counts with a bit more than 100 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
________________________________________________________________________
8. DELPHI ON THE NET
By Dave Murray
Components, Libraries and Utilities
===================================
Shareware/Commercial
--------------------
* Self-Extracting Archive Utility (SEAU)
SEAU binds and compresses a group of files into a single, professional
and self-contained installation program. It supports uninstallation,
multiple languages, shared files, interface customization, license
agreements, readme files, file associations, batch operations,
multiple disk spanning, DLL installation, automated installations,
patches, expiration dates, and much more.
http://www.gammadyne.com/seau.htm
Freeware
--------
* Encryption and security software - By Uri Fridman
Uri Fridman invites us to try his freeware applications and give him
some feedback (bug, comments, suggestions, ideas).
http://www.geocities.com/urifrid/soft.html
* TDirectoryDialog v1.7 - by Aivar, FREEWARE with source (KYLIX)
Displays a modal dialog box for selecting directory. Call Execute
to show dialog, selected directory is stored in DirName property.
http://www.torry.net/kylix/clx/dialogs/directorydialog.zip
* PBFolder Dialog v4.0, FREEWARE with source
Browse for folder dialog that can create new folders. The New button
caption and a Label caption (above the path) are automatic localized
every time the application runs. Also includes a localized
error-message if a new folder could not be created.
http://www.ciemmesoft.com/componenti/categorieing.asp?ID=11&PAG=1
* TicButton v.1.0.0.1 - by Halfpenny Software, FREEWARE
Button images are Up, Down and Disabled and you can change the button
state at run time. Transparent colour is set to pixel 1,1 colour.
http://www.icarus.surf3.net/
* TicButtonA v.1.0.0.1 - by Halfpenny Software, FREEWARE
As TicButton above but with a 'Roll' image, displayed when the cursor
is over the button.
http://www.icarus.surf3.net/
* TicSbutton v1.0.0.1 - by Halfpenny Software, FREEWARE
On mouse down the image changes and a wav sound is played, when
cursor enters the image it rolls over. Images are Up, Down, Disabled
and Roll and you can change the button state at run time.
http://www.icarus.surf3.net/
* TicSButtonA v1.0.0.1 - by Halfpenny Software, FREEWARE
As TicSButton above but with Transparent colour set to the pixel 1,1
colour for each image.
http://www.icarus.surf3.net/
* TicBGimage v1.0.0.2 - by Halfpenny Software, FREEWARE
Sets an image that can be Stretch or Tiled as a backdrop for the form
or placed in a Panel. The Image can be set to transparent.
http://www.icarus.surf3.net/
* Best Random Generator v1.0 - by Anton Zhuchkov, FREEWARE with source
Passes all of the tests for random number generators with a period of
2^144. Completely portable - gives bit identical results on all
machines with 24-bit+ mantissas in the floating point representation.
The algorithm is a combination of a Fibonacci sequence and an
"arithmetic sequence" (using subtraction).
http://www.torry.net/vcl/science/other/rmar.zip
* NC OCI8 v1.0.0 - by Dmitry Arefiev, FREEWARE with source
Component library for direct access to Oracle8i. Includes 7 core
components and 3 advanced.
http://www.da-soft.com/
* PsvDialogs v2.0 - by Sergiy Perevoznik, FREEWARE with source
Library of Windows Dialog components based on undocumented Windows
functions. 17 dialogs include: Add Hardware, Browse Folder, Change
Icon, Control Panel, Format, New Shortcut, Organize Favorites, Run.
http://www.torry.net/vcl/dialogs/stddialogs/psvdialogs.zip
* KWizard v1.6 - by Wei Yu, FREEWARE with source
Fully customizable, easy to use wizard construction kit.
http://members.rogers.com/wyu66/index.htm
Articles, Tips and Tricks
=========================
* Adding Custom HTML to your TAdapterPageProducers
Provides a component framework and sample components for adding
custom HTML as child components to TAdapterPageProducers.
http://community.borland.com/article/0,1410,28205,00.html
* Microsoft ComCtrls and Delphi / C++Builder v6 - by Eddie Churchill
Eddie Churchill describes the pitched battle to maintain
compatibility with the XP version of ComCtrls and discusses Themes.
http://community.borland.com/article/0,1410,28423,00.html
* System Tray Delphi application - quick and easy - by Zarko Gajic
Placing Delphi applications in the System Tray in easy steps. The
perfect place form programs that are left running for long periods of
time with no user interaction.
http://delphi.about.com/library/weekly/aa121801a.htm
* Delphi dot NET - by Zarko Gajic
As Borland unveils product strategy for Microsoft's NET platform, a
Delphi developer should find out what .NET is and what the future of
Delphi will be!
http://delphi.about.com/library/weekly/aa021902a.htm
* Indy Step by Step Part 1 - by Romeo Lefter
Part 1: Overview of TCP/IP and Indy.
http://www.delphi3000.com/articles/article_3049.asp
* Indy Step by Step Part 2.1 - by Romeo Lefter
Part 2.1 Overviw of TIdTcpServer Component.
http://www.delphi3000.com/articles/article_3050.asp
* Making 'Safe' ActiveX items for use in HTML Pages - by Scott Price
Actions required to make ActiveX/COM Objects safe for use in Internet
Explorer without "Control may be unsafe for use" dialogs.
http://www.delphi3000.com/articles/article_3053.asp
* Delphi trick for implementing VB's Control Arrays - by Malek Badi
A trick for implementing "arrays of components" similarly to VB's
"Control Arrays" allowing access to controls on a form via an index.
http://www.delphi3000.com/articles/article_3056.asp
* Enhanced Tray Icon and Task Bar Component - by Stewart Moss
How can I hide the program icon on the TaskBar under Win2000 / WinNT?
http://www.delphi3000.com/articles/article_3057.asp
* Extra Color codes for Delphi - by Stewart Moss
Nice list of color codes.
http://www.delphi3000.com/articles/article_3058.asp
* Why use Assembler? - by Max Kleiner
Why use Assembler code and a general understanding of what is meant
by instantiation, null pointer and register memory allocation.
http://www.delphi3000.com/articles/article_3059.asp
* Impersonating a User on WinNT - by Stewart Moss
How to simulate Unix SU command under WinNT and run an application
as a different user.
http://www.delphi3000.com/articles/article_3061.asp
* Some useful Windows NT API functions - by Stewart Moss
http://www.delphi3000.com/articles/article_3062.asp
* Easy Shareware limitation - Liquid Snake
How to determine the number of times an application has been run
using the registry.
http://www.delphi3000.com/articles/article_3063.asp
* Static property of a class in Delphi - Ya Xiang
How to implement a static property like the C++ static member.
http://www.delphi3000.com/articles/article_3064.asp
* Indy Step by Step Part 2.2 - by Romeo Lefter
Part 2.2. The TIdTCPServer in detail.
http://www.delphi3000.com/articles/article_3065.asp
* Get images (GIF/JPG) dimensions - by Khai Vuong Quang
Get width and height of GIF/JPG images stored as arrays of bytes.
Optimized to use within server apps.
http://www.delphi3000.com/articles/article_3066.asp
* Read the text of TEdit from another application - by Maarten de Haan
How to read the text in a TEdit from another application, even if you
only see ****. Eg. the TEdit containing internet address from MS-IE.
http://www.delphi3000.com/articles/article_3067.asp
* Overriding Registration exports from COM In-Process Automation Server
or ActiveX OCX Control - by Scott Price
How to perform additional work during the Registration routines of a
COM In-Process Automation Server or OCX Control. Eg. to create
additional registry keys relating to your configuration settings.
http://www.delphi3000.com/articles/article_3068.asp
* Implementing 'Drag Scrolling' in a Grid - by Duncan Parsons
When dragging an object over a grid, if the cell you require is not
visible it would be useful to have the grid automatically scroll to
bring the cell into view (a kind of drag-hot-tracking). Excel can do
it, let's make a humble TStringGrid do it. Builds on information
given in the article ID 3039.
http://www.delphi3000.com/article.asp?id=3069
* Indy Step by Step Part 3 - by Romeo Lefter
Part 3: Building the client.
http://www.delphi3000.com/articles/article_3070.asp
* NULL Values in a DBGrid - by Andreas Schmidt
How to display and modify NULL-Values in a DBGrid.
http://www.delphi3000.com/articles/article_3071.asp
* TOP ADO programming TIPS - by Zarko Gajic
The last chapter of this ADO tutorial is a collection of frequently
asked questions, answers, tips and tricks about ADO programming.
http://delphi.about.com/library/weekly/aa021202a.htm
* TOP 10 Delphi - by Zarko Gajic
Most popular Delphi Programming articles on delphi.about - Feb 2002.
http://delphi.about.com/library/weekly/bltop10.htm
* The fastest path to Delphi localization - by Zarko Gajic
How to change the captions on [Yes], [No], [Cancel] and similar
buttons that appear on dialog and message boxes in Delphi
applications. Plus how to personalize error, warning and other
messages in those dialogs.
http://delphi.about.com/library/weekly/aa020502a.htm
* Technique for handling mouse actions - by William Egge
A paint program requires that the mouse do different things depending
on what mode you are in. Want a clean way to handle all those mouse
actions without cluttering your form code?
http://www.delphi3000.com/articles/article_3045.asp
* Smart threads with a central management - by Erwin Molendijk
Want to fire up some threads in your application, let them do some
time consuming stuff and then report the results to the user? This
causes some synchronisation trouble. Shutting down while threads are
still running, updating the user interface... This unit gives a good
basis to avoid all kinds of multi-threading trouble using a
TSmartThread class and SmartThreadManager object
http://www.delphi3000.com/articles/article_3046.asp
* TSmartThread: Using blocking Indy sockets in a thread - E Molendijk
An example on how to use the SmartThreadLib (article 3046). Provides
a class called TTCPSmartThread that contains some basic routines to
perform TCP communication using blocking sockets.
http://www.delphi3000.com/articles/article_3047.asp
* Support for Windows Visual Styles API in your controls - by A Abdulin
http://www.delphi3000.com/articles/article_3048.asp
* How to use Strings in a Case Statement? - by Loïs Bégué
http://www.swissdelphicenter.ch/torry/showcode.php?id=1028
* How to calculate the factorial of a given number? - by Loïs Bégué
http://www.swissdelphicenter.ch/torry/showcode.php?id=1026
* How to copy Files to the Windows clipboard? - by Thomas Stutz
http://www.swissdelphicenter.ch/torry/showcode.php?id=1038
* How determine the minimum margins for a printer? - by Thomas Stutz
http://www.swissdelphicenter.ch/torry/showcode.php?id=1039
* How to get all the Permutations of a String? - by Fatih Ölçer
A permutation is an arrangement of n objects arranged in groups of
size r without repetition, where order is important.
Example: Find all two-letter permutations of the letters "ABC"
Answer: AB AC BA BC CA CB
http://www.swissdelphicenter.ch/torry/showcode.php?id=1032
* Additional dbExpress driver options - by John Kaster
List of third-party dbExpress drivers culled from newsgroups.
http://community.borland.com/article/0,1410,28371,00.html
* HTML Stylesheets - by Rick Spence
Why and how to use stylesheets in the HTML that Delphi CGI apps
return as well as avoiding some of the tedium of stylesheets.
//www.delphimag.com/features/2002/03/di200203rs_f/di200203rs_f.asp
* How to detect if Alt, Shift, Control are pressed? - by Thomas Stutz
http://www.swissdelphicenter.ch/torry/showcode.php?id=1002
* How to set TListBox Items right aligned? - by Rainer Kümmerle
http://www.swissdelphicenter.ch/torry/showcode.php?id=1023
* How to rename a directory? - by Thomas Stutz
http://www.swissdelphicenter.ch/torry/showcode.php?id=1024
* How to create a Font Combo Box with OwnerDraw - by Florin Stroiescu
Display the names of system installed fonts in a combo box drawn with
in the actual font.
http://www.delphi3000.com/articles/article_3033.asp
* MDI application without annoying ScrollBars - by Rafael Cotta
How to create a MDI app without scrollbars (like MS-Word) when a
child form is moved outside main form area.
http://www.delphi3000.com/articles/article_3035.asp
* How to export a dataset to Excel - by Steven van Els
How to make the VBA parameters visible for the end-user when
exporting a dataset to Excel.
http://www.delphi3000.com/articles/article_3037.asp
* Published Objects in Components - by Duncan Parsons
How to make properties which have object subproperties drop-down in
the Object Inspector in Delphi 6.
http://www.delphi3000.com/articles/article_3039.asp
* Unsigned 64 bit Integer support - by Erwin Molendijk
This article presents a new unsigned 64 bit integer type: UInt64.
Also two routines to convert between UInt64 and strings.
http://www.delphi3000.com/articles/article_3040.asp
Tutorials
=========
* Get to know the Delphi 6 container classes - by Bob Swart
A container stores a number of items in a useful way. A collection
stores of a list of items but a container adds special meaning to the
way the items are stored. Eg. a component list, ordered list, stack,
and queue - very handy if you know where to find them and use them.
http://www.techrepublic.com/
article.jhtml?id=r00820020204swa01.htm&page=1&vf=tt
Other Links
===========
* Delphi Search Engine and Directory
Delphi search engine for websites and newsgroup. Delphi link
collection.
http://www.neuber.com/delphi
* vpsource.com
Portal for webmasters and programmers (Delphi, C++, VB, Pascal), also
vp webdesign and programming services, e-store. Many more!
http://www.vpsource.com
* CodeBake.com
A website designed for developers to exchange and share resources and
information about Kylix, Delphi and Linux. CodeBake.com's mission is
to provide quality information to the developer community by sharing
information and resources so that everyone can benefit.
http://www.codebake.com
________________________________________________________________________
YOU CAN HELP US
We need your help to keep this newsletter going and growing. You can
help by referring the newsletter to your colleagues:
http://www.latiumsoftware.com/en/pascal/delphi-newsletter.php
Or you can help by voting for us in some or all of these rankings to
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
It's just a few seconds for you that REALLY mean a lot to us.
________________________________________________________________________
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=p33
________________________________________________________________________
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.
________________________________________________________________________
|