Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   IN durch CharInSet ersetzen (https://www.delphipraxis.net/187390-durch-charinset-ersetzen.html)

franz22 25. Nov 2015 08:24

Delphi-Version: XE7

IN durch CharInSet ersetzen
 
Hallo zusammen,

beim Öffnen eines, mit Delphi2007 erstellten Programms, mit Delphi XE7 bekomme ich folgende Meldung angezeigt:
[dcc32 Warnung] Unit1.pas(4190): W1050 WideChar in Set-Ausdrücken auf ByteChar verkürzt. Ziehen Sie die Verwendung der Funktion 'CharInSet' aus der Unit 'SysUtils' in Betracht.

Die beanstandete Quelltextzeile dazu ist:
Delphi-Quellcode:
  if not (Key in ['0'..'9', ',', '-', Char(VK_BACK), Char(VK_DELETE)]) then Key:= #0;
Diese Konstruktion stammt übrigens aus dem Easy Delphi Helper.

Nun habe ich das nach CharInSet() umgeformt, aber der Quelltext erstreckt sich jetzt über mehrere Zeilen:
Delphi-Quellcode:
  if not CharInSet(Key,['0'..'9']) then
    if not CharInSet(Key,[',']) then
      if not CharInSet(Key,['-']) then
        if not CharInSet(Key,[Char(VK_BACK)]) then
          if not CharInSet(Key,[Char(VK_DELETE)]) then Key:= #0;
Hat jemand eine Idee, wie es noch kürzer geht (Ja, ich weiß, das alles passt auch in eine Zeile), eventuell mit anderen Methoden?

Vielen Dank das Ihr Euch diesen Thread angeschaut habt.

Grüße
Franz

Nersgatt 25. Nov 2015 08:30

AW: IN durch CharInSet ersetzen
 
Das Set beginnt bei [ und endet bei ] :wink:

Delphi-Quellcode:
if not CharInSet(Key,['0'..'9', ',', '-', Char(VK_BACK), Char(VK_DELETE)]) then

franz22 25. Nov 2015 08:36

AW: IN durch CharInSet ersetzen
 
Hallo Jens,

vielen Dank für die blitzschnelle Antwort. Hat geklappt.

Grüße
Franz

himitsu 26. Nov 2015 13:19

AW: IN durch CharInSet ersetzen
 
Man könnte auch einfach die Compilermeldung deaktivieren.
CharInSet macht intern auch nichts anderes, als ein IN.

Und außerdem ist CharInSet auch schonwieder veraltet, aber dessen bei Ersatz macht Emba wohl einen Scherz.

uligerhardt 26. Nov 2015 13:38

AW: IN durch CharInSet ersetzen
 
Zitat:

Zitat von himitsu (Beitrag 1322588)
Und außerdem ist CharInSet auch schonwieder veraltet, aber dessen bei Ersatz macht Emba wohl einen Scherz.

Wie "schon wieder veraltet"? Verursacht CharInSet in DX eine Warnung?

Ich erinnere mich noch mit Freude an TCharacter. Um unseren D2007-Prä-Unicode-Quelltext auf XE2 zu bringen, haben wir unter anderem
Delphi-Quellcode:
c in ['0'..9'']
durch
Delphi-Quellcode:
TCharacter.IsDigit(c)
ersetzt, die neue, korrekte, frisch eingeführte Methode. Soweit OK. Dann steigen wir auf XE6 um und es hagelt "TCharacter is deprecated"-Meldungen. TCharacter wurde (vermutlich) 2009 eingeführt und 2014 (oder eher - bin zu faul zum nachschauen) ist es veraltet? :wall:

himitsu 27. Nov 2015 06:37

AW: IN durch CharInSet ersetzen
 
Die Meldung kommt schon seit einer ganzen Weile.

Delphi-Quellcode:
function CharInSet(C: Char; const CharSet: TSysCharSet): Boolean; overload; inline; deprecated 'Use TCharHelper functionality';


Nur für eigene Bereichsdefinitionen ist TCharHelper absolut sowas von garnicht geeignet.

XE6 weiß ich jetzt nicht, das war jetzt wieder aus XE8 kopiert.
Ja, bei soeinem Mist, weiß man doch garnicht was man tun soll.

Sir Rufo 27. Nov 2015 07:01

AW: IN durch CharInSet ersetzen
 
Zitat:

Zitat von himitsu (Beitrag 1322642)
Ja, bei soeinem Mist, weiß man doch garnicht was man tun soll.

Nennt mich maiv, aber wenn mir so etwas auf den Wecker geht, dann definiere ich mir mein eigenes Konstrukt (in meiner Basis-Bibliothek) und leite das per Compilerschalter auf die Variante um, die denn aktuell da gültig sein soll.

Dann bleibt der Anwendungscode immer gleich und trotzdem wird das verwendet, was nun gerade State of the Art ist.

Uwe Raabe 27. Nov 2015 07:13

AW: IN durch CharInSet ersetzen
 
Zitat:

Zitat von himitsu (Beitrag 1322642)
Delphi-Quellcode:
function CharInSet(C: Char; const CharSet: TSysCharSet): Boolean; overload; inline; deprecated 'Use TCharHelper functionality';

Jetzt nochmal mit Drumherum aus dem aktuellen Seattle:
Delphi-Quellcode:
{$IFNDEF NEXTGEN}
function CharInSet(C: AnsiChar; const CharSet: TSysCharSet): Boolean; overload; inline;
function CharInSet(C: WideChar; const CharSet: TSysCharSet): Boolean; overload; inline;
{$ELSE}
function CharInSet(C: Byte; const CharSet: TSysCharSet): Boolean; overload; inline; deprecated 'Use TCharHelper functionality';
function CharInSet(C: Char; const CharSet: TSysCharSet): Boolean; overload; inline; deprecated 'Use TCharHelper functionality';
{$ENDIF}
Bei genauem Hinsehen wird man entdecken, daß CharInSet lediglich für den NextGen-Compiler als deprecated markiert ist.

baumina 27. Nov 2015 07:21

AW: IN durch CharInSet ersetzen
 
Ifndef ?

Sir Rufo 27. Nov 2015 07:24

AW: IN durch CharInSet ersetzen
 
Zitat:

Zitat von baumina (Beitrag 1322648)
Ifndef ?

http://docwiki.embarcadero.com/RADSt...e_%28Delphi%29 (extra verlinkt auf die Delphi XE Dokumentation) :stupid:

baumina 27. Nov 2015 07:35

AW: IN durch CharInSet ersetzen
 
OK, fünfmal gelesen und doch falsch interpretiert. :oops: Wenn nicht dann ... sonst ..., grauenhaft.

Uwe Raabe 27. Nov 2015 07:45

AW: IN durch CharInSet ersetzen
 
Zitat:

Zitat von baumina (Beitrag 1322648)
Ifndef ?

Deswegen bei genauem Hinsehen...

himitsu 27. Nov 2015 09:03

AW: IN durch CharInSet ersetzen
 
Ich wusste nur noch, daß mir die Meldung dieses Jahr schon paar Mal um die Ohren flog,
aber bei ersterem Hinsehen hatte ich irgendwie IFDEF gelesen.


Nja, genau aus diesem Grund versuche ich keine negativen Bedingungen zu verwenden, zumindestens nicht, wenn ein ELSE im Spiel ist.

Und wenn man crossplattform Bibliotheken erstellen will, darf man nun entweder mit IFNDEFs abreiten, oder muß eben auf CharInSet verzichten.
Warum wird hier nur bei NEXTGEN gemeckert? Ich bekomme in Delphi doch sonst auch alle möglichen sinnlosen Warnungen, wenn was in C++ nicht geht. :wall:

Uwe Raabe 27. Nov 2015 09:39

AW: IN durch CharInSet ersetzen
 
Zitat:

Zitat von himitsu (Beitrag 1322662)
oder muß eben auf CharInSet verzichten.

Wenn man es genau nimmt, ist das die sichere Methode. Ich weiß, es wird viele nicht wirklich betreffen, aber sowohl ein
Delphi-Quellcode:
C in [...]
als auch ein
Delphi-Quellcode:
CharInSet
funktioniert so richtig nur dann, wenn die ordinalen Werte unter #128 liegen. Richtiges Unicode geht damit sowieso nicht und bei allem zwischen #128 und #255 spielt die aktuelle Codepage eine Rolle.

Die Verwendung von
Delphi-Quellcode:
IsInArray
ist zugegebenermaßen etwas umständlich, wenn man Bereiche abfragen will, aber für viele reale Abfragen gibt es eigene Routinen (
Delphi-Quellcode:
IsLetter
,
Delphi-Quellcode:
IsDigit
,
Delphi-Quellcode:
IsLower
, ...), die auch für exotische Umgebungen funktionieren und nebenbei den Code in vielen Fällen lesbarer machen.

SMO 27. Nov 2015 13:26

AW: IN durch CharInSet ersetzen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1322667)
Wenn man es genau nimmt, ist das die sichere Methode. Ich weiß, es wird viele nicht wirklich betreffen, aber sowohl ein
Delphi-Quellcode:
C in [...]
als auch ein
Delphi-Quellcode:
CharInSet
funktioniert so richtig nur dann, wenn die ordinalen Werte unter #128 liegen. Richtiges Unicode geht damit sowieso nicht und bei allem zwischen #128 und #255 spielt die aktuelle Codepage eine Rolle.

Genaugenommen spielt die Codepage immer eine Rolle. Die Zeichen zwischen #0 und #127 wären nur dann "sicher", wenn sie in allen Codepages identisch wären - sind sie aber nicht. Siehe z.B. EBCDIC. Hatte gerade erst damit zu tun... habe naiv angenommen, dass CR und LF (zum Erkennen eines Zeilenendes) immer auf #$D und #$A liegen, aber in EBCDIC ist LF #$25.


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