Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2562
Erhaltene Danke: 46

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 21.05.09 19:40 
Hallo!

Ich habe zum Thema Befehlsinterpreter
www.delphi-forum.de/...+springen_92352.html
noch eine Frage:

Ich bin mittlerweile beim "if" angelangt. Nun möchte ich vereinfachen, und zwar will ich nicht immer 2x den selben Code schreiben, wenn es zB, nur darum geht, ob eine Datei existiert oder nicht.
Beispiel, Stapeldatei:
if exist 1.txt then del 2.txt -> Mein Programm prüft, ob 1.txt existiert und löscht, wenn ja, 2.txt.

if not exist 1.txt then del 2.txt -> Mein Programm prüft, ob 1.txt nicht existiert und löscht, wenn nein, 2.txt.

Der Unterschied im Delphi-Quellcode ist also nur ein not:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  if (GetWord(sParam, w) = 'exist'then
  begin
   if FileExists(GetWord(sParam, d)) then  //oder eben not FileExists
   begin
    //...
   end;

Wie kann man das not "flexibel" einbauen?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  //Was muss aNOT sein? Eine Variable wohl nicht!
  aNOT := (kommt drauf an, ob der User not angegeben hat);
  if (GetWord(sParam, w) = 'exist'then
  begin
   if aNOT FileExists(GetWord(sParam, d)) then
   begin
    //...
   end;

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Do 21.05.09 19:48 
Das ist doch ganz einfach, indem Du dieses so schreibst:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
//wenn die Datei nicht existieren soll:
if FileExists(GetWord(sParam, d))=false then 
//und wenn die Datei doch existieren soll:
if FileExists(GetWord(sParam, d))=true then


Ist zwar nicht der sauberste Weg, aber dadurch kannst Du (fast) dieselbe Abfrage für das Problem mit oder ohne "not" nehmen, weil Du ja statt dem true/false auch eine boolsche Variable nehmen kannst, der Du vorher den entsprechenden Wert zuweist - z.B. so:
ausblenden Delphi-Quelltext
1:
2:
3:
sollDieDateiExistieren:=CheckBox1.Checked; //oder wie auch immer Du das festlegst, ob sie existieren soll...
if FileExists(GetWord(sParam, d))=sollDieDateiExistieren then
   //Dann tue das, was getan werden soll...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 21.05.09 20:04 
Wie wäre es ganz einfach so: ;-)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
  aNot: Boolean;
...
    if aNot xor FileExists(GetWord(sParam, d)) then
    begin
      //...
    end;


user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
//wenn die Datei nicht existieren soll:
if FileExists(GetWord(sParam, d))=false then 
//und wenn die Datei doch existieren soll:
if FileExists(GetWord(sParam, d))=true then
Bloß nicht. :shock:
Der Vergleich mit Booleanwerten (z.B. if x = true then) ist nicht nur unschön und unlogisch, sondern falsch.
Hier habe ich mal ein kleines Beispiel gebastelt, wann es schief geht:
www.delphi-forum.de/....php?p=548760#548760
Mehr dazu steht hier:
www.delphi-treff.de/...olean-werten/page/4/
Und warum das auch vollkommen unlogisch ist:
www.delphi-forum.de/....php?p=560637#560637
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2562
Erhaltene Danke: 46

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 21.05.09 20:16 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wie wäre es ganz einfach so: ;-)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
  aNot: Boolean;
...
    if aNot xor FileExists(GetWord(sParam, d)) then
    begin
      //...
    end;

Dann ist die Bedingung immer erfüllt! Der Code funktioniert nie, mit existierenden und nicht existierenden Dateien!
Mein Code sieht so aus (vereinfacht):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
 aNOT := (w = 2); //w ist 2 bei "if not", 1 bei "if"

 if (GetWord(sParam, w) = 'exist'then
 begin
  if aNOT xor FileExists(GetWord(sParam, d) then
  begin

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 21.05.09 21:27 
Also bei mir klappt das problemlos, ich habe es gerade kurz als Demo geschrieben, siehe Anhang.
Einloggen, um Attachments anzusehen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2562
Erhaltene Danke: 46

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 21.05.09 21:51 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Also bei mir klappt das problemlos, ich habe es gerade kurz als Demo geschrieben, siehe Anhang.
Ja, klappt jetzt auch bei mir. Ich hatte einen Bug im Ermitteln des Dateinamens!
Danke dir!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 22.05.09 06:21 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Der Vergleich mit Booleanwerten (z.B. if x = true then) ist nicht nur unschön und unlogisch, sondern falsch....

In 2 von drei Punkten muss ich Dir widersprechen:Es ist unschön, logisch und richtig. Deine Beispiele sind konstruiert und haben herzlich wenig mit dem hier geposteten Problem bzw. der Variante von ffgorcky zu tun.

Was ist den unlogisch an der Frage, ob 'Das Wahre ist wahr' nun wahr oder falsch ist?
Redundant und überflüssig: Ja, unlogisch und falsch: Nein.

_________________
Na denn, dann. Bis dann, denn.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 22.05.09 06:49 
Du würdest also zum Systemadministrator z.B. sagen:
Wenn "die Backupdatei xyz existiert" wahr ist, dann brenne sie mir bitte.

Logisch wäre für mich:
Wenn die Backupdatei xyz existiert, dann brenne sie mir bitte.

Und zu dem zweiten Punkt: Was, wenn FileExists nicht True mit dem Wert 1 sondern True mit dem Wert 2 zurückgibt? Weil der Fehlercode einer Betriebssystemfunktion ausgewertet wurde z.B.? Klar kann man jetzt hergehen, nachschauen, dass FileExists das nicht tut und sagen: In diesem Fall kann ich mit True vergleichen, weil FileExists da nichts Falsches zurückgeben wird.
(Denn FileExists benutzt ein boolsches and zur Verknüpfung des Rückgabewertes.)

Ergebnis wäre: Viele benutzen sowas und dann gibt eine solche Funktion plötzlich nicht sauber einen solchen Wert zurück. Bäng. Und dann ist man da wo es einmal eine lange Diskussion und Fehlersuche gab bei einer Frage.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 22.05.09 14:47 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Logisch wäre für mich: Wenn die Backupdatei xyz existiert, dann brenne sie mir bitte.
. Besseres Deutsch: Ja, Logisch(er): Nein. Beide Aussagen sind -rein logisch gesehen- äquivalent und damit *richtig*. Logisch (im mathematischen Sinne) sind auch beide, denn das ist nun mal die Bedeutung des Wortes 'Logik' (Wiki:Die Logik untersucht die Gültigkeit von Argumenten hinsichtlich ihrer Struktur unabhängig vom konkreten Inhalt der eigentlichen Aussagen).

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Und zu dem zweiten Punkt: Was, wenn FileExists nicht True mit dem Wert 1 sondern True mit dem Wert 2 zurückgibt?
. Wenn dem so wäre, hättest Du Recht. Da dem jedoch, wie Du bereits festgestellt hast, nicht so ist, hast du eben (hier) Unrecht. :wink:

Deine Bemerkungen sind, wenn auch im Prinzip richtig, hier jedoch fehl am Platze sind. Rein logisch gesehen. :mrgreen:

_________________
Na denn, dann. Bis dann, denn.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 22.05.09 15:21 
@alzaimar: Klugscheißer :P

Und zu dem Thema =True:

Gehen wir mal Mengentheoretisch ran und definieren:
False = 0
True = 1
Falsch = ==0
Whar = !=0

So gilt:
- False = Falsch --> Wahre Aussage, da beide die gleiche Menge Zahlen abbilden
- True != False --> Wahre Aussage, da 1 != 0
- False != Wahr --> Wahre Aussage, da 0 nicht != 0 --> 0 == 0
- True == Wahr --> Falsche Aussage, da Wahr nicht ==1 bedeutet.

Und genau das sind die Mechanismen, wie Booleans abgeglichen werden: Wir haben fast unendlich viele Zustände, die eine wahre Aussage andeuten, aber nur endlich viele, die eine falsche Aussage bedeuten. Ich kann also beliebig viele verschiedene Werte für wahre Aussagen zurückgeben, und werd damit garantiert auf die Fresse fliegen, wenn ich auf explizit einen dieser Werte prüfe. Das ist wie mit den heißen Herdplatten :mrgreen:

Ein Boolean ist ein Boolean ist ein Boolean --> Den muss man nicht noch einmal konvertieren, damit man einen Boolean hat!

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 22.05.09 15:35 
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
@alzaimar: Klugscheißer :P
Ich sitz hier in Oregon, es war 05:00 morgens. Sag DU mir, wie ich mir sonst die Zeit vertreiben soll. :eyes:
Zitat:

Ein Boolean ist ein Boolean ist ein Boolean --> Den muss man nicht noch einmal konvertieren, damit man einen Boolean hat!
:mahn: Aber man kann. Und es ist *nää nä näää nä näää nä* formal korrekt. :rofl:

Ein letztes Wort: Die Mehrdeutigkeit von True ist grausam. So verhält sich z.B. Boolean(2) nicht genau so wie Boolean(3), auch wenn beide als 'TRUE' dargestellt werden. *Kotz* Daraus folgt: Wer auf Boolean typecastet oder getypecastete Booleans verwendet, darf nicht mitspielen und muss in die Ecke. Mit dem Gesicht zur Wand.

_________________
Na denn, dann. Bis dann, denn.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 22.05.09 15:42 
Aber genau das machst Du, wenn Du von einer WinAPI-Funktion ein Ergebnis entgegennimmst, auch wenn der Typecast dort implizit ist. Und nein, der Delphi-Compiler normiert da nicht ;-)

Außerdem: Manchmal braucht man halt duecento-cinquanta-sei-Logik ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 22.05.09 18:09 
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Aber genau das machst Du, wenn Du von einer WinAPI-Funktion ein Ergebnis entgegennimmst
FileExists ist keine WinAPI-Funktion, wenn ich mich nicht irre. :lol: Lassen wir das und widmen uns den ernsten Dingen des Lebens. Wie dem eigentlichen Thema, denn das wird irgendwie OT-mäßich.

Wie Du schon treffen erwähnt hast, wollte ich nur ein wenig Klugsch***en...

_________________
Na denn, dann. Bis dann, denn.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2562
Erhaltene Danke: 46

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 22.05.09 18:20 
Während ich zunächst mal merke, das mein Thema auf Interesse stösst - DANKE noch mal dafür! - diskutiert ihr um "True = True" oder eben "False" - was ich meinem Code vermeide!

Viel mehr hänge ich hier - was ist, wenn es nicht um FileExist, also um ein True/False, sondern um einen String geht?
Angenommen, der Benutzer hat "d" als Alias für den Befehl "dir" definiert. Dann muss eine if-Abfrage in der Lage sein, das zu erkennen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
 b: Boolean;
//...
//Stapeldatei: if isalias a then dir
  if (GetWord(sParam, w) = 'isalias'then
  begin
   b := not (ExpandAlias(sFName) = ''); //ExpandAlias funktioniert zuverlässig!

   if aNOT xor b then
    MakesParamCmd(sParam);
  end;

Das klappt aber nicht.
Vielmehr ist es so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
if isalias d then {tu was}  ->  JA,  d ist ein Alias
if isalias dxxx then {tu was} ->  JA,  dxxx ist kein Alias

if not isalias d then {tu was} ->  NEIN,  d ist aber ein Alias
if not isalias dxxx then {tu was}  -> NEIN,  dxxx ist kein Alias

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2562
Erhaltene Danke: 46

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Sa 23.05.09 06:23 
Und auch hier war ein Bug: ExpandAlias ist niemals leer, sondern entweder ein Aliasname oder eben der Befehl:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
 b: Boolean;
//...
//Stapeldatei: if isalias a then dir
  if (GetWord(sParam, w) = 'isalias'then
  begin
   b := not (ExpandAlias(sFName) = '');  //Falsch!
   b := (ExpandAlias(sFName) = sFName);  //Richtig!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!