Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi UTF-8 mit GR32 zeichnen? (https://www.delphipraxis.net/73351-utf-8-mit-gr32-zeichnen.html)

alienous 16. Jul 2006 15:53


UTF-8 mit GR32 zeichnen?
 
hi,

habe hier ein kleines problem.

also, in einer mysql-db stehn einträge im utf-8 format drinne (russische zeichen zb)
diese lese ich aus, und wandele sie um mit utf8decode(utf8text);

bei umlauten klappt es ganz gut, aber bei den russischen zeichen erhalte ich nur ????????? :D
gebe testweise die strings mit showmessage aus.

als schriftart habe ich verdana in der fonteigenschaft der form genommen. diese sollte die zeichen enthalten, in word werden die ja auch angezeigt.

woran könnte das liegen?
danke
mfg

mkinzler 16. Jul 2006 15:55

Re: UTF-8 im Programm darstellen?
 
Verwende unicode-fähige Anzeige-Komponenten wie z.B. die von TNT

alienous 16. Jul 2006 16:00

Re: UTF-8 im Programm darstellen?
 
achso, ok liegt also an komponenten, danke

das anzeigen im programm mache ich nur aus testzwecken, will die strings dann aber in der gd32 imagekomponente zeichnen, würde das gehn? also auch mit den russischen zeichen? muss ich da was beachten?

danke

alienous 16. Jul 2006 19:22

Re: UTF-8 im Programm darstellen?
 
hmm habs jetz versucht im image32 mit textout... da kommen auch nur fragezeichen bei raus... die umlaute sind allerdings ok.

woran kann das liegen?

Delphi-Quellcode:
image32v.canvas.Font.Name := 'Verdana';
Image32V.Canvas.TextOut(10,10,utf8decode(_myrow[1]));
wobei Verdana mit russischen zeichen in word scheinbar klarkommt, Tahoma laut word auch, aber nicht in dem programm.

gibt es da tipps? binn am verzweifeln :( eine provisorische ausgabe über php klappt auch einwandfrei im utf8 format.


danke

jus 16. Jul 2006 20:09

Re: UTF-8 im Programm darstellen?
 
Zitat:

Zitat von alienous
hmm habs jetz versucht im image32 mit textout... da kommen auch nur fragezeichen bei raus... die umlaute sind allerdings ok.

woran kann das liegen?

Delphi-Quellcode:
image32v.canvas.Font.Name := 'Verdana';
Image32V.Canvas.TextOut(10,10,utf8decode(_myrow[1]));
wobei Verdana mit russischen zeichen in word scheinbar klarkommt, Tahoma laut word auch, aber nicht in dem programm.

gibt es da tipps? binn am verzweifeln :( eine provisorische ausgabe über php klappt auch einwandfrei im utf8 format.


danke

Leider sind die VCL Canvas Methoden wie Canvas.TextOut auch nicht unicodefähig. Wenn es unbedingt per TextOut hingezeichnet werden muß, dann sollte sicherlich die Windows API Funktion "TextOutW" funktionieren. Wenn ich mich richtig erinnere, sind sogar die Canvas-Funktionen von den Tnt Komponenten nicht unicodefähig.

Eigentlich ist es nicht viel anders, wenn du die API Funktion TextOutW verwendest. Du mußt nur halt noch das dazugehörige Handle mitübergeben.
Kurzes Beispiel:
Delphi-Quellcode:
var
  ws: WideString;
begin
  //..
  ws:=utf8decode(_myrow[1]);
  TextOutW(Image32V.Canvas.Handle,xpos,ypos,PWideChar(ws),length(ws));
  //..
end;
Grüsse,
jus

P.S.: ich habe das Programm so auf die schnelle hingetippt, bitte schlagen, wenn es welche Fehler enthält :duck:

Ydobon 16. Jul 2006 20:20

Re: UTF-8 im Programm darstellen?
 
Zitat:

Zitat von mkinzler
Verwende unicode-fähige Anzeige-Komponenten wie z.B. die von TNT

http://www.tntware.com/delphicontrols/unicode/

Die Tnt Units enthalten WideString Funktionen zur Textausgabe, sonst könnten sie schließlich nicht funktionieren.

Die Schrift spielt keinerlei Rolle, wenn in der gewählten ein entsprechender Glyph nicht enthalten ist, nimmt Windows zur Darstellung automatisch eine ähnliche mit diesem Zeichen, das klappt auch fast immer.

Bernhard Geyer 16. Jul 2006 20:30

Re: UTF-8 im Programm darstellen?
 
Zitat:

Zitat von Ydobon
Die Schrift spielt keinerlei Rolle, wenn in der gewählten ein entsprechender Glyph nicht enthalten ist, nimmt Windows zur Darstellung automatisch eine ähnliche mit diesem Zeichen, das klappt auch fast immer.

Das wäre mir neu. Wenn ein Zeichen in einem Font nicht vorhanden ist wird entsprechende Leerzeichen-Zeichen dieses Fontes genommen.

Ab Win2000 hat Windows einen Trick mittels FontReplacement das o.g. Verhalten zu implementieren. Wird im Hauptfont das Zeichen nicht gefunden wir in der für diesen Font definierten "Ersatzfonts" gesucht welche Fontdatei das Zeichen beinhaltet. In 2000/XP/2003 wird das für den Tahoma-Font eingesetzt.

alienous 16. Jul 2006 20:42

Re: UTF-8 mit GR32 zeichnen?
 
danke jus, das hat schonmal funktioniert, ein erfolgserlebniss juhu :)

@Ydobon: ich würd gern die image32 komponente behalten, du schlägst vor, ich soll ne andere imagekomponente nutzen? oder meinste was anderes?

achja, in meinem programm nutze ich auch noch an einer stelle die methode DrawText, flink wie ich binn, hab ich das dann da auch gleich probiert

Delphi-Quellcode:
Drawtext(Image32v.Canvas.Handle, PChar(UTF8Decode(_myrow[1])),Length(UTF8Decode(_myrow[1])), adrRect, DT_WORDBREAK or DT_NOPREFIX or DT_EDITCONTROL or DT_NOCLIP);
aber da erscheinen zwischen den buchstaben ne menge quadrate :wiejetzt:


die methode gehört doch auch zu windows, aber da scheint es probleme zu geben?
brauche die drawtext-methode, um einen text in einem betimmten bereich umgebrochen anzuzeigen.

danke

Ydobon 16. Jul 2006 20:48

Re: UTF-8 im Programm darstellen?
 
Zitat:

Zitat von Bernhard Geyer
Das wäre mir neu. Wenn ein Zeichen in einem Font nicht vorhanden ist wird entsprechende Leerzeichen-Zeichen dieses Fontes genommen.

Einen direkten Artikel dazu finde ich jetzt auf die Schnelle nicht, aber der MSDN-Library durchsuchenFont Mapper von Windows ist recht gut. Ich arbeite ziemlich viel mit CJK Texten, die werden auch angezeigt mit nicht dafür vorgesehen Schriftarten. Bei der SIP streikt der dann aber auch.
Wenn das Zeichen nicht gefunden werden kann, wird das im Font vorgesehen Ersetzungszeichen ausgegeben, meist eine Art Rechteck.

@alienous: Der große Vorteil der Tnt-Komponenten. Es gibt fast keinen Unterschied in der Verwendung zu den normalen von Delphi. Die entsprechende Funktion heißt dann einfach WideCanvasTextOut.

alienous 16. Jul 2006 20:52

Re: UTF-8 mit GR32 zeichnen?
 
naja, die image32 komponente is aber keine normale, die is aus der GR32-Lib, hat sehr viel mehr an bord, vorallem die bessere bildverarbeitung etc... darum kann ich die nich so einfach aufgeben.

drawtext is also nicht unicode-fähig?

mkinzler 16. Jul 2006 20:58

Re: UTF-8 mit GR32 zeichnen?
 
Du kannst doch die Image32-Komponenet verwenden, anstatt DrawText halt WideCanvasTextOut verwenden.

Ydobon 16. Jul 2006 21:00

Re: UTF-8 mit GR32 zeichnen?
 
Ich kenne die Komponente nicht, wenn sie aber wie die ursprünglichen von Delphi arbeitet, wird der WideString einfach zu einem AnsiString gemacht und kann daher nicht richtig dargestellt werden. Obwohl der Name image32 eigentlich etwas anderes suggeriert. Was nimmt es denn als Parameter String oder WideString?

wgDefault bei ScriptGetFontProperties gibt die Ersetzungsglyphe an.

alienous 16. Jul 2006 21:05

Re: UTF-8 mit GR32 zeichnen?
 
aber beim textout kannich doch kein bereich (Rect) übergeben, in das dann der text korrekt umgebrochen wird oder?

habe nämlich je nachdem was der benutzer auswählt, verschiedene bereiche, in die der text dann reingesetzt wird, auch die textgröße wird angepasst, dh wenn jemand 3wörter reinschreibt, wirds riesig gezeichnet, wenn jemand aber ein roman da reinschreibt, wirds so klein gezeichnet, das das letze wort ganz unten noch zu lesen ist...

und textout hat sowas ja nicht :(

die methode DrawText ist aber eine aus der winapi soweit ich des weiß!!! das verwundert mich ja noch mehr! aber als textparameter benötigt es PChar, kein PWideChar.

mkinzler 16. Jul 2006 21:09

Re: UTF-8 mit GR32 zeichnen?
 
Dann verwende WideCanvasTextRect

Ydobon 16. Jul 2006 21:13

Re: UTF-8 mit GR32 zeichnen?
 
Mach ein W ran. Die Api-Funktionen gibt es als Ansi- und Widestringvariante. DrawTextW ist für Unicode zuständig.
Zitat:

Implemented as Unicode and ANSI versions on Windows NT/2000/XP. Also supported by Microsoft Layer for Unicode.

alienous 16. Jul 2006 21:26

Re: UTF-8 mit GR32 zeichnen?
 
Zitat:

Zitat von Ydobon
Mach ein W ran. Die Api-Funktionen gibt es als Ansi- und Widestringvariante. DrawTextW ist für Unicode zuständig.
Zitat:

Implemented as Unicode and ANSI versions on Windows NT/2000/XP. Also supported by Microsoft Layer for Unicode.

:bounce1: Ydobon, du hast mich glücklich gemacht, :D ich danke dir! diese methode hat mir allerdings die hilfe verschwiegen! erst jetzt habe ich in gaanz kleiner schrift irgendwo in der mitte bemekrt, das da was von unicode steht, und drawtextW :)

Zitat:

Zitat von mkinzler
Dann verwende WideCanvasTextRect

wieso ist das nicht in der hilfe eingetragen? hab nix dazu gefunden!

Zitat:

Zitat von Ydobon
wgDefault bei ScriptGetFontProperties gibt die Ersetzungsglyphe an.

wo genau kann ich dieses einstellen? :gruebel: edit: hat sich erledigt :D aber fehlende zeichen aus einer anderen schrift kann man damit nicht setzen :(

mkinzler 16. Jul 2006 21:31

Re: UTF-8 mit GR32 zeichnen?
 
Zitat:

mkinzler hat folgendes geschrieben:
Dann verwende WideCanvasTextRect

wieso ist das nicht in der hilfe eingetragen? hab nix dazu gefunden!
Hab in TntGraphics.pas nachgeschaut.

alienous 16. Jul 2006 21:52

Re: UTF-8 mit GR32 zeichnen?
 
achso, ja ok, aber die tnt imagekompo is ja quasi eine normale imagekompo, und liefert seeehr viel schlechtere qualität wie es die graphics32 kompo tut, vorallem beim resizen.

aber es funktioniert ja schon ganz gut, ich möchte mich bei euch bedanken :)

mkinzler 16. Jul 2006 21:56

Re: UTF-8 mit GR32 zeichnen?
 
Zitat:

achso, ja ok, aber die tnt imagekompo is ja quasi eine normale imagekompo, und liefert seeehr viel schlechtere qualität wie es die graphics32 kompo tut, vorallem beim resizen.
Aber die Funktionen von TNT können ja auch auf den canvas der Image32-Kompo angewendet werden.

Ydobon 16. Jul 2006 21:59

Re: UTF-8 mit GR32 zeichnen?
 
Zitat:

Zitat von alienous
diese methode hat mir allerdings die hilfe verschwiegen! erst jetzt habe ich in gaanz kleiner schrift irgendwo in der mitte bemekrt, das da was von unicode steht, und drawtextW :)

Ist einfach so üblich. In der Hilfe oder MSDN wird nur allgemein die Funktion erläutert. Im Text wird dann, wenn relevant, auf die Unterschiede eingegangen.
Das A für Ansi oder W für WideString muss man sich dann halt selbst dazu denken. Die Delphi Units verwenden ohne anhängenden Buchstaben (oder sogar fehlerhaft mit W) einfach die A-Version.

Die Installation der Tnt-Controls würde ich jedenfalls auch sehr empfehlen, das macht vieles deutlich einfacher. Allerdings stehen einige interessante Funktionen nicht automatisch durch die Komponenten zur Verfügung, da sie für diese nur intern verwendet werden. TntGraphics (WideCanvas...) musst du also direkt angeben, um deren Funktionen benutzen zu können. TntSysUtils ist z.B. für jemanden, der mit Unicode arbeitet ein richtiger Schatz.

Mal so nebenbei, ich habe schon gesucht, aber die von dir benutzten Komponenten nicht gefunden. Hast du dafür eine Adresse? Vielleicht mal nützlich.

mkinzler 16. Jul 2006 22:04

Re: UTF-8 mit GR32 zeichnen?
 
http://sourceforge.net/projects/graphics32/

alienous 16. Jul 2006 22:06

Re: UTF-8 mit GR32 zeichnen?
 
ok, danke, wieder was gelernt :thumb:

Zitat:

Zitat von Ydobon
Zitat:

Zitat von alienous
Mal so nebenbei, ich habe schon gesucht, aber die von dir benutzten Komponenten nicht gefunden. Hast du dafür eine Adresse? Vielleicht mal nützlich.


jop, Graphics 32 oder direkt bei SF


edit: da war wohl einer schneller :D

Ydobon 16. Jul 2006 22:54

Re: UTF-8 mit GR32 zeichnen?
 
Danke euch beiden.
Allerdings denke ich nicht, dass ich diese Units mal verwenden werde. Die bessere Darstellung beruht vermutlich auf einer Vorbehandlung des Strings. Unicodefähig sind sie jedenfalls nicht im geringsten, und damit uninteressant.

@alienous: Ich befürchte du musst wählen zwischen gutem Aussehen und Machbarkeit, die von dir verwendete Unit kann mit Unicode nicht das geringste anfangen.

alienous 16. Jul 2006 23:03

Re: UTF-8 mit GR32 zeichnen?
 
funktioniert aber mit drawtextw und textoutw perfekt...

glaub mir, öffne mal ein jpg bild in der standardkompo, und stauche oder strecke das bild mal, dann wirste dir an den kopf fassen :D und für fotobearbeitung ist sowas einfach nicht zu gebrauchen (fotos werden in eine bestimmte größe gesetzt, und text wird noch drübergeblendet)


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