AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Parameter der Pfadangabe enthält herrausfinden
Thema durchsuchen
Ansicht
Themen-Optionen

Parameter der Pfadangabe enthält herrausfinden

Ein Thema von Back2Code · begonnen am 11. Okt 2013 · letzter Beitrag vom 11. Okt 2013
Antwort Antwort
Benutzerbild von Back2Code
Back2Code

Registriert seit: 6. Feb 2012
Ort: Deutschland
272 Beiträge
 
Delphi XE7 Professional
 
#1

Parameter der Pfadangabe enthält herrausfinden

  Alt 11. Okt 2013, 10:59
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:

[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?
00111100001100110010000001000100011001010110110001 1100000110100001101001
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

AW: Parameter der Pfadangabe enthält herrausfinden

  Alt 11. Okt 2013, 11:02
Du willst die Zeichen bestimmt nicht binär verknüpfen, daher muss es wohl eher so lauten:
if (cParam <> '-') and (cParam <> '/') then Alternativ:
if not CharInSet(cParam, ['-', '/']) then
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Back2Code
Back2Code

Registriert seit: 6. Feb 2012
Ort: Deutschland
272 Beiträge
 
Delphi XE7 Professional
 
#3

AW: Parameter der Pfadangabe enthält herrausfinden

  Alt 11. Okt 2013, 11:05
Du willst die Zeichen bestimmt nicht binär verknüpfen, daher muss es wohl eher so lauten:
if (cParam <> '-') and (cParam <> '/') then Alternativ:
if not CharInSet(cParam, ['-', '/']) then
Und ein or ist nicht möglich?
00111100001100110010000001000100011001010110110001 1100000110100001101001
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Parameter der Pfadangabe enthält herrausfinden

  Alt 11. Okt 2013, 11:07
Doch, aber Du musst links und rechts vom "or" einen jeweils vollständigen Ausdruck schreiben:

 if (heute = 'Dienstag') OR (heute = 'mittwoch') then WechseleSocken;
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#5

AW: Parameter der Pfadangabe enthält herrausfinden

  Alt 11. Okt 2013, 11:08
So sieht' s mit or aus:
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Parameter der Pfadangabe enthält herrausfinden

  Alt 11. Okt 2013, 11:12
Ich weiß nicht, wieviel Sicherheit dir reicht, aber ich würde mir

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...
  Mit Zitat antworten Zitat
Benutzerbild von Back2Code
Back2Code

Registriert seit: 6. Feb 2012
Ort: Deutschland
272 Beiträge
 
Delphi XE7 Professional
 
#7

AW: Parameter der Pfadangabe enthält herrausfinden

  Alt 11. Okt 2013, 11:25
Der Vorschlag von Günther hat mir gefallen, habe ich direkt mal mit eingebaut Danke auch an DeddyH & Daniel

Schneller als die deutsche Bahn
00111100001100110010000001000100011001010110110001 1100000110100001101001
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Parameter der Pfadangabe enthält herrausfinden

  Alt 11. Okt 2013, 11:37
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 if cParam <> '-or '/then wird ein if cParam <> ('-or '/') then , bzw. 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 <> 'abcor '123then
(Char ist ein ordinaler Typ, bei dem man mathematische und binäre Operationen anwenden kann, was beim String nicht geht)
$2B or not $2B

Geändert von himitsu (11. Okt 2013 um 11:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Parameter der Pfadangabe enthält herrausfinden

  Alt 11. Okt 2013, 12:15
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 '' , 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.

DeinProgramm.exe 123 "" 456 ´
Param 1 = "123"
Param 2 = "" (also '' 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;
$2B or not $2B

Geändert von himitsu (11. Okt 2013 um 12:25 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:40 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