Re: Formulareingaben Speichern verhindern



Hallo!

Dietmar Thesing:
Nun gut, dann trau ich mich mal, dir zu zeigen, was ich
bisher daraus gemacht habe. Am Speichern bin ich noch
dran, aber das Binden und Entbinden und Sammeln scheint
zu funktionieren. Alles befindet sich im Formular-Modul.
Fehlerbehandlung folgt später. Unten der Code, mit
Deklarationen, Form_Load und dem Codeschnippsel fürs
Wieder-Binden der Steuerelemente. Würd mich freuen, wenn
du Lust hast, Verbesserungsvorschläge zu machen.

Hab ich.

Die Länge der Collection-Keys ist mir z.B. etwas lang
geraten. (Die Formatierung ist bei mir etwas
übersichtlicher, hab jetzt zum Posten ein paar
Einrückungen rausgenommen und ein paar
Code-Zeilen-Umbrüche gemacht.)
Option Compare Database
Option Explicit

Private c1 As Collection
Private c2 As Collection
Private c3 As Collection


Private Sub Form_Load()
'Setzt voraus, dass alle anzusprechenden Steuerelemente
'nur in Ufos und UF-Ufos vorhanden sind,
'weil das eigentliche Formular keine Daten,
'sondern nur das TabControl enthält.
Dim subFrm As Access.SubForm
Dim subFrmU As Access.SubForm
'Controls für die drei Ebenen
Dim ctrFrm As Access.Control
Dim ctr As Access.Control
Dim ctrU As Access.Control

'strKey(U): Der Collectionschlüssel als Zeichenfolge.
'Wird aus dem "Pfad" der Controls komplett
zusammengesetzt, 'weil es sein kann, dass dieselben Namen
' 'in verschiedenen Unterformularen vorkommen.
'Die Identifizierung erfolgt also über die
'Steuerelementnamen der UFos.

Dim strKey As String
Dim strKeyU As String
Dim ctrC As Access.Control

Set c1 = New Collection
Set c2 = New Collection
Set c3 = New Collection

'Sammeln
For Each ctrFrm In Me.Controls
If ctrFrm.ControlType = acSubform Then
Set subFrm = Me(ctrFrm.Name)
strKey = subFrm.Name & "!"
For Each ctr In subFrm.Controls
If ctr.ControlType = acTextBox Or _
ctr.ControlType = acComboBox Then
strKey = strKey & ctr.Name
c1.Add ctr, strKey
c2.Add ctr.ControlSource, strKey
c3.Add strKey, strKey

c3 ist m. E. überflüssig.

ctl.ControlSource = c2(ctl.Parent.Name & "!" & ctl.Name)

sollte beim Binden tun, was Du brauchst. Formularname,
Ausrufezeichen, Control-Name sind ja Dein Schlüssel, wenn
ich recht verstanden habe. Um unter alteingefleischten
Programmierern nicht aufzufallen wäre aber _ statt !
schöner.

End If

'strKey zurücksetzen
strKey = subFrm.Name & "!"
If ctr.ControlType = acSubform Then
Set subFrmU =
Me(ctrFrm.Name).Controls(ctr.Name) For Each
ctrU In subFrmU.Controls If
ctrU.ControlType = acTextBox Or _
ctrU.ControlType = acComboBox Then
strKeyU = strKey & ctr.Name & "!" &
ctrU.Name c1.Add ctrU, strKeyU c2.Add
ctrU.ControlSource, strKeyU c3.Add
strKeyU, strKeyU End If
Next ctrU
End If
Next ctr
End If
Next ctrFrm

For Each ctrC In c1
ctrC.ControlSource = ""
Next ctrC

e:
Set subFrm = Nothing
Set subFrmU = Nothing

End Sub


Hier das Binden einfach als Codeschnippsel, die Variablen
sind natürlich deklariert, bei varKey wusste ich nicht so
recht:
' Zuerst Steuerelemente wieder binden
'in c1 sind die Controls mit Key als String,
'der sich aus dem kompletten Namen mit UFO-Ctr-Namen
zusammensetzt. 'in c2 befindet sich der
Control-Source-String, mit Key, der auch in c1 ist.
'Der entspricht aber nicht dem Namen des Controls in c1.
'Deshalb c3, wo der Key gespeichert wurde.
'(An den kommt man ja sonst nicht dran)

Sieht doch soweit gut aus. Die c3 mit Key, Key ist aber
unästhetisch. Versuch mal meinen Vorschlag von oben.

For Each varKey In c3
Set ctrC = c1(varKey)
Debug.Print ctrC.Name
Debug.Print c2(varKey)
ctrC.ControlSource = c2(varKey)
Next varKey

Alles in allem ist das für einen 'beta-testenden Laien, der
noch nie Collections gesehen hat', doch sehr ordentlich. :-)
Weiter so!

Gruß aus Mainz
Michael


.



Relevant Pages

  • Re: Formulareingaben Speichern verhindern
    ... Private c1 As Collection ... Dim subFrmU As Access.SubForm ... Dim strKey As String ... Set c1 = New Collection ...
    (microsoft.public.de.access)
  • Re: Gleicher Bericht mehrmals Qffnen?=
    ... > Ich hab es einmal ohne Collection in einem Modul versucht: ... > Dim rep As Report ... > Set rpt = Nothing ... Damit speicherst du die Referenz auf den Bericht im Bericht selbst. ...
    (microsoft.public.de.access)
  • Re: Gleicher Bericht mehrmals Qffnen?=
    ... Ich hab es einmal ohne Collection in einem Modul versucht: ... Dim rep As Report ... Set rpt = New Report_XYZ ...
    (microsoft.public.de.access)
  • Re: Objekte gehen nicht in Collection
    ... > Dim Warengruppe As CWarengruppe ... > Set rst = comm.Execute ... auch für die Collection eine eigene Klasse ... auf (CWarengruppe und CWarengruppen). ...
    (microsoft.public.de.access)
  • Re: Wasserzeichen mit Word-Art
    ... Sub Vorschlag1() ... Dim hdr As Word.HeaderFooter ... Set doc = ActiveDocument ... With shp ...
    (microsoft.public.de.word.vba)