I applied update 4 and 5 and the boost update.
Since I didn’t know the exact state my Delphi 2010 was in, I watched the build numbers and the list of items in the Help About box.
Read the rest of this entry »
Archive for the ‘Delphi’ Category
Delphi 2010 build numbers don’t tell you what you have installed
Posted by jpluimers on 2009/12/17
Posted in Delphi, Development | 11 Comments »
Delphi – MD5: the MessageDigest_5 unit has been there since Delphi 2007
Posted by jpluimers on 2009/12/11
I still see a lot of people crafting their own MD5 implementation.
A lot of the existing MD5 implementations do not work well in Delphi 2009 and later (because they need to be adapted to Unicode).
Many of those existing implementations behave differently if you pass the same ASCII characters as AnsiString or UnicodeString.
The MessageDigest_5 unit has been available in Delphi since Delphi 2007.
This is the location relative to your installation directory: source\Win32\soap\wsdlimporter\MessageDigest_5.pas
(Edit: 20091223: Since Delphi 7.01, Indy has provided the unit IdHashMessageDigest which also does md5, see the comments below)
So this unit used by the WSDL, and more importantly: works with Unicode (if you pass it a string with Unicode characters, it will convert them to UTF-8 first).
The unit is not in your default search path, and has not been very well promoted (the only link at the Embarcadero site was an article by Pawel Glowacki), so few people know about it.
Now you know too :-)
Note that MD5 is normally used to hash binary data.
It is not wise to send a non ASCII string through both the AnsiString and UnicodeString versions: because of the different encoding (and therefore a different binary representation), you will get different results depending on the Delphi version used.
A sample of the usage showing the above AnsiString/UnicodeString issue is not present for ASCII strings, nor for ANSI strings: this is because both get encoded using UTF-8 before hashing.
Delphi 2007 did not do the UTF-8 encoding, so you will see different results here.
You will also see that Writeln uses the Console for encoding, and those are different than the code editor.
Edit: 20091216 – added RawByteString example to show that the conversion does not matter.
<br />program md5;<br /><br />{$APPTYPE CONSOLE}<br /><br />uses<br /><%%KEEPWHITESPACE%%> SysUtils,<br /><%%KEEPWHITESPACE%%> MessageDigest_5 in 'C:\Program Files\Embarcadero\RAD Studio\7.0\source\Win32\soap\wsdlimporter\MessageDigest_5.pas';<br /><%%KEEPWHITESPACE%%> // Vista/Windows 7: MessageDigest_5 in 'C:\Program Files (x86)\Embarcadero\RAD Studio\7.0\source\Win32\soap\wsdlimporter\MessageDigest_5.pas';<br /><br />function GetMd5(const Value: AnsiString): string; overload;<br />var<br /><%%KEEPWHITESPACE%%> hash: MessageDigest_5.IMD5;<br /><%%KEEPWHITESPACE%%> fingerprint: string;<br />begin<br /><%%KEEPWHITESPACE%%> hash := MessageDigest_5.GetMD5();<br /><%%KEEPWHITESPACE%%> hash.Update(Value);<br /><%%KEEPWHITESPACE%%> fingerprint := hash.AsString();<br /><%%KEEPWHITESPACE%%> Result := LowerCase(fingerprint);<br />end;<br /><br />function GetMd5(const Value: UnicodeString): string; overload;<br />var<br /><%%KEEPWHITESPACE%%> hash: MessageDigest_5.IMD5;<br /><%%KEEPWHITESPACE%%> fingerprint: string;<br />begin<br /><%%KEEPWHITESPACE%%> hash := MessageDigest_5.GetMD5();<br /><%%KEEPWHITESPACE%%> hash.Update(Value);<br /><%%KEEPWHITESPACE%%> fingerprint := hash.AsString();<br /><%%KEEPWHITESPACE%%> Result := LowerCase(fingerprint);<br />end;<br /><br />var<br /><%%KEEPWHITESPACE%%> SourceAnsiString: AnsiString;<br /><%%KEEPWHITESPACE%%> SourceUnicodeString: UnicodeString;<br /><%%KEEPWHITESPACE%%> SourceRawByteString: RawByteString;<br /><br />begin<br /><%%KEEPWHITESPACE%%> try<br /><%%KEEPWHITESPACE%%> SourceAnsiString := 'foobar';<br /><%%KEEPWHITESPACE%%> SourceUnicodeString := 'foobar';<br /><%%KEEPWHITESPACE%%> SourceRawByteString := 'foobar';<br /><br /><%%KEEPWHITESPACE%%> Writeln(GetMd5(SourceAnsiString));<br /><%%KEEPWHITESPACE%%> Writeln(GetMd5(SourceUnicodeString));<br /><%%KEEPWHITESPACE%%> Writeln(GetMd5(SourceRawByteString));<br /><br /><%%KEEPWHITESPACE%%> SourceAnsiString := 'föøbår';<br /><%%KEEPWHITESPACE%%> SourceUnicodeString := 'föøbår';<br /><%%KEEPWHITESPACE%%> SourceRawByteString := 'föøbår';<br /><%%KEEPWHITESPACE%%> Writeln(SourceAnsiString, ' ', GetMd5(SourceAnsiString));<br /><%%KEEPWHITESPACE%%> Writeln(SourceUnicodeString, ' ', GetMd5(SourceUnicodeString));<br /><%%KEEPWHITESPACE%%> Writeln(SourceRawByteString, ' ', GetMd5(SourceRawByteString));<br /><%%KEEPWHITESPACE%%> except<br /><%%KEEPWHITESPACE%%> on E: Exception do<br /><%%KEEPWHITESPACE%%> Writeln(E.ClassName, ': ', E.Message);<br /><%%KEEPWHITESPACE%%> end;<br />end.<br />–jeroen
Posted in Delphi, Development, Encoding, Hashing, md5, Power User, Security, Software Development, Unicode, UTF-8, UTF8 | 28 Comments »
Fiddler replaying requests to the ASP.NET Development Server: XP works but Vista not, or “when localhost is not 127.0.0.1 in Fiddler 2”
Posted by jpluimers on 2009/12/09
Today, I bumped into something utterly strange: requests replayed through Fiddler 2 to a locally running ASP.NET Development Server on Vista using localhost URLs did not give a connection.
I use ASP.NET from both C# and Delphi Prism. Most of my development work is on Windows XP (see notes below) but I test on many platforms.
Moving one of the projects from XP to Vista, and testing with Fiddler, I found that when using Fiddler 2:
This form of URL fails on Vista, but works on XP: http://localhost:49703
This form of URL works both on Vista, and XP: http://127.0.0.1:49703
So on Vista – contrary to XP – localhost requests from Fiddler were in fact being sent to the external network adapter on Vista, and the 127.0.0.1 requests to the internal network adapter.
Since the ASP.NET Development Server is bound only to the internal network adapter, external requests don’t work (boy, I wish they did, it would make some of my debugging so much easier!).
Posted in .NET, ASP.NET, C#, Delphi, Development, Fiddler, Keyboards and Keyboard Shortcuts, Prism, Software Development, Web Development | 2 Comments »
InterBase 2007: UPPER and collations (and a trick to specify the character set for string literals)
Posted by jpluimers on 2009/12/01
One of the applications that I’m currently involved with will in the future be used in different European countries.
Since it is developed in Delphi 2007, and uses InterBase 2007 we have chosen to use the ISO8859_15 character set: it is a single byte character set very similar to ISO8859_1, but supports the euro sign (€) and some other characters (Š, š, Ž, ž, Œ, œ and Ÿ).
When testing, we found out that UPPER would not always function as we expected.
Hence below some explanation about how UPPER behaves depending on the character sets and collation sequences you specify.
Note: most of this also holds for other versions of InterBase and for FireBird versions, but I have not checked everything with all versions yet, FireBird might be different as this piece of documentation shows.
If anyone does have the results for other InterBase or FireBird versions, please let me know the results.
Posted in Database Development, Delphi, Development, Firebird, InterBase | Leave a Comment »
Delphi – for … in on enumerated data types
Posted by jpluimers on 2009/10/27
I like [Wayback/Archive] 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 [Wayback/Archive] 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 [Wayback/Archive] expects a collection type.
A request for [WayBack/Archive] 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 [WayBack/Archive] 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.
Posted in Conference Topics, Conferences, Delphi, Development, Event, F2084, QC, Software Development | 20 Comments »
Delphi operator overloading: table of operators, names, and some notes on usage and ‘glitches’
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!
- http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/operatoroverloads_xml.html
http://docwiki.embarcadero.com/RADStudio/2010/en/IDEIds03
http://docwiki.embarcadero.com/RADStudio/2010/en/Operator_Overloading
http://docwiki.embarcadero.com/RADStudio/XE/en/IDEIds03
http://docwiki.embarcadero.com/RADStudio/XE2/en/IDEIds03
http://docwiki.embarcadero.com/RADStudio/XE3/en/IDEIds03 - Win32 only records; .NET classes and records
- BitwiseNot does not exist (use LogicalNot)
As of Delphi XE1, it has been fixed in some pages of the docs:
http://docwiki.embarcadero.com/RADStudio/XE/en/Operator_Overloading
http://docwiki.embarcadero.com/RADStudio/XE2/en/Operator_Overloading_(Delphi)
http://docwiki.embarcadero.com/RADStudio/en/Operator_Overloading_(Delphi) - At least 1 operand must be of the same type as your record data type:
– for single operand operators, the operand must be of the record data type
– for double operand operators, one or two operands must be of the record data type - The result type of the operator may be anything (so for comparison and set operators they do not need to return Boolean. Beware your users likely expect Boolean though).
Combining the rules of operator and result types, you can do magical things like Dances with XML | Australian Delphi User Group Members.
Do not use Delphi 2006 with operator overloading
Delphi 2007 fixed a number of bugs including this one: Delphi 2006 wont allow const parameters of type record within record method? – Stack Overflow.
10+ years later: maybe assignment operator?
It might be that in 2019, a new Delphi version gets assignment operator overloading: [WayBack] Operator Overloading Explained – Code Partners
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 | |
| operator | # | usage | name | category | * |
| in | 2 | R := A in B; | In | set |
–jeroen
Posted in Conferences, Delphi, Delphi 2006, Delphi 2007, Delphi 2009, Delphi 2010, Delphi XE, Delphi XE2, Delphi XE3, Development, Event, Software Development | 6 Comments »
Delphi – list of posts about hidden registry entries
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:
- 20091015 – Chris Bensen – Delphi Tips and Tricks – Additional Files
- 20090509 – René Rikkers – Delphi 2009 broken after installing Update 2
- 20080912 – Matthias Eissing – C++ Builder 2007 und der Remote Debugger
- 20071017 – Chris Bensen – Delphi and C++ Builder IDE Memory Usage Tip
- 20070928 – Sergio Cardoso – Are you nuts?
- 20070920 – David Clegg – Maximizing your RAD Studio 2007 experience
- 20070509 – Fredrik Haglund – How do I get my application with Paradox tables to work on Windows Vista?
- 20070313 – Chris Hesik – Source has been modified. Rebuild?
- 20061019 – Steve Trefethen – IE7 is now available get your BDS reg file here
- 20060110 – Mark Edington – Delphi Startup Times and the Kitchen Sink
- 20051219 – Adam Markowitz – Displaying macros in Code Completion (C++Builder2006)
- 20051209 – Adam Markowitz – Hidden feature, anyone?! (Delphi2006)
- 20051208 – Chris Hesik – BDS 2006 Debugger and .NET 2.0 compatibility
- 20040929 – Corbin Dunn – Delphi 8 Tips, Tricks and Speed Improvements
- 20040923 – Allen Bauer – Newsgroups leakage…
- 20041228 – Daniel Polistchuck – Delphi 2005 and Janeva 6.5
- 20040313 – Allen Bauer – Revenge of the Automated IDE Incident reporting
- 20040217 – Allen Bauer – Delphi 7 packages for using the Delphi 8 Win32 compiler
- 20031029 – Allen Bauer – Editor pair highlighting
Have fun with them!
–jeroen
Posted in Delphi, Development, Software Development | 2 Comments »
Delphi – finding the VERxxx define for a particular Delphi version: use JEDI.INC
Posted by jpluimers on 2009/10/15
Edit 20140822 since originally posting, JEDI moved to a GIT repository, so I changed some URLs and added that it is up to date until Delphi XE7.
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 XE7.
You can always browse the to JEDI.INC with this link to the sourceforge trunk. link to the GitHub master version.
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, Delphi 1, Delphi 2, Delphi 2005, Delphi 2006, Delphi 2007, Delphi 2009, Delphi 2010, Delphi 3, Delphi 4, Delphi 5, Delphi 6, Delphi 7, Delphi 8, Delphi x64, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5, Delphi XE6, Delphi XE7, Development, Software Development | 9 Comments »
Delphi – hardcore debugging the intialization of your app, dlls and packages
Posted by jpluimers on 2009/10/15
Recently we got involved with a client having a large and complex application that (historically) consists of
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 Conference Topics, Conferences, Debugging, Delphi, Development, Event, Software Development | 3 Comments »
Te Waka o Delphi · Absolute for Beginners
Posted by jpluimers on 2009/10/15
Jolyon Smith just published a great article about using the absolute keyword in Delphi.
When used with care (just like the with or goto keywords), absolute can make your code much easier to maintain.
Recommended reading!
–jeroen
Posted in Delphi, Development, Software Development | Leave a Comment »





