The Unofficial Newsletter of Delphi Users - Banner

Downloadable UNDU Issues Delphi User Groups

News Page

May 25, 1998

A bunch of great stuff today...

First, we have a quick tip by Jorge Turiel on making multi-line hints in Delphi.

Next, an interesting discussion by Clinton Johnson on the failings of TImageList. I haven't yet confirmed some of the details, but it is a very interesting read. He calls the article: Here Thar be Dragons!

Next, Lanny Grim encountered a number of problems dealing with conversions of DateTime values from Delphi 1 and Delphi 3 (they store them a litttle differently). His solution was a Universal Date/Time class that makes the conversions a snap.

And finally, Angus Johnson presents an in-depth discussion of disk space and cluster usage in FAT32. A very interesting article... Check it out in Getting to the Bottom of FAT32...

May 11, 1998

A little bit of catch up work...

First, as most of you are probably aware, Borland has changed its name to Inprise Corporation. It seems primarily intended to show their focus on distributed object computing. What this means for Delphi is still unclear however. It may be just a simple name change, but who knows. If you want to learn more, you can check out their renamed web site at http://www.inprise.com (formerly http://www.borland.com).

This month, I will again be giving out several prizes for randomly selected contributors from last months UNDU articles. The winners are as follows:

For his article on Controlling Application Startup in Delphi 3, Evan Simpson wins a copy of Wise Installation System Version 6.0 - Enterprise Edition.

Wei Bao (Inside the Delphi 3 Package) and Michael Van Canneyt (Explanation of Graphics in RichEdit) both win a copy of Pythoness Software's PSetting system. PSetting is a great set of tools that makes it easy to let your application maintain settings, window positions, preferences, MRU lists, and much more.

And finally, Stanislav Holenda (Digital Sound Part II), Clinton Johnson (Hooking into the VCL), and Matt Hamilton (Using TDataSource to Improve Your User-Interface) all win copies of Swirl Development's PowerSetup 98.

And now on to new things!

As many of you have learned by now, Delphi Packages are, at their core, really just dynamic link libraries (DLL's). Alexander Mehlhorn brings us an interesting discussion about Dynamically Loading Packages at Runtime.

Roberto Gerola- rogerola@tin.it presents a number of interesting components primarily for Delphi 1. First, there is a component called TIDSFormAsst which allows you to have a background image (centered, stretched or tiled) on your form. Next, is a component called HorzList which allows you to have a horizontal scroll bar on a TListBox component. Then, a few database components... DBScroll which is a scrollbar navigator that allows you to rapidly move through records in a table and finally, NQuery and NTable which allow you to easily reference the record number of a TQuery or TTable (for Paradox and dBase files).

And lastly, I have made a number of updates to the Users Group Page. Please feel free to email me if you have changes or additions you would like to make!

In order to keep the size of the News Page to a minimum, I will be archiving previous months and listing them at the bottom.
News Page for April, 1998
News Page for March, 1998
News Page for February, 1998


The Unofficial Newsletter of Delphi Users - Tips & Tricks

Articles, Tips & Tricks

Below is a comprehensive list of links to all the Articles, Reviews, and Tips & Tricks published in The Unofficial Newsletter of Delphi Users. Because of the number of articles and tips & tricks in past issues, this will be a work in progress, so please keep checking back for updated links.

05/25/98 - Multi-Line Hints
05/25/98 - A Universal TDateTime Class
05/25/98 - Here Thar Be Dragons!
05/25/98 - Getting to the Bottom of FAT32
05/11/98 - Dynamically Loading Packages
04/22/98 - Controlling Application Startup in Delphi 3
04/22/98 - Inside the Delphi 3 Package
04/22/98 - Digital Sound in Delphi Part II
04/17/98 - Multiple Lines of Text in a String Grid - Improved!
04/17/98 - Auto Upgrading!
04/17/98 - Piggybacking Event Handlers with Components
04/15/98 - Using TDataSource to Improve Your User-Interface
04/15/98 - Hooking Into the VCL
03/26/98 - Using TMediaPlayer to Manage Multiple CDRoms
03/26/98 - Beziers and Paths
03/26/98 - Windows Hooks
03/25/98 - WinHelp Office Review
03/18/98 - Creating Shortcuts in Delphi
03/18/98 - Can't Have Too Much WinInfo!
03/18/98 - Drawing on a TEdit Control
03/18/98 - Borland's Tech Sheets
03/17/98 - Extending the Moving/Resizing Technique
03/17/98 - Using the Clipboard with WAV Files
03/11/98 - Determining CPU Type
03/11/98 - Compressing 256 Color BMPs
03/06/98 - Moving and Sizing Controls at Runtime
02/28/98 - Digital Sound & Music in Delphi
02/26/98 - Accessing the Win95 FindFiles Dialog
02/23/98 - Improving Cut, Copy & Paste
02/23/98 - Giving Your EditBoxes Some Attention
02/21/98 - Delphi 3's Code Parameters
02/21/98 - CD Change Notifications
Issue #24 - Speeding Up Master-Detail Tables
Issue #24 - Beginners Block: An Introduction to Pointers
Issue #24 - NIL Pointers: How Delphi Frees Objects
Issue #24 - RGB & HSL Colour Models
Issue #24 - More on Moving From VB to Delphi
Issue #24 - A Second Look at MicroEdge's Visual SlickEdit
Issue #24 - Delphi and the Year 2000
Issue #23 - Playing and Recording Sounds in Delphi
Issue #23 - An Immediate IF Function
Issue #23 - Two Lines of Text in a String Grid
Issue #23 - A Simple Drawing Program
Issue #23 - Finding the Cursor Coordinates in a Memo Control
Issue #23 - A Browse Directory Component
Issue #23 - Changing Event Handlers at Runtime
Issue #23 - Book Review: Hidden Paths of Delphi 3
Issue #23 - Book Review: Building Delphi 2 Database Applications
Issue #23 - Review: Raize Components
Issue #23 - Making the Move: VB to Delphi
Issue #23 - Add a Web Search Engine to Your Application
Issue #22 - Bitmaps in String Grids
Issue #22 - A Cure for Previous Instance Problems
Issue #22 - A Word Search Tip
Issue #22 - Unbridled Acceleration
Issue #22 - Showing the Caret Position
Issue #22 - Using the Win95 Registry
Issue #22 - Wallpapering MDI Forms
Issue #22 - The InputQueryEx Function
Issue #22 - Exceeding the Data Segment
Issue #22 - Delphi 2.0 and 3.0 on the Same Computer
Issue #22 - Review: Programmers Guild Animated Tray Icon
Issue #22 - Review: MicroEdge's Visual SlickEdit
Issue #22 - Review: IniOut Component
Issue #22 - Review: Addict 2.2 Spell Checker for Delphi
Issue #22 - Getting Control of the Control Panel
Issue #21 - Low-Level Windows Stuff
Issue #21 - Listing Procedures
Issue #21- Hiding Apps from the TaskBar
Issue #21 - Excel OLE Tips
Issue #21 - Playing Sounds Asynchronously
Issue #21 - Bitmaps on StringGrids
Issue #21 - How to Find Up-To-Date Delphi Books
Issue #21 - Using the Margin Marker in Delphi 1 & 2
Issue #21 - Lock Violations Revisited
Issue #21 - Object Creation Tip
Issue #21 - How To Compress a Bitmap
Issue #21 - The TEndSession Component
Issue #21 - Video Capture and Delphi
Issue #21 - Review: Delphi Component Design
Issue #20 - Is Someone Else Running? Revisited!
Issue #20 - InputQueryEx Function
Issue #20 - Multi-Colored Text in a String Grid
Issue #20 - Converting Pascal Source to HTML
Issue #20 - Processing Large Database Tables
Issue #20 - Making Your App Look Normal at Different Resolutions
Issue #20 - How to Make Your EXE's Lighter!
Issue #20 - Win95 Shell Operations - Update
Issue #20 - Form Aspect Ratio
Issue #20 - Previous Instances - Revisited
Issue #20 - Printing Raw Data
Issue #20 - Implementing a "Tip Of The Day" Component
Issue #20 - TFieldPanel
Issue #20 - TPageControl - Update
Issue #20 - Learning How To Drive: Disk Information in Delphi
Issue #20 - Delphi Books and Periodicals
Issue #19 - Using Win95's SHFileOperation to Move/Copy/Delete Files
Issue #19 - How to Create a Polygon Splash Screen
Issue #19 - Is Someone Else Running?
Issue #19 - Lock Violation Errors in Paradox
Issue #19 - Printing Directly to the Printer
Issue #19 - Refreshing MDI Menus
Issue #19 - Extending the Background Bitmap Technique
Issue #19 - Paradox File Size Limits
Issue #19 - Safer Use of Enumerated Types
Issue #19 - Simplifying Code Management with Include
Issue #19 - A Look at the TreeView Component
Issue #19 - Aligning Text in a Grid
Issue #19 - TPageControl
Issue #19 - Big Bitmaps
Issue #19 - Transparency Masks
Issue #19 - Review: SpeedDaemon Code Profiler
Issue #19 - A Look at MagiKit
Issue #19 - Humor: Are you Computer Illiterate?
Issue #18 - Storing Fonts in INI files
Issue #18 - Sorting Columns in a DBGrid
Issue #18 - Adding UNDU to an Edit Menu
Issue #18 - Put Anything in Your Delphi EXE!
Issue #18 - A Simple Clipboard Viewer
Issue #18 - Object Express by OopSoft
Issue #18 - Announcement: IniOut Component
Issue #18 - Book Review: Delphi Component Design by Dany Thorpe

More links to come! To see the material in Issues 1 through 17, click here.


Dynamicall Loading Packages

The Unofficial Newsletter of Delphi Users - by Robert Vivrette

Dynamically Loading Packages

by Alexander Mehlhorn - ahm@global.co.za

Its been a while since last I wrote an article, yet even then it was in German rather than in English.

The issue I want to talk about today is Packages. Now we are all not new to Delphi Packages. Yet has anyone ever tried to create his own for his own Application ? Why would I do that, if I could, you ask; well you might find the following reasons appealing:

On a Network with many Users you don't have to log anyone out when redistributing a part of your application if it is in Package format.

  • The Size of your Main Application is very small and will stay that way.
  • The Memory used is smaller than anything you have ever seen as each package loaded gets disposed afterwards again.
  • The speed at which your application executes is fast compared to the size of work your application can handle.
  • Unlike DLL's the Packages don't have to be there for your Application to run. Never mind if you load the Package Names of a database or inifile then you could even just added while the application is running and you can see it the next time around.

I have created a template for my Package Forms which you can install into Delphi and reuse afterwards by pressing New on Delphi's File Menu. I wanted my Forms to appear inside a Panel on the Mainform of my Application (similar to Outlook). Therefore I created a new type of Form that does not contain huge pointers all around and is actually (even thought it looks different in design) not a Form but a Scrollbox. You might know that a scrollbox is the face of the form which is the reason I used it.

Now when I create a new Package and add one of those types of forms into it then I can compile the package (without installing it into Delphi... that presents other problems...) Now I have created a component that is a TPanel but it acts as the Owner of any Package Form once the Package gets loaded. I drop this one onto the Mainform. Then I have a unit that will be compiled with the Package as well as the Application. This unit is responsible for automatically adding the Form within the Package onto the Panel when the Package gets loaded.

And if you have a look at my example it does exactly that. Now you can actually go around and play with packages that get loaded dynamically into your Application.

One additional thought. You have to set compile using packages to on. Even if it will not actually link into your packages the application needs to be able to support their loading.

Where I work we have used it quite extensively. Our Main Application never really changes anymore. Our Database Interface component resides there and the actual look and feel of the App. In the packages we have our forms that load and dispose themself upon a change in the Menu Navigation. Everything is fast and reliable and things never really go wrong. I am not 100% finished with this Idea but I need input from people who are interested in using it. It works fine but the talking between Application and Package is not always that easy. I do have workarounds for them but to explain them all would simply take to long if you have not seen it in action.

Try it out for yourself and send me an email if you have a wider interest than that. An example is on my homepage on the download area at http://www.global.co.za/~ahm. Its called the AHM Package Solution and comes complete with source and example. You can also download the example I have discussed in this article by clicking here.

Also if you do any changes please forward them to me and I will see what I can do to post it to everyone around. If you want to get updates about this just let me know and I will keep you posted on their progress.

Thanks!


Getting to the Bottom of FAT32

The Unofficial Newsletter of Delphi Users - by Robert Vivrette

Getting to the Bottom of FAT32

by Angus Johnson - ajohnson@rpi.net.au

Some time ago I created a Win95 utility which displayed disk drive and directory space usage. It also displayed the wasted drive space, or slack. This slack results from the fact that when files are stored on disk, they are stored in clusters or "file allocation units". A cluster cannot be used by more than one file. Therefore, if a file is only a couple of bytes long it will still own the the whole cluster (commonly 32k) on your hard disk, and the remainder of the cluster
cannot be used by another file. With many small files on a disk the slack can run into hundreds of megabytes.

Drive Slack := (No clusters used * cluster size) - (the sum of the size of all files on drive).

The API function - GetDiskFreeSpace - retrieved most of the relevant data I needed for my utility : BytesPerSector, SectorsPerCluster, TotalNumberOfClusters and TotalNumberOfFreeClusters. Cluster Size := BytesPerSector * SectorsPerCluster; Clusters used := TotalNumberOfClusters - TotalNumberOfFreeClusters;
(A recursive function not relevant to this discussion added up all the file sizes on the drive.)

The utility worked well until Win95 OSR2. GetDiskFreeSpace no longer works on FAT32 drives - reporting incorrect cluster sizes and disk sizes. Microsoft created another function - GetDiskFreeSpaceEx - to replace the old one. This new function can now read the total disk size and disk free space on FAT32
disks > 2gigs (as long as it is not networked). I have noticed that this new function does not work on NETWORKED FAT32 disks - reporting 2 gig disks sizes for FAT32 volumes > 2gig! Even explorer gets the wrong sizes. I would call this a Microsoft bug. Anyhow, I presume Microsoft in its wisdom decided that programers no longer needed to be concerned with cluster sizes because the new function does not return cluster sizes! ScanDisk & ChkDsk in OSR2 still
reports cluster size (on local drives) so I assumed it was still possible to get cluster size if I dug a little deeper.

A search of Microsoft Developers Network (MSDN) for FAT32 revealed a new DOS interrupt function - Int 21h Function 7303h Get_ExtFreeSpace (FAT32) which returned all the the information in the old GetDiskFreeSpace...

From MSDN ...

    --------------------------------------------------------------------
    :Int 21h Function 7303h Get_ExtFreeSpace (FAT32)
    :[Windows 95 only.]
    :Returns the total disk space and the free disk space.

    :mov dx, seg Buffer
    :mov es, dx
    :mov di, offset Buffer ;See below
    :mov es:[di].ExtGetDskFreSpcStruc.ExtFree_Level, ExpectLevel
    :mov cx, BufferSize ;See below
    :mov dx, seg DriveName ;See below
    :mov ds, dx
    :mov dx, offset DriveName ;See below
    :mov ax, 7303h ;Get_ExtFreeSpace
    :int 21h
    :jc error_handler ;carry set means error

    :Parameters

    :Buffer:-
    :The address of the buffer at ES:DI that will receive the disk space
    :information.

    :BufferSize:-
    :The size (in bytes) of the buffer.

    :DriveName:-
    :The address of a null terminated string at DS:DX. In real mode, this must
    :be in standard form ("C:\"). In Windows, either the standard name or a
    :universal naming convention form ("\\Server\Share") is acceptable.

    :Return Values:-
    :Clears the carry flag and returns the total disk space and the free disk
    :space of the specified drive, in the form of an ExtGetDskFreSpcStruc
    :(FAT32) structure, to a buffer at ES:DI. It is recommended to initialize
    :the buffer to the level value the application expects to receive.

    :Remarks:-
    :When calling this function with DeviceIoControl, the dwloControlCode
    :parameter must be set to VWIN32_DIOC_DOS_IOCTL (defined as 6 in VWIN32.H).
    :For more information on this, see Using VWIN32 to Carry Out MS-DOS
    :Functions.

    :© 1997 Microsoft Corporation. All rights reserved. Terms of Use.
    --------------------------------------------------------------------

    The relevant structure used by Get_ExtFreeSpace is (from MSDN) ...
    --------------------------------------------------------------------
    :ExtGetDskFreSpcStruc STRUC
    :    ExtFree_Size                      DW    ?
    :    ExtFree_Level                     DW    ?
    :    ExtFree_SectorsPerCluster         DD    ?
    :    ExtFree_BytesPerSector            DD    ?
    :    ExtFree_AvailableClusters         DD    ?
    :    ExtFree_TotalClusters             DD    ?
    :    ExtFree_AvailablePhysSectors      DD    ?
    :    ExtFree_TotalPhysSectors          DD    ?
    :    ExtFree_AvailableAllocationUnits  DD    ?
    :    ExtFree_TotalAllocationUnits      DD    ?
    :    ExtFree_Rsvd                      DD    2 DUP (?)
    :ExtGetDskFreSpcStruc ENDS
    --------------------------------------------------------------------

Not having tried to call DOS interrupts in Delphi before, it took a little effort to work out how to do this. (See also - Learning To Drive by Grahame Marsh - UNDU Issue #20.) However, I now have a function which is a wrapper for Get_ExtFreeSpace which returns the same information as GetDiskFreeSpace for FAT32.

The following program (which bears little resemblance to my utility) demonstrates my new function - GetDiskFreeSpaceFAT32. You can download it by clicking here.

Hope you find this useful!


Here That Be Dragons!

 The Unofficial Newsletter of Delphi Users - by Robert Vivrette

Here Thar Be Dragons!

by Clinton R. Johnson - xepol@poboxes.com

Every once in a while, you run across a feature in Delphi that just seems to cause problems. One such example is the TImageList common control.

True, TImageList IS low on resources, but it comes at a cost: all your images in the TImageList must be of the same dimension. This is because behind the screens, the TImageList creates a common bitmap. The common bitmap is allocated with a fixed width (wide enough for 4 images) that can hold a certain number of images tiled vertically. To add more images to the list, the common bitmap is made longer. It seems innocent, but several problems appear.

We should all remember the problems that an number of Win3.1 drivers had with large bitmaps? You can bet that corners were cut on the 95 drivers too. Lets face it, it is unlikely that the driver designers decided to support a 100,000 scan line bitmap no matter how narrow. You may get lucky, or you may get a buggy driver. (I've already run into this problem using large 16 colour images, so it is still haunting us!)

Palettes? (read 256 colour images) FORGET IT! Palettes just aren't supported. You can't really blame Borland, the documentation does refer to the ability to assign a palette to the common bitmap, but never gets around to mentioning how. Even if you could assign the common palette, all your images would have to use the common palette to work correctly.

Borland avoids the whole problem by mapping 256 colour images down to 16 colours. True, High Colour and True Colour images(16 bits or higher) don't need palettes, but in 16 and 256 colour modes, the images are mapped down to 16 colours again.

Delphi 3's implementation does not support unmasked bitmaps correctly. You can test this by setting the TImageList’s MASKED property to False. You can not save the form. Internally, a second common bitmap is conditionally created based on the MASKED property. It is a monochrome bitmap that stores the mask used when drawing. The source of the problem is that the TImageList component ALWAYS expects the mask bitmap to exist when saving to a stream. This prevents the form from saving or closing in the IDE. The only work around is in the custom property editor. When you load your images into the TImageList, you need to change what it selects as the transparent colour to one not used in the image.

I could go on for pages and pages about the problems related to this control, but I think you get the point. The only condition I would recommend using the TImageList is when you need 16 colour images with transparency, otherwise you would be best advised to avoid it entirely.


A Universal Date/Time Class

The Unofficial Newsletter of Delphi Users - by Robert Vivrette

A Universal Date/Time Class

by Lanny Grim - lgrim@pop.nh.ultranet.com

In my programming efforst, I often found myself using data files with DateTime stored in Delphi 1 format and I was working with Delphi 3. Then I found I wanted to use Dates in Delphi 1 that were created by Delphi 3.

UNIVDT.PAS implements a class TUniversalDateTime to resolve the problems associated with converting from D1 -> D2/3 or from D2/3 -> D1 DateTime
formats. It takes the guesswork and tedium out of it (for me at least). I am provide it below in the homes that others might find it useful.

UNIVDT.PAS is the unit is question and has an explanation of properties and functions at the top of the file. Also included in the zip file is a demo project created in D1. It will load and compile in both D1 and D3. I did not test the demo project in D2, but it should work there as well. The demo shows how the TUniversalDateTime class is instantiated and used.

Click here to download the code and demo project.


Mutli-Line Hints

 The Unofficial Newsletter of Delphi Users - by Robert Vivrette

Multi-Line Hints

Jorge Turiel - eb1fts@arrakis.es

Here is a quick tip!

If you want to have more than a single line hint on a control, for example in a button, put it's ShowHint property to true but don't put anything in it's hint property. Then, in the FormCreate event of the form just do this:

procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.Hint := 'First line'+chr(13)+'Second
line';
End;


Delphi Users Groups

If you run a Delphi Users Group that is not on this list, please feel free to send me an email with the essentials. Please include basic information about where and when the group meets, and particularly any web links you may have to support the group. I am going to keep the info to a minimum so I can include in each issue (or maybe every other issue). I have provided a sample form to help you provide the right information.

Arizona

    Tucson Delphi Users Group - TDug
California
    Orange County Delphi Users Group
    North Bay Delphi SIG
    Delphi SIG of the Sacramento PC User Group
Canada
    Metro Halifax Delphi Developers Group
    The Toronto Area Delphi Developers Association
    Vancouver Delphi Developers Association
Colorado
    Western Slope Visual Developers Group
    Denver Borland Users Group
Iowa
    Central Iowa Delphi Users Group
Kansas
    Kansas City Delphi Users Group
Massachusetts
    The Delphi Developers Group of Greater Boston
Minnesota
    TCPC Delphi SIG
Michigan
    Royal Oak Delphi Users Group
North Carolina
    Research Triangle Park Delphi Users Group
Ohio
    Delphi SIG of the Greater Cleveland PC Users Group
    Columbus Delphi SIG
    Greater Dayton Delphi Group
Oregon
    Oregon Delphi Users Group
Pennsylvania
    Pittsburgh Area Delphi Users Group
    Borland Technologies User Group
Utah
    Salt Lake City Delphi Users Group


Tucson Delphi Users Group

Group Name: | Tucson Delphi Users Group - TDug
Person(s) in Charge: | Matthew J. Brock, Oscar Speed
Meeting Date/Time: | Third Saturday of each month, 9:00am-10:00am
Meeting Location: | DRA Software Training Center, 3434 E. 22nd St. Suite 100, Tucson, AZ
Dues: | Free
Email Address: | mjb@azstarnet.com
Phone Number: | 520-571-7203
Internet URL: |
Description: | One or more presentations, Q&A, Product Reviews


Orange County Delphi Users Group

Group Name: | Orange County Delphi Users Group
Person(s) in Charge: | Greg Stevenson
Meeting Date/Time: | Fourth Tuesday of each month at 7:00 pm
Meeting Location: | See Web Site
Dues: | See Web Site
Email Address: | See Web Site
Phone Number: | See Web Site
Internet URL: | http://www.ocdelphi.org
Description: |


North Bay Delphi Special Interest Group

Group Name: | North Bay Delphi Special Interest Group
Person(s) in Charge: | Bjarne Winkler
Meeting Date/Time: | Second and Fourth Wednesday of each month from 7:00 pm to 9:00 pm
Meeting Location: |
Dues: |
Email Address: | nts4618086@aol.com
Phone Number: |
Internet URL: |
Description: | Announcements, Q&A, Special topics each meeting.


Delphi SIG of the Sacramento PC User Group

Group Name: | Delphi SIG of the Sacramento PC User Group
Person(s) in Charge: | Robert Muir, Mike Prestwood
Meeting Date/Time: | 2nd Monday of the Month - 6:30pm
Meeting Location: | New Horizons Building, 1215 Howe Avenue, Sacramento, CA
Dues: | None
Email Address: | robertmuir@worldnet.att.net or mike@prestwood.com
Phone Number: |
Internet URL: | www.prestwood.com/forums/delphi/sdug
Description: | Announcements, Q&A, Special Topics each meeting


Metro Halifax Delphi Developers Group

Group Name: | Metro Halifax Delphi Developers Group
Person(s) in Charge: | Dave Hackett
Meeting Date/Time: | First Tuesday of each month from 7:00 pm to 9:00 pm
Meeting Location: | Maritime Life Business Park
Dues: | None
Email Address: | 71650.2646@compuserve.com
Phone Number: |
Internet URL: |
Description: | News, Q&A, Presentations


Toronto Area Delphi Developers Association

Group Name: | Toronto Area Delphi Developers Association (TaDDA!)
Person(s) in Charge: | Henri Fournier (President), Robert Kozak (Membership Director), Ted Nye (Executive Director)
Meeting Date/Time: | First Tuesday of each month
Meeting Location: | North Youk Public Library, Toronto, Ontario, Canada
Dues: | $60/year
Email Address: | membership@TaDDA.com
Phone Number: | 416-366-7150
Internet URL: | http://www.tadda.com
Description: | 3 Hours. Sessions by well known Delphi experts such as Mark Miller, Ray Konopka, Charlie Calvert, etc. and in depth sessions on all aspects of Delphi for New to Advanced users.


Vancouver Delphi Developers Association

Group Name: | Vancouver Delphi Developers Association
Person(s) in Charge: | Michael Li
Meeting Date/Time: | Third Wednesday of each month, 6:30pm
Meeting Location: | Liquor Distribution Branch, 2625 Rupert Street, Vancouver, BC
Dues: | None
Email Address: | mli@infocan.com
Phone Number: | 604-736-5888 x728
Internet URL: | http://www.infocan.com
Description: | Michael Li is usually the main speaker at meetings. Informal setting. Michael's main focus is on Delphi and Borland related topics and discussion, updates on new technology (hardware, software) coming out to the market, updates on books that are useful to particular products (provide evaluation copies for review), information on conferences coming up in Vancouver. May have guest speakers depending on the topic.


Western Slope Visual Developers Group

Group Name: | Western Slope Visual Developers Group
Person(s) in Charge: | Shane Holmes, Software Engineer, ViA Software Services
Meeting Date/Time: | Last Wednesday of each month, 6:30pm
Meeting Location: | ViA Software Services, 743 Horizon Court, Suite 368, Grand Junction, CO 81506
Dues: | None
Email Address: | sholmes@viagj.com
Phone Number: | 970-257-7010, 970-248-9733
Internet URL: | http://www.gj.net/~hap
Description: |


Denver Borland Users Group

Group Name: | Denver Borland Users Group (DeBUG)
Person(s) in Charge: | Ron Kocsis, Chuck Gadd
Meeting Date/Time: | 6:30pm, 2nd Tuesday of the Month
Meeting Location: | Suite #1350 at 5299 E. Prentice Ave, Greenwood Village, CO
Dues: | $30/year
Email Address: | cgadd@cfxc.com
Phone Number: | 303-933-4159
Internet URL: | www.fcxc.com/debug
Description: | Presentation by members or third-party companies.


Central Iowa Delphi Users Group

Group Name: | Central Iowa Delphi Users Group
Person(s) in Charge: | David W. Body
Meeting Date/Time: | Third Thursday of every month at 5:30 pm
Meeting Location: | Offices of Iowa Bankers Association, Liberty Building, 418 6th Ave. Suite 430, Des Moines, Iowa.
Dues: | None
Email Address: |
Phone Number: | 515-984-6243
Internet URL: | http://www.bigcreek.com/delphi
Description: |


Kansas City Delphi User Group

Group Name: | Kansas City Delphi User Group
Person(s) in Charge: | Shawn McDonald, Kerri VanMevern
Meeting Date/Time: | 1st Wednesday of each month, 6:30pm
Meeting Location: | DRT Systems, 4501 College Blvd., Leawood, KS
Dues: | $24/year
Email Address: | mofnet@aol.com
Phone Number: | 913-661-9669 x265
Internet URL: | http://www.kcdelphi.org
Description: | Flexible format includes presentations by members, code reviews, and question and answer


Delphi Developers Group of Greater Boston

Group Name: | Delphi Developers Group of Greater Boston
Person(s) in Charge: | Al Renhart, DisCom Systems
Meeting Date/Time: | Third Monday of each month, 7:00 pm
Meeting Location: | 10 New England Executive Park, Burlington, MA
Dues: |
Email Address: | reinhart@discom.com
Phone Number: | 508-869-6417
Internet URL: |
Description: |


TCPC Delphi SIG

Group Name: | TCPC Delphi SIG
Person(s) in Charge: | Richard Hansen
Meeting Date/Time: | 4th Wednesday of Month, 7pm
Meeting Location: | 2850 Metro Drive, Room 124 - Bloomington, MN
Dues: | None
Email Address: | rickh@artemisalliance.com
Phone Number: | 612-227-7172
Internet URL: | http://www.tcpc.com
Description: | Questions & Answers, Monthlu topic, Focus Groups.


Royal Oak Delphi Users Group

Group Name: | Royal Oak Delphi Users Group
Person(s) in Charge: |
Meeting Date/Time: | First Thursday of each month at 7:00 pm
Meeting Location: | William Beaumont Hospital (Lower Level), Royal Oak, MI. Classrooms in AB-West building.
Dues: | None
Email Address: |
Phone Number: | 810-551-5000
Internet URL: | http://ourworld.compuserve.com/homepages/STNICOL/
Description: | Constructing DLL's, SQL Server 6.5, CGI, Email enabled databases, data collection alternatives, VCL parties, book review night, etc.


Research Triangle Park Delphi Users Group

Group Name: | Research Triangle Park Delphi Users Group
Person(s) in Charge: | Mark Hutchinson
Meeting Date/Time: | Third Wednesday of each month, 5:00 pm
Meeting Location: | New Horizons Computer Learning Center - Willow Oak Bldg, Suite 116, 4625 Creekstone Drive, Durham, NC
Dues: |
Email Address: | aikimark@aol.com
Phone Number: |
Internet URL: | http://www.geocities.com/CapeCanaveral/Lab/1185/rtpdig.html
Description: |


Delphi SIG of the Greater Cleveland PC Users Group

Group Name: | Delphi SIG of the Greater Cleveland PC Users Group
Person(s) in Charge: | Bill Querry
Meeting Date/Time: | Fourth Wednesday of each month, 6:30 pm - 8:30 pm
Meeting Location: | 2747 SOM Center Rd, Willoughby OH 44094
Dues: | Free for Meetings. $25/year for GCPCUG
Email Address: | bq@bigfoot.com
Phone Number: | 440-944-9980
Internet URL: | http://www.gcpcug.org
Description: | Demos of some feature of Delphi or 3rd Party Add-On. General discussion of user's current projects & problems. Talk about latest magazines/book releases.


Columbus Delphi SIG

Group Name: | Columbus Delphi SIG
Person(s) in Charge: | Rick Ross
Meeting Date/Time: | 2nd Wednesday of every month. 7-9pm
Meeting Location: | 1091 W. Broad St., Columbus, OH
Dues: | None
Email Address: | rickross@compuserve.com
Phone Number: | 614-898-2767
Internet URL: |
Description: | Demonstrations, discussion, and training


Greater Dayton Delphi Group

Group Name: | Greater Dayton Delphi Group (GDDG)
Person(s) in Charge: | Keith Wire
Meeting Date/Time: | Second Thursday of each month
Meeting Location: | Dayton, OH
Dues: | $50/Year
Email Address: | kwire@compuserve.com
Phone Number: |
Internet URL: | http://www.aii-usa.com/gddg
Description: | Sharing of Delphi-related information


Oregon Delphi Users Group

Group Name: | Oregon Delphi Users Group
Person(s) in Charge: | Greg Postlewaite
Meeting Date/Time: | 3rd Monday of every month, 7pm
Meeting Location: | Lorenzen Center, Emanuel Hospital, Portland, OR
Dues: |
Email Address: |
Phone Number: |
Internet URL: |
Description: |


Pittsburgh Area Delphi Users Group

Group Name: | Pittsburgh Area Delphi Users Group
Person(s) in Charge: | Kirk A. Farra
Meeting Date/Time: | Second Thursday of the month at 7:00 pm
Meeting Location: | Mastech Inc.
Dues: | None
Email Address: |
Phone Number: | 412-452-6121
Internet URL: | http://www.nauticom.net/www/kfarra
Description: | We cover Delphi and any related products/tools. Members are exposed to many 3rd party components and have a local support network for Q/A. Members get to review many products before they are released and get information on local job opportunities and contracting positions.


Borland Technologies User Group

Group Name: | Borland Technologies User Group
Person(s) in Charge: | Matt Beckius
Meeting Date/Time: | Undetermined (we are just forming now)
Meeting Location: | Philadelphia, PA
Dues: | Undetermined
Email Address: | Undetermined
Phone Number: | 610-409-8229 extension 8
Internet URL: | http://www.sourcetechcorp.com/borland.htm
Description: | Product Reviews, Demonstrations, Discussions


Salt Lake City Delphi Users Group

Group Name: | Salt Lake City Delphi Users Group
Person(s) in Charge: | Robert Love, John Rendell, Mike Mormondo
Meeting Date/Time: | 3rd Thursday of every month
Meeting Location: | Franklin Covey Headquarters
Dues: | None
Email Address: | slcdug@lovedata.com
Phone Number: | 801-296-0809
Internet URL: | http://www.lovedata.com/delphislc
Description: | Each meeting is different but usually it is a presentation of a new idea or product that relates to delphi. There is a Q/A Session in every meeting to help you move along as well.


Form For Users Groups

If your Delphi Users Group is not mentioned in the list, please take a moment to email me the particulars about your group. To make the information as uniform as possible, please cut and paste this form into an email and send it to me at RobertV@compuserve.com. Please only send one if you are in charge of the group… I don't want to have to wade through 30-40 copies for each group… Thanks!

Group Name:
Person(s) In Charge:
Meeting Date/Time:
Meeting Location (include City & State):
Dues:
Email Address:
Phone Number:
Internet URL:
Brief description of meeting format:


 The Delphi Workout
  • Professional Delphi Training for Under £100
  • One of the World's leading Delphi Trainers
  • Great sessions to enhance your Delphi Skills
  • FREE Full 170 page course book
  • FREE Developers CD with over 1200 tools and components
  • FREE £600 off Borland Tools
  • Sessions in London (Westminster Hall) and Manchester (United Football Club)

    • Zack Urlocker (Borland VP Marketing) says: "A must for Developers who want to take their Delphi skills to the next level. Highly recommended"

    To register:

    Phone:      0800 833022
    Fax back:   0118 954 6978
    E-Mail:     workout@multizone.com
    On-Line:    http://www.multizone.com/workout
    Mail:       The Delphi Workout
                Multizone International
                Caversham Business Centre
                23 Prospect St, Caversham, RG4 8JB.
    When:       19th, 20th March 1998 and other dates TBA

    Course Outline:

    8.30-9.00 Registration

    9.00-9.30 Warming up
    In this section we'll discuss some generic tips to working with Delphi 2 including some focus on exciting new methods of working in Delphi 3

    9.00-9.30 - Delphi Overview
    Delphi 2&3, ObjectPascal, Code Insights, Components, BDE. This session will give a very quick overview of some 32-bits Delphi features, such as Code Insights, the VCL Component Palette/Packages, Data Modules, Form Inheritance, ActiveX controls, and the Database-Form Wizard, etc.

    9.30-10.45 The Top 10 Ways to becoming a better Delphi Programmer
    In this section we'll focus on ObjectPascal, exception handling, and performance optimization, positioning most of this on Delphi 2, but highlighting new better ways to do it in Delphi 3 as well

    9.30 -10.00 - ObjectPascal
    ObjectPascal, Exceptions, Try-Except, Try-Finally, Raise, Assert. This session will start with new ObjectPascal features, followed by the benefits of structured exception handling as the preferred way of error detection, error handling and resource management. All Delphi 2 compatible. At the end of the session, we'll also examine a new Delphi 3 feature called assertions, to support preconditions and error detection.

    10.00-10.45 - 32-bits Efficiency
    Profiling, Algorithms & Datastructures, Language Features. This session will identify the steps of performance optimization: finding bottle-necks, checking algorithms & datastructures, and new 32-bits Delphi language features. A number of examples will illustrate what difference it can make in performance to know and apply the tips and techniques from this session.

    10.45-11.00 Coffee

    11.00-12.30 The Top 10 Secrets to building Rapid Applications
    In this section we'll focus on the developer and his building tools (components, packages and Delphi IDE experts/wizards) to help building Rapid Applications.

    11.00-11.45 - Component Building
    Component Wizard, Properties, Methods, Events. This session will teach the basics of component building, as we focus on the Component Wizard, followed by the creation of a component skeleton, the addition of properties, methods, events and event handlers. We'll move on by installing the component in the Component Palette, or in a Delphi 3-specific package

    11.45-12.00 - Delphi 3 Packages
    Design Time, Run Time, Deployment, Versioning. This session will explain what Delphi 3 packages are, how they can benefit our projects (size of executable), how to make our own custom packages with components, and how to deploy them correctly.

    12.00-12.30 - Experts and Wizards
    IDE, Open Tools API, Experts, Wizards. This session will show how to extend the Delphi IDE itself by using the Open Tools API to write Experts (that plug into the IDE) and Wizards, including some User Interface guidelines for writing Wizards.

    12.30-13.30 Lunch

    13.30-14.00 Unleashing the hidden power of Databases within Delphi
    BDE, Tables, Queries, data-aware components. This session will show the database basics, including tables, queries, data-aware components and how to (re-) create your own tables with ObjectPascal source code.

    14.00-14.45 - The Best of Delphi (UK-BUG)
    A Borland User Group representative will highlight how to unearth the most comprehensive guide (the DIL database) where to find free Delphi Code,
    tools, samples and support.

    14.45-17.00 Building Killer Web Applications
    In this section we'll start by seeing how we can use Delphi 2 for data-aware net development, followed by some next exciting techniques and net development support in Delphi 3.

    14.45-15.10 - Table to HTML
    HTML, Tables, Image Map, Table-layout, Index Fields, Frames. This session will shortly introduce the basic concepts of HTML, followed by a Wizard that can be used to convert the contents (records) of a table to a set of static HTML-pages that can be uploaded to the web.

    15.10-15.30 - CGI and WinCGI
    CGI/WinCGI, GET/POST, State, Debugging CGI. This session will extend our HTML knowledge with the Common Gateway Interface protocol, which is a way to interact between the web client and the web server. Delphi 2 compatible.

    15.30-15.45 Afternoon Tea

    15.45-16.15 - Delphi 3 ActiveForms
    New ActiveForm, Converting existing Forms, Deployment. This session will illustrate how to write, use and deploy ActiveForms on the web, including an example where we publish a table on an ActiveForm on the Internet.

    16.15-17.00 - Delphi 3 C/S WebModules
    WebModule, Dispatcher, PageProducer, TableProducers. This session will demonstrate the Delphi 3 Client/Server-only capabilities of the Web Modules to create and support CGI/WinCGI and ISAPI/NSAPI web server applications, including an example where we connect a database to the web, with options to browse, query and update the database contents.

    17.00-17.30 Cooling Down

    17.00-17.30 - The Future of Delphi (Borland)
    A Borland Product Manager will talk to the audience for half an hour on the future of Delphi... and answer questions from the audience.


Product Reviews & Announcements

I have moved all the announcements and reviews of books, and other Delphi related products to this page. If you have a product you would like to see reviewed, or wish to do a review yourself, please feel free to contact me at RobertV@csi.com.

03/25/98 - WinHelp Office Review
Issue #24 - A Second Look at MicroEdge's Visual SlickEdit
Issue #23 - Book Review: Hidden Paths of Delphi 3
Issue #23 - Book Review: Building Delphi 2 Database Applications
Issue #23 - Raize Components
Issue #22 - Programmers Guild Animated Tray Icon
Issue #22 - MicroEdge's Visual SlickEdit
Issue #22 - IniOut Component
Issue #22 - Addict 2.2 Spell Checker for Delphi
Issue #21 - Book Review: Delphi Component Design
Issue #20 - Delphi Books and Periodicals
Issue #19 - SpeedDaemon Code Profiler
Issue #19 - A Look at MagiKit
Issue #18 - Object Express by OopSoft
Issue #18 - Announcement: IniOut Component
Issue #18 - Book Review: Delphi Component Design by Danny Thorpe

More links to come! To see the material in Issues 1 through 17, click here.


Delphi Job Sites

Below are some of the Delphi Job sites currently available. If you know of others, please let me know about them and I will add a link on this page.

    Employment at Borland/Inprise
    http://www.borland.com/about/hr/

    Borland/Inprise Delphi Jobs Newsgroup
    news://forums.inprise.com/borland.public.delphi.jobs

    Delphi Job Hunter
    http://www.inthemiddle.co.uk/jobhunter/delphi/default.htm

    Mike Strock's Delphi Jobs Site
    http://www.oz.net/~mstrock/delphijobs.html

    Greg Postlewait's Delphi Jobs Site
    http://www.teleport.com/~gpost/djobs

    Richard Fellner's Delphi Job Exchange
    http://www.user.xpoint.at/r.fellner/DELPHIJ.HTM

    Richard Maley's Delphi Jobs Service
    http://www.advdelphisys.com/jobs/jobs_all.html

    Becker Technology, Inc.
    http://www.beckertechnology.com/emplopps.htm

Additional Programming-Related Job Sites
    Jobs for Programmers
    http://www.prgjobs.com

    JobServe UK
    http://www.jobserve.com


The Unofficial Newsletter of Delphi Users - News

News Page

May 25, 1998

A bunch of great stuff today...

First, we have a quick tip by Jorge Turiel on making multi-line hints in Delphi.

Next, an interesting discussion by Clinton Johnson on the failings of TImageList. I haven't yet confirmed some of the details, but it is a very interesting read. He calls the article: Here Thar be Dragons!

Next, Lanny Grim encountered a number of problems dealing with conversions of DateTime values from Delphi 1 and Delphi 3 (they store them a litttle differently). His solution was a Universal Date/Time class that makes the conversions a snap.

And finally, Angus Johnson presents an in-depth discussion of disk space and cluster usage in FAT32. A very interesting article... Check it out in Getting to the Bottom of FAT32...

May 11, 1998

A little bit of catch up work...

First, as most of you are probably aware, Borland has changed its name to Inprise Corporation. It seems primarily intended to show their focus on distributed object computing. What this means for Delphi is still unclear however. It may be just a simple name change, but who knows. If you want to learn more, you can check out their renamed web site at http://www.inprise.com (formerly http://www.borland.com).

This month, I will again be giving out several prizes for randomly selected contributors from last months UNDU articles. The winners are as follows:

For his article on Controlling Application Startup in Delphi 3, Evan Simpson wins a copy of Wise Installation System Version 6.0 - Enterprise Edition.

Wei Bao (Inside the Delphi 3 Package) and Michael Van Canneyt (Explanation of Graphics in RichEdit) both win a copy of Pythoness Software's PSetting system. PSetting is a great set of tools that makes it easy to let your application maintain settings, window positions, preferences, MRU lists, and much more.

And finally, Stanislav Holenda (Digital Sound Part II), Clinton Johnson (Hooking into the VCL), and Matt Hamilton (Using TDataSource to Improve Your User-Interface) all win copies of Swirl Development's PowerSetup 98.

And now on to new things!

As many of you have learned by now, Delphi Packages are, at their core, really just dynamic link libraries (DLL's). Alexander Mehlhorn brings us an interesting discussion about Dynamically Loading Packages at Runtime.

Roberto Gerola- rogerola@tin.it presents a number of interesting components primarily for Delphi 1. First, there is a component called TIDSFormAsst which allows you to have a background image (centered, stretched or tiled) on your form. Next, is a component called HorzList which allows you to have a horizontal scroll bar on a TListBox component. Then, a few database components... DBScroll which is a scrollbar navigator that allows you to rapidly move through records in a table and finally, NQuery and NTable which allow you to easily reference the record number of a TQuery or TTable (for Paradox and dBase files).

And lastly, I have made a number of updates to the Users Group Page. Please feel free to email me if you have changes or additions you would like to make!

In order to keep the size of the News Page to a minimum, I will be archiving previous months and listing them at the bottom.
News Page for April, 1998
News Page for March, 1998
News Page for February, 1998


The Unofficial Newsletter of Delphi Users - Past UNDU Issues

Past UNDU Issues

Below are links to all the issues of UNDU that are currently available to read online. If you want to obtain these same issues in a downloadable format, please check the section on Downloadable UNDU Issues.

Issue #24 - December '97
Issue #23 - September '97
Issue #22 - June '97
Issue #21 - May '97
Issue #20 - March '97
Issue #19 - January '97
Issue #18 - November '96
Issue #17 - October '96
Issue #16 - September '96
Issue #15 - August '96
Issue #14 - June '96
Issue #13 - May '96
Issue #12 - February '96
Issue #11 - January '96
Issue #10 - December '95
Issue #9 - November '95
Issue #8 - October '95
Issue #7 - August '95
Issue #6 - July '95
Issue #5 - June '95
Issue #4 - May '95 (b)
Issue #3 - May '95 (a)
Issue #2 - April '95
Issue #1 - March'95


The Unofficial Newsletter of Delphi Users - Downloadable UNDU Issues

Downloadable UNDU Issues

Since issue #1 in March of 1995, all issues of The Unofficial Newsletter of Delphi Users has been published as Windows Help files. Below are links to each of these files so you can download them individually, or all at once. To speed downloading time, I have Zipped them, so you will need PKUNZIP or an equivalent program to decompress them. If you don't have a ZIP compatible program, you can download just the HLP file.

When you unzip them, I suggest that you put all issues in a single directory. Many of the files have links to other issues and if they are all present together, they will behave normally. Most of the later issues in ZIP file format also have a contents file (*.CNT) which is used to by the Windows help system to display a complete list of all issues available.

Effective January, 1998 - I will no longer be arranging UNDU as "issues", but rather as individual articles that will be posted on the UNDU web site every few days. At some time in the future, I may start packaging these articles as downloadable WinHelp files, but I am not promising anything at this point.

Issue # - Month of Release | Zip File | HLP File
Issue #24 - December '97 | DN971201.ZIP | DN971201.HLP
Issue #23 - September '97 | DN970901.ZIP | DN970901.HLP
Issue #22 - June '97 | DN970601.ZIP | DN970601.HLP
Issue #21 - May '97 | DN970501.ZIP | DN970501.HLP
Issue #20 - March '97 | DN970301.ZIP | DN970301.HLP
Issue #19 - January '97 | DN970101.ZIP | DN970101.HLP
Issue #18 - November '96 | DN961101.ZIP | DN961101.HLP
Issue #17 - October '96 | DN961001.ZIP | DN961001.HLP
Issue #16 - September '96 | DN960901.ZIP | DN960901.HLP
Issue #15 - August '96 | DN960801.ZIP | DN960801.HLP
Issue #14 - June '96 | DN960601.ZIP | DN960601.HLP
Issue #13 - May '96 | DN0596.ZIP | DN0596.HLP
Issue #12 - February '96 | DN0223.ZIP | DN0223.HLP
Issue #11 - January '96 | DN0118.ZIP | DN0118.HLP
Issue #10 - December '95 | DN1212.ZIP | DN1212.HLP
Issue #9 - November '95 | DN1109.ZIP | DN1109.HLP
Issue #8 - October '95 | DN1010.ZIP | DN1010.HLP
Issue #7 - August '95 | DN0831.ZIP | DN0831.HLP
Issue #6 - July '95 | DN0725.ZIP | DN0725.HLP
Issue #5 - June '95 | DN0626.ZIP | DN0626.HLP
Issue #4 - May '95 (b) | DN0524.ZIP | DN0524.HLP
Issue #3 - May '95 (a) | DN0501.ZIP | DN0501.HLP
Issue #2 - April '95 | DN0401.ZIP | DN0401.HLP
Issue #1 - March '95 | DN0315.ZIP | DN0315.HLP


Group Name:
Person(s) in Charge:
Meeting Date/Time:
Meeting Location:
Dues:
Email Address:
Phone Number:
Internet URL:
Description: