Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi7 mit nur einer Unit Unicode fähig machen (https://www.delphipraxis.net/175267-delphi7-mit-nur-einer-unit-unicode-faehig-machen.html)

derMischka 10. Jun 2013 12:26

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:
 
var ss : string                                      
begin
  ss := WideStringToUtf8(WideString);              
   control1.caption := ss
viel Spaß damit

Bernhard Geyer 10. Jun 2013 12:36

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

sx2008 10. Jun 2013 14:07

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;

Bernhard Geyer 10. Jun 2013 14:31

AW: Delphi7 mit nur einer Unit Unicode fähig machen
 
Zitat:

Zitat von sx2008 (Beitrag 1218052)
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

Geht aber erst in den "letzten" Windows-Versionen.
Win9x kannte die UTF-8 "Codepage" noch nicht.

sx2008 10. Jun 2013 17:20

AW: Delphi7 mit nur einer Unit Unicode fähig machen
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1218054)
Win9x kannte die UTF-8 "Codepage" noch nicht.

Das erste Window mit ernstzunehmendem Unicode-Support war Windows NT 4.
MultiByteToWideChar() und WideCharToMultiByte() benötigen mindestens Windows 2000.
Alles unterhalb Win 2000 würde ich heutzutage eh nicht mehr als Ziel akzeptieren.

Bernhard Geyer 10. Jun 2013 19:49

AW: Delphi7 mit nur einer Unit Unicode fähig machen
 
Zitat:

Zitat von sx2008 (Beitrag 1218080)
Das erste Window mit ernstzunehmendem Unicode-Support war Windows NT 4.

Wir habens auch mit Win9x hin bekommen (gab ca. 10 APIs die Unicode konnten. Hat gereicht um die GUI komplett Unicodefähig zu haben :-)

Zitat:

Zitat von sx2008 (Beitrag 1218080)
Alles unterhalb Win 2000 würde ich heutzutage eh nicht mehr als Ziel akzeptieren.

Ist bei uns auch so W2K ist zwar noch supportet, fliegt aber bald raus.

jaenicke 10. Jun 2013 20:19

AW: Delphi7 mit nur einer Unit Unicode fähig machen
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1218116)
Ist bei uns auch so W2K ist zwar noch supportet, fliegt aber bald raus.

Bei uns ist es schon rausgeflogen. Unter XP gibt es in der Regel keinen Support mehr.

derMischka 12. Jun 2013 11:04

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.

lbccaleb 12. Jun 2013 11:44

AW: Delphi7 mit nur einer Unit Unicode fähig machen
 
Cool, danke für die Arbeit.

derMischka 13. Jun 2013 16:20

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

cookie22 14. Jun 2013 11:25

AW: Delphi7 mit nur einer Unit Unicode fähig machen
 
Geht die Unit auch mit D 2007?

Bernhard Geyer 14. Jun 2013 11:32

AW: Delphi7 mit nur einer Unit Unicode fähig machen
 
Zitat:

Zitat von cookie22 (Beitrag 1218589)
Geht die Unit auch mit D 2007?

Die verwendete Technik sollte kein Hinderniss sein.
Müsst halt jemand mit D2007 ausprobieren und evtl. die nötigen Anpassungen vornehmen.

cookie22 14. Jun 2013 12:12

AW: Delphi7 mit nur einer Unit Unicode fähig machen
 
Hat schon wer unter D 2007 getestet? Hab gerade selbst keine Zeit.

derMischka 17. Jun 2013 12:56

AW: Delphi7 mit nur einer Unit Unicode fähig machen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Und wieder ein Update...

der Mischka

derMischka 25. Jun 2013 09:45

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

derMischka 3. Jul 2013 11:31

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

derMischka 3. Jul 2013 13:19

AW: Delphi7 mit nur einer Unit Unicode fähig machen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab noch eine TestAnwendung gemacht ...

der Mischka

Verno 1. Feb 2015 19:10

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ß

DeddyH 1. Feb 2015 19:19

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 $

Verno 17. Feb 2015 10:57

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

himitsu 17. Feb 2015 11:08

AW: Delphi7 mit nur einer Unit Unicode fähig machen
 
Zitat:

Zitat von Verno (Beitrag 1290165)
Ist zwar umständlich alle Komponenten im Project mit den UniCode Komponenten umzustellen,

http://www.delphipraxis.net/141895-t...phi-other.html :stupid:

Verno 20. Feb 2015 08:03

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.

himitsu 20. Feb 2015 11:24

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.

derMischka 23. Feb 2015 11:33

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

derMischka 24. Mai 2016 10:32

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

OrNEC 24. Mai 2016 10:49

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?

jaenicke 24. Mai 2016 11:19

AW: Delphi7 mit nur einer Unit Unicode fähig machen
 
Da dort keine besonderen Units verwendet werden, sollte das kein Problem sein.

Delphi-Laie 24. Mai 2016 13:33

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:
{$ifdef CamSpy}oCamSpyMem,{$endif}
, weil der Compiler die Unit nicht findet.

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.

uligerhardt 24. Mai 2016 13:43

AW: Delphi7 mit nur einer Unit Unicode fähig machen
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1338827)
Leute, was habt Ihr für Zauberdelphis, daß Ihr mit der Unit zurechtkommt?

Bei mir scheitert es an der Zeile

Delphi-Quellcode:
{$ifdef CamSpy}oCamSpyMem,{$endif}
, weil der Compiler die Unit nicht findet.

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.

Ich hab mir das Teil nicht runtergeladen, aber scheinbar ist in den Projekteinstellungen "CamSpy" definiert. Wenn du das rausnimmst, sollte es besser werden.

Lemmy 24. Mai 2016 14:30

AW: Delphi7 mit nur einer Unit Unicode fähig machen
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1338827)
Leute, was habt Ihr für Zauberdelphis, daß Ihr mit der Unit zurechtkommt?
..

Delphi-Quellcode:
{$ifdef CamSpy}oCamSpyMem,{$endif}

ganz oben in der Unit steht

Delphi-Quellcode:
{$define CamSpy}  //my own logging

auskommentieren und gut ist?!?

Delphi-Laie 24. Mai 2016 15:19

AW: Delphi7 mit nur einer Unit Unicode fähig machen
 
Zitat:

Zitat von Lemmy (Beitrag 1338830)
Zitat:

Zitat von Delphi-Laie (Beitrag 1338827)
Leute, was habt Ihr für Zauberdelphis, daß Ihr mit der Unit zurechtkommt?
..

Delphi-Quellcode:
{$ifdef CamSpy}oCamSpyMem,{$endif}

ganz oben in der Unit steht

Delphi-Quellcode:
{$define CamSpy}  //my own logging

auskommentieren und gut ist?!?

Schön wäre es. Das hatte ich auch schon probiert, jedoch vergaß ich, das mit aufzulisten.

Dann scheitert es (erstmalig) an

Delphi-Quellcode:
ss := AnsiToUtf8(ss);
(Delphi 4 und 5)

bzw. an

Delphi-Quellcode:
addlog('Exception in DispatchMessageUniCode(MsgNum='+inttostr(lpMsg.message)+') '+e.ClassName+' '+e.Message,cst_Exception);
(ab Delphi 6).

Delphi-Laie 24. Mai 2016 15:30

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.

Delphi-Laie 24. Mai 2016 15:51

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;

Lemmy 24. Mai 2016 16:40

AW: Delphi7 mit nur einer Unit Unicode fähig machen
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1338832)

Schön wäre es. Das hatte ich auch schon probiert, jedoch vergaß ich, das mit aufzulisten.

ah.. und ich habe mich schon gewundert....

derMischka 30. Mai 2016 11:30

AW: Delphi7 mit nur einer Unit Unicode fähig machen
 
Zitat:

Zitat von Lemmy (Beitrag 1338830)
Zitat:

Zitat von Delphi-Laie (Beitrag 1338827)
Leute, was habt Ihr für Zauberdelphis, daß Ihr mit der Unit zurechtkommt?
..

Delphi-Quellcode:
{$ifdef CamSpy}oCamSpyMem,{$endif}

ganz oben in der Unit steht

Delphi-Quellcode:
{$define CamSpy}  //my own logging

auskommentieren und gut ist?!?

Hätte nicht gedacht, dass mein Logging so viele Probleme bereitet...

Ihr müsst einfach die {$define CamSpy} Zeile auskommentieren

der Mischka

somby 21. Jun 2016 10:18

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

taaktaak 21. Jun 2016 18:37

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:
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;
.. so ganz funktioniert das mit der Modifikation leider doch nicht?!
Gruß Ralph

somby 27. Jun 2016 10:19

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

derMischka 27. Jun 2016 11:22

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

somby 27. Jun 2016 11:31

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.
Seite 1 von 2  1 2      

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