Delphi7 mit nur einer Unit Unicode fähig machen
Liste der Anhänge anzeigen (Anzahl: 3)
Hallo Community,
Ihr habt mir schon oft aus der Klemme geholfen. Nun möchte ich euch auch mal was hoffentlich Nützliches liefern. Ich habe eine Unit gecodet, die eure Komponenten/Controls nur mit dem Hinzufügen meiner kleinen Unit Unicode-fähig macht. Dabei werden immer noch die "normalen" strings verstanden (Abwärtskompatibel). Dies habe ich erreicht, indem ich die Windows-Api-Funktionen auf eigene Funktionen "umgebogen" habe, die die Strings in WideChar/Unicode umwandelt und dann die entsprechenden Windows-Api-Funktionen mit der "W"(für WideChar/Unicode)-Erweiterung aufruft. Diese Unit gibt auch Chin. bzw. Kyril. Zeichen auf einen Deutschen/nicht multilingualen System wieder. Die Unit läuft soweit. Bin aber für Verbesserungsvorschläge dankbar. Die Richedit-Komponente habe ich noch nicht zum Unicode verstehen bekommen. Zur Benutzung: die unit einfach in die uses-Klausel hinzu fügen. Wenn ihr einen Widestring habt, der nun durch ein Control angezeigt werden soll, diesen einfach mit der Funktion WideStringToUtf8 zu einen string konvertieren und diesen string an das Control übergeben.
Delphi-Quellcode:
viel Spaß damitvar ss : string begin ss := WideStringToUtf8(WideString); control1.caption := ss |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Nette Idee.
Ähnliche Ansätze habe ich für 1-2 Controls auch als ich 2002 unsere Anwendung Unicode-Enabled habe. Aber ein Glück das ich mit jetzt nicht mehr mit diesem UTF8-Trick herumschlagen muss sondern direkte (Dank Elpack und 2-3 anderen Unicode-Controls) das nicht mehr benötige |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Interessant!
Für die Umwandlung von UTF8 <-> Widestring verwende ich immer die Windows API. Als Zusatzbonus kann man neben UTF8 auch andere Codepages als Ziel oder Quelle angeben.
Delphi-Quellcode:
function StringToWideStringEx(const S: string; CodePage: Word): WideString;
var InputLength, OutputLength: Integer; begin InputLength := Length(S); OutputLength := MultiByteToWideChar(CodePage, 0, PChar(S), InputLength, nil, 0); SetLength(Result, OutputLength); MultiByteToWideChar(CodePage, 0, PChar(S), InputLength, PWideChar(Result), OutputLength); end; function WideStringToStringEx(const WS: WideString; CodePage: Word): string; var InputLength, OutputLength: Integer; begin InputLength := Length(WS); OutputLength := WideCharToMultiByte(CodePage, 0, PWideChar(WS), InputLength, nil, 0, nil, nil); SetLength(Result, OutputLength); WideCharToMultiByte(CodePage, 0, PWideChar(WS), InputLength, PChar(Result), OutputLength, nil, nil); end; function UTF8ToWideString(const S: string): WideString; begin Result := StringToWideStringEx(S, CP_UTF8); end; function WideStringToUTF8(const WS: WideString): string; begin Result := WideStringToStringEx(WS, CP_UTF8); end; |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Zitat:
Win9x kannte die UTF-8 "Codepage" noch nicht. |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Zitat:
MultiByteToWideChar() und WideCharToMultiByte() benötigen mindestens Windows 2000. Alles unterhalb Win 2000 würde ich heutzutage eh nicht mehr als Ziel akzeptieren. |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Zitat:
Zitat:
|
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Zitat:
|
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Liste der Anhänge anzeigen (Anzahl: 1)
Habe inzwischen noch die Windows Funktion DrawTextEx eingebunden (wird bei mir vor allem von den LMD Tools verwendet).
der Mischka Wie kann man man den originalen Beitrag (#1) wieder bearbeiten. Würde gerne die aktuellste Version immer in Beitrag #1 haben. |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Cool, danke für die Arbeit.
|
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Liste der Anhänge anzeigen (Anzahl: 1)
Und wieder ein Update ...
würde mich über Testergebnisse von D5-D7 Nutzer freuen. der Mischka |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Geht die Unit auch mit D 2007?
|
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Zitat:
Müsst halt jemand mit D2007 ausprobieren und evtl. die nötigen Anpassungen vornehmen. |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Hat schon wer unter D 2007 getestet? Hab gerade selbst keine Zeit.
|
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Liste der Anhänge anzeigen (Anzahl: 1)
Und wieder ein Update...
der Mischka |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Liste der Anhänge anzeigen (Anzahl: 1)
und wieder ein Update.
konnte inzwischen das Workaround für die Classikansicht entfernen. Die Callback-Funktionen von Windows werden nun mit einen kleinen Asm-Hack gekapselt - dadurch ist es nun möglich, den Ursprung (Windows oder Exe) des Funktionsaufruf zu bestimmen. ab dieser Version ist nun darauf zu achten, dass in den Projektoptionen WinApiUnicode definiert ist. viel Spaß damit. der Mischka |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Liste der Anhänge anzeigen (Anzahl: 1)
Und noch ein paar Bugfixes.
- Memo-Feld ab hundert Zeichen hat an der falschen Stelle eingefügt ich würde mich über Erfahrungsberichte / Problemeberichte freuen, damit ich die unit soweit rund bekomme. der Mischka |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Liste der Anhänge anzeigen (Anzahl: 1)
Hab noch eine TestAnwendung gemacht ...
der Mischka |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Hi,
bin durch zufall auf diesen unit gestoßen, weil ich das Problem habe eine UTF8 datei mit deutschen / russischen text darzustellen.Leide bekomme ich folgende Fehlermeldungen: Fehler] oWinApiUnicode.pas(77): Undefinierter Bezeichner: 'TGlobalLogType' [Fehler] oWinApiUnicode.pas(77): Undefinierter Bezeichner: 'cst_Info' [Fehler] oWinApiUnicode.pas(80): Undefinierter Bezeichner: 'GlobalAddLog' [Warnung] oWinApiUnicode.pas(118): Vorzeichenbehaftete und -lose Typen werden verglichen - beide Operanden werden erweitert [Warnung] oWinApiUnicode.pas(152): Vorzeichenbehaftete und -lose Typen werden verglichen - beide Operanden werden erweitert [Fehler] oWinApiUnicode.pas(774): Undefinierter Bezeichner: 'cst_ERROR' [Fehler] oWinApiUnicode.pas(1666): Inkompatible Typen: 'LongBool' und 'Integer' [Fehler] oWinApiUnicode.pas(1699): Undefinierter Bezeichner: 'cst_ERROR' [Fataler Fehler] dWinApiUniCodeTest.pas(7): Verwendete Unit '..\oWinApiUnicode.pas' kann nicht compiliert werden Habe D6 Gruß |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Wird es besser, wenn Du in Zeile 30 die Direktrive mal deaktivierst?
Delphi-Quellcode:
{.$define CamSpy} //Punkt zwischen { und $
|
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Habe es mal probiert, aber dann komme ich vom Regen in die Traufe :-)
Das Problem hat sich eh gelöst mit TntUnicodeControls_2.3.0 Komponentensammlung Ist zwar umständlich alle Komponenten im Project mit den UniCode Komponenten umzustellen, aber dafür klappt es hervorragend. Sogar Japanisch / Chinesisch wird korrekt dargestellt. Ich danke Dir trotzdem für deine Hilfestellung |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Zitat:
|
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Ok , thx für den Tip . Nun ja nun hab ich bereits alles umgestellt, aber fürs nächste Mal ist es ein sehr guter tip.
|
AW: Delphi7 mit nur einer Unit Unicode fähig machen
In cnPack, GExperts und Co. gibt es oftmals Component-Replace-Helper ... da kann man dann sagen "ersetzte alle TLabel auf der Form durch Xyz".
Ach ja, nur nochmal zur Info: Delphi 7 selber ist natürlich unicodefähig (oft gibt es von vielen Funktionen je eine AnsiString und eine WideString-Variante), aber die VCL-Komponenten und Teile der RTL sind es nicht. Und mit nur einer Unit lässt sich das alles natürlich nicht umstellen. |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
"Und mit nur einer Unit lässt sich das alles natürlich nicht umstellen. "
Hallo Himitsu, dann hast Du leider meine Unit nicht verstanden... Ich überschreibe die Quellen aller Controls und ersetze diese durch Unicode-fähige. D.h. Du kannst dir irgend ein altes (nicht unicode fähiges) Projekt mit Standard-Komponenten nehmen, die unit einbinden und schon UTF-String an deine alten Controls schicken. Und das alles ohne irgendwelche Komponenten zu ersetzen. MfG der Mischka |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal wieder ein Update für die Delphi 7 Nutzer unter uns ...
der Mischka |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Wow... voll gute Idee. :thumb: Eignet sich das auch für die Delphi 7 Personal Edition?
|
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Da dort keine besonderen Units verwendet werden, sollte das kein Problem sein.
|
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Leute, was habt Ihr für Zauberdelphis, daß Ihr mit der Unit zurechtkommt?
Bei mir scheitert es an der Zeile
Delphi-Quellcode:
, weil der Compiler die Unit nicht findet.
{$ifdef CamSpy}oCamSpyMem,{$endif}
Entferne ich die Zeile (auskommentieren), hilft das leider auch nicht weiter, dann scheitert es an
Delphi-Quellcode:
.
procedure Addlog(const Value:string{$ifdef CamSpy};aType:TGlobalLogType=cst_Info{$endif});
Das Phänomen tritt auf, egal ob ich Delphi 4-7 oder Turbo-Delphi verwende. Schade, aber vielleicht weiß ja jemand Rat. |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Zitat:
|
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Zitat:
Delphi-Quellcode:
{$define CamSpy} //my own logging
auskommentieren und gut ist?!? |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Zitat:
Dann scheitert es (erstmalig) an
Delphi-Quellcode:
(Delphi 4 und 5)
ss := AnsiToUtf8(ss);
bzw. an
Delphi-Quellcode:
(ab Delphi 6).
addlog('Exception in DispatchMessageUniCode(MsgNum='+inttostr(lpMsg.message)+') '+e.ClassName+' '+e.Message,cst_Exception);
|
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Mit folgenden Änderungen ist die Unit bei Delphi 6 & 7 compilierbar:
Zeile 30: //{$define CamSpy} //my own logging Zeile 1719: addlog('Exception in DispatchMessageUniCode(MsgNum='+inttostr(lpMsg.mes sage)+') '+e.ClassName+' '+e.Message{,cst_Exception});//letzter Parameter zuviel? Zeile 1746: Result := windows.GetCharacterPlacementW(DC,@wsbuf[0],boolean(ii),boolean(p4),p5,p6);//mit Boolean-Konvertierung klappt es Bei Delphi 7 kommen zudem unzählige Warnungen. |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Bei Turbo-Delphi muß es ab Zeile 1740 so aussehen:
Delphi-Quellcode:
function GetCharacterPlacementUnicode(DC: HDC; p2: PChar; p3, p4: Integer;
var p5: TagGCP_ResultsW; p6: cardinal): cardinal; stdcall; var wsbuf : TDynWSbuf; ii : integer; begin ii := ConvertToWideChar(p2,p3,wsbuf,false); Result := windows.GetCharacterPlacementW(DC,@wsbuf[0],ii,p4,p5,p6); end; |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Zitat:
|
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Zitat:
Ihr müsst einfach die {$define CamSpy} Zeile auskommentieren der Mischka |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Liste der Anhänge anzeigen (Anzahl: 1)
Habe die Unit oWinApiUnicode.pas noch ein wenig modifiziert, um das
TRichEdit-Control Unicodefähig zu machen. Es wird einfach die Subclass-Abfrage GetClassInfo und GetClassInfoEx modifiziert, um die richtigen Windows-Prozeduren zu erhalten |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Manchmal möchte man an kleine Wunder glauben ...
Diese RichEdit-Unterstützung wäre genau das Richtige für meinen alten IniViewer - den ich immer noch regelmäßig nutze. Also schnell ein Test bereitet: Form+Richedit+...
Delphi-Quellcode:
.. so ganz funktioniert das mit der Modifikation leider doch nicht?!
procedure TfoTest05.FormShow(Sender: TObject);
begin RE.Lines.LoadFromFile('c:\program files\desktop.ini'); // << UNICODE // // Exception EReadError in Modul test05.exe bei 000181EB // Fehler beim Lesen von RE.Lines.Strings: Fehler bei Einfügen von RichEdit-Zeile // // :-( end; Gruß Ralph |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Delphi-Mitstreiter,
habe in der letzten Version (24.05.2016) von oWinApiUnicode.pas einige Fehler beseitigt und einige Funktionen hinzugefügt: TToolbar - Control funktioniert, TRichEdit - Control funktioniert (hier war wichtig, dass im WideString-Modus der Klassenname anders ist), TListView - Control funktioniert, Sowohl in TListView und TTreeView funktioniert der Label-Edit Funktion SetClipboardData wurde hinzugefügt. Wichtig: einige Messages (z.B. SB_SETTEXT und TB_ENABLEBUTTON, beide WM_USER+1) besitzen gleiche WM_USER-Werte, hier muß duch den Klassenname unterschieden werden. Hallo Mischka, vielen Dank für dieses wunderbare Tool. Ich hoffe wir können das noch um einiges erweitern. In der Anlage meine geänderte Variante. Gruß somby |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Hallo somby,
schön zu hören, dass mal einer die Unit nutzt und nicht mit "das kann gar nicht gehen" kommt! Werde deine Änderungen bei Gelegenheit mal mit sichten/testen/übernehmen. Bin bloss grad mit Umstellung auf Free Pascal beschäftigt. der Mischka |
AW: Delphi7 mit nur einer Unit Unicode fähig machen
Hallo taaktaak,
wenn du die Richedit-Funktion .Lines.LoadFromFile verwendest, muß die Datei auch ein RTF-Format haben. Probiere z.B.: -In Word Unicode-Zeichen eintragen (mit Hilfe der Zeichentabelle) -Speichern als RTF-Datei. Und dann diese Datei mit Lines.LoadFromFile ins Control laden. Gruß Somby |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:39 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