Menu : "saven" ?

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12911
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Menu : "saven" ?

Beitrag von AUGE_OHR »

hi,

wie kann man ein vorhandenes Menu "saven" ?

Ich baue wie gewöhnlich ein Menu mit Submenus auf. In der Function
ChangeMenu() will ich nun die einzelnen Menupunkte in ein Array
aufnehmem. Dazu stelle ich mit oMenu:numItems() fest wie viele Items
ich habe und versuche die in der Schleife mit oMenu:getItem(i) zu
bekommen ... aber ich bekomme nur {XbpMenu, NIL, NIL, NIL}

Code: Alles auswählen

#include "Appevent.ch"

STATIC aMenu := {}

PROCEDURE Main
LOCAL nEvent, mp1, mp2, oXbp
LOCAL oMenuBar, oSubMenu, aItem

   Setcolor( "N/W")
   CLS
   SetAppWindow():useShortCuts := .T.

   oMenuBar := SetAppWindow():MenuBar()

   oSubMenu       := XbpMenu():new(oMenuBar):create()
   oSubMenu:title := "~Prozedural"
   oSubMenu:addItem( { "Prozedur ~1", {|| MyFunction(1) }} )
   oSubMenu:addItem( { "Prozedur ~2", {|| MyFunction(2) }} )
   oMenuBar:addItem( { oSubMenu, NIL } )

   oSubMenu       := XbpMenu():new(oMenuBar):create()
   oSubMenu:title := "~Funktional"
   oSubMenu:addItem( { "Funktion ~1", {|| MyFunction(3) } } )
   oSubMenu:addItem( { "Funktion ~2", {|| MyFunction(4) } } )
   oSubMenu:addItem( { "~Ende"      , {|| MyFunction(5) } } )
   oMenuBar:addItem( { oSubMenu, NIL } )

   oSubMenu       := XbpMenu():new(oMenuBar):create()
   oSubMenu:title := "~Change"
   oSubMenu:addItem( { "~Change Menu", {|| ChangeMenu( SetAppWindow() ) } } )
   oMenuBar:addItem( { oSubMenu, NIL } )

   // Event loop = Programmsteuerung
   nEvent := 0
   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      oXbp:HandleEvent( nEvent, mp1, mp2 )
   ENDDO

RETURN

PROCEDURE MyFunction(nNum)
   ? "Hallo "+STR(nNum)
RETURN

FUNCTION ChangeMenu( oDraw )
LOCAL oMenu := oDraw:menuBar()
LOCAL nZahl := oMenu:numItems()
LOCAL i

   aMenu := {}

   FOR i := 1 TO nZahl
       AADD(aMenu, oMenu:getItem(i) )
       ? aMenu[i]
   NEXT
ALTD()

   oMenu:setItem( 1,{ "~Artikel ", { || MyFunction(6)  } }, )
   oMenu:setItem( 2,{ "~Kunden  ", { || MyFunction(7)  } }, )
   oMenu:setItem( 3,{ "~Ende    ", { || MyFunction(8)  } }, )

RETURN .T.
Fragen :
a.) wieso gibt er beim ersten "Change" mit {XbpMenu, NIL, NIL, NIL} ?
b.) mit oMenu:setItem( 1, ...) ersetze ich das erste Item. Wenn ich nun
nochmals "Change" aufrufe zeigt er mir "richtig" (?)
{~Artikel , { || MyFunction(6) }, NIL, NIL}
c.) wie komme ich an die "SubMenus" ?
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12911
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hier die "lates"

Code: Alles auswählen

FUNCTION ChangeMenu( oDraw )
LOCAL oMenuBar := oDraw:menuBar()
LOCAL nZahl    := oMenuBar:numItems()
LOCAL i
LOCAL nSub
LOCAL j
LOCAL oSub
LOCAL oSubMenu := NIL
LOCAL cTitle

IF EMPTY(aMenu)

   FOR i := 1 TO nZahl
       AADD(aMenu, oMenuBar:getItem(i) )
       ? oSub := oMenuBar:getItem(i)
       IF VALTYPE( oSub[1] ) = "O"
          nSub := oSub[1]:numItems()
          FOR j := 1 TO nSub
              ? oSub[1]:getItem(j)
              AADD(aMenu, oSub[1]:getItem(j) )
          NEXT
          AADD(aMenu, {"ENDE","ENDE"} )
       ENDIF
   NEXT
   ? ""

   FOR i := nZahl TO 1 STEP -1
      oMenuBar:delItem(i)
   NEXT

   oSubMenu       := XbpMenu():new(oMenuBar):create()
   oSubMenu:title := "~Artikel"
   oSubMenu:addItem( { "Prozedur ~6", {|| MyFunction( 6) }} )
   oSubMenu:addItem( { "Prozedur ~7", {|| MyFunction( 7) }} )
   oMenuBar:addItem( { oSubMenu, NIL } )

   oSubMenu       := XbpMenu():new(oMenuBar):create()
   oSubMenu:title := "~Kunden"
   oSubMenu:addItem( { "Funktion ~8", {|| MyFunction( 8) } } )
   oSubMenu:addItem( { "Funktion ~9", {|| MyFunction( 9) } } )
   oSubMenu:addItem( { "~Ende"      , {|| MyFunction(10) } } )
   oMenuBar:addItem( { oSubMenu, NIL } )

   oSubMenu       := XbpMenu():new(oMenuBar):create()
   oSubMenu:title := "~Change"
   oSubMenu:addItem( { "~Change Menu", {|| ChangeMenu( SetAppWindow() ) } } )
   oMenuBar:addItem( { oSubMenu, NIL } )

ELSE

   FOR i := nZahl TO 1 STEP -1
      oMenuBar:delItem(i)
   NEXT

   nZahl := LEN(aMenu)
   FOR i := 1 TO nZahl
       ? aMenu[i]
       IF VALTYPE( aMenu[i][1] ) = "O"
          ? cTitle := aMenu[i][1]:Title

          oSubMenu       := XbpMenu():new(oMenuBar):create()
          oSubMenu:title := cTitle

       ELSEIF VALTYPE( aMenu[i][1] ) = "C" .AND. aMenu[i][1] = "ENDE"

          oMenuBar:addItem( { oSubMenu, NIL } )

       ELSE
          IF oSubMenu = NIL
             ALERT("war nix")
          ELSE
             IF VALTYPE(aMenu[i][2]) = "B"
                oSubMenu:addItem( { aMenu[i][1]  , aMenu[i][2] , aMenu[i][3] , aMenu[i][4]} )
             ELSE
                oSubMenu:addItem( { aMenu[i][1]  , String2CB(aMenu[i][2]), aMenu[i][3] , aMenu[i][4] } )
             ENDIF
          ENDIF
       ENDIF
   NEXT
   ? ""
   aMenu := {}

ENDIF

RETURN .T.

FUNCTION String2CB(cString)
RETURN &(cString)
gruss by OHR
Jimmy
Antworten