Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Überprüfen ob Char ein vernünftiges Zeichen enthält? (https://www.delphipraxis.net/63351-ueberpruefen-ob-char-ein-vernuenftiges-zeichen-enthaelt.html)

ichbins 17. Feb 2006 13:39


Überprüfen ob Char ein vernünftiges Zeichen enthält?
 
Hi, gibt es eine Funktion, mit deren Hilfe ich überpfüfen kann, ob ein Char einen darstellbaren Wert enthält? (Buchstabe, Ziffer, Sonderzeichen) und nicht sowas wie #0 oder irgend so ein schwarzes Kästchen

danke

malo 17. Feb 2006 13:47

Re: Überprüfen ob Char ein vernünftiges Zeichen enthält?
 
Bei Google suchenascii steuerzeichen
Im Prinzip musst du jeweils den Ordinalwert eines zeichens ermitteln, und prüfen, ob der möglich ist. Die Liste müsstest du wohl selbst erstellen ;)

ichbins 17. Feb 2006 18:35

Re: Überprüfen ob Char ein vernünftiges Zeichen enthält?
 
soweit war ich auch schon...

aber ich dachte Delphi hat da vllt eine vordefinierte Funktion. :wall:

Delphi-Quellcode:
function sinnvoll(c:char):boolean;
const
  worths='abcdefghijklmnopqrstuvwxyzäöüABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ+-_.,;:''#*~´`ß?=)(/&%$§"!°^<>|\}][{³² @€µáéíóúÁÉÍÓÚàèìòùÀÈÌÒÙ';
begin
  result:=pos(c,worths)>0;
end;
//edit: @ und € vergessen :oops:
//edit2: und das ganze aboschdrofzeugs áé :zwinker:´

die Zeichentabelle von M$ macht das ja auch irgendwie ?

marabu 17. Feb 2006 20:01

Re: Überprüfen ob Char ein vernünftiges Zeichen enthält?
 
Hallo Michael,

nicht Delphi, sondern Windows hat da eine Funktion:

Delphi-Quellcode:
// uses Windows;

function GlyphIndex(Canvas: TCanvas; wc: WideChar): Cardinal;
var
  index: Word;
  flags: Cardinal;
begin
  flags := GGI_MARK_NONEXISTING_GLYPHS;
  if GetGlyphIndicesW(Canvas.Handle, @wc, 1, @index, flags) = GDI_ERROR
    then Result := GDI_ERROR
    else Result := Index;
end;
Funktioniert aber nicht mit allen Fonts zuverlässig. Wenn du eine absolut zuverlässige Funktion brauchst, dann wirst du wahrscheinlich die Fonts direkt untersuchen müssen.

Grüße vom marabu

retnyg 17. Feb 2006 21:23

Re: Überprüfen ob Char ein vernünftiges Zeichen enthält?
 
@marabu: willst du etwa jeden buchstaben erst auf den canvas malen, um ihn dann zu prüfen ?

@ichbins:
dein code wird zwar funktionieren, ist aber ungeschickt implementiert, da das pos jedesmal den gesamten (oder einen teil) des strings durchscannen muss, was sehr lange dauern kann, da du ja jedes zeichen eines strings prüfen musst.

am einfachsten prüfst du einfach auf den ordinalwert, oder guckst ob das Zeichen in einer menge enthalten ist

Delphi-Quellcode:
function isAscii(c:char):boolean;
begin
// mengenprüfung
   //result := (c in 'A'..'Z','a'..'z','ä','ö','ü');

// oder per ordinalwert
   case byte(c) of 32..126, 128..165: result := true;
   else result := false;
   end;
end;

Elvis 18. Feb 2006 00:01

Re: Überprüfen ob Char ein vernünftiges Zeichen enthält?
 
Zitat:

Zitat von retnyg
@marabu: willst du etwa jeden buchstaben erst auf den canvas malen, um ihn dann zu prüfen ?

Nö.
Der OP wollte die Zeichen die nicht darstellbar sind, marabu hat ihm exakt das gegeben.
Es wird geprüft ob der angegebene DC eines der Zeichen in einem Unicode string nicht rendern kann.
Deine hardcoded Variante ist dagegen etwas plump, schließlich können manche Fonts mehr Zeichen darstellen als andere. ;)

retnyg 18. Feb 2006 00:58

Re: Überprüfen ob Char ein vernünftiges Zeichen enthält?
 
hier geht es aber nicht wirklich um fonts...

marabu 18. Feb 2006 07:41

Re: Überprüfen ob Char ein vernünftiges Zeichen enthält?
 
Hallo gynter,

"darstellbar" und "schwarze Kästchen" sind die Worte von Michael gewesen - das kann ich nur mit dem Font in Verbindung beantworten. Wenn die Font-Resource ordnungsgemäß mitteilt, welche CharCodes sie rendern kann, dann liefert mein Code korrekte Ergebnisse. Manche (ältere) Fonts bieten z.B. für das Euro-Zeichen #128 keinen Glyph an, informieren aber auch nicht darüber. In solch einem Fall liefert GlyphIndex den CharCode zurück, aber gerendert wird der Font Default Character. Canvas als Parameter heißt nicht, dass ich rendere. Die API Funktion erfährt so nur, welchen Font sie untersuchen soll. Wie geschrieben, nicht immer funktioniert das so wie geplant.

Sollte ich Michael falsch verstanden haben, dann tut es mir leid.

Freundliche Grüße vom marabu


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