Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Name von Unicode-Zeichen (https://www.delphipraxis.net/193150-name-von-unicode-zeichen.html)

Codehunter 28. Jun 2017 07:52

AW: Name von Unicode-Zeichen
 
Zitat:

Zitat von Ydobon (Beitrag 1375488)
Aber laut Quelltexten z.B. GetGlyphIndices.

Ich habe das jetzt mal so umgesetzt, wo GetGlyphIndices aber immer GDI_ERROR liefert. Mach ich da jetzt einen gedanklichen Fehler?
Delphi-Quellcode:
function TfrmMain.GetCharExists(const Chr: Char): Boolean;
var
  Buf: Word;
begin
  Result:= FALSE;
  if GetGlyphIndices(tvChars.Canvas.Handle, PChar(Chr), 1, @Buf,
                     GGI_MARK_NONEXISTING_GLYPHS) <> GDI_ERROR then
  begin
    Result:= (Buf <> $FFFF);
  end;
end;

Ydobon 28. Jun 2017 08:37

AW: Name von Unicode-Zeichen
 
Mal schnell was rauskopiert. Funktioniert mit japanischen Text und Tahoma vs. Arial Unicode MS.

Delphi-Quellcode:
var pwOutGlyphs: PWord;
    i, cwstr: Integer;
    wstr: String;
    erg: Cardinal;
begin
  wstr:=Edit1.Text;
  cwstr:=Length(wstr);
  if wstr='' then exit;
  GetMem(pwOutGlyphs, cwstr*2);
  ZeroMemory(pwOutGlyphs, cwstr*2);
  erg:=GetGlyphIndices(Canvas.Handle, @wstr[1], cwstr, pwOutGlyphs, GGI_MARK_NONEXISTING_GLYPHS);
  if erg=GDI_ERROR then RaiseLastOSError;
  ExtTextOut(Canvas.Handle, 10, 6, ETO_GLYPH_INDEX, Nil, PChar(pwOutGlyphs), cwstr, Nil);
  Memo1.Clear;
  for i:=0 to cwstr-1 do Memo1.Lines.Add(IntToHex(PWordArray(pwOutGlyphs)[i], 4));
end;
Edit: War noch von D2005.

himitsu 28. Jun 2017 08:44

AW: Name von Unicode-Zeichen
 
Zitat:

Delphi-Quellcode:
PChar(Chr)

:?:

Delphi-Quellcode:
PChar(@Chr)
// bzw.
@Chr
Und dann noch die fehlende #0-Terminierung

Und C=1 ?
Was ist, wenn pgi größer sein muß?

Ydobon 28. Jun 2017 08:58

AW: Name von Unicode-Zeichen
 
Ähm, OK.

Dann halt noch die Uniscribe-Version. Der Rest stimmt überein.
Delphi-Quellcode:
var sc: TScriptCache;
    hr: HRESULT;

  sc:=Nil;
  hr:=ScriptGetCMap(Canvas.Handle, @sc, @wstr[1], cwstr, SGCM_RTL, pwOutGlyphs);
  if (hr<>S_OK) and (hr<>S_FALSE) then RaiseLastOSError;
  ScriptFreeCache(@sc);

TiGü 28. Jun 2017 09:09

AW: Name von Unicode-Zeichen
 
Du kannst dich auch mal mit DirectWrite beschäftigen!
Da steckt sehr viel drin, was du sicherlich gebrauchen kannst.

Bspw. hat das IDWriteFont Interface eine HasCharacter-Methode.
Daneben gibt es noch eine Vielzahl weiterer Sachen, die sicherlich weiterhelfen:
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, System.SysUtils, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Direct2D, Winapi.D2D1;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    function GetCharExists(const Chr: Char): Boolean;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Caption := GetCharExists('&#8224;').ToString(TUseBoolStrs.True);
end;

function TForm1.GetCharExists(const Chr: Char): Boolean;
var
  hr: HRESULT;
  FontHandle: HFont;
  LogFont: TLogFont;
  GdiInterop: IDWriteGdiInterop;
  WriteFont: IDWriteFont;
  CharacterExists: BOOL;
begin
  Result := False;
  hr := DWriteFactory.GetGdiInterop(GdiInterop);
  if SUCCEEDED(hr) and Assigned(GdiInterop) then
  begin
    FontHandle := Self.Font.Handle;
    if GetObject(FontHandle, SizeOf(LogFont), @LogFont) <> 0 then
    begin
      hr := GdiInterop.CreateFontFromLOGFONT(LogFont, WriteFont);
      if SUCCEEDED(hr) and Assigned(WriteFont) then
      begin
        hr := WriteFont.HasCharacter(Ord(Chr), CharacterExists);
        Result := SUCCEEDED(hr) and CharacterExists;
      end;
    end;
  end;
end;

end.

TiGü 28. Jun 2017 09:23

AW: Name von Unicode-Zeichen
 
Vielleicht als Einstieg, wenn man von der alten GDI/WinApi-Welt kommt: https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Codehunter 30. Jun 2017 14:41

AW: Name von Unicode-Zeichen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also bei der ganzen Experimentiererei ist quasi nebenbei noch etwas Nützliches entstanden: Eine Art Zeichentabelle wie die von Windows, nur ein bisschen komfortabler, nicht so klein und fuddelig.

Ydobon 30. Jun 2017 21:09

AW: Name von Unicode-Zeichen
 
Mir fehlen da ein paar Komponenten, aber ist der Font Fallback Absicht? Die angezeigten Glyphen sind nicht unbedingt in den Schriftarten enthalten.

Codehunter 1. Jul 2017 08:45

AW: Name von Unicode-Zeichen
 
Zitat:

Zitat von Ydobon (Beitrag 1375752)
Mir fehlen da ein paar Komponenten, aber ist der Font Fallback Absicht? Die angezeigten Glyphen sind nicht unbedingt in den Schriftarten enthalten.

Genau darum dreht sich das Thema ja, dass Windows von sich aus einen Fallback macht und das zu vermeiden gar nicht so einfach ist.

Nebenbei zeigt sich, dass manche VCL-Komponenten bis heute Probleme mit Unicode haben. So funktioniert z.B. die Selektion von bestimmten Unicode-Zeichen in TLabeledEdit nicht.

Die Anwendung ist eigentlich nur als Testanwendung entstanden. Die Quellen sind ja dabei, Vorschläge gerne willkommen.

p80286 1. Jul 2017 09:20

AW: Name von Unicode-Zeichen
 
Zitat:

Zitat von Codehunter (Beitrag 1375758)
Die Anwendung ist eigentlich nur als Testanwendung entstanden. Die Quellen sind ja dabei, Vorschläge gerne willkommen.

Könntest Du die farbliche Hervorhebung etwas kräftigen? und für die, die noch mit Hex-Ziffern alt geworden sind, eine Umschaltmöglichkeit einbauen?

Und ein echtes Add on, einen Font (temporär) laden?
(die notwendigen Sourcen kann ich Dir heraus suchen)

Muß ich noch erwähnen, daß mir Dein Programm gefällt?

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:52 Uhr.
Seite 2 von 3     12 3      

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