Seite 1 von 1

Menueitem dynamisch abschalten

Verfasst: Mo, 26. Feb 2018 9:54
von Manfred
Dieses Thema hatte ich schonmal unter GUI gepackt, aber irgendwie werde ich das Gefühl nicht los, das es etwas mit express++ zu tun hat.

Code: Alles auswählen

PROCEDURE main()
          LOCAL getlist        := {}
          LOCAL GetOptions

          LOCAL oDatenBank         := datenbank():new(,,,.T.)
          LOCAL oDialogZusatz      := mk_dialog():new(,,"25.02.2018 ")
          LOCAL oMenu1             := NIL
          LOCAL oMenu2             := NIL

DCSUBMENU oMenu1;
             PARENT oDialogZusatz:oMenuBar;
             PROMPT "D~ienste"

         DCMENUITEM "~Stundenübersicht Fahrer";
             ACTION {|o|o := Thread():new(), o:start({|| stundenusicht(oMenu1)}) };
            MESSAGE "" INTO oDialogZusatz:oMessageBox;
             PARENT oMenu1
             ..................
********************************************************************************************************************
PROCEDURE stundenusicht(oMenu)
          LOCAL getlist        := {}
          LOCAL GetOptions

          LOCAL oDialog       := NIL
          LOCAL oDialogZusatz := dialogStundenUsicht():new(900,1080,"14.11.2017",oSysPara:oHauptDialog)

          MEMVAR oSysPara

          DC_SETKEYACTIVE(.T.)                                                  // damit die F-Tasten wie im textmodus klappen
          oDialogZusatz:deaktiviereMenueItem(,oMenu,"STUNDENÜBERSICHT FAHRER")
          .........
          return
********************************************************************************************************************
METHOD mk_dialog:deaktiviereMenueItem(lAlle,oMenu,cCaption)
       DEFAULT lAlle TO .F.

       FOR ::nI := 1 TO oMenu:numItems()
           IF Upper(CharRem("~",oMenu:getItem(::nI)[1])) == cCaption
              oMenu:disableItem(::nI)
              ::nItem := ::nI
              EXIT
           ENDIF
       NEXT
RETURN
Bis zur Version 1.90xx hat es einwandfrei geklappt. Seit der 2.0 ist es mir durch Zufall aufgefallen, das es nicht mehr klappt. In der For Next wird das Menuitem gefunden und dann deaktiviert. Aber es wird im menue nicht ausgegraut, sondern bleibt anwählbar. Selbst wenn ich von hand oMenu:disablemitem(zahl) eingebe, es bleibt aktiviert. Übersehe ich irgendwas im Express++ System, oder hat sich was geändert in der 2.0er?

Re: Menueitem dynamisch abschalten

Verfasst: Mo, 26. Feb 2018 18:29
von Wolfgang Ciriack
Hast du mal ein kleines Testprogramm ?
Ich benutze die Menüs mit einer WHEN Klausel, da hab ich zwischen 1.9 und 2.0 noch keinen Unterschied festgestellt.

Re: Menueitem dynamisch abschalten

Verfasst: Mo, 26. Feb 2018 18:34
von Manfred
Hi Wolfgang
mit When Klausel stand damals auch zur Debatte, klappt damit auch. Der große Nachteil ist aber, ich muß wieder "sprechende" Variablen mitführen.
Mit einem Beispiel muß ich mal schauen, wie ich das gebacken kriege.

Re: Menueitem dynamisch abschalten

Verfasst: Do, 12. Apr 2018 11:28
von Manfred
Mit dem Beispiel hapert es. Da steckt zu viel Kram hinter und ich weiß nicht, ob es dann so klappt, wie jetzt.
kann ich denn irgendwie das Klappmenue aufhalten um zu sehen, ob disable funktioniert aber evtl. nur durch irgendeine Nachfolgeroutine von Roger evtl. wieder rückgängig gemacht wird? Das Pulldownmenue schließt ja sofort wieder, sobald der Punkt angewählt wurde.

Re: Menueitem dynamisch abschalten

Verfasst: Do, 12. Apr 2018 11:57
von Manfred
Jetzt habe ich ATTRIBUTE gefunden, aber das ist es wohl nicht. Alledings würde ich das aus der Erklärung so definieren.

Re: Menueitem dynamisch abschalten

Verfasst: Do, 12. Apr 2018 12:46
von Tom
Wenn Du Menüeinträge ausblendest, holt Dir spätestens das nächste DC_GetRefresh() alles wieder rein. Wenn nämlich Menüeinträge kein .F. im WHEN- oder PROTECT-Codeblock zurückliefern, sind sie aktiv, vorhanden und verwendbar, auch wenn sie das vorher nicht waren, weil Du sie abgeschaltet hast. DC_GetWhen(GetList) ist die Funktion, die das macht. Sie wird nicht nur von DC_GetRefresh() aufgerufen, sondern auch zwischendrin, wenn XbParts ihre Inhalte ändern, in ein Browse geklickt wird usw. Da kommst Du auch kaum drumherum. Ich sehe nur zwei Möglichkeiten. Entweder, Du baust Dein Menü direkt (ohne eXpress++) oder Du verwendest WHEN/PROTECT.

Re: Menueitem dynamisch abschalten

Verfasst: Do, 12. Apr 2018 12:49
von Manfred
so ein Mist. Warum hat das nur bisher unter der 1.90er geklappt? Muß ich wohl in den sauren Apfel beissen... :banghead:
Hm, gibt es denn da genauso eine Möglichkeit wie mit Cargo? Wenn ich disable, dann ermittel ich ja wo der Menuepunkt steht. Kann man das dann nicht auch mit WHEn/Protect machen? Da muß doch auch irgendein wert irgendwo gespeichert sein?

Re: Menueitem dynamisch abschalten

Verfasst: Do, 12. Apr 2018 13:28
von Manfred
ich hatte ein ähnliches Problem schonmal mit Pushbutton. Da habe ich dann den CARGo Slot genommen und da "AN" oder "AUS" eingeschrieben (oPb:CARGO[3] = "AUS") . Somit konnte ich dann über die When Klausel eine Abfrage starten und die Pushbutton steuern. Es gibt bei den Menuitems ja auch einen CARGO Slot. Aber wie kann ich dann später ermitteln, wenn ich das da genauso machen möchte wie bei den Pushbuttons? Ich vergebe ja bei den menuitems keinen Objektnamen, den ich übergeben und prüfend durchlaufen kann.

Re: Menueitem dynamisch abschalten

Verfasst: Do, 12. Apr 2018 13:55
von Tom
Aber Du kannst doch irgendwas in der WHEN-Klausel verwenden, zum Beispiel auch die angezeigte Caption:

Code: Alles auswählen

DCMENUITEM "Statistik 1" PARENT oStatistikMenu ACTION {||Statistik1()} WHEN {||IchDarfGerade("Statistik 1")}

FUNCTION IchDarfGerade(c)
RETURN IF (<xAusDruck>,.T.,.F.)

Re: Menueitem dynamisch abschalten

Verfasst: Do, 12. Apr 2018 13:57
von Manfred
haha, ich bin ja etwas schusselig. Wir haben ja nächste Woche Forentreffen........... :badgrin:

Re: Menueitem dynamisch abschalten

Verfasst: Do, 12. Apr 2018 18:52
von DelUser01
Hallo Manfred

ich mach das so:
beim Generieren des Menü schreibe ich in ein Array allenotwendigen Infos zu diesem neuen MenuItem. Natürlich auch die Item-Nr., auch die ItemNr welche bei oMnu:AddItem() zurückgegeben wird.

Sollen jetzt ein MenuItem aktiviert/deaktiviert (versteckt?) werden kann suche ich die betroffenen ItemNr z.B. mit aScan und vergleiche die im Array abgelegten Item-Informationen. Die gefundenen ITems kann ich dann mit der ItemNr aktivieren/deaktivieren. Das kann ein Item sein oder gleich mehrere.
Dazu habe ich mir ein paar kleine Funktionen geschrieben.

Dem MenüItem gebe ich nur wenig Informationen mit. Die eigene Konfiguration und was passieren soll wenn das Item angeklickt wird kommt immer aus dem Array. Somit kann ich viele Parameter während der Laufzeit am Menü ändern.

(Ist aber nicht der einfachste Weg...)

Re: Menueitem dynamisch abschalten

Verfasst: Do, 12. Apr 2018 19:15
von Manfred
Hi Roland,
das es verschiedene Wege gibt ist klar. Ich hatte einen Weg gefunden, der unter 1.90 noch klappte, aber jetzt unter 2.0 nicht mehr klappt. Außerdem geht es hier speziell um express++
Aber wie schon erwähnt, ich werde das mal nächste Woche versuchen zu klären.

Re: Menueitem dynamisch abschalten

Verfasst: Do, 12. Apr 2018 19:18
von DelUser01
Manfred hat geschrieben: Do, 12. Apr 2018 19:15Außerdem geht es hier speziell um express++
Sorry - habe ich übersehen