Seite 1 von 1

DO CASE über Eval(), oder FOR NEXT?

Verfasst: Do, 18. Mai 2006 20:22
von Manfred
Hallo,

ich habe mal wieder eine tolle Frage parat.

Code: Alles auswählen

          LOCAL aPromptArray := {;
                                 {"Menue1","menue1()","Menue1"},;
                                 {"Menue2","menue2()","Menue2"},;
                                 {"Menue3","menue3()","Menue3"},;
                                 {"Menue4","menue4()","Menue4"},;
                                 {"Menue5","menue5()","Menue5"},;
                                 {"Ende"    ,"AppQuit()" ,"Programmende"};
                                }

          ASort(aPromptArray,,LEN(aPromptArray)-1,{|aX,aY| aX[1] < aY[1]}) // sortieren, damit die alphabetische Reihenfolge bleibt, aber ohne Programmende, deshalb (-1)

          DO WHILE .T.
             nY := 4
             nX := MAXCOL()/2-4
             nAuswahl := LEN(aPromptArray)
             FOR nI := 1 TO nAuswahl
                 IF nI < nAuswahl                        // damit das letzte Prompt (Ende) kein Zeichen davor bekommt
                    IF nI > 9
                       cZahl := CHR(nI+55) + ")"                         // hier werden große Buchstaben generiert
                    ELSE
                       cZahl := CHR(nI+48) + ")"                         // Zahlen von 1-9
                    ENDIF
                 ELSE
                    cZahl := ""
                 ENDIF
                 @ nY,nX PROMPT cZahl + aPromptArray[nI,1] MESSAGE aPromptArray[nI,3]
                 nY += 2
             NEXT
             MENU TO nAuswahl
             DO CASE
                   CASE nAuswahl = 1
                            &(aPromptArray[1,2])
                   CASE nAuswahl = 2
                            &(aPromptArray[2,2])

                   CASE nAuswahl = 3
                            &(aPromptArray[3,2])

                   CASE nAuswahl = 4
                            &(aPromptArray[4,2])

                   CASE nAuswahl = 5
                            &(aPromptArray[5,2])

             ENDCASE
          ENDDO .T.
 
Gibt es irgendeine Möglichkeit die DO CASE Anweisung auch über eine Schleife mit dem Array zu verbinden? Ich habe ein paar Dinge ausprobiert, aber irgendwie will es mir nicht gelingen. Es wäre ja schön, wenn man das Array irgendwie einbinden könnte, sonst müßte man ja vorher immer wissen, wie groß das Array ist. Es gibt doch Menues, die aus einer DB gefüttert werden können? Ich finde auch auf die Schnelle nichts in den Beispielen..

Verfasst: Do, 18. Mai 2006 21:19
von Martin Altmann
Hallo Manfred,
warum machst Du nicht einfach:

Code: Alles auswählen

&(aPromptArray[nAuswahl,2])
statt Deiner DO CASE-Konstruktion??

Viele Grüße,
Martin

Verfasst: Do, 18. Mai 2006 21:22
von Manfred
Hi Martin,

hm, statt der Zahl die Var nAuswahl, das stimmt, da habe ich mal wieder nicht dran gedacht. War mal wieder zu einfach, aber damit erschlage ich doch nicht die ganzen CASES, oder?

Das würde ich jetzt nicht verstehen, wie das klappen sollte. Oder wird statt der Cases da einfach nur das Macro in einer Schleife da stehen?

Mal testen.

Verfasst: Do, 18. Mai 2006 21:25
von Manfred
:banghead:
:banghead:
:banghead:
:banghead:
:banghead:
Verflixt,

Schande über mich und Asche auf mein Haupt.

Danke MArtin, das war es. Irgendwie habe ich es nicht mit dem Denken.

Verfasst: Do, 18. Mai 2006 21:28
von Martin Altmann
Hallo Manfred,
Manfred hat geschrieben::banghead:
:banghead:
:banghead:
:banghead:
:banghead:
Aua - ich hoffe, Du hast genug Kopfschmerzmittel :?:
:D

Viele Grüße,
Martin

Verfasst: Do, 18. Mai 2006 21:31
von Manfred
Hi Martin,,

diese Frage von mir, ist mir jetzt im nachhinein so peinlich, dass ich schon fast darum bitten möchte den Thread zu löschen.....

Aber vielleicht gibt es ja noch andere, die daran partizipieren, weil sie sich vielleicht nicht getraut haben so eine blöde Frage zu stellen, wie ich es manchmal mache.

Das war nun wirklich eine simple Lösung des Falles und ich habe es nicht gesehen, weil ich DO CASE so fest im Kopf mit PROMPT verankert hatte..

So was nennt man flexibel wie ein Atombunker....

:roll:

Verfasst: Do, 18. Mai 2006 21:41
von Martin Altmann
Hallo Manfred,
Du kannst natürlich gerne alle Deine Postings in diesem Thread löschen - aber es wäre doch schade drum :wink:
Ich finde es gut und sehe es genauso wie Du!! Dadurch werden unter Umständen auch andere Leute mutig genug, Fragen zu stellen, die ihnen eigentlich peinlich sind - aber die Frage, auch wenn sie peinlich für Dich gewesen sein sollte, war doch sinnvoll! Dein Knoten ist doch jetzt geplatzt und somit brauchst Du Dich doch auch nicht schämen, oder?

Viele Grüße,
Martin

Verfasst: Do, 18. Mai 2006 21:43
von Manfred
Hi Martin,

danke für Deinen Trost.

Langsam komme ich mir aber vor wie ein Schiff, das hat auch jede Menge Knoten, nur das es pro Knoten schneller wird und ich langsamer. ;-)

Verfasst: Do, 18. Mai 2006 21:46
von Martin Altmann
Nun, dafür bekommst Du aber schneller Sterne :-)

Viele Grüße,
Martin

Verfasst: Do, 18. Mai 2006 21:50
von Manfred
:D \:D/ =D> :headbang: :happy6: :wav:

Verfasst: Do, 18. Mai 2006 22:01
von brandelh
Hallo,

nur um Sicher zu sein, kannst du noch vorher abfragen ob

nAuswahl <= len(aPromptArray)

ist, falls aPromptArray nicht automatisch durch die Generierung des Menüs als Obergrenze dient.

Und auch wir haben manchmal ein Brett vor dem Kopf (zumindest ich) :D

Verfasst: Do, 18. Mai 2006 22:08
von Manfred
na gut, weil es so schön war und ich im Moment absolut Panne im Kopf bin, hier gleich noch eine Frage hintendran:

oben steht im 2 Element die Funktion, die ausgeführt werden soll.

Wenn ich jetzt stattdessen EXIT reinschreibe um die Do While Schleife zu verlassen, kommt die Meldung:

------------------------------------------------------------------------------
oError:args :
-> NIL
oError:canDefault : N
oError:canRetry : J
oError:canSubstitute: N
oError:cargo : NIL
oError:description : Unbekannte Variable
oError:filename :
oError:genCode : 22
oError:operation : EXIT
oError:osCode : 0
oError:severity : 2
oError:subCode : 2000
oError:subSystem : BASE
oError:thread : 1
oError:tries : 1
------------------------------------------------------------------------------

Ich komme nicht drauf.....

Ich schätze es hängt mit dem Makro zusammen..

Verfasst: Do, 18. Mai 2006 22:18
von brandelh
Hallo,

er versucht 'Exit' als Variable zu interpretieren, was natürlich nicht geht.

Mach doch eine Unterscheidung

Code: Alles auswählen

if aPromptArray[nAuswahl,2] = NIL
   exit
else
   &(aPromptArray[nAuswahl,2])
endif

Verfasst: Do, 18. Mai 2006 22:23
von Manfred
Hi,

die einfachsten Rezepte sind immer noch die besten.....

Verfasst: Do, 18. Mai 2006 22:25
von brandelh
Hallo,

sag ich doch :D