16.05.2007, 23:30 | #1 |
Участник
|
jinx: Auf Benutzereingaben reagieren in Dialogen und DialogControls
Dialog zu erzeugen ist einfach und geht in der Regel sehr schnell. Das einzige Problem bei Dialog und deren Controls ist, das man im Dialog keine M?glichkeit hat auf die Benutzereingangen sofort zu reagieren. Nun das stimmt nicht wirklich, denn auch bei Dialogen und deren Controls kann man auf die Methoden, wie Modified oder Valdidate f?r jede Control innerhalb des Dialoges erzeugen um auf Benutzereingaben reagieren zu k?nnen. Leider geht es nur nicht so einfach wie bei den Forms, in der in der Regel schon alle FormControls im Design vorhanden sind und sehr einfach die entsprechenden Methoden direkt hinter dem aktuellem Control zu finden und anzupassen sind.
Bei Dialog ist dies nicht der Fall, so muss man diese Methoden an dem Objekt hinterlegen, welches den Dialog aufruft. Ein Beispiel void DialogOeffnen() { Dialog meinDialog; DialogField dCtrl1, dCtrl2; ; meinDialog = new Dialog("Neuer Dialog", this); // Feld Kundennummer hinzuf?gen dCtrl1 = meinDialog.addField(Typeid(CustAccount)); // Feld Name hinz?fgen dCtrl2 = meinDialog.addField(typeid(Name)); // Dialog ausf?hren meinDialog.run(); } Um nun auf Benutzereingaben reagieren zu k?nnen um Beispielsweise nach Eingabe der Kundennummer(Feld: dCtrl1) den Name des aktuellen Kunden im zweiten Feld (Feld: dCtrl2) zu erhalten, muss f?r das Feld Kundennummer die Methode "Modified" ?berschrieben werden. Hierzu ist es n?tig, dem Dialog bzw. dessen Form inkl. FormRun mitzuteilen, das sich diese Methoden im aktuellen Objekt und nicht im Dialog befinden, denn im Dialog haben wir keinen einfluss. Das erreicht man mit meinDialog.doInit(); meinDialog.formRun().controlMethodOverload(true); meinDialog.formRun().controlMethodOverloadObject(this); Die Methode "doInit" ist notwendig um FormRun im Dialog zu initialiseren, wird dieses vers?umt kommt es zum Laufzeitfehler. Alle wichtigen Dinge sind nun getan, bis auf die Definition der Methode f?r das Feld "Kundennummer". Leider kann man den Namen des Feldes bei DialogField nicht manipulieren und muss hier mit den automatisch generierten Controlnamen leben. Da dieses aber immer nach dem gleichen Schema passiert ist das nicht wirklich tragisch. Bei Feldern wird der Name immer wie folgt aussehen fld + Feldnummer + _ + ArrayIdx Die Feldnummer kann man in der Regel einfach ermitteln: Das erste Feld hat die Feldnummer 1, das zweite Feld die Feldnummer 2, usw. Den ArrayIdx hab ich bisher auch nur als 1 gesehen. Das kann sich nat?rlich immer anhand der Komplexit?t ver?ndern. Zu guter Letzt fehlt noch die Methode "Modified" die die gew?nschten ?nderungen beinhaltet. public boolean fld1_1_modified() { FormStringControl c = dialog.formrun().controlCallingMethod(); // Die FormControl, von der der Aufruf erfolgt boolean ret; ; ret = c.modified(); // Super() der aktuellen FormControl aufrufen ->modified dControl2.value(CustTable::find(dControl1.value()).Name); dControl2.enabled(false); return ret; } Eine einfach Klasse die genau dieses auch macht kann man von hier runterladen. Class_DialogControlMethodOverload.zip (,91 KB) Es wird keine Haftung oder Gew?hrleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Mathias F??ler * jinx's AX Blog http://starside.eu * More... |
|
|
За это сообщение автора поблагодарили: Hans (1). |
17.05.2007, 16:50 | #2 |
Banned
|
Повторение - мать учения: автор рассказывает о добавлении методов к элементам управления в динамических диалогах. Возможно, кому-то это покажется новым.
|
|
|
|