Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit Pwidechar (https://www.delphipraxis.net/93909-problem-mit-pwidechar.html)

WS1976 13. Jun 2007 08:02


Problem mit Pwidechar
 
Hallo,
ich sitz im Moment auf der Leitung:

Was ist daran falsch?
Delphi-Quellcode:
var a:string;
......
  a:=edit1.Text;
  ListSharedFolders(pwidechar(a));
der Übergabeparameter von ListSharedFolders ist vom Typ Pwidechar.
Der Compiler nimmt das klaglos entgegen. Die Funktion kann damit aber nichts anfangen.

Gruss Rainer

Gausi 13. Jun 2007 08:35

Re: Problem mit Pwidechar
 
Ich bin mir nicht ganz sicher, ob der Cast von String zu Widechar direkt funktioniert. Probier mal
Delphi-Quellcode:
pwidechar(WideString(a));
Ich weiß, dass die Umwandlung
Delphi-Quellcode:
PChar(aWideString)
nicht richtig läuft - da muss erst nach String zwischengecastet werden. Wahrscheinlich ist es hier auch so.

WS1976 13. Jun 2007 08:42

Re: Problem mit Pwidechar
 
Hallo,

danke für deinen Tip. Funktioniert einwandfrei.

Gruss Rainer

Bernhard Geyer 13. Jun 2007 11:30

Re: Problem mit Pwidechar
 
Zitat:

Zitat von Gausi
Ich weiß, dass die Umwandlung
Delphi-Quellcode:
PChar(aWideString)
nicht richtig läuft - da muss erst nach String zwischengecastet werden. Wahrscheinlich ist es hier auch so.

Sorry. Wie kommst du darauf. Ich hab unter D6 eine große Unicode-Enabled Anwendung und hab mit Widestrings nur probleme beim Zusammenbauen in der IDE bzw. wenn ich Wert aus (Ole)Variants bekomme.

Robert Marquardt 13. Jun 2007 12:14

Re: Problem mit Pwidechar
 
Erst mal der Typecast ist definitiv falsch. Es soll ja ein Unicodestring uebergeben werden und der will erst mal erzeugt sein.
Delphi-Quellcode:
var
  WS: WideString;
begin
  WS := Edit1.Text; // hier findet die Unicode-Umwandlung statt
  ListSharedFolders(PWideChar(WS)); // das ist nur eine Umtypung
Grundsaetzlich ist es so das weder PWideChar() noch PChar() eine Wandlung des Strings vornehmen.

ErazerZ 13. Jun 2007 12:30

Re: Problem mit Pwidechar
 
Ich habe das immer so gemacht
Delphi-Quellcode:
var
  s: string;
begin
  s := 'hey man!';
  MessageBoxW(0, PWideChar(WideString(s)), 'x', 0);

Gausi 13. Jun 2007 12:34

Re: Problem mit Pwidechar
 
Liste der Anhänge anzeigen (Anzahl: 1)
Eine Anweisung wie PChar(aWideString) geht zwar, liefert aber eine Compiler-Warnung "bedenkliche Typumwandlung". Resultat einer solchen Anweisung ist meistens, dass nur das erste Zeichen ankommt, da das zweite Byte in einem WideString in aller Regel #0 ist (wenn man unsere Zeichen so verwendet).
Wenn man einen String direkt nach PWideChar castet, kommt meistens asiatisches Zeug bei raus:
Delphi-Quellcode:
var s: String;
begin
   s := 'Hallo Welt';
   WideShowMessage(PWideChar(s)); // WideShowMessage aus den TNT-Unicode-Controls
end;
liefert eine Meldung wie im Anhang. Deine Funktion läuft also wahrscheinlich durch, findet aber keine Ordner mit so einem Namen.

Und ob man nun Edit1.Text zuerst in einen WideString packt, oder in einer Zeile doppelt castet, dürfte egal sein.

xaromz 13. Jun 2007 12:34

Re: Problem mit Pwidechar
 
Hallo,

PWideChar(WideString(<AnsiString>)) ist schon richtig. Durch den Typecast auf WideString wird die Funktion WStrFromLStr aufgerufen, die aus einem AnsiString einen WideString generiert. Also tatsächlich eine Umwandlung und nicht nur eine andere Interpretation der Daten.

Gruß
xaromz


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 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