<div dir="ltr"><div><div>I do not see how it is a hack, when you have a function taking a null terminated string of a specific character type (in this case PWideChar) and you only have the generic string type you don't know what format the underlying memory of the string is so you cannot pass it as a pointer to the function. In this case you need to convert to the explicit type.<br><br></div>These are (potentially) two different types, they just happen to be strings. You could think of it as if you had a function Foo(VP: PSingle) and a variable V: Number where Number could be either Single or Double depending on some macro - but you don't know which one, so to avoid passing a Double you'd need to assign it to a temporary variable to convert it to the right type.<br><br></div>There is nothing wrong or hacky with that approach, this is how working with functions that accept pointers work in general - you need to make sure that the pointer you pass in is of the correct type.<br><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Sep 26, 2017 at 4:37 AM, Marcos Douglas B. Santos via Lazarus <span dir="ltr"><<a href="mailto:lazarus@lists.lazarus-ide.org" target="_blank">lazarus@lists.lazarus-ide.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Mon, Sep 25, 2017 at 9:52 PM, Juha Manninen via Lazarus<br>
<<a href="mailto:lazarus@lists.lazarus-ide.org">lazarus@lists.lazarus-ide.org</a><wbr>> wrote:<br>
> On Tue, Sep 26, 2017 at 3:14 AM, Marcos Douglas B. Santos via Lazarus<br>
> <<a href="mailto:lazarus@lists.lazarus-ide.org">lazarus@lists.lazarus-ide.org</a><wbr>> wrote:<br>
>> So, you mean that I cannot declare a constant without specify the<br>
>> type. The language allow me but it won't work?<br>
><br>
> Yes you can declare a string constant without specifying the type.<br>
<br>
</span>But according with this table, I shouldn't do that because so many<br>
problems could happen.<br>
<a href="http://wiki.freepascal.org/Unicode_Support_in_Lazarus#Without_.7B.24codepage_utf8.7D_or_compilerswitch_-FcUTF8" rel="noreferrer" target="_blank">http://wiki.freepascal.org/<wbr>Unicode_Support_in_Lazarus#<wbr>Without_.7B.24codepage_utf8.<wbr>7D_or_compilerswitch_-FcUTF8</a><br>
<span class=""><br>
>> 3.1. "When a parameter type is a pointer PWideChar,<br>
>> you need a temporary UnicodeString variable.<br>
>> ...<br>
>> That is a ugly hack. This code doesn't make any sense, if you don't<br>
>> know about these Unicode issues.<br>
>> We need do remember that trick when we are coding... not good.<br>
><br>
> It is not so ugly. It is actually an elegant solution. Just one<br>
> assignment, using the FPC's automatic conversion in a clever way. No<br>
> explicit conversion functions or anything.<br>
> The "ugly" pointer typecast is needed always, also in Delphi.<br>
<br>
</span>The "ugly" is because we need to remember to do that instead of just<br>
assign the variable.<br>
IMHO, both design are wrong. But I understand that the problem is in<br>
the compiler — or RTL.<br>
<span class=""><br>
>> 4. "Reading / writing text file with Windows codepage"<br>
>> ...<br>
>> The text said: "This is not compatible with Delphi ".<br>
>> Examples on that page are hacks.<br>
><br>
> The solution is to NOT use Windows codepages. They can be seen as a<br>
> historical remain with severe inherent problems which are solved by<br>
> Unicode already a long ago.<br>
> Windows has supported full Unicode since year 2000, and supported<br>
> UCS-2 before that.<br>
> Why would anybody still use the historical Windows codepages?<br>
<br>
</span>So, no problems here and the page is outdated. OK.<br>
<span class=""><br>
>> Summary:<br>
>> I know that was a huge work for who made that. Lazarus is more<br>
>> Unicode, more compatible with Delphi, and the team could move on.<br>
>> Great.<br>
>> But you might agree with me that this is far from a good design, right?<br>
><br>
> IMO it is not far from a good design. From FPC's point of view it is a<br>
> hack but you can write 100% Delphi compatible code by following just<br>
> few simple rules (and dumping the historical Windows codepages).<br>
<br>
</span>Like I said, it's a hack. But, again, it was|is a great job. No doubt.<br>
<br>
Best regards,<br>
Marcos Douglas<br>
<div class="HOEnZb"><div class="h5">--<br>
______________________________<wbr>_________________<br>
Lazarus mailing list<br>
<a href="mailto:Lazarus@lists.lazarus-ide.org">Lazarus@lists.lazarus-ide.org</a><br>
<a href="https://lists.lazarus-ide.org/listinfo/lazarus" rel="noreferrer" target="_blank">https://lists.lazarus-ide.org/<wbr>listinfo/lazarus</a><br>
</div></div></blockquote></div><br></div>