Zitat:
Erst mal ein großes Danke schön für deine guten erklärungen
schleim .. muss aber mal gesagt werden
Man tut was man kann.
tsTextOutA ist die
ANSI Variante von tsTextOut.
tsTextOutW ist die Wide Variante von tsTextOut.
tsTextOutA macht intern nichts anderes als den Text mit der aktuellen CodePage in einen WideString zu verwandeln und damit dann tsTextOutW aufzurufen. tsTextOutW erwartet einen pWideChar. tsTextOutW ist die Funktion die du benötigst um WideStrings ausgeben zu können.
Wenn du mit Widestrings arbeitest, dann kannst du die Codepage ignorieren. Allerdings habe ich keine Ahnung ob der Text richtig übergeben, da ich nicht verstehen was du da machst. VB habe ich bisher immer gemieden weswegen ich dir dazu auch nichts sagen kann. Auch kann ich nicht erkennen wo der Text genau herkommt. Und ob das bereits Widestrings sind. Aber wichtig ist, dass diese Kette nicht unterbrochen wird. Man kann WideStrings leider direkt zu einem String zuweisen. Und sei es nur als Paramater einer Funktion. Sobald das gemacht wurde ist der Text kaputt bzw. unmapbare Zeichen erscheinen als Fragezeichen.
pWideString: Also pWideString benutze ich persönlich nicht. Kann also dazu nur bedingt was sagen. Denn das ist ein Pointer auf einen WideString wärend pWideChar ein Pointer auf das erste Zeichen ist. Das Ende des Strings ist dann durch ein #$0000 gekennzeichnet. Warum ich das Unterscheide liegt im Wesen der Delphi Strings. Diese haben eine Längenangabe und Referenzzählung vor dem Pointer! Denn du jetzt einen pWideChar als pWideString benutzen würdest, dann würde Dephi versuchen auf diese Informationen zuzugreifen. Die würde aber vermutlich nicht existieren. Entsprechend würde es Fehler geben. Da ich mit der TextSuite aber auch andere Sprachen unterstützen will kann ich so etwas natürlich nicht benutzen.
Zitat:
von BassVis
Delphi-Quellcode:
if StreamInfo.PlaylistTitle <> nil then
ReturnStr := StreamInfo.PlaylistTitle + chr(0);
p := @ReturnStr;
Inc(p, 1);
Result := longint(p);
Das halte ich für sehr gefährlich!!! Denn wenn du den Pointer p als Rückgabewert der Methode hast, dann existiert der String ReturnStr bereits nicht mehr. Kurze Erklärung warum. "StreamInfo.PlaylistTitle + chr(0);" Erstellt einen neuen String (Wide oder Long ist dabei egal). Die Referenzzählung von Delphi hält den String am Leben. Du lässt dir den Pointer auf den String geben. Setzt den Pointer auf das erste Zeichen und gibst die Adresse zurück. Beim Verlassen der Methode merkt Delphi aber, dass der STRING nicht mehr benutzt wird und gibt ihn frei. Der Pointer zeigt aber immer noch auf den Speicherbereich. Wenn jetzt irgendwas neuen Speicher haben will, dann kann es passieren, dass die Daten des Strings überschrieben werden. Inklusive des terminierende #0 Zeichens. Was nicht so gut sein dürfte, wenn man auf korrekten Inhalt angewiesen ist.
Zum Erfragen eines pChar oder pWideChar anhand eines String oder WideString genügt pChar(String) oder pWideChar(WideString) zu machen. Dabei achtet Delphi selber darauf, dass ein abschließendes #0 vorhanden ist und positioniert den Pointer selbsttätig auf das erste Zeichen. Aber auch da musst du darauf achten, dass der String, wärend der Lebensdauer des Pointers über, vohanden ist. Unter anderem ist das ein Grund warum ich innerhalb der TextSuite die Textbehandlung selber in die Hand genommen habe. Wenn ich die Strings nicht selber freigebe bleibt ein Speicherloch aber so werden sie mir nicht unter dem Allerwertesten weggeschossen.