Delphi 6 introduced a number of improvements to Code Completion, which was
originally delivered as part of Delphi 3s Code Insight feature set. The most obvious
improvement is that Code Completion now appears as a color-highlighted, resizable window. It is
also typically more responsive than it was in Delphi 5, and it incrementally
reduces the options offered as you continue to type.
There are more new Code Completion features than these. You can find out
more about them and see them in action at
http://www.geocities.com/delphihelp/info/CodeInsight.htm,
which is part of Steve Trefethens
Web site. Steve is a member of Borlands Delphi R&D team.
The reason for this article is that one of these new Code Completion features
--
which is mentioned on Steve's Web page and in Delphis online help -- does not work in a normal installation of Delphi 6 (with or without
Update Pack 1
installed). The R&D people are rightly very proud of this feature, but since
the installation program does not set it up correctly, we Delphi programmers are
missing it. This article describes the missing feature and explains how to
enable it.
You can download the utility project described in this article from
Code
Central.
THE MISSING FEATURE
This is the definition of the missing feature, as specified in the Delphi 6 help for Code
Completion:
On a blank statement line, press Ctrl+Space to display
symbols from additional RTL units even if they are not used by the current
unit.
The Whats New help file says much the same thing:
When you manually
(Ctrl+Space) invoke code completion on a blank statement line
in the body of a routine, the pop-up list box now shows symbols from additional RTL
units even if they are not used by the current unit.
This enhancement was made to allow you to keep typing code, using Code Completion
when you couldnt remember the exact identifier name (or didnt want to manually type
it all) without being obliged to keep jumping to the uses clause
first to make sure it has the correct unit listed.
In fact, if you select something from the Code Completion list that
comes from a unit not already in your uses clause, that unit name will
automatically be added to it for you.
Note that this applies only when Code Completion is explicitly invoked with
Ctrl+Space, and has no effect on the normal auto-invoked Code Completion
(which pops up automatically when you type an object reference or record variable and
then a full stop).
THE PROBLEM
The full list of units that Code Completion is prepared to look in should be
stored in this registry entry:
HKEY_CURRENT_USER/Software/Borland/Delphi6.0/Code Insight/ExtraUnits
Unfortunately, this entry does not get set up by the Delphi installer, so the
feature is not enabled by default. Instead, probably due to an oversight, the installer
sets up an entry:
HKEY_CURRENT_USER/Software/Borland/Delphi6.0/CodeCompletion/ExtraUnits
This entry contains what looks like a healthy list of semicolon-separated unit
names for the described purpose, but there is a variety of problems with it:
- It is installed in the wrong registry key (
CodeCompletion instead
of Code Insight).
- It contains a typo in one of the unit names: the HelpIntfs unit has a semicolon
in the middle of it, making it references to two non-existent units: Help and Intfs.
- It contains DelphiMM, which is not a unit but a DLL project file.
- It contains StdMain, which is not a unit supplied with Delphi.
- It contains some pointless units, which are always implicitly used by all Delphi
source files anyway, namely System and SysInit.
Each of these problems (other than the last) causes a
problem. The fact that the value is in the wrong key means that no extra units are
searched at all. The erroneous entries in the list mean that even if it were in the
right key, Code Completion would still fail to appear when invoked with
Ctrl+Space, because an errant or non-existing unit in the list completely
breaks manually invoked Code Completion. Both problems have been reported, but the
problem is not rectified by
Delphi 6 Update Pack 1.
THE SOLUTION
We can bring the feature into play ourselves by creating the
missing registry entry and ensuring that only valid unit names are in the list. The project
CodeCompletionSettings.dpr accompanies this article and implements a utility program
that lets you set up this missing functionality.
The program allows you to set up the list of extra units as required. It also supports
tailoring of the colors used in the Code Completion window, as described in the Code
Completion help. These colors are stored in the same registry key as the correct location
for the extra units to search. One additional feature it lets you control is whether Code
Completion will add parentheses when entering the name of a routine that expects parameters
to be passed. Delphi does this for you by default, but you can disable the
feature if you wish.
You can see the program running below.
The code that sets up the extra units reads the appropriate registry entry and shows the
current value (which will be blank by default), offering to set up a corrected version
of the erroneously placed default unit list if required. You can then add units
to the list or remove unwanted units as needed.
Note that each time you press Ctrl+Space, Delphi re-reads the registry entry,
so you can modify the value with this new program while Delphi is running and it will
instantly take note of units you add. Just remember that if Code Completion suddenly
refuses to appear, it is most likely because you have an invalid or non-existent unit in
the list.
The screenshot below shows Code Completion being used in a fresh project with just a
button on it. Since ComObj is in the list of extra units stored in the registry, Code
Completion will show CreateOleObject (which is declared in the ComObj unit)
and, if chosen, will add ComObj to the uses clause automatically.
ABOUT BRIAN LONG
Brian Long used to work at
Borland UK, performing a number of duties including
technical support on all the programming tools. Since leaving in 1995, Brian has been
providing training and consultancy services to the Delphi and C++Builder communities, and the
newly forming Kylix community.
If you need training in these products, or need solutions to problems you have with them,
please get in touch, or visit
Brian's Web site.
Besides authoring a
Borland
Pascal problem-solving book published in 1994, Brian is now a regular columnist in
The Delphi Magazine and has had numerous
articles published in Computing,
Delphi Developer's Journal,
Linux Format, Developers Review and EXE Magazine.
In his spare time (and waiting for his C++ programs to compile) Brian has
learned the art
of juggling and making inflatable
origami paper frogs.