Um neue Dialogmasken für die Active Skin Oberfläche zu erstellen und einzubinden, sollte der SOGDevAssistant verwendet werden.
Starten Sie den SOGDevAssistant über das entsprechende Icon der SOGToolbar.
Wählen Sie das gewünschte Verzeichnis, falls dieses noch nicht korrekt eingestellt ist.
Geben Sie unter "Dlg" den gewünschten Dialognamen ein. z. B. "TestStolle1" Der Name der CSharp-Klasse wird dann "DlgTestStolle1" lauten.
Checken Sie "Parameter", wenn der Dialog mit einer Parameter-Aufrufklasse ausgestattet werden soll.
Geben Sie in Lizenz den gewüsnchten Lizenznamen an: z. B. vacos/center oder vacos/basis
Geben Sie die gewünschten Einstellung unter "Eintrag erzeugen" an.
Für neue Funktionen, die noch nicht freigegeben sind, wählen Sie "SOGSichtbar".
Folgende Dateien werden angelegt: (Am Beispiel des Zielordners Sources\SOG.ERP.Modules\Allgemein.Dialog\Test
dd\DlgName.ddx
Sources\SOG.ERP.Modules\Allgemein.Dialog\Test\DlgTestStolle1.cs
Sources\SOG.ERP.Modules\Allgemein.Dialog\Test\DlgTestStolle1.soggenerate.cs
Sources\SOG.ERP.Data\Copy\Dialog\DlgTestStolle1Parameter.cs
In den Menüfunktionen (c064):
Funktion VacosObjectDefinition - Datensatz mit Id = "TestStolle1"
Anschließend übersetzen per DeveloperStudio oder makeallcs
Ausprobieren:
pn
Direktstart TestStolle1
Zur Laufzeit: In der neuen, leeren Maske
Ctrl-S (Erzeugt/Bearbeitet c064 Dialogschritt)
Text Eintragen
KeyBack auf "99" einstellen.
Vor dem Bearbeiten der Maske:
Per Ctrl-W auf Maskenvariante "base" schalten
Wenn Datenfelder auf die Dialogmaske gelegt werden sollen, sollten diese über das DataDictionary erzeugt werden.
Öffnen Sie die gewünschte Datei (Die Dialogklasse DlgTestStolle1.cs) und klicken Sie aus der SOGToolbar die Funktion "SOGDD".
Wahlweise: Aus der Entwicklungsumgebung das Kommando
sogdd DlgTestStolle1
Fügen Sie nun mit Level "05" neue Datenfelder hinzu. Achten Sie darauf, das diese Datenfelder das "V" Attribut gesetzt haben.
Wählen Sie aus der SOGToolbar die Funktion "Generate".
Wahlweise: Führen Sie in dem Verzeichnis, in dem die Datei liegt, das Kommando aus, das in der generierten Datei unter
// SOGGENERATED:
eingetragen ist.
Die Datei DlgTestStolle1.soggenerate.cs wird ggf. neu generiert.
Neugenerieren aller generierten Dateien eines Verzeichnisses
Entwicklungsumgebung:
hhcsgen2 -a upddir -input Verzeiczhnisname
z. B.:
hhcsgen2 -a upddir -input Sources\SOG.ERP.Modules\Allgemein.Dialog\Test
oder:
hhcsgen2 -force -a upddir -input Sources\SOG.ERP.Modules\Allgemein.Dialog\Test
Die Option "-force" erzwingt eine Neugenerierung auch dann, wenn die Quellen (DataDictionary) sich nicht geändert haben.
Einstellen der Cursorposition auf einer Dialogmaske
Verwenden Sie die Funktion "SetCursor" um einem bestimmten Datenfeld den Eingabefocus zu geben.
Beispiel:
SetCursor(nameof(m_anl_termin));
Aktivieren eines bestimmten TabReiters
Um einen bestimmten TabReiter zur Anzeige zu bringen, sollte ein logischer TabReiter-Name definiert und verwendet werden.
[GuiElement(ElementType = GuiElementType.TabPage, Description = "Tabpage die bei einer neuen Aufgabe angezeigt werden soll.")]
public const string TAB_INFO = "info";
// bestimmten TabReiter zur Anzeige bringen:
ShowTab(TAB_INFO);
Damit dies korrekt funktioniert muss entweder auf dem TabReiter selbst oder außerhalb des TabControls ein Feld existieren, auf welches der Cursor gesetzt werden kann. (siehe philip201804120713)
Verwendung von Control-Connectoren
Über Control-Connectoren kann mit bestimmten Controls auf der ActiveSkin Maske kommuniziert werden. Damit können z.B. Nachrichten an Controls geschickt, oder Daten abgefragt werden. Außerdem können Connectoren dazu verwendet werden, den Anwender beim Design von Masken zu unterstützen.
Siehe auch: activeskin.entwickler.meldungen
Festlegung von Voreinstellungen für ObjectSelectoren
Über DialogParameter können auf der Maske konfigurierte ObjectSelectoren so eingestellt werden, dass sie automatisch bestimmte Bedingungen selektieren.
DialogParameter.Add(SOGDialogParameter.SetField(_sel1.Name, nameof(Pinnwand.m_aktiv_bis), SOGObjectFilterItem.OpCodes.GreaterOrEqual, DateHelper.Now.Date));
Über die "SetField" Methode wird ein DialogParameter erzeugt, der eine bestimmte Selektion für ein Datenfeld einrichtet. Als "Klasse" kann entweder der Name eines Selektors (z. B. _sel1.Name oder "sel1") übergeben werden, oder "null". In diesem Fall richtet sich der Parameter an alle oder den einzigen Selector auf der Maske.
Geben Sie den Namen des gewünschten Datenfeldes immer über "nameof" des unterliegenden Datentyps an.
DialogParameter.Add(SOGDialogParameter.SelectView(null, Anschrift.VIEW_KONTO));
Mit "SelectView" kann die im Selector dargestellte Ansicht ausgewählt werden.
DialogParameter.Add(SOGDialogParameter.ShowData(null));
Die Funktion "ShowData" weißt den Selector an, sofort die ausgewählte Datenmenge anzuzeigen. Achtung: Dies kann auch (besser) durch Optionen der ausgewählten Ansicht erreicht werden.
Festlegung von nicht änderbaren Voreinstellungen für ObjectSelectoren
Die WPF Oberfläche unterstützt die Verwendung von nicht änderbaren Voreinstellungen für den ObjectSelector. Dies kann verwendet werden, wenn in einer Maske z.B. visualisiert werden soll, dass Daten nur zu einem festgelegten Konto angezeigt werden. Gehen Sie dazu wie folgt vor:
var para = SOGDialogParameter.SetField(null, nameof(Kundenstamm.m_konto), SOGObjectFilterItem.OpCodes.Equal, _parameter.Konto);
para.IsFixed=true;
DialogParameter.Add(para);
Durch die Angabe von "IsFixed = true", wird der eingestellte Parameter für den Benutzer unveränderbar.
Aus Sicherheitsgründen muss aber zusätzlich die gewünschte Bedingung noch in der erzeugten SQL Anweisung programmatisch eingeschränkt werden. Der Benutzer hat sonst Möglichkeiten, an der so festgelegten Bedingung vorbei kommen.
Festlegung von komplexen Bedingungen
DialogParameter erlauben in der WPF Oberfläche auch die Verwendung von komplexen Bedingung, die mit "UND" und "ODER" miteinander verknüpfbar sind.
SOGDialogParameterGroup grp1 = new SOGDialogParameterGroup(null, nameof(LieferscheinLeitsatz.m_sa), SqlLogical.OR);
SOGDialogParameterGroup grp11 = new SOGDialogParameterGroup(null, nameof(LieferscheinLeitsatz.m_ek_vk), SqlLogical.AND);
SOGDialogParameterGroup grp12 = new SOGDialogParameterGroup(null, nameof(LieferscheinLeitsatz.m_sa), SqlLogical.AND);
grp1.AddField(grp11);
grp1.AddField(grp12);
grp11.AddField(SOGDialogParameter.SetField(null, nameof(LieferscheinLeitsatz.m_ek_vk), SOGObjectFilterItem.OpCodes.Equal, 1));
grp11.AddField(SOGDialogParameter.SetField(null, nameof(LieferscheinLeitsatz.m_rg), SOGObjectFilterItem.OpCodes.Less, 2));
grp12.AddField(SOGDialogParameter.SetField(null, nameof(LieferscheinLeitsatz.m_sa), SOGObjectFilterItem.OpCodes.Equal, 2));
grp12.AddField(SOGDialogParameter.SetField(null, nameof(LieferscheinLeitsatz.m_rg), SOGObjectFilterItem.OpCodes.Equal, 2));
DialogParameter.Add(grp1);
In diesem Beispiel werden 3 Gruppen erzeugt, die jeweils mit "OR" und "AND" verknüpft werden. In jeder Gruppe liegen mit "SetField" definierte Datenfelder.
Solche komplexen Definitionen werden für die "WinForms" Oberfläche in eine SQL Anweisung umgesetzt. Diese Umsetzung erlaubt jedoch nur rudimentäre Bedingungen. In der WPF Oberfläche sind auch kompliziertere Bedingungen denkbar.
Der aus dem obigen Beispiel in der WinForm Oberfläche erzeugte SQL sieht wie folgt aus:
((#TABNAME#.ek_vk = 1 AND #TABNAME#.rg < 2) OR (#TABNAME#.sa = 2 AND #TABNAME#.rg = 2))
Der in der WPF Oberfläche gefüllte SQL Selector hat folgenden Inhalt:
Wird später, z. B. durch das Senden von "DefineSelection" die Selektion eines Selectors z. B. durch ein Event verändert, so kann die angelegte Gruppe verworfen werden, indem dem als Gruppenname genutzten Datenfeld ein anderer Wert zugewiesen wird:
_sel1.DefineSelection(SOGDialogParameter.SetField(null, nameof(LieferscheinLeitsatz.m_sa), SOGObjectFilterItem.OpCodes.Equal, 1));
DefineSelection ersetzt die Definition des Datenfeldes "m_sa" auch wenn dies bislang eine komplexe Gruppe war.