On 10 Nov 2007, at 16:41, Felipe Monteiro de Carvalho wrote:

On Nov 10, 2007 4:30 PM, Jonas Maebe <[EMAIL PROTECTED]> wrote:
You're making the same error which Marco pointed out earlier:
Utf8Decode returns a (reference counted) widestring, but you are not
assigning it to anything so it ends up in a (reusable) temp location.
As soon as the next temporary widestring has to be created, the
previous one is destroyed and the pwidechar will point to a random
memory block.

Ummm, but there is nothing else on that function, so I don't see how
can the temporary string be destroyed before I call SETTEXT,

You should never make assumptions about when compiler-managed types are destroyed when you don't hold an explicit reference to them anymore (it may happen immediately, or a long time in the future, and anywhere in between).

unless
SETTEXT expects that I give it a storage that is at all times
available...

procedure TWin32MemoStrings.SetText(TheText: PChar);
begin
   SendMessage(fHandle, WM_SETTEXT, 0, LPARAM(TheText));
end;

Which I currently converted into (but still doesn't work):

procedure TWin32MemoStrings.SetText(TheText: PChar);
var
 AnsiBuffer: ansistring;
 WideBuffer: widestring;
begin
 {$ifdef WindowsUnicodeSupport}
   if UnicodeEnabledOS then
   begin
     WideBuffer := Utf8Decode(TheText);
SendMessage(fHandle, WM_SETTEXT, 0, LPARAM(PWideChar(WideBuffer)));
   end
   else
   begin
     AnsiBuffer := Utf8ToAnsi(TheText);
     SendMessage(fHandle, WM_SETTEXT, 0, LPARAM(PChar(AnsiBuffer)));
   end;
 {$else}
   SendMessage(fHandle, WM_SETTEXT, 0, LPARAM(TheText));
 {$endif}
end;

Alternatively I moved AnsiBuffer and WideBuffer to the class
declaration, so they are always available, which also didn't solve the
problem of showing wrong characters.

It shows the string ééé as if it was Ã(c)Ã(c)Ã(c)

Which is what I would expect if I use ansi routines to show a utf-8 string.

The above code looks correct as far as managing the data is concerned. I don't know anything about the win32 api though, so I can't help further.


Jonas
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to