Seite 1 von 1

Ideensammlung

BeitragVerfasst: Di 27. Mär 2012, 10:12
von Josef Pötzl
Hallo!

Was benötigt man alles für die Gestaltung und Steuerung eines Ribbon?

  • Ribbon-Controls als Elemente um per Code (IntelliSense) ein Ribbon (XML-Text) zusammenstellen zu können
  • Ribbon-XML aus Tabelle auslesen (Tabs, Groups und Controls inkl. deren Eigenschaften als Einträge in Tabellen)
  • Tab-Wechsel u. ä. als Ereignis ausgeben bzw. generell die Callbacks als Ereignis gestalten

Re: Ideensammlung

BeitragVerfasst: Di 27. Mär 2012, 10:24
von Josef Pötzl
Ich gestalte derzeit das Ribbon aus Tabelleneinträgen.
Prinzip: Per VBA-Code wird der Ribbon-XML-Text zusammengestellt. Je nach Bedarf werden Callbacks eingebaut.

Wenn ich in der Anwendung einen Tab-Wechsel mitbekommen will, wird zusätzlich ein unsichtbares Control je Tab eingebaut, auf dessen Visible-Callback ich das Tab-Wechsel-Ereignis auslöse.

Beispiel:
Auf diese Weise habe ich eine Anwendung gestaltet, die beim Tab-Wechsel das zum Tab passende Formular öffnet. Im Tab selbst sind dann die Filter-Bedingungen untergebracht.
Anm.: das war ein Versuch, das Ribbon direkt mit den Formularen zu koppeln um für den Anwender eine übersichtliche Bedienoberfläche zu gestalten.
Die Formulare selbst sind in dieser Anwendung in der Dokumentenregisteransicht gestaltet, wobei das Register (im Produktivbetrieb) allerdings nicht angezeigt wird.

Re: Ideensammlung

BeitragVerfasst: Di 27. Mär 2012, 10:33
von Josef Pötzl
BTW: Ich nannte das Projekt für den Anfang einmal "RibbonTools" ... das können wir aber ändern, wenn sich (aufgrund des Inhalts) ein bessere Name ergibt.

Re: Ideensammlung

BeitragVerfasst: Di 27. Mär 2012, 10:54
von Sten Schmidt
Josef Pötzl hat geschrieben:Was benötigt man alles für die Gestaltung und Steuerung eines Ribbon?


  • Eine sinvolle Möglichkeit Callback-Methoden zu gestalten *
  • Ribbon-XML aus Tabelle oder Textfile auslesen, in einem Objekt speichern, etwas Ändern und zurückschreiben
  • Eine Möglichkeit die Control-Tags mit zusätzlichen Angaben zu füllen (z.B. Berechtigungslevel, oder direkte weitergabe an DoCmd) **

* Ich meine hier insbesondere ohne unendlich Ausdrücke wie:

Code: Alles auswählen

If ribboncontrol.tag = "foo" then MachWas()
else if ribboncontrol.tag = "bar" then MachWasAnderes()
else if ....
...
 


** Hierzu habe ich schon etwas Code aus einem anderen Projekt, aber es ist auch nur Teststadium

Code: Alles auswählen

    /// <summary>
    /// Klasse zum Parsen des IRibbonControl.Tag-Values
    /// </summary>
    class CustomRibbonControlTag
    {
        public string TagString { get; private set; }
        public List<CustomRibbonControlTagElement> TagElements { get; private set; }

        /// <summary>
        /// Klasse zum Parsen des IRibbonControl.Tag-Values
        /// <remarks>
        /// Über die generische Liste TagElements können die erkannten Elemente abgerufen werden.
        /// </remarks>
        /// </summary>
        /// <param name="tagString">IRibbonControl.Tag-Value</param>
        public CustomRibbonControlTag(string tagString)
        {
            this.TagElements = new List<CustomRibbonControlTagElement>();
            this.TagString = tagString;

            string[] tagElements = this.TagString.Split(';');
           foreach (string tagElement in tagElements)
            {
                string[] tagElementContent = tagElement.Split(':');

                CustomRibbonControlTagElement te = new CustomRibbonControlTagElement();
                te.ElementName = tagElementContent[0];
                te.ElementValue = tagElementContent[1];
                te.IsVBAStyleValue = tagElementContent[1].StartsWith("=");

                this.TagElements.Add(te);
            }
        }
    }

    class CustomRibbonControlTagElement
    {
        public string ElementName { get; set; }
        public string ElementValue { get; set; }

        /// <summary>
        /// Gibt an ob das ElementValue mit einem Istgleich-Zeichen beginnt
        /// </summary>
        public bool IsVBAStyleValue { get; set; }
    }
 

Re: Ideensammlung

BeitragVerfasst: Di 27. Mär 2012, 11:06
von Josef Pötzl
Hallo!

Bei mir sieht das (derzeit noch in VBA) z. B. so aus:
1. Einerseits schreibe ich direkt in OnAction einen Funktionsaufruf. Beispiel: "=RibbonActionFormOpen('fProjectList')" .. diese Variante verwende ich am meisten
2. Ich lass eine Klasse den Callback-Aufruf durchführen.
Code: Alles auswählen
Public Sub RibbonWatcherCallBack_OnAction(ByRef rc As IRibbonControl)
   CurrentRibbonWatcher.CallRibbonControlOnAction rc
End Sub

=> in CallRibbonControlOnAction hole ich mir passend zum jeweiligen Ribbon-Control noch Parameter für einen Prozeduraufruf und rufe die Prozedur über Application.Run auf.
Vorteil: das Modul mit den Callback-Funktionen bleibt übersichtlich.

3. (Noch nicht vollständig umgesetzt): man könnte statt den Callback-Aufrufen auf Ereignisse umstellen, dann hätte man das Ribbon entkoppelt und die "Anwendungssteuerung könnte dann je nach Ereignis und dessen Parameter entscheiden, was passieren soll.

mfg
Josef

Re: Ideensammlung

BeitragVerfasst: Di 27. Mär 2012, 11:40
von Josef Pötzl
Noch etwas kann hilfreich sein:
CommandBarConverter ... Wandelt Commandbar-Einträge in Ribbon-Struktur um.

Re: Ideensammlung

BeitragVerfasst: Di 27. Mär 2012, 11:55
von Sten Schmidt
Josef Pötzl hat geschrieben:Noch etwas kann hilfreich sein:
CommandBarConverter ... Wandelt Commandbar-Einträge in Ribbon-Struktur um.


Cool, ja genau, oder auch umgekehrt, ich wandle meinen Ribbon in eine CommandBar wenn ich Access 2003 unterstützen muss.

Re: Ideensammlung

BeitragVerfasst: Di 27. Mär 2012, 15:16
von FireWalkerHH
Ich glaube Du hast schon alles gesagt ... mehr fällt mir gerade auch nicht ein!

Re: Ideensammlung

BeitragVerfasst: Di 27. Mär 2012, 16:48
von Josef Pötzl
Hallo!

Ein Beispiel, wie ich das Ribbon derzeit (zumindest so ähnlich) mit VBA verwende: VbaRibbonWatcher.zip
Anm.: Der Code ist im Beispiel etwas zusammengestoppelt. Daher bitte das nicht als sauberen Code betrachten, der in .NET umgesetzt werden kann. Das Beispiel soll nur ein mögliches Szenario zeigen.

In diesem Beispiel nutze ich je eine Tabelle für Tabs, Groups und Controls. Die Datensätze sind 1:n verbunden.
Sollte man die Tabellen n:m verbinden, damit Control-Definitionen mehrfach verwendet werden können?

mfg
Josef