Archive for the ‘Delphi’ Category
Posted by jpluimers on 2009/08/10
This is the second post of a series of posts around using FastMM4.
The start of the series contains a listing of other posts as well and will be updated when new posts become available.
One of the larger projects I’ve becoming involved in, uses a pattern that uses TDataModule descendants exposing interfaces.
Interfaces in Delphi are nice: if used properly, you have reference counting that will automatically free the underlying objects if there are no references left to them.
When you do not do interfaces in Delphi properly, you are bound to have a lot of memory leaks, and this is one of the cases where we did.
The client choose to do testing and QA very late in the product cycle, and we choose to use FastMM to do memory debugging.
Lo and behold: a truckload of memory leaks appeared all having to do with those datamodules.
As a side node:
Another thing we bumped into at an earlier stage was lifetime management in general: (both interface and object) references were kept to objects long after they were disposed.
That caused a lot of EAccessViolation pain.
It is best not to mix the “interface reference” pattern with the “owned component” pattern: you usually end up with many more EAccessViolation exceptions.
This article is about finding the memory leaks caused by the way the interfaces were exposed from the TDataModule descendants, and a solution for preventing them by introducing the concept of TInterfacedDataModule.
Read the rest of this entry »
Posted in Conference Topics, Conferences, Database Development, Debugging, Delphi, Development, Event, FastMM, Software Development | 10 Comments »
Posted by jpluimers on 2009/07/29
I’m using FastMM in our projects when debugging memory allocations.
It is a great tool, but documentation is sparse.
Hence this post: point to some introductory articles and add some of my own experiences.
Later on, I will show some more advanced use.
These posts are already available in this series:
- Delphi – FastMM: Using FastMM4 for debugging your memory allocations – part 1: Introduction
- Delphi – Using FastMM4 part 2: TDataModule descendants exposing interfaces, or the introduction of a TInterfacedDataModule
So now lets get on with the introduction:
Read the rest of this entry »
Posted in Delphi, Development, FastMM | 23 Comments »
Posted by jpluimers on 2009/07/27
When you add a non-Delphi file to your project, the current (Galileo based) IDE’s add them only to your .dproj file.
But older Delphi’s used to add them to the .dpr file using the (undocumented) {%File pseudo-directive.
When including the file ..\src\Defines.inc, you need this pseudo-directive: {%File ‘..\src\Defines.inc’}
The .dpr import wizard knows about it: if you have a lonely .dpr file using the {%File pseudo-directive, it will be correctly reflected in the .dproj file.
Read the rest of this entry »
Posted in Delphi, Development, FastMM | Leave a Comment »
Posted by jpluimers on 2009/07/23
Sometimes, indexed properties can make your life much easier: they allow you to redirect single properties to central Get/Set methods.
You don’t see it used very often, but when you need it, it is very handy.
There is even some online help on it (look for “Index Specifiers”) it gives you the basics, but no compiling example.
For me it works best when I have a complete, but concise example.
So here is one: TMyIndexedPropertyComponent that has property Range1Value through Range4Value of type TRange, all centralized to one pair of read/write methods: GetRangeValue and SetRangeValue.
Read the rest of this entry »
Posted in Component Development, Delphi, Development, Package Development, Software Development | 2 Comments »
Posted by jpluimers on 2009/07/22
Did you ever get this error message when creating TFrame descendants?

---------------------------
Error Reading Form
---------------------------
Error reading TDioptreFrame.ClientHeight: Property ClientHeight does not exist. Ignore the error and continue?
NOTE: Ignoring the error may cause components to be deleted or property values to be lost.
---------------------------
Ignore Cancel Ignore All
---------------------------
It is odd: TFrame descendants do not have a ClientHeight property!
If you press Cancel, then you get this error message.

---------------------------
Error
---------------------------
Error creating form: Error reading TDioptreFrame.ClientHeight: Property ClientHeight does not exist.
---------------------------
OK
---------------------------
I did, and here is a reason why it can happen.
Read the rest of this entry »
Posted in Component Development, Delphi, Development, Package Development, QC, Software Development | 15 Comments »
Posted by jpluimers on 2009/07/16
I have been using Delphi Frames as visual components for quite some time now.
They make it really easy to use the Delphi IDE to visually design your component.
This makes the development process for creating visual components much easier and faster.
There are some things you need to watch when doing this, so I’ll devote a few blogs posts on this topic over the next couple of months.
A few of the things are:
- When you put components on your frame, and later drop that frame as a component on a Delphi form or frame, the components are visible in the Structure Pane.
- The
Visible property is ignored at design time.
- You need to watch resizing.
- Frames do not have
OnCreate and OnDestroy events.
- Error messages about a missing
ClientHeight property.
- You can still drop other components on your frame.
- … probably some more that I forgot right now…
The first blog on this series is about the first issue:
When you put components on your frame, and later drop that frame as a component on a Delphi form or frame, the components are visible in the Structure Pane.
The bad thing about this is that you can now delete the components on the frame using the structure pane.
This leads to all sorts of problems (mostly access violations).
Read the rest of this entry »
Posted in Component Development, Delphi, Development, Package Development, Software Development | 5 Comments »
Posted by jpluimers on 2009/07/16
I just found out that in my updates to TFS 2008 Folder Comparison Filter for both C# and Delphi projects somehow some backslashes (\) were missing.
Oops, sorry :-)
These backslashes are important when excluding directories: if omitted, TFS thinks you want to exclude a filename in stead of a directory name (see Folder Comparison Filters).
It might be due to the HTML pasting issue that I explained in Including formatted sourcecode in WordPress.
Anyway, here is the correct one that has the backslashes at the right places:
!*.pdb;!*.obj;!*.dll;!*.exe;!*.res;!*.resources;!*.cache;!*.ilk;!*.ncb;!obj\;!objd\;!bin\;!lib\;!*.local;!*.identcache;!*.dcu;!__history\;!*.dsk;!*.~*;!*.stat;!*.drc;!*.map;!*.csproj.user;!*.vbproj.user;!*.csproj.webinfo;!*.vbproj.webinfo;!*.suo;!*.bpl;!*.dcp;!*.log;!*.lck
(Note these all should be on one line when pasting them).
–jeroen
Posted in .NET, C# 2.0, C# 3.0, Delphi, Development, Prism, Software Development, Source Code Management, TFS (Team Foundation System), WordPress | Leave a Comment »
Posted by jpluimers on 2009/07/15
Somehow, at every client I need a function like GetExecutablePath.
Maybe you do too, so here is the code that I adapted a long time ago from the Delphi 2006 RTL:
using System;
using System.Diagnostics;
using System.Reflection;
namespace bo.Reflection
{
public class AssemblyHelper
{
public static string GetExecutablePath()
{
// borrowed from D2006\source\dotNet\rtl\Borland.Delphi.System.pas function ParamStr():
string result;
Assembly entryAssembly = Assembly.GetEntryAssembly();
if (null != entryAssembly)
{
result = entryAssembly.Location;
}
else
{
Process currentProcess = Process.GetCurrentProcess();
ProcessModule mainModule = currentProcess.MainModule;
result = mainModule.FileName;
}
return result;
}
}
}
Enjoy :-)
–jeroen
Posted in .NET, C#, C# 2.0, C# 3.0, Delphi, Development, Software Development, Visual Studio and tools | 2 Comments »
Posted by jpluimers on 2009/07/09
Here is another update for the TFS 2008 Folder Comparison Filter for both C# and Delphi projects:
Exclude .bpl, .dcp, log and .lck files.
So then the search filter becomes this:
!*.pdb;!*.obj;!*.dll;!*.exe;!*.res;!*.resources;!*.cache;!*.ilk;!*.ncb;!obj;!objd;!bin;!lib;!*.local;!*.identcache;!*.dcu;!__history;!*.dsk;!*.~*;!*.stat;!*.drc;!*.map;!*.csproj.user;!*.vbproj.user;!*.csproj.webinfo;!*.vbproj.webinfo;!*.suo;!*.bpl;!*.dcp;!*.log;!*.lck
(Note: this all goes on one line; your web-browser probably wraps this over multiple lines, so you might need to undo that wrapping before pasting it in to TFS).
Have fun with it!
–jeroen
Posted in .NET, Delphi, Development, Software Development, Source Code Management, TFS (Team Foundation System), Visual Studio and tools | Leave a Comment »
Posted by jpluimers on 2009/06/11

I finally had time to get the downloads of the DelphiLive sessions I gave or participated in done.
During DelphiLive, my conference VM containing Delphi 2009 blue-screened, so I had to to use a production Delphi 2009 VM to demo, and get my conference stuff installed on it.
Luckily, I had recent copies of my materials with me.
Back home, work, more conferences and some construction work on our house held me back doing a restore of the conference VM, which I needed for doing a proper merge and upload of the materials.
At last, here are the downloads, see also the page Conferences, seminars and other public appearances:
Read the rest of this entry »
Posted in Component Development, Conferences, Delphi, DelphiLive, Designer Development, Development, Event, Package Development, Software Development | 1 Comment »