The Wiert Corner – irregular stream of stuff

Jeroen W. Pluimers on .NET, C#, Delphi, databases, and personal interests

  • My badges

  • Twitter Updates

  • My Flickr Stream

  • Pages

  • All categories

  • Enter your email address to subscribe to this blog and receive notifications of new posts by email.

    Join 1,854 other subscribers

.NET/C#/ASP.NET – CodeProject: Multi-Threading in ASP.NET. Free source code and programming help

Posted by jpluimers on 2010/01/12

Finally someone who explains this topic well: CodeProject: Multi-Threading in ASP.NET.

Most of it is based on Web 405 “Building Highly Scalable ASP.NET Web Sites by Exploiting Asynchronous Programming Models” by Jeff Prosise, which should be here on the Microsoft events site (which currently has connection problems) and is referenced here and here.

Recommended reading!

–jeroen

Posted in .NET, ASP.NET, C#, C# 2.0, C# 3.0, C# 4.0, Development, IIS, Software Development, Visual Studio and tools | 2 Comments »

Delphi – TCustomGrid.InvalidateCol and InvalidateRow bug that has been there since at least Delphi 4^H^H^H^H^H^H^H^H 2 and 1

Posted by jpluimers on 2010/01/12

I just re-reported this in in QC as 81060, but wanted to let you know that there is a bug in TCustomGrid.InvalidateCol and TCustomGrid.InvalidateRow which has been there since at least Delphi 4 Delphi 1 (InvalidateRow) and Delphi 2 (InvalidateCol) and still present in Delphi 2010.

Both methods will not invalidate the entire Row/Col but only the Left/Top most cells of that Row/Col.
So the invalidate the absolute rectangle in stead of the visible rectangle.

You will see this behaviour when you have a virtual grid that is larger than the actual grid on the screen, you scroll through that grid, and perform your own drawing.

Boths bugs are easy to fix, have been reported in QC as number 8472 before (and reported even before QC existed), but denied as ‘test case error’  in stead of being investigated further.
The earliest reference I could find on them is as number 531 in the Delphi Buglist, by Rune Moberg, long time and well respected Delphi developer and bikedude.

Some of the 3rd party grid vendors are also to blame: they seemed to have worked around it without pressing the Delphi team to solve the issue.
For instance, the infamous rxgrid, just invalidates all Rows within InvalidateCol. Now that is pure overkill, as my solution will show. Read the rest of this entry »

Posted in Delphi, Development, QC, Software Development | 2 Comments »

C# / Delphi – getting the right parameter and function result order for SOAP

Posted by jpluimers on 2010/01/05

Getting different architectures to talk can be a pain, even when using standards like SOAP.

In this case, the .NET WSDL imports Delphi generated WSDL in a different manner than you’d expect at first sight: when having both an ‘out’ parameter and a function ‘result’, the ‘result’ is not imported well.

But alas: SOAP didn’t accommodate for this situation in the past, and now SOAP now has some additions to solve this.

Bruneau Babet explains this here: [WayBackSOAP inconsistency? Delphi 2010 (Win32) Server and .NET Client swapping ‘out-parameter’ and ‘result’. – Stack Overflow.

There he explains how to use the parameterOrder attribute, which the Delphi WSDL importer and exporter still do not support.

–jeroen

Posted in .NET, ASP.NET, Conference Topics, Conferences, Delphi, Development, Event, SOAP/WebServices, Software Development | Leave a Comment »

C# – Kirk Evans Blog : Suppress warnings in C# 2.0

Posted by jpluimers on 2010/01/05

I always forget the pragma syntax, because it differs substantially from the #if syntax, and I hardly use #pragma.

Contrary to #if#endif, there is no #pragma#endpragma.
Instead, there is #pragma warning disable ### #pragma warning restore ###).

Ken Evans wrote a nice blog article about it (a long time ago, but it is still current): Kirk Evans Blog : Suppress warnings in C# 2.0.
And of course: the official docs, which indicate that when you omit the  warning list in a #pragma warning restore, then all warnings are restored.

You can get the error numbers from the compiler output window (no, the errors/warnings/hints window does not show the numbers, that would be to obvious).

–jeroen

Posted in .NET, C#, C# 2.0, C# 3.0, C# 4.0, Development | Leave a Comment »

Delphi – Announce: ModelMaker Code Explorer 8.02 beta

Posted by jpluimers on 2010/01/05

Gerrit Beuze just announced the new beta of ModelMaker Code Explorer 8.

For me, ModelMaker Code Explorer (especially at a price of only EUR 99!)  is an indispensable tool for both creating new sources, and maintaining old sources (the refactorings it can do are awesome, but there are many other useful features in it as well).

Over the years, I’ve been using interfaces in Delphi more and more.
Actually, in some of my projects almost all classes implement interfaces.

Therefore, I’m particularly glad with the new feature  ‘auto complete style drop down list’ in the ‘Edit Class dialog’ that this beta brings.

More info: ModelMaker Code Explorer 8.02 beta.

Note: if you use Visual Studio, there is a Visual Studio edition of ModelMaker Code Explorer too.

–jeroen

Posted in C# 2.0, C# 3.0, Delphi, Development, Software Development, Visual Studio and tools | Leave a Comment »

Welcome to Classic Shell: Classic Start Menu and Classic Explorer functions for Windows 7

Posted by jpluimers on 2009/12/31

One of the things in usability is to enable old skoop people that have been using.

Windows 7 went even further than Windows Vista into changing start menu functionality and explorer functionality that had been there since Windows 95.
So things that have been working for over a decade, suddenly stopped to work, or worse: work differently.

Would you imagine what happened when someone reordered the pedals in a car (from left to right are clutch, brake and throttle) or reassign their functionality?

So some people gathered and wrote Classic Shell.

Now someone please restrore the “backspace” keyboard behaviour back to “go one level up in the folder tree” as it had been for more than a decade…

–jeroen

Posted in Keyboards and Keyboard Shortcuts, Power User, Usability, User Experience (ux) | 4 Comments »

Anyone got the Delphi 2010 code formatter to work with anonymous methods?

Posted by jpluimers on 2009/12/24

With the default settings, the Delphi 2010 code formatter folds anonymous methods on one line.

Is there anyone who has found settings to circumvent this?
(You can also react on my Stackoverflow question here, I will update the blog with the relevant answers).

Original code:

procedure TUnit.AppendFinalization(const StringBuilder: TStringBuilder);
begin
  AppendMemberResults(StringBuilder,
    function(Member: TGeneratableInUnit): IStringListWrapper
    begin
      Result := Member.FinalizationText;
    end
  );
end;

procedure TUnit.AppendMemberResults(const StringBuilder: TStringBuilder; const GetMemberText: TFunc<TGeneratableInUnit, IStringListWrapper>);

Formatted code:

procedure TUnit.AppendFinalization(const StringBuilder: TStringBuilder);
begin
  AppendMemberResults(StringBuilder, function(Member: TGeneratableInUnit): IStringListWrapper begin Result := Member.FinalizationText; end);
end;

procedure TUnit.AppendMemberResults(const StringBuilder: TStringBuilder; const GetMemberText: TFunc<TGeneratableInUnit, IStringListWrapper>);

As you can see, the anonymous method is being formatted to one line.

I feel I’m missing some kind of setting here…

–jeroen

Posted in Delphi, Delphi 2010, Development, Software Development | Leave a Comment »

For Pre D2007 versions: CodeCentral 24535 Delphi SOAP Runtime and Importer Update

Posted by jpluimers on 2009/12/23

Had to use this on an old project, so I put this up as a reference (quite a few people have it, it was released late 2007 and I just put it up here as a reference for myself):
[WayBack] 24535 Delphi SOAP Runtime and Importer Update.

It contains the SOAP runtime and WSDL importer from Delphi 2007, but then compiled for Delphi  7, Delphi  2005 and Delphi  2006.
So if you have a project stuck in one of those old Delphi versions, you can use the SOAP/WSDL support from Delphi 2007.

–jeroen

Posted in Delphi, Development, SOAP/WebServices, Software Development | 1 Comment »

Delphi 2010 build numbers don’t tell you what you have installed

Posted by jpluimers on 2009/12/17

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 »

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 »