AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Name von Unicode-Zeichen

Ein Thema von Codehunter · begonnen am 27. Jun 2017 · letzter Beitrag vom 3. Jul 2017
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Name von Unicode-Zeichen

  Alt 28. Jun 2017, 08:52
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;
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Ydobon

Registriert seit: 3. Mär 2006
264 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: Name von Unicode-Zeichen

  Alt 28. Jun 2017, 09:37
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.

Geändert von Ydobon (28. Jun 2017 um 09:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#13

AW: Name von Unicode-Zeichen

  Alt 28. Jun 2017, 09:44
Zitat:
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ß?
$2B or not $2B
  Mit Zitat antworten Zitat
Ydobon

Registriert seit: 3. Mär 2006
264 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Name von Unicode-Zeichen

  Alt 28. Jun 2017, 09:58
Ä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);

Geändert von Ydobon (28. Jun 2017 um 12:13 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#15

AW: Name von Unicode-Zeichen

  Alt 28. Jun 2017, 10:09
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('').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.

Geändert von TiGü (28. Jun 2017 um 10:18 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#16

AW: Name von Unicode-Zeichen

  Alt 28. Jun 2017, 10:23
Vielleicht als Einstieg, wenn man von der alten GDI/WinApi-Welt kommt: https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#17

AW: Name von Unicode-Zeichen

  Alt 30. Jun 2017, 15:41
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.
Angehängte Dateien
Dateityp: zip CharmapX.zip (1,56 MB, 16x aufgerufen)
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Ydobon

Registriert seit: 3. Mär 2006
264 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: Name von Unicode-Zeichen

  Alt 30. Jun 2017, 22:09
Mir fehlen da ein paar Komponenten, aber ist der Font Fallback Absicht? Die angezeigten Glyphen sind nicht unbedingt in den Schriftarten enthalten.
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#19

AW: Name von Unicode-Zeichen

  Alt 1. Jul 2017, 09:45
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.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden

Geändert von Codehunter ( 1. Jul 2017 um 09:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#20

AW: Name von Unicode-Zeichen

  Alt 1. Jul 2017, 10:20
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:57 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