Pascal Newsletter Issue 54
Pascal Newsletter #54 - 23-APRIL-2005
Contents
1. A Few Words From the Editors
2. Using a .NET Assembly via COM
3. Managing Your IP Configuration
4. Forums / Mailing Lists
5. Delphi on the Net
- Components, Libraries and Utilities
- Shareware / Commercial
- Freeware
- Borland Product Updates
- Articles, Tips and Tricks
- Tutorials and Training
- Whitepapers + Case Studies
- News
- Other / Misc Sites
________________________________________________________________________
1. A Few Words From the Editors
It's a bit late but the second Pascal Newsletter of 2005 is finally
here. Due to lack of contributions it's also a bit short but I think
you'll find the content is still worth it.
The Latium Software website is currently unavailable and email to
Ernesto is bouncing. I don't know what the problem is or when (if?) he
will return. In the meantime, I will continue to publish the English
edition of the newsletter myself and will try to contact the translation
teams for the other editions. All links in the newsletter that
previously pointed to Latium Software will now point to my site
Irongut's Delphi Pages. I've worked with Ernesto for several years so
I'm sure he'll be happy for me to keep the torch burning in his absence.
If you run a site where the newsletter is advertised please contact me
about changing the links.
I'd like to thank Jim McKeeth for contributing an article to this issue
and I'm pleased to award him the following prize:
* Jim McKeeth - 'Using a .NET Assembly via COM'
InstallAWARE 2005 Developer Edition
InstallAWARE 2005 - by InstallAWARE Software Corporation ($69 - $899)
What sets InstallAWARE apart from the competition is how it goes about
building an MSI. The graphical choices such as adding files and
registry entries are provided as most tools offer. However, when you
switch to the "script view" you do not see a list of sequences and
actions, but an easy to read (and manipulate) script that spells out
each action to be taken by the MSI and under what condition. When
everything is just as you wish, InstallAWARE builds a fully compliant
Windows Installer setup requiring no runtimes or distributable.
http://www.installaware.com/buy.asp
In the next issue I have two prizes up for grabs: KnowedgeBASE Vortex
and YAPI Professional. Issue #55 will be published in June if I get
enough articles so if you've got an idea, start writing!
Now, on with the code...
Regards,
Dave Murray
pascal-newsletter-owner@yahoogroups.com
________________________________________________________________________
Help & Manual 3.50 by EC Software - Shareware ($ 299) - Help & Manual is
a WYSIWYG help authoring tool that will aid you in creating standard
WinHelp files (.HLP), Adobe PDF files, HTML pages and the new HTML HELP
(.CHM) files introduced in Windows 98, as well as other file formats and
printed documentation, everything from a single source. This is a must-
have for any software developer. http://www.helpandmanual.com/hmpage.htm
________________________________________________________________________
2. Using a .NET Assembly via COM
By Jim McKeeth <jim at mckeeth dot org>
Abstract: Using .NET Assemblies as COM objects in Win32 programs is
simple, once you are familiar with the necessary hoops. This article
outlines the steps necessary and provides a few tips to improve your
experience.
This paper operates on the premise that you are familiar with .NET
development and know how to call a COM object in traditional Win32
development. It fills in the gap by explaining how you can treat a .NET
assembly as a COM object. Most of the links provided point to articles
in the MSDN unless otherwise specified.
Introduction
============
Using a .NET assembly as a COM object typically requires the following
steps:
1. Giving the assembly a Strong Name
2. Placing the assembly in the Global Assembly Cache (GAC)
3. Registering the assembly as a COM object
4. Calling your COM object
An assembly is not required to be in the GAC if it is in the system or
application path, and the strong name is only required if it is in the
GAC, but this is the preferred method of using an assembly as a COM
object. In the following sections we will take a closer look at each
step as well as some other related steps.
All the command line utilities I will mention in this article are part
of the .NET Framework SDK, but they may not be in the path when you are
at a command prompt. You will either need to explicitly specify the
path, copy them to your path, or add the path to your path environment
variable (Control Panel / System / Advanced / Environment Variables for
2000 and XP). The usual location for the .NET version 1.1 is
C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322 (or WinNT instead of
Windows)
Step 1: Strong Names
====================
Strong names provide assemblies with a digital signature and public key
to identify it by. This is in addition to the simple name and version
number. Because strong names rely on unique, cryptographically secure
strong key pairs. No one else can generate the same key pair you
generate, and no one else knows your private key, so no one can generate
the same strong name. "Assemblies with the same strong name are expected
to be identical." Because strong names guarantee uniqueness and equality
they allow for side-by-side operation and help to eliminate DLL Hell.
Well that is all fine and dandy, but I am sure you would like to know
how one gives their assembly a strong name. The steps to give an
assembly a strong name include:
1. Obtain a key pair
2. Assign the key to the assembly
Lets look at these steps.
Obtain a Key Pair
-----------------
Your organization may already have a key pair. If this is the case, and
the private key is not available to you as a developer for security
reasons then you will need to perform a Delayed Signing. If you do have
a key pair then you can skip this step.
To obtain a key pair use the Strong Name Tool (Sn.exe) that is provided
with the .NET Framework.
To generate a new key pair type the following:
sn -k MyKey.snk
Where MyKey is the name of the key you are creating. Key files typically
have an snk extension, but this is not required. If you don't want to
deal with a key file, you can place the key in the strong name
Cryptographic Service Provider (CSP) with the following command:
sn -i MyKey.snk MyContainer
Now the key from the file MyKey.snk has been placed in the MyContainer
container. When you want to remove a container use the following:
sn -d MyContainer
We will talk more about containers in the section on assigning a key to
an assembly (next).
For more information see the MSDN tutorial on strong names:
http://msdn.microsoft.com/library/en-us/cptutorials/html/shared_names.asp
Assign the Key to the Assembly
------------------------------
Once you have a key that you wish to assign to your assembly you need to
decide how to assign it to your assembly. As mentioned earlier, if you
don't have access to the private key you will need to resort to Delayed
Signing.
There are essentially 4 ways to sign an assembly.
1. Using the Assembly Linker (AL.exe) tool
2. Using the AssemblyKeyFile attribute
3. Using the AssemblyKeyName attribute
4. Using the AssemblyDelaySign attribute
Using the Assembly Linker (AL.exe) Tool
---------------------------------------
The method suggested in most of the documentation on strong names is to
use the Assembly Linker (AL.exe) tool. AL has many uses beyond strong
names. It allows the generation of a file with an assembly manifest from
one or more module or resource files. For now we will just look at using
it to sign an assembly.
To sign an assembly, use the following command:
al /out:MyAssembly.dll MyModule.netmodule /keyfile:MyKey.snk
This signs the assembly MyAssembly.dll with the code module
MyModule.netmodule using the key found in MyKey.snk. If instead you are
using a key stored in a container you would type:
al /out:MyAssembly.dll MyModule.netmodule /keyname:MyContainer
Which uses the key found in MyContainer. For those of you who hate
typing you can shorten keyname and keyfile to keyn and keyf
respectively, saving 3 key strokes each.
One thing to note about using the AL tool is that rebuilding the
assembly will require a re-signing of the assembly.
Using the AssemblyKeyFile Attribute
-----------------------------------
If you are actually able to edit the source code of the assembly then
the AssemblyKeyFile attribute is probably a preferred method over using
AL since the assembly will be resigned every time you rebuild it.
The syntax for AssemblyKeyFile is simply
[assembly:AssemblyKeyFile( "MyKey.snk" )] // C#
You need to be aware of how the relative path is calculated since that
varies based on Language. Both Borland Developer Studio (Delphi or C#)
and Microsoft Visual C# base the path on the binary location, while
Microsoft VB.NET bases the path on the source code location. Also in C#
you will either need to proceed the string with the @ sign, or use
double backslashes if specifying a relative path.
One word of caution: When using AssemblyKeyFileAttribute the path and
file name persist into the distributed assembly, so you will need to be
sure that it does not contain any sensitive information.
Using the AssemblyKeyName Attribute
-----------------------------------
If, instead of a key file, you stored your key within a container in the
CSP then you want to use the AssemblyKeyName attribute. With this
attribute, instead of specifying the name of the key file you use the
name of the container.
[assembly:AssemblyKeyFile( 'MyContainer')] // Delphi
This has the advantage of not needing to worry about relative paths. The
disadvantage is that it requires the key be in the container, so could
make it harder to share code between machines.
Notice: You should specify a value for AssemblyKeyFile OR
AssemblyKeyName. If you specify a value for both then you will
receive an error at compilation.
Using the AssemblyDelaySign Attribute
-------------------------------------
As mentioned earlier, if you do not have access to the private key then
you need to use the AssemblyDelaySign attribute. This attribute reserves
space in your assembly for later signing. The syntax is simply:
[assembly: AssemblyDelaySign( true )]
For more information please see the following:
* Understanding and Using Assemblies and Namespaces in .NET
http://msdn.microsoft.com/library/en-us/dndotnet/html/assenamesp.asp
* Craig Wills' Delayed Signing of Assemblies tutorial
http://www.codenotes.com/articles/articleAction.aspx?articleID=502
Step 2: Global Assembly Cache (GAC)
===================================
The Global Assembly Cache (GAC) provides a machine wide code depository.
This is present on all machines with the Common Language Runtime (CLR)
installed. Whenever there is an assembly that is intended to be shared
by several applications on the computer then they should be placed in
the GAC. As mentioned earlier, the less desirable alternative is to
simply place the assembly in the system or application path. There are
three ways to place an assembly in the GAC:
1. Drag and drop the assembly into the GAC
2. Use an installer that supports placing assemblies in the GAC
3. Use Global Assembly Cache tool (Gacutil.exe)
The first two options are for systems without the SDK since Gacutil is
only available with the SDK. When installing on a system without the SDK
you will either need to manually drag it in to the Assembly folder (e.g.
C:WinntAssembly) or use an installer that supports the GAC. For now we
are going to look at using Gacutil.exe.
Global Assembly Cache tool (Gacutil.exe)
----------------------------------------
The Global Assembly Cache tool (Gacutil.exe) allows viewing and
manipulation of the assemblies in the GAC. For now we are going to look
at installing and removing assemblies from the cache. Before an assembly
can be installed into the GAC it must have a strong name as covered in
step 1.
The command to install an assembly in the GAC is:
gacutil -i MyAssembly.dll
This installs the assembly MyAssembly.dll into the GAC. If you change
the assembly you will need to reinstall the new version. Before
reinstalling you may need to remove the old one. To remove an assembly,
use the following command:
gacutil -u MyAssembly
Notice that instead of using the file name MyAssembly.dll you use the
assembly name MyAssembly. Using the file name results in an error.
For more information see the following:
* Working with Assemblies and the Global Assembly Cache
http://msdn.microsoft.com/library/en-us/cpguide/html/cpconworkingwithassembliesglobalassemblycache.asp
Step 3: Registering
===================
Prior to .NET we registered out COM objects with RegSvr32. In order to
register a .NET assembly we need to use the new Assembly Registration
Tool (Regasm.exe). The usage of RegAsm is just as simple as RegSvr32
was. To register use the following command:
regasm -i MyAssembly.dll
If you make a change to the interface you will need to re-register your
assembly. If the change is significant enough you will want to
unregister the old one first. Generally I have a batch file to
unregister with each change. The command to unregister is:
regasm -ui MyAssembly.dll
Automating
----------
As mentioned earlier, I use a batch file to automate the installation
into the GAC and registering. Here is a sample batch file that assumes
the assembly already has a strong name:
@echo off
echo Installing %1. . .
gacutil /nologo /i %1.dll
regasm /nologo %1.dll
echo.
echo Press any key to uninstall. . .
pause > nul
echo.
regasm /nologo /u /nologo %1.dll
gacutil /nologo /u %1
echo.
echo %1 uninstalled.
Then I create a batch file that calls this batch file with the name of
the assembly I am working with. Notice that this batch file wants the
assembly name, not the file name, and assumes that the file name is the
assembly name with a .dll extension. If this is not the case for your
project then you will need to adapt this batch file as necessary.
Step 4: Calling your COM Object
===============================
Now that you have gone to all the work of registering your assembly as a
COM object you need to know how to call it. You call it just like you
call any other COM object, but you might be curious what it's Dispatch
Identifier (DispID) and the Programmatic Identifier (ProgID). You also
might be curious how to prevent some classes and members from not being
visible via COM.
ProgID
------
The ProgID is simply the namespace dot class name. Notice that the
Namespace may be named different then the Assembly. So if your namespace
is MyNamespace and your class name is MyClass then your ProgID would be:
MyNamespace.MyClass
DispID
------
A Dispatch ID is a unique integer assigned to a method of a COM object.
Depending on how you are making the calls you might alternatively use
the method name. You can specify the Dispatch ID in your assembly's
source code with the DispId Attribute. If you do not specify one then
the Common Language Runtime (CLR) automatically assigns a DispID. For
example to set the Dispatch ID to 1 for a method you would use the
following:
[DispId(1)]
For more information see:
* Exposing .NET Framework Components to COM
http://msdn.microsoft.com/library/en-us/cpguide/html/cpconExposingNETFrameworkComponentsToCOM.asp
Visibility
----------
By default all public members are visible to COM when an assembly is
registered. If you wish to hide a public member then you can use the
ComVisible Attribute. The attribute takes a Boolean as a parameter, and
it defaults to true. This seems kind of odd since a member defaults to
visible without the attribute. So if you want to hide a member you would
use the following:
[ComVisible(false)]
Additional Reading
------------------
A good source of information on this topic, from a slightly different
point of view, is Brian Long's '.NET Interoperability: COM Interop'
paper from BorCon 2004:
http://www.blong.com/Conferences/BorCon2004/Interop2/COMNetInterop.htm
You can also pick up Adam Nathan's book '.NET and COM: The Complete
Interoperability Guide' which is also available in PDF format ebook:
http://www.amazon.com/exec/obidos/ASIN/067232170X/jimmckeeth03-20
http://www.amazon.com/exec/obidos/ASIN/B0002NYF8I/jimmckeeth03-20
________________________________________________________________________
Vote for the Pascal Newsletter in The Borland Top 100!
http://top100borland.com/in.php?who=20
________________________________________________________________________
3. Managing Your IP Configuration
By Dave Murray <irongut at vodafone dot net>
http://www.paranoia.clara.net/
Introduction
------------
The IP Helper API enables the retrieval and modification of network
configuration settings for the local computer. Delphi doesn't include
the interface units for the IP Helper API but they are available from
Project JEDI. The JEDI units are good but they are merely translations
of the C originals with no documentation which makes them difficult to
use. In this article I will present two classes that build on the JEDI
units to make it easy to use the IP Helper API to read and modify basic
network settings. The accompanying zip archive contains these classes
and a demo application which is a copy of Windows ipconfig.exe utility.
Written and tested using Delphi 6, they should work with minor changes
in Delphi 5 and later.
The IP Helper API is supported on Windows 98/ME/NT4 SP4/2000/XP/2003 but
all functions are not necessarily supported. My classes should work on
all these platforms but have only been tested on Windows 2000 and XP.
For specific information about which functions are supported on a
particular platform refer to MSDN.
All code is released under MPL 1.1 and is available in the zip archive
accompanying this issue or from Irongut's Delphi Pages:
http://www.paranoia.clara.net/software/index.html
Overview
--------
conIPConfig.pas contains two classes - TconIPConfig and TconAdapterInfo.
TconIPConfig is the master object that handles general network
configuration and contains a list of TconAdapterInfo which handle
individual network adapters. Instances of TconAdapterInfo are created
and destroyed as required by TconIPConfig.
TconIPConfig
Public Properties:
Hostname : string = host name for the local computer
Domain : string = domain in which the local computer is registered
DNSServers : TStringList = list of DNS server addresses
NodeType : string = node type
ScopeID : string = DHCP scope name
IPRouting : boolean = specifies if routing is enabled
WINSProxy : boolean = specifies if acting as an ARP proxy
NBUsesDNS : boolean = specifies if DNS is enabled
Adapters[const idx : integer] : TconAdapterInfo = list of adapter info
AdaptersCount : integer = no of adapters
Public Methods:
procedure Refresh = refresh all data
procedure ReleaseAll = release DHCP leases on all adapters
procedure RenewAll = renew DHCP leases on all adapters
TconAdapterInfo
Public Properties:
AIndex: cardinal = adapter index, may change
Name: string = GUID for the adapter
Description: string = often used as human readable name
MACAddress: string = hardware or MAC address of adapter
AType: string = adapter type, one of NBTypes
DHCP : boolean = specifies if DHCP is enabled on this adapter
CurrIPAddress: string = current IP address of this adapter
CurrIPMask: string = current subnet mask of this adapter
IPAddresses: TStringList = IP addresses associated with adapter
SubnetMasks: TStringList = subnet masks associated with adapter
Gateways: TStringList = list of IP addresses for default gateway
DHCPServers: TStringList = list of IP addresses for DHCP servers
WINS: Boolean = specifies if adapter uses WINS
PrimWINSServers: TStringList = list of primary WINS servers
SecWINSServers: TStringList = list of secondary WINS servers
LeaseObtained: TDateTime = time when DHCP lease was obtained
LeaseExpires: TDateTime = time when DHCP lease expires
Public Methods:
function Release = release current DHCP lease
function Renew = renew current DHCP lease
Error handling is provided by a custom exception, EconIPConfigError, and
the TconAdapterInfo.Release and TconAdapterInfo.Renew functions return a
Windows error code.
Reading Your Network Settings
-----------------------------
To read the network settings of the local computer all you need to do is
create an instance of TconIPConfig and call its Refresh method. Read the
properties of TconIPConfig for general network info such as hostname,
node type and DNS server list. For example:
IPConfig.Refresh;
{host info}
edtHostName.Text := trim(IPConfig.Hostname);
edtScope.Text := trim(IPConfig.ScopeID);
edtNodeType.Text := IPConfig.NodeType;
chkbxIPRouting.Checked := IPConfig.IPRouting;
chkbxWINSProxy.Checked := IPConfig.WINSProxy;
chkbxNBDNS.Checked := IPConfig.NBUsesDNS;
mmDNSServers.Lines.Clear;
mmDNSServers.Lines.Text := IPConfig.DNSServers.Text;
The IPConfig.Adapters property is a list of TconAdapterInfo which
contain all the adapter specific configuration info. In the demo I have
added the Description of each adapter to a ComboBox and display the info
of whichever adapter is selected. Note I didn't use the Name property
since it is a GUID and wouldn't mean much to the user. Since I've added
the adapters to the ComboBox in the order that they appear in
TconIPConfig.Adapters it is easy to get the details of the right
adapter. For example:
index := cmbxAdapterDesc.ItemIndex;
{populate Adapter section with data}
edtName.Text := IPConfig.Adapters[index].Name; {GUID string}
edtMAC.Text := IPConfig.Adapters[index].MACAddress;
edtAdapterType.Text := IPConfig.Adapters[index].AType;
chkbxDHCP.Checked := IPConfig.Adapters[index].DHCP;
chkbxWINS.Checked := IPConfig.Adapters[index].WINS;
edtIPAddress.Text := IPConfig.Adapters[index].IPAddresses[0];
edtSubnet.Text := IPConfig.Adapters[index].SubnetMasks[0];
edtGateway.Text := IPConfig.Adapters[index].Gateways[0];
edtDHCP.Text := IPConfig.Adapters[index].DHCPServers[0];
edtPWINS.Text := IPConfig.Adapters[index].PrimWINSServers[0];
edtSWINS.Text := IPConfig.Adapters[index].SecWINSServers[0];
edtObtained.Text :=
DateTimeToStr(IPConfig.Adapters[index].LeaseObtained);
edtExpires.Text :=
DateTimeToStr(IPConfig.Adapters[index].LeaseExpires);
The TconAdapterInfo.AType property is a string that tells you the
Adapter type. It will be UNKNOWN, Broadcast, Peer To Peer, Mixed or
Hybrid. These strings are defined in an array constant called NBTypes.
Managing DHCP Leases
--------------------
Managing DHCP leases is just as easy. If you want to Release or Renew
the address for a specific adapter then just call the Release or Renew
method for its instance of TconAdapterInfo. Both methods are functions
that return the last Windows error code they encounter. If they work as
expected that code will be ERROR_SUCCESS. Otherwise SysErrorMessage()
can be used to get a more friendly message to display to the user.
Sometimes the message returned by SysErrorMessage() doesn't make much
sense. One instance of this is when the network cable is unplugged or
the DHCP server can't be found which returns ERROR_FILE_NOT_FOUND. In
the demo I check for this specific error first and give my own message
before processing a more general error with SysErrorMessage().
i := cmbxAdapterDesc.ItemIndex;
Err := IPConfig.Adapters[i].Release;
if (Err = ERROR_SUCCESS) then RefreshInfo
else if (Err = ERROR_FILE_NOT_FOUND) then {better message than system}
MessageDlg('Problem releasing DHCP address, the server or network is
not available.', mtError, [mbOk], 0)
else {general error handling}
MessageDlg(Format('Problem releasing DHCP address:'#13'%s',
[SysErrorMessage(Err)]), mtError, [mbOk], 0);
If you want to Release or Renew all DHCP addresses leased by the
computer then call the ReleaseAll or RenewAll method of TconIPConfig.
These methods iterate thru the list of all adapters and Release or Renew
each in turn. If an error is encountered they raise an EconIPConfigError
exception which contains the message produced by SysErrorMessage().
After releasing or renewing a DHCP lease, remember to refresh
TconIPConfig and your GUI.
References
----------
MSDN - About IP Helper:
http://msdn.microsoft.com/library/en-us/iphlp/iphlp/about_ip_helper.asp
Project JEDI API Library:
http://www.delphi-jedi.org/APILIBRARY:145364
________________________________________________________________________
InstallAWARE 2005 - by InstallAWARE Software Corporation ($69-$899)
What sets InstallAWARE apart from the competition is how it goes about
building an MSI. The graphical choices such as adding files and registry
entries are provided as most tools offer. However, when you switch to
the "script view" you do not see a list of sequences and actions, but an
easy to read (and manipulate) script that spells out each action to be
taken by the MSI and under what condition. When everything is just as
you wish, InstallAWARE builds a fully compliant Windows Installer setup
requiring no scripting runtimes or distributable.
Special limited offer: 33% off all editions, Studio only $559.95!
Order any cross-grade edition for a 33% discount on purchase price.
>>>> http://www.installaware.com/buy.asp <<<<
________________________________________________________________________
4. Forums / Mailing Lists
To join any of our forums, the best way is to subscribe from the web,
since then you'll be able to access the website features (message
archive, files section, etc). A Yahoo! ID is required for that, and you
can get yours free by registering as a Yahoo! user, but you can also
subscribe by email (you'll only have email access).
* Delphi-En: A unique forum for intermediate-level Delphi programmers.
A large group with a helpful community of members. If you are a beginner
please stay as a listener and learn from others' questions and answers.
Home Page: http://groups.yahoo.com/group/delphi-en/
Subscription: http://groups.yahoo.com/group/delphi-en/join
mailto:delphi-en-subscribe@yahoogroups.com
* Delphi-All: A Delphi group open to programmers of all levels.
Home Page: http://groups.yahoo.com/group/delphi-all/
Subscription: http://groups.yahoo.com/group/delphi-all/join
delphi-all-subscribe@yahoogroups.com
* Kylix: Kylix programming.
Home Page: http://groups.yahoo.com/group/KylixGroup/
Subscription: http://groups.yahoo.com/group/KylixGroup/join
KylixGroup-subscribe@yahoogroups.com
* Components: This is a forum for searching / recommending software
components (VCL and CLX components, ActiveX objects, DLL libraries,
.Net, etc.), as well as utilities, tutorials, information, etc.
Home Page: http://groups.yahoo.com/group/components/
Subscription: http://groups.yahoo.com/group/components/join
components-subscribe@yahoogroups.com
* Software Developers: A place for subjects related to software
development and the industry. For developers to share their experiences
as an academic, professional or hobbyist. It is not a programming forum,
messages here are supposed to be more general or language independent.
Home Page: http://groups.yahoo.com/group/software-developers/
Subscription: http://groups.yahoo.com/group/software-developers/join
software-developers-subscribe@yahoogroups.com
________________________________________________________________________
KnowedgeBASE Vortex 2.9 by Delphinium Software ($49.35 US)
KnowledgeBASE Vortex features a highly searchable and expandable
information tree viewed in outline or audited within a built-in
wordprocessor. Includes a database for stored references.
http://www.download.com/KnowledgeBase-Vortex/3000-2064-10342084.html
________________________________________________________________________
5. Delphi on the Net
By Dave Murray <irongut at vodafone dot net>
Components, Libraries and Utilities
===================================
Shareware / Commercial
----------------------
* InstallAWARE 2005 - by InstallAWARE Software Corporation ($69 - $899)
What sets InstallAWARE apart from the competition is how it goes about
building an MSI. The graphical choices such as adding files and
registry entries are provided as most tools offer. However, when you
switch to the "script view" you do not see a list of sequences and
actions, but an easy to read (and manipulate) script that spells out
each action to be taken by the MSI and under what condition. When
everything is just as you wish, InstallAWARE builds a fully compliant
Windows Installer setup requiring no runtimes or distributable.
Special limited offer: 33% off cross-grade editions, Studio only $559!
http://www.installaware.com/buy.asp
Freeware
--------
* Easy Menus v1.0 - by Alexandru Murariu (with source)
Easy Menus Components are a set of 12 Delphi Components designed to
make menu manipulation easier. Includes recently used files, a user
configurable Tools Menu, add your own menu items into the system menu,
show the contents of a directory in a menu and more. Delphi 6 - 7.
http://www.torry.net/vcl/menus/menuenhancments/easymenus.zip
* Structured Storage Lib v1.0 - by Alexandru Murariu (with source)
Structured Storage Lib makes it easy for Delphi programmers to store a
hierarchy of folders and files inside a single disk file. Just as you
have directories and files in a conventional file system, Structured
Storage provides the programmer with directories (known as storages)
and files (known as streams) within a file. An element inside the file
can be added, deleted, moved or copied without affecting any other
elements. All allocation within the structured file is managed for you
by OLE. Includes a sample application. Delphi 6 - 7.
http://www.torry.net/vcl/system/ole/StructuredStorageLib.zip
* XYGraph v.2.2 - by Wilko C. Emmens (with source)
A set of Delphi units for the easy construction of 2D and 3D graphs.
Major features include automatic drawing of axes, user coordinates,
scaleable pictures, integrated ruler and zoom functions, export as
bitmap or metafile, print, optional in high-res, special time axis for
date/time parameters and much more. Delphi 4 - 7.
http://www.solcon.nl/wcemmens/xygraph.htm
* Pre-compiled LibTiff for Delphi v3.7.0.00 - by AWare Systems
LibTiffDelphi is a pre-compiled version of LibTiff for use in Delphi.
LibTiffDelphi is not a DLL, it is a series of .obj files that link
into your project as if it were native ObjectPascal. This is similar
to the pre-compiled LibJpeg that Borland distributes with Delphi. It
does not require any extra files in your distribution, does not
involve additional installation issues, and does not need any
load-time or run-time linking. Delphi 6 - 2005.
http://www.awaresystems.be/imaging/tiff/delphi.html
* ProDelphi (Source Code Profiler) v18.0 - by Helmuth J. H. Adolph
Source code profiler for Delphi (runtime measurement). Features
include: built-in viewer, cyclic storage of measurement results for
long period measurement, conditional compilation, history function
built in, idle times produced by some API, VCL or CLX calls
automatically excluded, integration into the IDE, measures runtimes
in DLLs, multiple profiling directories, smallest measurable duration
is 1 CPU-cycle, compatible with DUnit. Delphi 2 - 2005.
http://www.prodelphi.de/
Borland Product Updates
-----------------------
* Delphi 2005 Update 2 is Available for Download
Well over 200 bugs have been fixed in this update for Delphi 2005.
Download it now!
http://community.borland.com/article/0,1410,33005,00.html
Articles, Tips and Tricks
=========================
* Moving a Visual SourceSafe Project to StarTeam
Details the steps required to import a current Visual SourceSafe
project into StarTeam.
http://community.borland.com/article/0,1410,33011,00.html
* Using Custom Attributes in C#
An introduction into creating and using custom attributes in C#.
http://community.borland.com/article/0,1410,30250,00.html
* Introduction to StarTeam Integration in Delphi 2005 - by David Clegg
An introduction to the new StarTeam Integration features of D2005.
http://community.borland.com/article/0,1410,32959,00.html
* Development Best Practices: Agile Development - by Robert Wegener
Covers some of the best practices for the agile development
organization.
http://community.borland.com/article/0,1410,33001,00.html
* FAQ for Borland's Investment in Eclipse
FAQ (and Answers) regarding Borland's increased investment in Eclipse.
http://community.borland.com/article/0,1410,32992,00.html
* Historical Documents: Delphi 1 Launch Demos Source Code,
Launch Script, and Marketing Video
Anders Hejlsberg provided the original launch script and projects used
in the Delphi 1 launch on February 14th 1995.
http://community.borland.com/article/0,1410,32977,00.html
* Historical Document: Visual Component Library First Draft
The first draft document for the Visual Component Library (VCL)
description. This document describes components, properties, events,
forms, and more.
http://community.borland.com/article/0,1410,32975,00.html
* BDNradio: The Creation of Delphi
Phone interview with some of the original creators of Delphi.
http://community.borland.com/article/0,1410,32973,00.html
* Historical Document: Delphi Product Definition 3rd Draft
Zack Urlocker, Delphi Product Manager, wrote the product definition
for Delphi v1.0. This is the HTML version of the 3rd draft, dated May
13th 1993. Notable items include the original target dates and
technical terms like "lotsa".
http://community.borland.com/article/0,1410,32971,00.html
* Delphi 2005 Architect Prize Awarded for BorCon 2004 Diamondback
Referral Campaign
John Kaster created a Delphi web service and ASP.NET client to help
select the winner of Delphi 2005 Architect.
http://community.borland.com/article/0,1410,32963,00.html
* BDNradio: ECO II in Delphi 2005 with the ECO Team
Read the chat log and listen to the replay of the live audio interview
with the ECO team on the new features of ECO.
http://community.borland.com/article/0,1410,32957,00.html
* BDNradio: Delphi 2005 DBWeb Controls with John Keegan
Read the chat log and listen to the replay of the live audio interview
with John Keegan on the Delphi 2005 data-aware controls for ASP.NET.
http://community.borland.com/article/0,1410,32940,00.html
* "Zoom" - Screen Magnifier with Source Code - by Zarko Gajic
Delphi application to display a magnified view of whatever is beneath
the mouse cursor. Full source included. Learn how to track the mouse
cursor movement over the screen, and show enlarged section around the
cursor...
http://delphi.about.com/od/graphics/l/aa120198.htm
* Accessing and managing MS Excel sheets with Delphi - by Zarko Gajic
How to retrieve, display and edit Microsoft Excel spreadsheets with
ADO (dbGO) and Delphi. This step-by-step article describes how to
connect to Excel, retrieve sheet data, and enable editing of data
(using the DBGrid). You'll also find a list of most common errors
(and how to deal with them) that might pop up in the process.
http://delphi.about.com/od/database/l/aa090903a.htm
* A Guide to Using the TClientDataSet in Delphi Applications - Z. Gajic
Looking for a single-file, single-user database for your next Delphi
application? Need to store some application specific data but you do
not want to use the Registry / INI / or something else?
http://delphi.about.com/od/usedbvcl/a/tclientdataset.htm
* A more powerful Delphi Form - by Zarko Gajic
Messing with the creation process of a form object, or how to change
the default style of a window when it gets created to suit your
particular needs. Transparent forms, no caption forms, etc.
http://delphi.about.com/od/formsdialogs/l/aa073101a.htm
* Drawing an Image in a Cell of a Delphi DBGrid - by Zarko Gajic
Here's how to place an image into a cell of a TDBGrid. Enrich the
visual presentation of data in Delphi database applications.
http://delphi.about.com/library/weekly/aa032205a.htm
* Simulating Class Properties in (Win32) Delphi - by Zarko Gajic
A class property is a property you can access without actually
creating an instance of a class. While (Win32) Delphi enables you to
create class (static) methods (function or procedure), you cannot mark
a property of a class to be a class (static) property. False. You can!
Let's see how to simulate class properties using typed constants.
http://delphi.about.com/library/weekly/aa031505a.htm
* Picture Motion: Double Buffering - by Cevahir Parlak
Delphi Programming concepts of Double Buffering, technique that is
used to prevent flicker when drawing onto the screen.
http://delphi.about.com/library/bluc/text/uc092700a.htm
* Placing a TProgressBar into a TStatusBar - by Zarko Gajic
Here's how to add a status bar (or any other Delphi component) to a
progress bar. Provide visual feedback of application's lengthy
operation in the status area of a Delphi form.
http://delphi.about.com/library/weekly/aa030805a.htm
* TGuidEx - Class for Manipulating GUID Values - by Zarko Gajic
A Guid type represents a 128-bit integer value. The TGuidEx class
exposes class (static) methods that help operate GUID values and
TGuidField database field types.
http://delphi.about.com/library/weekly/aa022205a.htm
* Storing and Calling an MDI Child Form from a DLL - by Zarko Gajic
Need to modularise your application? Learn how to place a Delphi MDI
child form into a dynamic link library (DLL) and how to display the
child form inside an MDI parent window.
http://delphi.about.com/library/weekly/aa020805a.htm
* (Windows) Message in the (Delphi) Bottle - by Zarko Gajic
One of the keys to traditional Windows programming is handling the
messages sent by Windows to applications. Learn how to handle Windows
Messages using Delphi.
http://delphi.about.com/od/windowsshellapi/a/aa020800a.htm
* Implementing Shell Search Handler in Delphi
The Shell supports several search utilities that allow users to locate
namespace objects such as files or printers. You can create a custom
search engine and make it available to users by implementing and
registering a search handler.
http://www.delphi-central.com/tutorials/Shell_Search.aspx
Tutorials and Training
======================
* GOF BEHAVIOURAL Patterns with C#: Part 3 - by Barry Mossman
Final article in a series about the GOF Design patterns from a C# and
.Net Framework perspective. It is a continuation of the BEHAVIORAL
Patterns, this time looking at the State, Strategy, Template and
Visitor patterns.
http://community.borland.com/article/0,1410,32887,00.html
* Getting Started with C# and the Compact Framework - by Marc Rohloff
This article will show you the steps to edit, compile and test
applications for the .NET Compact Framework using Borland Delphi 2005
and C# and explain what you can and cannot do.
http://community.borland.com/article/0,1410,32950,00.html
* Programming a Memory Game in Delphi: Part 4 - by Delphi Central
Part 1 explained how to create the form and drawgrid at design time,
part 2 started writing the code and part 3 drew the grid that the game
is played on. In part 4 the game is completed with the main algorithm.
http://www.delphi-central.com/tutorials/memory_game_4.aspx
Whitepapers + Case Studies
==========================
* Borland Software Delivery Platform for Eclipse
Extend the Eclipse framework with Borland ALM solutions for
requirements, design, development, performance and testing, and change
management.
http://community.borland.com/article/0,1410,32991,00.html
* Whitepaper: Delphi 2005 and ADO.NET Database Development
Easy, reliable, and scalable data remoting services on ADO.NET using
Borland Delphi 2005.
http://community.borland.com/article/0,1410,32979,00.html
* Whitepaper: Delphi 2005 and ECO II
Using an existing enterprise database with Borland ECO II and D2005.
http://community.borland.com/article/0,1410,32978,00.html
* Whitepaper: Delphi 2005 and ADO.NET Database Development
Easy, reliable, and scalable data remoting services on ADO.NET using
Delphi 2005.
http://community.borland.com/article/0,1410,32979,00.html
* Whitepaper: Delphi 2005 and ECO II
Using an existing enterprise database with Borland ECO II and D2005.
http://community.borland.com/article/0,1410,32978,00.html
* A case study for ECO II: An ASP.NET Web Site - by Peter Morris
This article outlines Peter's experiences of rewriting
www.HowToDoThings.com using ECO.
http://community.borland.com/article/0,1410,32967,00.html
News
====
* Borland Open Sources JBuilder
Borland is releasing core code from its JBuilder IDE into the Eclipse
open source community after a surprise drop in first-quarter sales.
The company hopes to offset JBuilder's R&D expenses by putting the
suite into Eclipse, where the open source community would drive API
and feature improvements.
http://www.theregister.com/2005/04/22/jbuilder_eclipse/
* CodeCentral Maintenance Announcement
Read this if you are having problems getting to Borland CodeCentral.
http://community.borland.com/article/0,1410,33037,00.html
* 2005 Borland Developer Conference US
Register now for the 2005 Borland Developer Conference US, the premier
event for technical education. At the Borland Developer Conference
learn technical tips, tricks, techniques, APIs and more needed to
maximize the way you develop software. Learn more about Delphi,
Eclipse, .NET, Java, JBuilder as well as network with your peers,
speakers, and with the Borland R&D team.
http://www.borlandevents.com/devcon05/
* Open Letter to the Borland Community Regarding Eclipse Announcement
Borland announces it is significantly increasing its support for
Eclipse by joining the organization's Board of Directors as a
Strategic Developer, and by expanding our use of the Eclipse platform
across our ALM product line.
http://community.borland.com/article/0,1410,32987,00.html
* Open Letter from Dale Fuller: TO ALL ENTERPRISE DEVELOPERS
Dale Fuller, Borland's CEO writes an open letter to all enterprise
developers announcing Borland Core SDP (Software Delivery Platform).
http://community.borland.com/article/0,1410,32972,00.html
* Firebird 2.0 Alpha-01 Release
This alpha release contains a large number of new features including
derived tables, support for Execute Block, increased table sizes, new
improved index code, expression indices, numerous optimiser
improvements, enhanced security features and support for online
incremental backups along with many other improvements and bug fixes.
http://firebird.sourceforge.net/index.php?op=files&id=fb2_alpha01
* Borland Project Tools Boost Collaboration
Borland has introduced a suite of integrated tools aimed at providing
IT departments with a way to manage projects more effectively using
role-based collaboration. The product, called Borland Core SDP, is the
foundation of the company's SDO strategy, providing an ALM
environment.
http://www.computerweekly.com/articles/article.asp?liArticleID=136552
* Borland University Looks to Spring Debut
Borland will cut the ribbon on Borland University as early as this
spring, bringing a new, problem-solving focus to IT technical
training. "With Borland University, we will go way beyond the
traditional tactical 'point product approach' to training, where
technical staff takes 2-3 days to learn how to work with a new
product," Chris Barbin, Borland's Senior Director of Worldwide
Services told Integration Developer News.
http://www.idevnews.com/IntegrationNews.asp?ID=153
Other / Misc Sites
==================
* Computerworld - Steps for Writing Trusted Applications
This article discusses using hardware to combat threats against
computers using the open specification created by the Trusted
Computing Group (TCG).
http://community.borland.com/article/0,1410,33003,00.html
* developer.* - Code as Design: Three Essays by Jack W. Reeves
developer.* Magazine republishes three essays by Jack W. Reeves (from
1992) discussing how programming is fundamentally a design activity
and that the only final and true representation of "the design" is the
source code itself.
http://community.borland.com/article/0,1410,33004,00.html
* Getting Reacquainted with the Father of C#
Derek Ferguson, Editor-in-Chief of .NET Developer's Journal, talks to
Anders Hejlsberg, the Distinguished Engineer responsible for the
creation of the C# programming language, at Microsoft's Tech Ed 2004.
http://www.sys-con.com/story/?storyid=48156&DE=1
________________________________________________________________________
Irongut's Delphi Pages
Dedicated to programming with Borland Delphi and Kylix. We have articles
on programming, Borland and Delphi news, source code and components to
use in your applications and more. >> http://www.paranoia.clara.net/ <<
________________________________________________________________________
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.paranoia.clara.net/delphi_newsletter.html
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://news.optimax.com/delphi/links/links.exe/click?id=70C517ECAE6E
http://www.programmingpages.com/?r=latiumsoftwarecomenpascal
http://top100borland.com/in.php?who=20
http://top200.jazarsoft.com/delphi/rank.php3?id=latium
It's just a few seconds for you that REALLY mean a lot to us.
Don't forget we also need articles and there are prizes available for
contributions. All articles will be considered, send them to:
<pascal-newsletter-owner@yahoogroups.com>
We are also looking for shareware authors who would like to offer their
components or applications as prizes for articles in the newsletter. In
return you will be promoted in the newsletter and website. For more info
contact: Dave Murray <irongut at vodafone dot net>
________________________________________________________________________
If you haven't received the full source code examples for this issue,
you can get them from http://www.paranoia.clara.net/downloads/p0053.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.paranoia.clara.net/legal.html
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.paranoia.clara.net/delphi_newsletter.html
Group Home: http://groups.yahoo.com/group/pascal-newsletter/
Subscribe: pascal-newsletter-subscribe@yahoogroups.com
Unsubscribe: pascal-newsletter-unsubscribe@yahoogroups.com
Problems with your subscription? pascal-newsletter-owner@yahoogroups.com
________________________________________________________________________
Ironguts Delphi Pages: http://www.paranoia.clara.net/
Latium Software: http://www.latiumsoftware.com/en/index.php (down)
Copyright 2005 by Ernesto De Spirito + Dave Murray. All rights reserved.
________________________________________________________________________