| Autor |
Beitrag |
galagher
      
Beiträge: 2562
Erhaltene Danke: 46
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: 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:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| if (GetWord(sParam, w) = 'exist') then begin if FileExists(GetWord(sParam, d)) then begin end; |
Wie kann man das not "flexibel" einbauen?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| 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
      
Beiträge: 573
WIN XP/2000 & 7Prof (Familie:Win95,Win98)
|
Verfasst: Do 21.05.09 19:48
|
|
jaenicke
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 21.05.09 20:04
Wie wäre es ganz einfach so:  Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var aNot: Boolean; ... if aNot xor FileExists(GetWord(sParam, d)) then begin end; |
ffgorcky hat folgendes geschrieben : | Delphi-Quelltext 1: 2: 3: 4:
| if FileExists(GetWord(sParam, d))=false then if FileExists(GetWord(sParam, d))=true then | |
Bloß nicht.
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 
      
Beiträge: 2562
Erhaltene Danke: 46
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 21.05.09 20:16
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
jaenicke
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 2562
Erhaltene Danke: 46
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 21.05.09 21:51
jaenicke hat folgendes geschrieben : | | 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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 22.05.09 06:21
jaenicke hat folgendes geschrieben : | | 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
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 22.05.09 14:47
jaenicke hat folgendes geschrieben : | | 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).
jaenicke hat folgendes geschrieben : | | 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.
Deine Bemerkungen sind, wenn auch im Prinzip richtig, hier jedoch fehl am Platze sind. Rein logisch gesehen. 
_________________ Na denn, dann. Bis dann, denn.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 22.05.09 15:21
@alzaimar: Klugscheißer
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
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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 22.05.09 15:35
_________________ Na denn, dann. Bis dann, denn.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 22.05.09 18:09
BenBE hat folgendes geschrieben : | | Aber genau das machst Du, wenn Du von einer WinAPI-Funktion ein Ergebnis entgegennimmst | FileExists ist keine WinAPI-Funktion, wenn ich mich nicht irre.  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 
      
Beiträge: 2562
Erhaltene Danke: 46
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: 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:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var b: Boolean; if (GetWord(sParam, w) = 'isalias') then begin b := not (ExpandAlias(sFName) = ''); if aNOT xor b then MakesParamCmd(sParam); end; |
Das klappt aber nicht.
Vielmehr ist es so:
Delphi-Quelltext 1: 2: 3: 4: 5:
| if isalias d then -> JA, d ist ein Alias if isalias dxxx then -> JA, dxxx ist kein Alias
if not isalias d then -> NEIN, d ist aber ein Alias if not isalias dxxx then -> 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 
      
Beiträge: 2562
Erhaltene Danke: 46
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 23.05.09 06:23
Und auch hier war ein Bug: ExpandAlias ist niemals leer, sondern entweder ein Aliasname oder eben der Befehl:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| var b: Boolean; if (GetWord(sParam, w) = 'isalias') then begin b := not (ExpandAlias(sFName) = ''); b := (ExpandAlias(sFName) = sFName); |
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
|