Seite 1 von 1

MenuItem "dynamisch" an/abschalten [ERLEDIGT]

Verfasst: Di, 25. Jan 2011 18:40
von Manfred
Hi,

die Überschrift klingt vielleicht ein wenig komisch, aber irgendwie könnte sie auch passen.

Wenn man eine Menubar, mit entsprechenden Items hat, dann ist es sicherlich sinnvoll, das jeweilige Item zu deaktivieren, wenn darüber ein Programmteil aufgerufen wurde. Das wird ja in der Regel über oMenu:disableItem(nummer) gemacht. Und genauso wieder enabled. Jetzt finde ich es ein wenig blöde, wenn man nun x Einträge hat, diese über die entsprechende Reihenfolgennummer (de)aktiviert, aber mitten im Spiel feststellt, da müssen irgendwie noch ein paar Einträge zwischen. Also heißt es alles neu durchnummerieren. Und das bei jedem Item 2x (de/aktiv).

Im Moment löse ich das so:

Code: Alles auswählen

funktion blahblah(oMenu)

FOR nI := 1 TO oMenu:numItems()
      IF Upper(CharRem("~",oMenu:getItem(nI)[1])) = "BUCHUNGSKONTEN"
          oMenu:disableItem(nI)
          nItem := nI
          EXIT
      ENDIF
NEXT

oMenu:enableItem(nItem)
Geht das von Haus aus nicht irgendwie eleganter? Ich meine, dass man irgendwie abfragen kann, von wo kommst Du? Und jetzt bitte disablen. Ich konnte nichts finden, was wir weitergeholfen hätte.

Re: MenuItem "dynamisch" an/abschalten

Verfasst: Di, 25. Jan 2011 18:47
von Tom
Arbeitest Du nicht mit eXpress++?

Code: Alles auswählen

DCMENUITEM 'Test' PARENT oMenu WHEN {||DasGehtHierGeradeNicht()}

Re: MenuItem "dynamisch" an/abschalten

Verfasst: Di, 25. Jan 2011 18:51
von Manfred
Doch, ich arbeite mit express++ aber ich verstehe Deinen Vorschlag nicht. Kann man über When und Aufruf der Funktion schalten? Ansonsten hatte ich schon mal eine var genommen, die jedesmal .F. oder .T. bekam vor und nach dem Funktionsaufruf, aber das hat mich nicht so sehr vom Hocker gehauen. Mich hat dann interessiert, ob es nicht anders geht. Naja, meine Lösung ist ja nicht der Kracher.

Außerdem habe ich ja mal vor von express++ wegzukommen, dann wäre natürlich eine Alternative wünschenswert

Re: MenuItem "dynamisch" an/abschalten

Verfasst: Di, 25. Jan 2011 20:03
von Wolfgang Ciriack
Außerdem habe ich ja mal vor von express++ wegzukommen
Warum denn ?

Re: MenuItem "dynamisch" an/abschalten

Verfasst: Di, 25. Jan 2011 20:08
von Manfred
Hm,

weil ich mir schon des öfteren Schelte eingefangen habe, dass ich so nicht richtig lernen kann, wie es wirklich klappt.

Und weil ich ein bisschen mehr von der Materie verstehen möchte. Ich baue in einer ruhigen Minute nach und nach alles mit xbase++ pur nach um zu sehen, wie man sowas umsetzen muß.

Re: MenuItem "dynamisch" an/abschalten

Verfasst: Di, 25. Jan 2011 20:13
von Herbert
Hi Manfred
Die Frage ist, was erreichst du durch das Disablen? Du willst verhindern, dass die Methode dahinter nicht abläuft.
Ich lass die Menüpunkte bei unwichtigen Dingen aktiv und prüfe in der Methode, ob und was durchgelaufen werden darf.
Z.B. erscheint in einer Messagebox der Standard-Satz: "Bitte zuerst Login und/oder Daten laden" und kehre wieder zurück. Nur bei wichtigen Dingen disable ich.
Nun, letztendlich hast du das Problem ja nur, solange du die Menüpunkte rumschiebst...

Re: MenuItem "dynamisch" an/abschalten

Verfasst: Di, 25. Jan 2011 20:18
von Manfred
Naja,

erstmal möchte ich ein Mehrfachaufrufen dadurch verhindern.

Und während der Entwicklungsphase ist das halt blöde, wenn man "andauernd" die Nummern ändern muß. Man ist ja bestrebt so dynamisch/flexibel wie möglich zu entwickeln, damit man später nur noch fertige Module nehmen und ein wenig anpassen muß.

Re: MenuItem "dynamisch" an/abschalten

Verfasst: Mi, 26. Jan 2011 1:18
von brandelh
Hallo Manfred,

wenn ich dich recht verstehe, sollte oMenu:setName(nMenuXID) genau das sein was du brauchst.
Später kannst du dann nach nMenuXID suchen und genau dieses Menü erhalten, egal an welcher Stelle es steht.

Auf den Text würde ich auch nicht gehen, das wird bei Änderungen schnell übersehen.

Re: MenuItem "dynamisch" an/abschalten

Verfasst: Mi, 26. Jan 2011 8:13
von Manfred
Hi Hubert,

dann muß ich aber vorher eine feste Nummer vergeben und immer darauf achten, dass ich richtig weiter zähle. Ich finde es schon praktischer, wenn es das System macht und ich dann nur abfrage, wie es gemacht wurde. Und das mit dem Namen war jetzt nur ein Beispiel. Im Zweifelsfalle würde ich mich dann an den Namen der Funktion halten, der steht ja auch in dem :getitem drin. Aber ok, ich sehe, es ist nicht so machbar. Hätte ja mal sein können.

Re: MenuItem "dynamisch" an/abschalten

Verfasst: Mi, 26. Jan 2011 8:26
von brandelh
Manfred hat geschrieben:Hi Hubert,
dann muß ich aber vorher eine feste Nummer vergeben und immer darauf achten, dass ich richtig weiter zähle.
Ähmm JA, und wo liegt das Problem ? ;-)

Code: Alles auswählen

#define  MENU_DATEI      1
#define  MENU_BEARB      2
#define  MENU_FENSTER    3
...
oMenu:setName(MENU_DATEI)
...

Re: MenuItem "dynamisch" an/abschalten

Verfasst: Mi, 26. Jan 2011 8:33
von Manfred
OK,

etwas weiter ausgeholt. Tom hat ja weiter oben auf express++ hingewiesen. Dort kann ich mit einer when Klausel regeln, ob aktiv oder nicht. Das setzt aber voraus, dass ich z.B. ganz am Anfang entsprechende Vars mitführe. Das hatte ich auch schon mal gemacht, aber es machte mich nicht glücklich.

Aber ich vermute, ich muß es alles nochmals überdenken und dann die einfachste Lösung aus allen hier nehmen.

Wie gesagt, ich wollte nur wissen, ob ich irgendwas übersehen habe. Aber dem war wohl nicht so.

Trotzdem Danke für eure Ideen und Vorschläge.

Re: MenuItem "dynamisch" an/abschalten [ERLEDIGT]

Verfasst: Mi, 26. Jan 2011 8:43
von brandelh
Hallo Manfred,

Ich nutze mehrere Instanzvariablen mit Arrays und sammle alle Controls, die ich komplett ab-/anschalten will:

Code: Alles auswählen

     * Jetzt MenüPunkte setzen und HideArrays füllen
      soMenu:setname( MENU_BEARB )
      soMenu:addItem({  "Änderungen aufheben", {|| WinMenu():currentWin:Undo() }  })
      aadd(soMenu:disableEmptyShell, nItemNr)
      nItemNr++
      soMenu:addItem(MENUITEM_SEPARATOR )
      aadd(soMenu:disableEmptyShell, nItemNr)
      nItemNr++
      soMenu:addItem({  "~Suchen ..." , {|| NochNicht() }  })
      aadd(soMenu:disableEmptyShell, nItemNr)
      nItemNr++
      soMenu:addItem(MENUITEM_SEPARATOR )
      aadd(soMenu:disableEmptyShell, nItemNr)
      nItemNr++
      soMenu:addItem({ "Zum ~Anfang"  , {|| WinMenu():currentWin:GoTop() } })
      aadd(soMenu:disableEmptyShell, nItemNr)
      aadd(soMenu:disableTop, nItemNr)
      nItemNr++
      soMenu:addItem({ "~Zurück"+chr(9)+"F7" , {|| WinMenu():currentWin:SkipBack() } })
      aadd(soMenu:disableEmptyShell, nItemNr)
      aadd(soMenu:disableTop, nItemNr)
      nItemNr++
      soMenu:addItem({ "~Vor"   +chr(9)+"F8" , {|| WinMenu():currentWin:SkipNext() } })
      aadd(soMenu:disableEmptyShell, nItemNr)
      aadd(soMenu:disableBottom, nItemNr)
      aadd(soMenu:disableEOF, nItemNr)
      nItemNr++
      soMenu:addItem({ "Zum ~Ende"    , {|| WinMenu():currentWin:GoBottom() } })
      aadd(soMenu:disableEmptyShell, nItemNr)
      aadd(soMenu:disableBottom, nItemNr)
      aadd(soMenu:disableEOF, nItemNr)
      nItemNr++
So kann ich in einer Methode je nach DBF Stellung an und abschalten was ich will.
Wenn man kein aufgebohrtes Framework hat, bietet sich z.B. eine Funktion mit einem STATIC aMenuItems := {} an,
in dem dann aadd( aMenuItems, { "MenuName",oMenuItem } ) hinterlegt wird.
Dann kann man diesen "Namen" suchen und ein Objekt zurückgeben.

Re: MenuItem "dynamisch" an/abschalten [ERLEDIGT]

Verfasst: Mi, 26. Jan 2011 8:48
von Manfred
Hi Hubert,

mir ist gerade noch eine etwas andere Idee gekommen, die werde ich erstmal verfolgen.Mal schauen, was man damit machen kann. Wenn die vielleicht OK ist, werde ich mich nochmal dazu äussern.

Re: MenuItem "dynamisch" an/abschalten [ERLEDIGT]

Verfasst: Fr, 23. Feb 2018 18:04
von Manfred
also jetzt werde ich doch langsam porös. Seit xbase++ 2.0 klappt meine Methode von oben nicht mehr.