Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Case... else (https://www.delphipraxis.net/133243-case-else.html)

ToFaceTeKilla 28. Apr 2009 13:09


Case... else
 
Heyho,

hab mal ne Frage zu Case-Bedingungen:
Wenn ich einen Dialog mittels Case aufrufe
Delphi-Quellcode:
case MessageDlg('Wuppdi',mtError,[mbOk,mbNo,mbCancel],0) of
          mrOK : begin
                  ...
                  end;
          mrNo : begin
                 end;
     
          else : begin
                 end;
        end;
müsste dann nicht beim Klick auf Cancel der Else-Block ausgeführt werden? Also so, dass else alle Buttons umfasst, die nicht einzeln behandelt werden?
Bei mir wird das immer übersprungen...

DeddyH 28. Apr 2009 13:13

Re: Case... else
 
Stimmt, das else sollte alle Fälle abfangen, die zu keinem case-Label passen.

Mithrandir 28. Apr 2009 13:15

Re: Case... else
 
Tuts eigentlich auch... Aber das original Statement hat sicherlich noch was zwischen begin...end, oder? Sonst wird das nämlich gnadenlos wegoptimiert... ;)

taaktaak 28. Apr 2009 13:18

Re: Case... else
 
Vermutlich ist es das gleiche Problem, dashier behandelt wurde.

ToFaceTeKilla 28. Apr 2009 13:25

Re: Case... else
 
Zitat:

Zitat von taaktaak
Vermutlich ist es das gleiche Problem, dashier behandelt wurde.

Leider nicht, weil bei mir in dem else-Label ein exit steht. Quasi genau umgekehrter Fall. Auch wenn ich nen Breakpoint drauf setz, wird es nicht angesprungen Oo

DeddyH 28. Apr 2009 13:31

Re: Case... else
 
Zeig doch mal den Originalcode.

taaktaak 28. Apr 2009 13:34

Re: Case... else
 
Hmmm, seltsam, hab's ausprobiert:
Bei mir funktioniert das genau wie erwartet.


ähhhh - allerdings mit einem Unterschied: Nach else kein Doppelpunkt

Klaus01 28. Apr 2009 13:35

Re: Case... else
 
Moin,

hinter else kommt kein ":".
Einfach
else
begin
...
end;

Grüße
Klaus

ToFaceTeKilla 28. Apr 2009 13:39

Re: Case... else
 
Man beachte das mrCancel, was ich gerade mal noch zum Testen hinzugefügt hab...
Delphi-Quellcode:
case TypeCompare(aImpObj, aCurObj) of            
              2: blDoTblCheck := true;
              1: case MessageDlg( message, mtConfirmation, [mbYes,mbNo,mbCancel],0 ) of
                   mrNo: begin
                           aDeleteObj[aImpObjCount]:=1;
                           aActionProtocol.DoAddDBActionEventItem(customEvent);
                         end;
                   mrYes: begin
                           aImpObj.ID:= aCurObj.TypID;
                           blDoTblCheck:= TRUE;
                         end;
                   mrCancel : Exit;     //hab ich testhalber mal hinzugefügt, wird auch ignoriert

                 else
                   exit;    //wird ignoriert
                 end;
             else
                begin
                  aDeleteObj[aImpObjCount]:=1;
                  aActionProtocol.DoAddDBActionEventItem(customEvent);
                  blDoTblCheck:= false;
                  exit;
                end;
EDIT:
beim Klick auf Cancel springt er direkt in das else-Label der äußeren Case-Bedingung und zwar direkt auf exit, ohne die drei Anweisungen davor.

EDIT2:
Was mir noch aufgefallen ist, was dem Problem aber auch nicht abhilft, ist, dass die IDE(*) das else unterschiedlich einfärbt, je nachdem ob davor ein Semikolon steht oder nicht: mit Semikolon hat es die Farbe der Case-Bedingung und ohne die der begin...end eine Ebene tiefer bei mrYes usw.
*hab CN-Pack installiert, das färbt zusammengehörige Statements ein

himitsu 28. Apr 2009 14:29

Re: Case... else
 
Passiert nach diesem CASE noch etwas, oder ist da die Prozedur/Funktion zuende?
Wenn danach nichts mehr passiert, dann wird das Exit vermutlich auch wegoptiomiert.

ToFaceTeKilla 28. Apr 2009 14:52

Re: Case... else
 
Ne, nach dem Case ist Schluss. Dann wird das wohl auch der Grund sein.
Ich seh auch gerade, dass wenn man hinter mrCancel mehr als exit schreibt, die Breakpoints auch wieder auftauchen...
Also wird else einfach wegoptimiert, da die Prozedur in dem Falle eh die Programmsteuerung wieder abgibt.

Danke fürs Augen öffnen :thumb:

TurboMartin 28. Apr 2009 15:19

Re: Case... else
 
Auch wenn ich schon längere Zeit nicht mehr mit Delphi arbeite, dachte ich immernoch das es für soetwas default gibt...

himitsu 28. Apr 2009 15:28

Re: Case... else
 
Zitat:

Zitat von TurboMartin
dachte ich immernoch das es für soetwas default gibt...

ich glaub in C ist das so :gruebel:, aber in Delphi/Pascal ist es ELSE.

find ich auch praktischer so, denn so ist es identisch zum IF-THEN-ELSE und {$ELSE} :angel:

mkinzler 28. Apr 2009 15:29

Re: Case... else
 
Urspünglich hies es ja OTHERWISE


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:23 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