Nachdem nun in diesem Artikel schon die ersten Schritte unternommen und vorhandene Elemente manipuliert wurden, werden nun auch neue Elemente hinzuzugefügt.
Einfügen einer neuen Formcontrol im Design.
FormRun fr; Args args = new ARgs(); FormStringControl fsc; ; args.name(formstr(InventTable)); fr = new FormRun(args); fr.init(); // Neue Control (Tabellenfeld "AltItemID") im Design anfügenfsc = fr.design().addDataField(fr.dataSource(1).id(),fieldnum(InventTAble, altitemid)); fr.run(); fr.wait();
In dem o.g. Beispiel wird das Feld Ersatz-Artikelnummer direkt im Design der Form eingefügt. Bei einem Datenfeld ist es wichtig das als Datasource immer die ID der FormDatasource übergeben wird um die richtige Referenz zu erhalten. Anstelle eines Datenfeldes kann natürlich auch jedes andere Formcontrol eingefügt werden, was wiederrum anderen Möglichkeiten der weiteren Verwendung bieten kann. Möchte man kein Datenfeld erzugen kann mit
.addControl(...
element.design().addControl(FormControltype::String, "Neue Control");
Um das Feld Ersatz-Artikelnummer Beispieltsweise im Überblick - Grid anzuzeigen muss die Erzeugung der FormControl auch auf dem Grid geschehen.
Hierzu wird die FormGridControl „Grid“ aus der Maske gesucht und dort das neue Feld hinzugefügt.
FormRun fr; Args args = new ARgs(); FormGridControl fgc; ; args.name(formstr(InventTable)); fr = new FormRun(args); fr.init(); // Zugriff auf FormControl "Grid" aus dem Design fgc = fr.design().controlName("Grid"); // Dem Grid ein neues Control hinzufügenfgc.addDataField(fr.dataSource(1).id(),fieldnum(InventTAble, altitemid)); fr.run(); fr.wait();
Eine neues FormControl wird also immer vom Vater (Übergeordneten) Control aus erzeugt, im zweifelsfall also mindestens auf dem Design der Form.
parentControl.addControl(… es muss immer die FormControl gefunden werden auf dem die FormControl erzeugt werden soll. Neue FormControls können nur auf Container FormControls, wie Grid, TabPage, Group usw. erzeugt werden.
Über X++ können alle Eigenschaften der FormControls manipuliert werden. Je nach ControlTyp stehen unterschiedliche Eigenschaften zur Verfügung.
FormGroupControl groupCtrl;FormStringControl stringCtrl;;//Neue Gruppe im Design einfügengroupCtrl = element.design().addControl(FormControlType::Group, "Gruppe");//Neue Zeichenfolge der GruppehinzufügenstringCtrl = groupCtrl.addControl(FormControlType::String, "ZeichenFolge");//Zuweisung der DataSourcestringCtrl.dataSource(element.dataSource().name());//Zuweisung des Feldes// stringCtrl.dataField(fieldnum(InventtAble, ItemID));//Zuweisung einer Methode der TabellestringCtrl.dataMethod("ItemName"); stringCtrl.enabled(false);stringCtrl.visible(true);
FormGroupControl groupCtrl;FormStringControl stringCtrl;;//Neue Gruppe im Design einfügengroupCtrl = element.design().addControl(FormControlType::Group, "Gruppe");//Neue Zeichenfolge der GruppehinzufügenstringCtrl = groupCtrl.addControl(FormControlType::String, "ZeichenFolge");//Zuweisung der DataSourcestringCtrl.dataSource(element.dataSource().name());//Zuweisung des Feldes// stringCtrl.dataField(fieldnum(InventtAble, ItemID));//Zuweisung einer Methode der TabellestringCtrl.dataMethod("ItemName");
stringCtrl.enabled(false);stringCtrl.visible(true);
In dem Beispiel wird eine Gruppe direkt im Design erzeugt und in dieser Gruppe wird ein Zeichenfolge eingefügt, die über die Methode ItemName auf der InventTable Daten anzeigt.
Überschreiben der Standardevents ausserhalb der Form
Auch Events wie Modified oder Validate können ausserhalb der Form überschrieben werden. Hierzu muss der aufgerufenden Form mitgeteilt werden, das dieses nicht mehr in der Maske passieren soll, sondern in dem aufrufenden Element (zb. In der Class).
// Das Überschreiben der Methoden erlauben fR.controlMethodOverload(true); // Das Objekt festlegen in der die Methoden definiert sind fR.controlMethodOverloadObject(this);
Nun kann man nicht pauschal für alle Controls eine Methode definieren, sondern muss für jede Control eine eigende Definition erzeugen. Die Syntax ist aber immer die gleiche und fängt mit der Benamung der Methode an. D.h. wurden 10 FormControls zur Laufzeit eingefügt müssen für jeden Event der verändert werden soll eine neue Methode erzeugt werden. Eine Ausnahme, die aber oft zur Regel werden kann, ist das nur für jeden unterschiedliche Namen der FormControls zusätzliche Methode erzeugt werden müssen.
ControlName_MethodenName
Als Beispiel kann die Control ctrlInventTable_ItemId (Artikelnummer im Reiter Übersicht) wie folgt aussehen um die Änderung auf diesem Feld abzufragen
Public boolean ctrlInventTable_ItemID_modified() { FormStringControl c = formrun.controlCallingMethod(); // Die FormControl, von der der Aufruf erfolgt boolean ret; ; ret = c.modified(); // Super() der aktuellen FormControl aufrufen ->modified return ret; }
Oben genannte Methode entspricht der Standard Methode "modified" auf der FormControl "ctrlInventTable_ItemID"
public boolean modified(){ boolean ret; ret = super(); return ret;}
Achtung: Gibt es mehrere Controls in der Form die dieselben Namen haben, werden auch die überschriebenen Methoden von all diesen Controls benutzt! Somit muss die Unterschreidung welche Control das Event gerade ausgelöst hat hier abgefragt werden. Es können aber nur Controls die zur Laufzeit per X++ erzeugt wurden den gleichen Namen erhalten. Beim "normalen" Erstellen einer Form kann das nicht vorkommen...
Subscribe in a reader