I am trying to migrate my own projects to delphi 2010. But it seems to be very difficult.
- I use TntControls for old projects. If I remove this library, some runtime functions must be re-implemented by myself. For instance: convert UnicodeString to a specified code page.
- The “SizeOf”, “Length”, FillChar() still confuse me. Compiler will throw a warning, if SizeOf() should be replaced with Length(). But I have not found any idiot-safe tutorials for me.
- A confusing warning, when trying to cast an AnsiString to UnicodeString. This conversation won’t cause a data lose, will it?
- Many code (zip, string utils, etc.) must be retested.
Too many headaches… Can someone share experience on migrating existing project from a very old delphi to delphi 2010?
If you’re using Tnt and you’re converting between code pages already, then yes, switching to Delphi 2010 will cause you extra work because you’ll need to remove code for things that Delphi now handles intrinsically. Ultimately, your code will be simpler, but it will be a hassle to get it there in the meantime.
SizeOf, Length, and FillChar are very basic concepts that you, as a professional software developer, owe to yourself to understand. Be cognizant of whether you’re dealing with character data or non-character data, and when dealing with the latter, don’t use character-related types. You’ve got TBytes; use it. Don’t use strings as byte buffers. When you want to know how many bytes you have, use SizeOf; when you want to know how many “things” you have, use Length. Generally avoid FillChar; you probably don’t need it as much as you use it today anyway. Since the “char” that things are filled with is almost always zero anyway, you might consider using ZeroMemory instead. It has fewer parameters and is just as fast as FillChar, especially since Delphi supports function inlining.
The compiler warns you when converting from AnsiString to UnicodeString because it’s not a simple string assignment but rather a conversion, guaranteed to allocate more memory and copy everything one character at a time. It’s a performance warning, not a data-loss warning. Conversions in the opposite direction are both (even when assigning to Utf8String, which technically will never lose data from a UnicodeString, if it’s filled only with valid Unicode characters). The best way to avoid the warning is to not use AnsiString in the first place. Use plain old String except for code that really does need to know what code page to encode things as.
I don’t think the “retest” argument is very strong. The library code especially should have unit tests that you’ve been running every time you recompiled. Retesting is something you do several times a day; there’s no special effort involved unless something goes wrong.