Posted by jpluimers on 2009/10/27
I like enumerated type a lot.
The allow you to perfectly describe what the members of such a type actually mean, much more readable than a bunch of integer constants!
Given an enumerated type like TTraphicLightColors
type
TTraphicLightColors = (Red, Orange, Green);
I always wondered why - since the for ... in statement was added to the structured statements part of the Delphi language – it is not possible to use a for … in statement like the this:
</span>
<pre>var
TraphicLightColor: TTraphicLightColors;
begin
try
for TraphicLightColor in TraphicLightColor do
ShowValueAsTraphicLightColor(Ord(Value));
// [DCC Error] EnumerationEnumeratorDemoProcedures.dpr(63): E2430 for-in statement cannot operate on collection type 'TTraphicLightColors'
end;
Somehow, for … in expects a collection type.
A request for the for … in do on enumerated types compiler feature is in QC, but it is closed with reason “Won’t do”.
Back in Delphi 2007, I tried working around this by writing a type implementing the GetEnumerator pattern myself, but got Internal Errors when compiling anything but the most basic sample.
Until today, where I found how I could get that most basic sample to work!
It is an example on how you could implement this: it is research, so you decide if you find the result practical enough to use yourself.
Read the rest of this entry »
Posted in Delphi, Development, Software Development | 15 Comments »
Posted by jpluimers on 2009/10/19
Operator overloading is a very nice feature of the Delphi language.
However. the Delphi documentation on Operator overloading is not completely right.
Below is my table of what I found out so far, and some notes.
It is part of my “Nullable types in Delphi” session that I gave on some conferences.
The downloads for that session contain more detailed information.
This is just an abstract to get you going and a try to answer this operator overloading question on Stackoverflow.
Download the full presentation to get more in depth information.
Let me know if you need more information.
Notes
Operator overloading
Add your own “behaviour” to operators
- Win32: Works only for records, not classes!
- An operator and the operand(s)
are being implemented worden by a “class operator”;
this is a kind of class method with name and argumen(s)
Example:
- Multiplication X : = A * B;
- Operator: *
- Name: Multiply
- Operands: 2 -> two parameters
type
TMyRecord = record
class operator Multiply(A, B: TMyRecord): TMyRecord;
end;
Documentation is not correct!
Watch the result type of comparison operators!
Tips:
- Some operators should be overloaded pair-wise
= and <>
shl and shr
< and >=
> and <=
dec and inc
+ and -
/ and *
div and mod
- Prefer Explicit over Implicit operators
- Beware of the built-in type coercion (implicit operators)
- e.g
- Byte to Integer;
- Integer to Double;
- Variants from/to anything!
Table of operators
| operator |
# |
usage |
name |
cagetory |
* |
| and |
2 |
R := A and B; |
BitwiseAnd |
bit |
|
| not |
1 |
R := not A; |
//BitwiseNot |
bit |
glitch: does not exist! |
| or |
2 |
R := A or B; |
BitwiseOr |
bit |
|
| xor |
2 |
R := A xor B; |
BitwiseXor |
bit |
|
| () cast |
1 |
R := TValue(A); |
Explicit |
conversion |
|
| := |
1 |
R := A; |
Implicit |
conversion |
|
| operator |
# |
usage |
name |
category |
* |
| round |
1 |
R := Round(A); |
Round |
function |
|
| trunc |
1 |
R := Trunc(A); |
Trunc |
function |
|
| and |
2 |
R := A and B; |
LogicalAnd |
logical |
|
| not |
1 |
R := not A; |
LogicalNot |
logical |
|
| or |
2 |
R := A or B; |
LogicalOr |
logical |
|
| xor |
2 |
R := A xor B; |
LogicalXor |
logical |
|
| operator |
# |
usage |
name |
category |
* |
| + |
2 |
R := A + B; |
Add |
binary |
|
| / |
2 |
R := A / B; |
Divide |
binary |
|
| div |
2 |
R := A div B; |
IntDivide |
binary |
|
| mod |
2 |
R := A mod B; |
Modulus |
binary |
|
| * |
2 |
R := A * B; |
Multiply |
binary |
|
| - |
2 |
R := A – B; |
Subtract |
binary |
|
| operator |
# |
usage |
name |
category |
* |
| shl |
2 |
R := A shl B; |
LeftShift |
binary |
name is confusing |
| shr |
2 |
R := A shr B; |
RightShift |
binary |
name is confusing |
| - |
1 |
R := -A; |
Negative |
binary |
|
| + |
1 |
R := +A; |
Positive |
binary |
|
| dec |
1 |
Dec(A); |
Dec |
self |
|
| inc |
1 |
Inc(A); |
Inc |
self |
|
| operator |
# |
usage |
name |
category |
* |
| = |
2 |
R := A = B; |
Equal |
comparison |
|
| > |
2 |
R := A > B; |
GreaterThan |
comparison |
|
| >= |
2 |
R := A >= B; |
GreaterThanOrEqual |
comparison |
|
| < |
2 |
R := A < B; |
LessThan |
comparison |
|
| <= |
2 |
R := A <= B; |
LessThanOrEqual |
comparison |
|
| <> |
2 |
R := A <> B; |
NotEqual |
comparison |
|
–jeroen
Posted in Conferences, Delphi, Development, Event, Software Development | Leave a Comment »
Posted by jpluimers on 2009/10/15
There are quite a few registry tricks that you can perform to influence the Delphi IDE.
If you have any registry settings to share, please let me know by posting a comment below, or filling out the contact form.
This summary will be enhanced over time:
Have fun with them!
–jeroen
Posted in Delphi, Development, Software Development | 2 Comments »
Posted by jpluimers on 2009/10/15
Finding the correct VERxxx conditional define for a particular Delphi version is asked by a lot of people.
Even the first link in the above search, does not contain the full list!
But: JCL comes to the rescue
The JCL file JEDI.INC usually (read: like 99.999% of the time) is up to that with that information soon.
Currently, it contains all the defines starting with Delphi 1, up to Delphi 2010.
You can always browse the to JEDI.INC with this link to the sourceforge trunk.
In fact that file contains a lot more useful defines.
Actually, having the JCL and/or JVCL at hand is a very good practice: it is filled with high quality code that solves a lot of everyday problems.
Note:
VER190 (by some people attributed to the wrong Delphi version) is only used by Delphi 2007 for .NET (Delphi 2007 for Win32 used VER185 by itself and shares VER180 with Delphi 2006 for Win32).
The number 13 (in between Delphi 2009 aka Delphi 12, and Delphi 2010 aka Delphi 14) was never used as a Delphi version number
Since Delphi is mainly developed in the USA, and since a lot people there have Triskaidekaphobia, they showed mercy to those and skipped Delphi 13.
–jeroen
Posted in Delphi, Development, Software Development | 6 Comments »
Posted by jpluimers on 2009/10/15
Recently we got involved with a client having a large and complex application that (historically) consists of
- A main .EXE that loads
- Many DLLs
- Underlying BPLs
One of the biggest problems is debugging the startup sequence.
Somehow, when the Delphi IDE loads DLLs in the initialization sequences of units, it looses its ability symbol tables.
This article describes a few tips on how to debug those, especially where to put breakpoints.
Read the rest of this entry »
Posted in Debugging, Delphi, Development, Software Development | 3 Comments »
Posted by jpluimers on 2009/09/29
Nick Hodges just posted he has become the tpfsadmin on sourceforge: the administrative account for the Turbo Power tools and libraries.
It is not an officially sponsored Embarcadero thing, but at best semi official.
However, it is an admirable step into getting the Turbo Power tools and libraries updated in one central place again.
Those tools include OnGuard, Orpheus, SysTools, FlashFiler, B-TreeFiler, Async Professional and many others.
So if you have your own fork of any of the Turbo Power code from sourceforge, then please drop Nick a note.
Many thanks to Nick!
–jeroen
Posted in .NET, Database Development, Delphi, Development, Software Development, Source Code Management, SourceForge, Web Development | 1 Comment »
Posted by jpluimers on 2009/09/28
At the EKON13 conference, I will be presenting a talk about record and class helpers.
This morning, my laptop did “beeeeeeep beep beep” followed by a deadly silence.
It will take a while before my spare laptop arrives at the hotel and my Vista and VM’s are working again.
So I needed to redo some of my preparations to make sure that I can do a ‘plan B’ if restoring on the spare laptop fails.
Hence below a list of useful links, not yet in a particular order, but it saves you browsing through search engine results sifting the good from the not so good info.
Posted in .NET, Delphi, Development, EKON, Event, Software Development | Leave a Comment »
Posted by jpluimers on 2009/09/18
Somehow, CodeCentral managed to not only delete my uploaded CodeRage 4 session materials (the videos are fine!), but also newer uploads with other submissions.
Since I’m in crush mode to get the BASTA! and DelphiLive 2009 Germany sessions done, and all Embarcadero sites having to do with their membership server perform like a dead horse, I have temporary moved the downloads, and corrected my earlier post on the downloads.
I have notified Embarcadero of the problems, so I’m pretty sure they are being addressed on their side as well.
Edit 20090919: Embarcadero indicated that between 20090913 and 20090914 there has been a database restore on CodeCentral. Some entries therefore have been permanently lost.
When I get back from the conferences, and CodeCentral is more responsive, I’ll retry uploading it there, and correct the posts.
In the mean time, be sure not to save shortcuts to the current locations, as they are bound to change.
The are the new download locations can all be found in my xs4all temporary CodeRage 4 2009 download folder.

This is the full list of my CodeRage 4 sessions and places where you can download everything: Read the rest of this entry »
Posted in .NET, CodeRage, CommandLine, Conferences, Database Development, Debugging, Delphi, Development, Encoding, Event, Firebird, ISO-8859, ISO8859, InterBase, Prism, SQL Server, Software Development, UTF-8, UTF8 | 1 Comment »
Posted by jpluimers on 2009/09/13
Embarcadero has made available the replays of the CodeRage 4 sessions.
You can find them in the CodeRage 4 sessions overview.
In order to download them from that overview, NOTE: To access this session replay, you must be logged into EDN. you can login or sign-up (which is free).
To make it easier to find all the relevant downloads, below is an overview of my sessions and their links.
Let me know what you use it for, I’m always interested!
Update 20090918: changed the download locations because CodeCentral messed up.
Read the rest of this entry »
Posted in .NET, C#, C# 2.0, CodeRage, CommandLine, Conferences, Database Development, Debugging, Delphi, Development, Encoding, Event, Firebird, ISO-8859, ISO8859, InterBase, Java, Prism, Software Development, UTF-8, UTF8, Visual Studio and tools, XML, XML/XSD, XSD | 4 Comments »