![]() |
Ist wahres Unicode mit Delphi überhaupt möglich?
Hallo.
Borland will ja bald seine Delphi-VCLs Unicode-tauglich machen. Es gibt zwar jetzt schon kommerzielle Komponenten, mit denen man Unicode gut handhaben kann, doch sind diese für OpenSource-Entwickler für mich nicht zu gebrauchen. Ich habe fast die Vermutung, dass Delphi die falsche Programmiersprache ist, wenn man Unicode möchte. Die VCL dürfte das kleinere Übel sein. Ich habe mir mal folgendes Beispielprogramm ausgedacht und sehe, dass Unicode quasi unmöglich ist: 1. Das Programm bekommt einen Unicodenamen über die Befehlszeile. > Geht nicht. ParamStr() gibt nur einen String von sich, keinen Widestring! 2. Der Dateiname soll in einer Editbox dargestellt werden. > Würde gehen, wenn VCL Unicode geeignet. 3. Die Datei soll nun umbenannt werden. > Geht, wenn man MoveFileW() anstelle von MoveFile() verwendet. 4. In die Datei soll mit einer Nicht-API-Funktion geschrieben werden. > Keine Ahnung. Deklaration von AssignFile() ist nicht innerhalb der System.pas aufzufinden. Am meisten machen mir also die Befehlszeile (ParamStr) und die Nicht-API-Funktionen von Delphi sorgen. Das blöde ist außerdem, dass ich nicht in den Genuss der neusten Delphi Versionen wie z.B. 2008 kommen werde. Als OpenSource-Entwickler bin ich sehr froh, Turbo-Delphi kostenlos nutzen zu dürfen. Würde ich kommerzielle VCLs nutzen, könnten andere Entwickler meinen Source nicht weiterverwenden. Was meint ihr? Ist Delphi der falsche Weg, wenn man an Unicode denkt? Ich bin mir sicher, Microsoft hat in VC++ etc. absolut keine Probleme mit Unicode. Gruß blackdrake |
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Also unsere Anwendung ist (dank ElPack und ein bischen TNTWare) seit 2002 mit Delphi 6 Unicodefähig. Selbst unter Win98 (bis vor kurzen noch Win95) können wir Unicode in der GUI ohne jedliche Installation (passender Font vorrausgesetzt). Welches VC++ oder .NET kann das :-)
|
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Man kann sich ein ParamStrW selbst basteln. Gibt hier einen Eintrag in der Library der zeigt, wie das geht.
In Dateien schreiben geht mit Sachen wie den TNTFileStream wunderbar. Könnte man sich wahrscheinlich auch aus dem Code von TFileStream und ersetzen der Api-Aufrufe durch die entsprechende *W-Variante selbst zusammenbauen. Insofern: Mit etwas Mehraufwand bekommt man seine Anwendung durchaus Unicode-fähig. ;-) |
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zitat:
Sprich - Kompiliert in Turbo-Delphi eine Non-Unicode-Anwendung, kompiliert in D2009 eine Unicode-Anwendung? Würde man jedoch in D2009 kompilieren ... gäbe es dann nicht Inkompatibilitätsprobleme mit älteren Windows Versionen (W95 *räusper*)? Zitat:
TNTWare ist ja leider kommerziell geworden. Als es noch Freeware war, hatte man fast die perfekte Lösung. Zitat:
Ich müsste mir mal einen Plan machen, welche Stellen der Dateiname in meinem Programm passiert, sodass ich alle Non-Unicode-Funktionen versuchen kann, zu umgehen oder zu ersetzen. Gruß blackdrake |
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Hast du dich mal mit Lazarus auseinandergesetzt ? Dort wird Unicode wesentlich weiter unterstützt und man braucht keine Zusatzkomponenten. Ausserdem, ist Lazarus selbst ja Open Source und dürfte dir damit wesentlich mehr zusagen.
|
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zitat:
Zitat:
Zitat:
|
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zitat:
|
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zitat:
Vielen Dank für den Hinweis. Ich werd es mir mal anschauen. Ich befürchte aber, dass man seine Projekte nicht einfach reinschieben und sofort wieder nutzen kann (jedoch unter der Annahme, dass man nur Standard-VCLs sowie die Indy's nutzt). Ich werde das Programm trotzdem mal genauer testen. Zitat:
|
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
|
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zitat:
|
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zitat:
Delphi ist ja soweit gegangen, dass es die Funktion "GetModuleFileName" implementiert und gleich auf GetModuleFileNameW umleitet. Schau mal in die Unit Windows! Mit allen weiteren Funktionen verhält es sich ähnlich. Wenn man String plötzlich als WideString und die Funktionen der WinAPI anders lenkt ist schon ein großer Teil geschafft (zumindest für Windows-like-UniCode). Aber der Teufel steckt sicher auch da noch in diversen Detaild. Dass der ausgetrieben wird, dafür bezahlen wir ja schließlich auch Borland...äh...CodeGear...äh...Emdingsdabums |
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Ich habe eben mal nachgesehen - und es ist (wie erwartet) wirklich so, dass GetCommandLine (und dieser Funktion bedient sich ParamStr()) per Standard auf die Unicode-Variante zugreift. Du hast darüber hinaus noch die Möglichkeit, explizit auf die Ansi-Variante zuzugreifen, sofern Dir dies ein Bedürfnis ist.
Delphi-Quellcode:
Um dem Protokoll Genüge zu tun: Ich bin von CodeGear autorisiert, diese Beta-Informationen zu veröffentlichen aber auch verpflichtet, diesen Nachsatz stets zu erwähnen.
[...]
{Auszug aus der System.poas von Tiburón} function GetCommandLineA: PAnsiChar; stdcall; external kernel name 'GetCommandLineA'; function GetCommandLineW: PWideChar; stdcall; external kernel name 'GetCommandLineW'; {$IFNDEF UNICODE} function GetCommandLine: PAnsiChar; stdcall; external kernel name 'GetCommandLineA'; {$ELSE} function GetCommandLine: PWideChar; stdcall; external kernel name 'GetCommandLineW'; {$ENDIF} [...] |
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zitat:
Zitat:
Zu meinem Fall: Meine Datei würde über ParamStr (API +W) oder OpenDialog (Ext.VCL) reinkommen. Anschließend in einem Label (Ext.VCL) dargestellt. Danach per Indy per POST an einer Webseite gesendet. Indy scheint WideStrings soweit ich das sehe bei MultiPartData-AddFile() zu akzeptieren (aber Source ist nicht bei Turbo-Delphi dabei). Jetzt müsste ich mich um die externen VCLs OpenDialog und Label kümmern. |
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zitat:
Eigentlich müßt ja viel mit PChar dortstehen und je nach Compilerschalter is PChar = PAnsiChar bzw. PChar = PWideChar. |
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zitat:
In Delphi 2009 ist PChar = PWideChar. Da führt kein Weg dran vorbei. Wenn Du den "alten" Char möchtest, bei dem noch 1 Zeichen = 1 Byte war, dann musst Du explizit PAnsiChar verwenden. Analog gilt Gleiches für Strings. In sich ist das System also weiterhin stimmig und deswegen ging das mit der Portierung auf weiten Strecken auch recht flott. Man biegt den API-Aufruf auf die "W"-Variante um und - wenigstens in diesem Fall - am Ziel. Dieses Prinzip funktioniert auf weiten Strecken der Portierung, bis genau zu der Stelle, an der man nicht sauber mit SizeOf() und Konsorten gearbeitet hat, sondern den String in seine Bytes zu zerlegen versucht. |
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Vor der Übernahme durch TMS standen die TNT Unicode Controls unter der LGPL. Diese etwas älteren Versionen findet man immer noch auf diversen Seiten unter eben dieser Lizenz. Die aktuellsten Versionen muss man dann bei TMS kaufen, wenn man sie braucht.
|
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zumindest sind die JEDI Projekte JVCL, JCL (größte Teile), API und WSCL für die neue Version gerüstet.
|
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Liste der Anhänge anzeigen (Anzahl: 1)
Noch mal kurz zur Demonstration:
Ich habe mein Vista mal auf Japanisch umgestellt. Das hat beispielsweise im Dateisystem die für Vista typische Lokalisierung einiger Ordner zur Folge. Wenn man nun mit den üblichen API-Funktionen diese Namen ermitteln will, nimmt man einfach seinen alten Code. Dadurch, dass die korrekte API-Funktion aufgerufen wird und sowohl Char als auch String unicode-fähig sind, hat man wieder ein in sich konsistentes System:
Delphi-Quellcode:
Ergebnis mit den Standard-Komponenten siehe Anhang.
(* Der Code ist nicht hübsch, aber er tut. *)
procedure TForm1.Button1Click(Sender: TObject); var root : string; sRec : TSearchRec; fint : integer; fInfo : TSHFileInfo; begin root:= 'c:\'; fint:= FindFirst( root+'*.*', faAnyFile, sRec ); while fint = 0 do begin SHGetFileInfo( PChar(root + srec.name), 0, fInfo, SizeOf(fInfo), SHGFI_DISPLAYNAME OR SHGFI_TYPENAME ); Memo1.lines.add( fInfo.szDisplayName + ' (' +fInfo.szTypeName+')' ); fint:= FindNext( sRec ); end; FindClose( sRec ); end; |
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
* Tiburon haben will :stupid: *
Scheint nur so, als würden dann genau die Leute Probleme bekommen, die gerne mal einen String als Array verwendet haben. Wie ist es eigentlich damit:
Delphi-Quellcode:
Wobei Data ein ByteArray ist, in dem jedes Byte ein Zeichen ist? Wird dann vermutlich alles falsch in MyString kopiert und MyString bekommt die doppelte Länge, die nötig wäre, da mit jedem neuen Element 2 Bytes hinzugefügt werden oder?
SetLength(MyString, DataLen);
CopyMemory(@MyString[1], @Data[0], DataLen); Gruß Zacherl |
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Ich habe es eben ausprobiert. Das geht tatsächlich nur dann, wenn man MyString als "AnsiString" deklariert.
Ich sehe hier allerdings auch kaum Raum für implizite Konvertierungen. "CopyMemory()" ist schon eine Sache für sich. ;-) // EDIT: Ich bin mir nicht sicher, ob ich Dich richtig verstanden habe. Das war mein Test-Code:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var MyString : AnsiString; data : array[0..4] of byte; DataLen : integer; begin DataLen:= SizeOf(Data); data[0]:= 72; // H data[1]:= 65; // A data[2]:= 76; // L data[3]:= 76; // L data[4]:= 79; // O SetLength(MyString, DataLen); CopyMemory(@MyString[1], @Data[0], DataLen); ShowMessage( MyString ); end; |
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Ah vielen Dank fürs Teste :) War genau das, was ich wissen wollte.
|
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zitat:
Zitat:
Gruß Assertor |
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zitat:
|
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zitat:
:dp: |
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Hallo Zacherl,
die Trickser steigen dann einfach von "Array of Byte" auf "Array of Word" um. Nur die Kompatibilität von "packed Array of Char" mit String ist dann dahin, oder ist Char dann auch ein 16Bit Wert? Wo bleibt dann der 8Bit-Char? Gruß K-H |
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Der Datentyp Char ist jetzt ein 16bit-Wert. Wer auch künftig den alten Char haben mag, der benutzt AnsiChar/PansiChar.
"packed array of char" und "string" ist in sich wieder konsistent - alles unicode. Kann ich aber gern später mal ausprobieren - bis zum heutigen Tage habe ich das Konstrukt "packed array of char" nie explizit genutzt. |
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zitat:
|
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zitat:
|
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zitat:
:stupid: Zitat:
Delphi-Quellcode:
(* Auszug aus der unit1.poas ;-) *)
procedure TForm11.Button2Click(Sender: TObject); var MeinString : string; begin MeinString:= 'Hallo'; ShowMessage( MeinString ); // zeigt 'Hallo' MeinString[1]:= 'Y'; ShowMessage( MeinString ); // zeigt 'Yallo' end; // EDIT: Oder meinst Du vielleicht sowas wie da im Aufruf von DrawText() ?
Delphi-Quellcode:
(* Quick & Dirty aus der uni1.poas *)
procedure TForm11.Button2Click(Sender: TObject); var MeinString : string; oRect : TRect; begin MeinString:= 'Hallo'; oRect:= Rect( 10, 10, 200, 200 ); DrawText( form1.canvas.handle, PChar(@MeinString[1]), 5, oRect, DT_SINGLELINE ); end; |
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Danke! Man wird ja richtig heiß auf das neue Delphi :wink: |
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
[quote="Roaster"]
Zitat:
Zitat:
Zitat:
Zitat:
Soviel zu [OT] [/OT] *fg* :-D |
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Wie stehts eigentlich mit Ribbon Komponenten? Habe auf einem Screenshot zu Tiburon (in irgendeinem der Entwickler / Tester Blogs) eine neue Kategorie mit diesen Komponenten gesehen. Oder handelt es sich um DevExpress Bars oder sowas in der Art?
|
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zitat:
|
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zitat:
![]() |
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Klingt ja richtig cool :) Mal abwarten, ob die von CodeGear besser sind als die von DevExpress (hab die mal getestet und war voll und ganz zufrieden .. so ist das ja nicht :mrgreen: )
€: @toms: Mh irgendwie stehen da zwar viele Komponenten, aber nichts über die Ribbons. Oder bin ich mal wieder blind :D |
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zitat:
das stimmt natürlich nur, wenn daniel auch nicht gefakted hat und in wirklichkeit was ganz anderes macht als den typ von CHAR von 1 nach 2 byte aufzuboren :mrgreen: |
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Zitat:
wenn du mal versuchst 'n skin einzusetzen, von wem auch immer... merkste es rasch... aber sonst, ist devexpress mit das beste was auf dem komponentenmarkt zur verfügung steht... und sie versuchen auch (mehr oder weniger) die lücken zu beheben. aber 'n ansporn wirds für die jungs :-) . sowohl devexpress als auch für die CG's.. die sich ja zur zeit wieder bewegen :-) . und schlecht sind die CG's nicht... die wurden halt nur die letzten jahre nur an der kurzen leine gehalten... hoffen wir mal, dass sich mit dem unlashed neue dimensionen erschliessen :-) |
Re: Ist wahres Unicode mit Delphi überhaupt möglich?
Jap hab das bei DevExpress auch gemerkt. Z.b. mit transparenten PNGs gibts Probleme, wenn das XP Manifest aktiviert ist, wobei das Problem mit 20 Zeilen Code zu fixen ist. Stattdessen haben die jetzt eine Warnung eingeblendet, wenn ein XP Manifest vorhanden ist :mrgreen:
Naja bin wirklich mal gespannt auf die CG Dinger. Die werden dann ja auch schön Unicode fähig sein :love: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz