Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Unicode aus Resource File auslesen (https://www.delphipraxis.net/50342-unicode-aus-resource-file-auslesen.html)

CodeX 24. Jul 2005 01:49


Unicode aus Resource File auslesen
 
ich hab da ein paar kleine problemchen:

ich habe eine rc datei, die als unicode-textdatei gespeichert ist, mit etwa folgendem inhalt:
Code:
STRINGTABLE
BEGIN
  1, "Unicodetext"
END
umgewandelt wird das ganze mit:
Code:
@rc /fo language.res language.rc
ausgelesen mit:
Delphi-Quellcode:
function GetStringFromRessource(ID, Offset: Integer): string;
var
  p: PChar;
begin
  p := StrAlloc(256);
  try
    if LoadString(hInstance, ID + Offset, p, 255) <> 0 then
      Result := p
    else
      Result := '';
  finally
    StrDispose(p);
  end;
end;

[...]
const Offset = 0;
[...]

tntLabel1.Caption := GetStringFromRessource(1, Offset);
das klappt mit normalem text prima, bis unicodezeichen dargestellt werden müssen. dann kommen nur fragezeichen. (in den TntWare Delphi Unicode Controls)
ich hoffe, dass das problem gelöst ist, sobald die GetStringFromRessource funktion richtig umgestellt ist. (die res datei sollte doch hoffentlich richtig erstellt werden)
): string; -> ): Widestring;
p: PChar; -> p: PWideChar;
LoadString -> LoadStringW
StrAlloc -> ?
StrDispose -> ?

zu den letzten beiden befehlen bräuchte ich die entsprechenden widechar-befehle. habe aber keine ahnung, welche das sind. StrDisposeW und StrAllocW sind es schon mal nicht ;) (außer es gibt da ne extra unit dafür :roll: )

danke :)

xaromz 24. Jul 2005 08:58

Re: Unicode aus Resource File auslesen
 
Hallo,
Zitat:

Zitat von CodeX
StrAlloc -> ?
StrDispose -> ?

zu den letzten beiden befehlen bräuchte ich die entsprechenden widechar-befehle. habe aber keine ahnung, welche das sind. StrDisposeW und StrAllocW sind es schon mal nicht ;) (außer es gibt da ne extra unit dafür :roll: )

danke :)

Für die beiden Befehle gibt es keine Entsprechung. Du musst also einfach StrAlloc und StrDispose nehmen.
Einen WideString allokierst Du dann so:
Delphi-Quellcode:
P := StrAlloc((10 + 1) * SizeOf(WideChar));
Damit erstellst Du einen PWideChar der Länge 10 (plus Nullbyte).

StrDispose kannst Du einfach weiterbenutzen.

Gruß
xaromz

AndreasP 24. Jul 2005 09:38

Re: Unicode aus Resource File auslesen
 
Mahlzeit,

folgenden code hab ich aus der advanced demo von TVirtualTree, wenn du mit unicode arbeitest solltest du die kompo auf alle fälle mal ansehen (wenn du das nicht schon gemacht hast :-D )

Delphi-Quellcode:
procedure LoadUnicodeStrings(Name: string; var Strings: array of WideString);

// Loads the Unicode strings from the resource.

var
  Stream: TResourceStream;
  Head, Tail: PWideChar;
  I: Integer;
                             
begin
  Stream := TResourceStream.Create(0, Name, 'Unicode');
  try
    Head := Stream.Memory;
    // Skip byte order mark.
    Inc(Head);
    Tail := Head;
    for I := 0 to High(Strings) do
    begin
      Head := Tail;
      while not (Tail^ in [WideChar(#0), WideChar(#13)]) do
        Inc(Tail);
      SetString(Strings[I], Head, Tail - Head);
      // Skip carriage return and linefeed.
      Inc(Tail, 2);
    end;
  finally
    Stream.Free;
  end;
end;
sollte eigentlich das sein was du suchst

CodeX 24. Jul 2005 12:55

Re: Unicode aus Resource File auslesen
 
Zitat:

Zitat von xaromz
Für die beiden Befehle gibt es keine Entsprechung. Du musst also einfach StrAlloc und StrDispose nehmen.
Einen WideString allokierst Du dann so:
Delphi-Quellcode:
P := StrAlloc((10 + 1) * SizeOf(WideChar));
Damit erstellst Du einen PWideChar der Länge 10 (plus Nullbyte).

StrDispose kannst Du einfach weiterbenutzen.

P := StrAlloc((10 + 1) * SizeOf(WideChar)); funktioniert nicht so einfach
StrAlloc liefert eben einen PAnsiChar zurück. und delphi meckert beim kompilieren da dran rum. (Inkompatible Typen: Char und WideChar).
das selbe nochmals bei StrDispose. da wird eben ein PAnsiChar als parameter erwartet.
und ich muss p als PWideChar definieren, da sonst LoadStringW nicht funktioniert.

@andy
sieht interessant aus, aber irgendwie nicht danach, als wärs richtig für mich. da werden die strings in einem stream ausgelesen und das auch noch ohne rückgabewert.
ich hätte das schon gerne so, wie das jetzt ist, dass ich an jeder beliebeigen stelle einen bestimmten text auslesen kann.

CodeX 24. Jul 2005 13:17

Re: Unicode aus Resource File auslesen
 
juhu!
soeben hier gefunden, getestet und für super befunden :D

Delphi-Quellcode:
function StrAllocW(Size: Cardinal): PWideChar;
begin
  Size := SizeOf(Cardinal) + (Size * SizeOf(WideChar));
  GetMem(Result, Size);
  PCardinal(Result)^ := Size;
  Inc(PAnsiChar(Result), SizeOf(Cardinal));
end;

procedure StrDisposeW(Str: PWideChar);
begin
  if Str <> nil then
  begin
    Dec(PAnsiChar(Str), SizeOf(Cardinal));
    FreeMem(Str, Cardinal(Pointer(Str)^));
  end;
end;
damit habe ich meine deinen fehlenden funktionen und damit geht das auch wirklich. *freu* :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz