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 AnsiIndexText -> Ergebnis verändern (https://www.delphipraxis.net/177569-case-ansiindextext-ergebnis-veraendern.html)

HolgerCW 14. Nov 2013 08:41

Delphi-Version: 2006

Case AnsiIndexText -> Ergebnis verändern
 
Hallo zusammen,

kann ich das Ergebnis manipulieren, so das wo anders hingesprungen wird ?

Siehe unten. Bei dem Ergebnis 0, soll er bei einem bestimmten Ereignis doch nach 1 springen.

Delphi-Quellcode:
Case AnsiIndexText(Wert, ['A', 'B','C']) of

   0: begin
   
   If Z = 1 then
   
    //Springe zu 1
   
   end;

   1:begin
   ...
   end;
   
   2:begin
   ...
   end;
  end;
Gruss

Holger

baumina 14. Nov 2013 08:47

AW: Case AnsiIndexText -> Ergebnis verändern
 
Delphi bietet zwar ein Goto (da heißt das Label), ist aber eine grauenvolle Art zu programmieren und kann eigentlich immer umgangen werden. Trotzdem ein Beispiel mit Label:

Delphi-Quellcode:
 var
   i : Integer;

 label
   GotoLabel;

 begin
   for i := 1 to 10 do
   begin
     ShowMessage('i = '+IntToStr(i));

    if i = 4 then Goto GotoLabel;  // Conditionally exit the loop
   end;

   ShowMessage('The loop finished OK');
 GotoLabel:
   ShowMessage('Loop finished with i = '+IntToStr(i));
 end;
EDIT : Eine Art ein GoTo zu vermeiden ist, dass Du einfach eine Procedure an beiden Stellen aufrufst.

himitsu 14. Nov 2013 09:20

AW: Case AnsiIndexText -> Ergebnis verändern
 
Oder vor dem CASE prüfen und da noch den Index ändern.

Delphi-Quellcode:
I := AnsiIndexText(Wert, ['A', 'B','C']);
if (I = 0) and (Z = 1) then I := 1;
case I of
  0: begin
  ...
:stupid:
Delphi-Quellcode:
if IfThen((UpperCase(Wert) = 'A') and (Z = 1), 1, AnsiIndexText(Wert, ['A', 'B','C'])) of
case I of
  0: begin
  ...

Sir Rufo 14. Nov 2013 09:46

AW: Case AnsiIndexText -> Ergebnis verändern
 
Das sieht ja grausam aus ...

Warum nicht so
Delphi-Quellcode:
procedure foo;
begin
  ...
end;

procedure bar;
begin
  ...
end;

case AnsiIndexText( Wert, ['A', 'B', 'C'] ) of
  0 :
    foo;
  1 :
    if Z=1 then
      foo
    else
      bar;
  2 :
    begin
      foo;
      bar;
    end;
end;
Und wenn gar nichts mehr geht, dann gibt es noch das State-Pattern

himitsu 14. Nov 2013 09:54

AW: Case AnsiIndexText -> Ergebnis verändern
 
Mein zweites Beispiel sollte man wohl nicht ganz Ernst. (aber wenn es ihm zuviele Zeilen sind, dann halt so :lol:)

Wenn in dem CASE jeweils nur 1-3 Zeilen stehen, dann würde ich eher Variante bevorzugen, oder das CASE gegen ELSE-IFs austauschen.

Es gibt tausende Wege es zu lösen, also wie wäre es beispielsweise mal mit etwas Mathematik?
Delphi-Quellcode:
// angenommen Z kennt nur 0 und 1
case AnsiIndexText(Wert, ['A', 'B','C']) + (Z * 10) of
  00:
    ...
  01, 11, 10:
    ...
  02, 12:
    ...
end;

Sir Rufo 14. Nov 2013 09:57

AW: Case AnsiIndexText -> Ergebnis verändern
 
@himitsu

Das ist wohl der KISS of death :mrgreen:

HolgerCW 14. Nov 2013 12:53

AW: Case AnsiIndexText -> Ergebnis verändern
 
Danke für die info.

Habe es jetzt ausgelagert in eine Funktion und rufe die auf. Goto gefällt mir nämlich auch nicht ...

Gruss

Holger

sx2008 14. Nov 2013 13:41

AW: Case AnsiIndexText -> Ergebnis verändern
 
Zitat:

Zitat von himitsu (Beitrag 1235814)
Mein zweites Beispiel sollte man wohl nicht ganz Ernst. (aber wenn es ihm zuviele Zeilen sind, dann halt so :lol:)

Also ich find's gut.
Die Programmierer wollen es ja heutzutage immer so einfach haben und hängen im Dämmerschlaf vor ihrem PC rum und trinken Kaffee.
Da tut es richtig gut wenn's mal nicht so einfach ist und die grauen Zellen auf Trab kommen :-)


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