Hoi,
Ik had eigenlijk verwacht dat het setten van de Font.Charset voor bv een TMemo de characters met ascii code van 128 tot 255 (waarvan het eigenlijke getoonde teken afhangt van de codepage) getoond zouden worden volgens die charset.
Niks is minder waar. Enkel de 'Symbol' charset is duidelijk anders (uitgenomen bij Richedit). Soms verander de fontgrootte een beetje.
Om de juiste characters (CP afhankelijk) te tonen moet ik manueel (in de code) de omzetting doen naar Unicode (widestring).
Mijn code is beperkt (dit is de code zonder manueele omzetting):
Code:
S := '';
for I := 128 to 255 do // extended ascii characters
begin
S := S + chr(I);
end;
Memo1.Lines.Add(S);
Memo1.Lines.Add('------');
RichEdit1.Lines.Add(S);
RichEdit1.Lines.Add('------');
Bovenstaande code toont dus altijd dezelfde tekst in de memo en de richedit.
Om de goede teksten (dus CP afhankelijk) te tonen moet ik het volgende doen:
Code:
S2 := StringToWideStringCP(S, CodePage_); // <--------------- omzetting naar unicode
Memo1.Lines.Add(S2);
Memo1.Lines.Add('------');
RichEdit1.Lines.Add(S2);
RichEdit1.Lines.Add('------');
Om compleet te zijn:
Code:
function StringToWideStringCP(const S: RawByteString; CP: Integer): UnicodeString;
var
P: PAnsiChar;
pw: PWideChar;
I, J: Integer;
begin
Result := '';
if S = '' then
Exit;
P := @S[1];
I := MultiByteToWideChar(CP, 0, P, Length(S), nil, 0);
if I <= 0 then
Exit;
SetLength(Result, I);
pw := @Result[1];
J := MultiByteToWideChar(CP, 0, P, Length(S), pw, I);
if I <> J then
if I < J then SetLength(Result, I)
else if J < I then SetLength(Result, J);
// SetLength(Result, Min(I, J));
end;
Mijn vraag is nu: waar wordt die Font.Charset eigenlijk voor gebruikt? Ik denk dat ik duidelijk e.e.a. niet heel begrijp.
Ik gebruik Delphi 10.1.
Alvast bedankt!
Bookmarks