Seite 1 von 1

MENU TO nMenuItem

Verfasst: Mo, 23. Nov 2015 16:18
von BenOve
In ein Menu ist en möglich auch ein Message zu zeigen
je nach Bewegung

Wäre es möglich statt Message ein Funktion zu starten.

Code: Alles auswählen

@ 0, 1 PROMPT " xxx "      MESSAGE "1111" 
@ 1, 1 PROMPT " yyy "      MESSAGE "2222" 
MENU TO nMenuItem
Was ich erreichen möchte ist ein jpg zu zeigen je nach Menu Bewegung
aber befor eine endgültige Wahl gemacht ist

Gruss Bengt

Re: MENU TO nMenuItem

Verfasst: Mo, 23. Nov 2015 16:31
von brandelh
ich schrieb schon ...
ich denke nicht dass man das mit MENU TO machen kann, das alte Clipper Menü ist da etwas eingeschränkt.
... aber ein Blick ins Handbuch der 1.90.355 zeigt folgendes:
@ <nRow>, <nCol> PROMPT <cMenuItem> [MESSAGE <bcMessage>]
Parameter
<nRow>
<nRow> bestimmt die Bildschirmzeile, an der der Menüpunkt ausgegeben wird.
<nCol>
<nCol> bestimmt die Bildschirmspalte, an der der Menüpunkt ausgegeben wird.
PROMPT <cMenuItem>
<cMenuItem> ist eine Zeichenkette, die als Menüpunkt angezeigt wird.
MESSAGE <bcMessage>
<bcMessage> ist eine Zeichenkette, die als Meldung in der durch SET MESSAGE definierten Bildschirmzeile ausgegeben wird, wenn der Menüpunkt ausgewählt ist.
Anstelle einer Zeichenkette kann für <bcMessage> ein Codeblock angegeben werden, der eine Zeichenkette zurückgeben muß.

Code: Alles auswählen

@ ... Prompt "Erstes Menü"
könnte man also auch so schreiben:

Code: Alles auswählen

@ ... Prompt "Erstes Menü" MESSAGE {|| ZeigeInfo(1), "Info Erstes Menü"  }
der letzte Wert wird vom Codeblock zurückgegeben, aber die Funktion davor ausgeführt !

oder die Funktion kümmert sich gleich um den richtigen Text ...

Code: Alles auswählen

@ ... Prompt "Erstes Menü" MESSAGE {|| ZeigeInfo(1) }
function ZeigeInfo(nMenuWert)
    local cInfo
    do case
        case nMenuWert = 1
               cInfo := "Info Erstes Menü"
               ZeigeBild( ... )
...
return cInfo

Re: MENU TO nMenuItem

Verfasst: Mo, 23. Nov 2015 17:17
von BenOve
Vielen dank Hubert, Es funktioniert wunderbar !
Gruss Bengt :angel8:

Re: MENU TO nMenuItem

Verfasst: Mo, 23. Nov 2015 18:02
von BenOve
Statt jede Prompt für sich zu schreiben möchte ich alles mit ein array aARR hereinführen
Aber wenn der Array zB 19 String Elemente hat , dann meldet ZeigeInfo(N) immer N=19
auch wenn Menu am Zeile 1 ist
Hier muss Syntax anscheint anderes aussehen. Was mache in falsch ??

Code: Alles auswählen

   FOR N=1 TO LEN(aARR)
    @ N,0  PROMPT aARR[N] MESSAGE {|| ZeigeInfo(N) }
    NEXT N
    MENU TO nMenuItem


function ZeigeInfo(nMenuWert)
 @0,0 say REPLICATE( STR(nMenuWert,2,0),10)
RETURN STR(nMenuWert,10,0)

Re: MENU TO nMenuItem

Verfasst: Mo, 23. Nov 2015 21:20
von BenOve
Hier einige Idéen probiert ohne Riesen Erfolg

Prompt mit Array funktioniert OK aber passt sich an LEN(aARR) nicht an

Code: Alles auswählen

      N=1;  @ N,0  PROMPT aARR[N]  MESSAGE {|| ZeigeInfo(1) }
      N=2;  @ N,0  PROMPT aARR[N]  MESSAGE {|| ZeigeInfo(2) }
      N=3;  @ N,0  PROMPT aARR[N]  MESSAGE {|| ZeigeInfo(3) }
     MENU TO nMenuItem

Ich habe nachgeguckt was der PreProcessor macht und dann mit CodeBlock probiert
Funktioniert nicht

Code: Alles auswählen

  bBlock := {|N| _AtPrompt(N, 0, aARR[N], promptList, {|| ZeigeInfo(N) }) }
      ? Eval(bBlock, 1)
      ? Eval(bBlock, 2)
      ? Eval(bBlock, 3)
    nMenuItem := _MenuTo(PromptList, nMenuItem, UPPER("nMenuItem"))
Macro Operator geht nicht

Code: Alles auswählen

cSTR:="_AtPrompt(N, 0, aARR[N], promptList, {|| ZeigeInfo(N) })"
FOR N=1 TO 9
x:=&cSTR
NEXT N
    MENU TO nMenuItem
Ist diese Herausforderung unlösbar ???

Re: MENU TO nMenuItem

Verfasst: Mo, 23. Nov 2015 21:45
von Martin Altmann
BenOve hat geschrieben:Ist diese Herausforderung unlösbar ???
Nö - ist sie nicht.
Die Lösung findest du unter anderem :arrow: http://xbaseforum.de/viewtopic.php?f=36&t=8410&p=94541

Viele Grüße,
Martin

Re: MENU TO nMenuItem

Verfasst: Di, 24. Nov 2015 8:05
von BenOve
Vielen Dank, Martin
Zwar immer noch ein bisschen rätselhaft warum es funktioniert,
aber es funktioniert tatsächlich wunderbar.

Code: Alles auswählen

FOR N=1 TO LEN(aARR)
      @ N,0  PROMPT aARR[N]  MESSAGE makeblock(N)
NEXT N
MENU TO nMenuItem

function makeblock(N)
return   {|| ZeigeInfo(N) }

function ZeigeInfo(nMenuWert)
    @0,0 say REPLICATE( STR(nMenuWert,2,0),10)  // Hier kann sich allerlei abspielen innerhalb Menu-Bewegung
RETURN STR(nMenuWert,10,0)