![]() |
Parameter der Pfadangabe enthält herrausfinden
Ich hab hier eine Funktion geschrieben die dazu gedacht ist, den Pfad von allen angegebenen Parametern herrauszufiltern. Leider kracht es wenn ich die Abfrage auf "-" & "/" mit einem or verknüpfen möchte. Der Compiler spuckt mir aus:
Delphi-Quellcode:
[dcc32 Warnung] TranslationManager.dpr(56): W1058 Implizite String-Umwandlung mit potenziellem Datenverlust von 'string' zu 'ShortString'
Delphi-Quellcode:
Gibt es keine Möglichkeit diese beiden Zeichen gleichzeitig mit or zu überprüfen?:roll:
function GetParamPath(): String;
var i: Integer; sActualParam: String; cParam: Char; begin for i := 0 to ParamCount -1 do begin sActualParam := ParamStr(i); cParam := sActualParam[1]; if cParam <> ('-') or ('/') then // Hier kommt der Fehler begin Result := sActualParam; break; end; end; end; |
AW: Parameter der Pfadangabe enthält herrausfinden
Du willst die Zeichen bestimmt nicht binär verknüpfen, daher muss es wohl eher so lauten:
Delphi-Quellcode:
Alternativ:
if (cParam <> '-') and (cParam <> '/') then
Delphi-Quellcode:
if not CharInSet(cParam, ['-', '/']) then
|
AW: Parameter der Pfadangabe enthält herrausfinden
Zitat:
|
AW: Parameter der Pfadangabe enthält herrausfinden
Doch, aber Du musst links und rechts vom "or" einen jeweils vollständigen Ausdruck schreiben:
Delphi-Quellcode:
if (heute = 'Dienstag') OR (heute = 'mittwoch') then WechseleSocken;
|
AW: Parameter der Pfadangabe enthält herrausfinden
So sieht' s mit or aus:
Delphi-Quellcode:
Wenn man es aber so macht wie in Deinem ersten Post, werden die Ordinalwerte der beiden Zeichen genommen und binär verodert. Das ist zwar syntaktisch korrekt, liefert aber ein ganz anderes Ergebnis.
if not ((cParam = '-') or (cParam = '/'))
|
AW: Parameter der Pfadangabe enthält herrausfinden
Ich weiß nicht, wieviel Sicherheit dir reicht, aber ich würde mir
Delphi-Quellcode:
einmal anschauen:
System.IOUtils.TPath.HasValidPathChars
Zitat:
|
AW: Parameter der Pfadangabe enthält herrausfinden
Der Vorschlag von Günther hat mir gefallen, habe ich direkt mal mit eingebaut Danke auch an DeddyH & Daniel :thumb:
Schneller als die deutsche Bahn :stupid: |
AW: Parameter der Pfadangabe enthält herrausfinden
Nur um es mal zu erklären:
Bei Strings kann Delphi, anhand der im "String" versteckten Encoding-Informationen auch unterschiedliche Strings vergleichen. Bei Char (WideChar) und AnsiChar geht das untereinander leider nicht so gut, weswegen Delphi hier eine "Warnung" anzeigt. Wobei die Fehlermeldung hier ja eigentlich "'char' zu 'ansichar'" heißen müßte, da aber der Compiler vermutlich versuchte das Problem aufzulösen, ist er erst bei "'string' zu 'ShortString'" gescheitert. Rechts das OR ist ein Binäres und aus
Delphi-Quellcode:
wird ein
if cParam <> '-' or '/' then
Delphi-Quellcode:
, bzw.
if cParam <> ('-' or '/') then
Delphi-Quellcode:
.
if cParam <> Chr(Ord('-') or Ord('/')) then
Hier wird also zuerst das OR aufgelöst, wobei Delphi hierbei die Chars als erstmal AnsiChar interpretiert. Den Char-Konstante direkt mit dem WideChar (cParam) verbinden, kann der Compier das erkennen und die Konstante ebenfalls als WideChar verwenden.
Delphi-Quellcode:
Besseres Beispiel (OK, abgesehn davon, daß das Zeichen 127 nicht so schön darstellbar ist)
if cParam <> AnsiChar(Ord('-') or Ord('/')) then
if cParam <> AnsiChar($2D or $2F) then if cParam <> AnsiChar($2F) then if cParam <> '/' then
Delphi-Quellcode:
Und hier knallt es natürlich:
if cParam <> ('-' or '[') then // $2D or $5B = $7F
if cParam <> Chr(127) then // $7F
Delphi-Quellcode:
(Char ist ein ordinaler Typ, bei dem man mathematische und binäre Operationen anwenden kann, was beim String nicht geht)
var cParam: string;
if cParam <> 'abc' or '123' then |
AW: Parameter der Pfadangabe enthält herrausfinden
Zitat:
Gebe ich dir den Rat das Result dennoch zu initialisieren :!: Hier bekommst du ja deine "Warnung" im die Ohren geworfen.
Delphi-Quellcode:
denn das Result wird nicht so initialisiert, wie man es sich vielleicht denkt. (lokale Strings sind automatisch immer leer
function Test: Integer;
begin if ... then begin Result := 123; break; end; end;
Delphi-Quellcode:
, welches beim Result zufällig fast immer so ist, es aber nicht so sein muß, da dieses Result außerhalb der Funktion initialisiert wird)
''
Und außerdem knallt es bei dir, wenn deine Schleife auf einen "leeren" Parameter trifft.
Delphi-Quellcode:
´
DeinProgramm.exe 123 "" 456
Param 1 = "123" Param 2 = "" (also
Delphi-Quellcode:
als Delphi-Stringkonstante)
''
... Und dann geht diese Schleife von 1 bis ParamCount :!: ParamStr(0) ist kein Parameter, sondern entspricht dem Anwendungsnamen, bzw. Application.ExeName .
Delphi-Quellcode:
function GetParamPath: String;
var i: Integer; begin Result := ''; // kann auch ans Ende der Funktion, da wenn man Exit statt Break verwendet for i := 1 to ParamCount do begin if (ParamStr(i) <> '') and not CharInSet(ParamStr(i)[1], ['-', '/']) then // if not StartsStr('-' ParamStr(i)) and not StartsStr('/' ParamStr(i)) then begin Result := ParamStr(i); Break; end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:37 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