12. Februar 2009 08:12
Hallo rom,
wenn du das ganze Subform für Das Editieren sperren willst, ist die von McClane vorgeschlagene Lösung die beste und die einfachste.
Das einzige Problem ist dann, wenn noch keine Zeilen im Subform vorhanden sind. Ich habe das ganze mit verschiedenen Tricks ausprobiert. Wenn aus dem Quellcode das Subform auf EDITABLE := FALSE gesetzt wird, bleibt es ‚taub‘ zu weiteren Aufrufen wie EDITABLE := TRUE. Das ist die Standardeigenschaft eines tabellarischen Formulars. Ich habe auch erreicht, dass es auf die Signalen des Mainforms reagiert, aber mit dem ‚Wiederbeleben‘ klappt es nicht. Ich kann den Benutzer verstehen: wenn die Zeilen vorhanden sind – funktioniert alles wunderbar. Aber wenn er mit der Erfassung beginnt, sicherlich sind die prüfenden Felder noch leer und als Folge die Zeilen noch nicht editierbar. Nach der Eingabe in den beiden Feldern wird von ihm erwartet, dass das Subform sich zum Editieren öffnet. Aber dieses bleibt ‚taub‘. Der geärgerte Benutzer muss das Formular schließen und wieder öffnen bzw. zu anderem Datensatz wechseln und zurück, um mit den Eingaben im Zeilen Bereich fortsetzen zu können. Aber das ist der Preis für solche kundenspezifischen Anpassungen.
Den gewünschten Effekt habe ich doch erreicht. Was Ähnliches habe ich nirgendwo gesehen. Nach langem Testen ist mir eingefallen. Ob du das einsetzen möchtest, ist dir überlassen. Es funktioniert unabhängig von den vorhandenen bzw. nicht vorhandenen Zeilen im Subform. Hier ist die Lösung:
Im Mainform wird das Subform SalesLine kopiert, unter den Namen SalesLineNotEditable eingefügt und genau über/unter dem SalesLines platziert. Das Formular SalesLineNotEditable kriegt die Standard Eigenschaft Editable = No.
Eine Funktion wird definiert:
- Code:
SetEditableSalesLines()
IF ("Sell-to Customer No." = '') OR ("Sell-to Customer Template Code" = '') THEN BEGIN
CurrForm.SalesLines.VISIBLE := FALSE;
CurrForm.SalesLinesNotEditable.VISIBLE := TRUE;
END ELSE BEGIN
CurrForm.SalesLines.VISIBLE := TRUE;
CurrForm.SalesLinesNotEditable.VISIBLE := FALSE;
END;
Die Funktion wird in Form – OnAfterGetRecord(), und OnAfterValidate() jeweiligen Feldes aufgerufen. Das war’s eigentlich. Hier wird einfach mit der anderen Eigenschaft gespielt.
Der einzige Nachteil – wenn die Größe der Felder in z.B. SalesLines geändert wird und im SalesLineNotEditable nicht. Dann wird sich der Benutzer wundern, dass das Subform im editierbaren und nicht editierbaren Modus unterschiedlich aussieht.
Gruß, Michael