Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Parameter der Pfadangabe enthält herrausfinden (https://www.delphipraxis.net/177033-parameter-der-pfadangabe-enthaelt-herrausfinden.html)

Back2Code 11. Okt 2013 09:59

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:
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;
Gibt es keine Möglichkeit diese beiden Zeichen gleichzeitig mit or zu überprüfen?:roll:

DeddyH 11. Okt 2013 10:02

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:
if (cParam <> '-') and (cParam <> '/') then
Alternativ:
Delphi-Quellcode:
if not CharInSet(cParam, ['-', '/']) then

Back2Code 11. Okt 2013 10:05

AW: Parameter der Pfadangabe enthält herrausfinden
 
Zitat:

Zitat von DeddyH (Beitrag 1231764)
Du willst die Zeichen bestimmt nicht binär verknüpfen, daher muss es wohl eher so lauten:
Delphi-Quellcode:
if (cParam <> '-') and (cParam <> '/') then
Alternativ:
Delphi-Quellcode:
if not CharInSet(cParam, ['-', '/']) then

Und ein or ist nicht möglich?

Daniel 11. Okt 2013 10:07

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;

DeddyH 11. Okt 2013 10:08

AW: Parameter der Pfadangabe enthält herrausfinden
 
So sieht' s mit or aus:
Delphi-Quellcode:
if not ((cParam = '-') or (cParam = '/'))
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.

Der schöne Günther 11. Okt 2013 10:12

AW: Parameter der Pfadangabe enthält herrausfinden
 
Ich weiß nicht, wieviel Sicherheit dir reicht, aber ich würde mir

Delphi-Quellcode:
System.IOUtils.TPath.HasValidPathChars
einmal anschauen:
Zitat:

Überprüft, ob der angegebene Pfadstring nur zulässige Zeichen enthält.

Durch einen Aufruf von HasValidPathChars können Sie überprüfen, ob der angegebene Pfadstring nur zulässige Zeichen enthält. HasValidPathChars gibt true zurück, wenn der String nur zulässige Zeichen enthält. Andernfalls wird false zurückgegeben.
Sonst "findest" du ja auch einen Parameter als Pfad, wo nur jemand das Prefix '-' oder '/' vergessen hat...

Back2Code 11. Okt 2013 10:25

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:

himitsu 11. Okt 2013 10:37

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:
if cParam <> '-' or '/' then
wird ein
Delphi-Quellcode:
if cParam <> ('-' or '/') then
, bzw.
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:
if cParam <> AnsiChar(Ord('-') or Ord('/')) then
if cParam <> AnsiChar($2D or $2F) then
if cParam <> AnsiChar($2F) then

if cParam <> '/' then
Besseres Beispiel (OK, abgesehn davon, daß das Zeichen 127 nicht so schön darstellbar ist)
Delphi-Quellcode:
if cParam <> ('-' or '[') then // $2D or $5B = $7F

if cParam <> Chr(127) then // $7F
Und hier knallt es natürlich:
Delphi-Quellcode:
var cParam: string;

if cParam <> 'abc' or '123' then
(Char ist ein ordinaler Typ, bei dem man mathematische und binäre Operationen anwenden kann, was beim String nicht geht)

himitsu 11. Okt 2013 11:15

AW: Parameter der Pfadangabe enthält herrausfinden
 
Zitat:

Zitat von Back2Code (Beitrag 1231761)
Delphi-Quellcode:
function GetParamPath(): String;
begin
  ...
    if ... then
    begin
      Result := ...;
      break;
    end;
  ...
end;

Auch wenn der Compiler hier nicht meckert, da solche compilerverwalteten Typen (String, Interface, Variant oder dynamisches Array) praktisch automatisch initialisiert werden.

Gebe ich dir den Rat das Result dennoch zu initialisieren :!:

Hier bekommst du ja deine "Warnung" im die Ohren geworfen.
Delphi-Quellcode:
function Test: Integer;
begin
  if ... then
  begin
    Result := 123;
    break;
  end;
end;
denn das Result wird nicht so initialisiert, wie man es sich vielleicht denkt. (lokale Strings sind automatisch immer leer
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