Home

News

Articles

Forums / Groups

Mozilla-Delphi Project

Pascal Newsletter
Issue 54
Back Issues

Software

Links

Search

Vote For Us:
Irongut's Delphi Pages
Pascal Newsletter

Contact Details

Legal Stuff

News Archive
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.
________________________________________________________________________
  
Copyright © 2005 Ernesto De Spirito and Dave Murray. All Rights Reserved.