Hallo Friedel
Lnagsam müssen wir den Thread umbenennen :-)
Post by Friedel JantzenAm Namen kann ich den Typ erkennen und alle gewünschten Controls
Ist sicher eine Möglichkeit, aber es können Fehler entstehen, wenn du dich
mal selber nicht an deine Konventionen hälst oder sich ein Vertipper
einschleicht.
Post by Friedel JantzenEine Eigenschaft wie Control.Type habe ich nicht gefunden,
habe ich was übersehen?
Ja :-)
Google hätte es dir verraten
Sub Demo()
Dim oCRL As Control
For Each oCRL In UserForm1.Controls
If TypeOf oCRL Is OptionButton Then
MsgBox oCRL.Name, vbExclamation
End If
Next oCRL
End Sub
Post by Friedel JantzenDurch die Benennung kann ich mir Code sparen.
Also ein kleiner Teil für die Lösung des Problems
mit den vielen Controls im Assistenten.
Wie machst Du das?
Manuell, das heisst ich weiss was ich will, da meine Formulare klein sind.
Da hat es höchstens ein Dutzend Controlls für die Eingabe des Benutzers
drauf.
Post by Friedel JantzenEin weiteres Problem ist für mich die Abhängigkeit der
Controls: Ein Control auf einer Seite greift auf den Wert
eines anderen auf einer früheren Seite zurück.
Mein Vorgehen sieht ungefähr so aus
UserForm_Initialize()
- Vorgabe Werte auf die Userform setzen (z.B. Comboboxen füllen)
- diverse Parameter zum beeinflussen des Verhaltens der UserForm bzw. des
anschliessenden Dokumentaufbaus aus eine zentralen .Ini-Datei lesen.
- letzte Werte restaurieren (z.B. viele Felder werden mit dem alten Inhalt
wieder gefüllt [z.B. Absendername, ich will ja mein - Name nicht jedesmal
wieder neue eingeben müssen, diese Werte werden in der Registry abgelegt und
dort wieder geholt]
UserForm_Activate()
- aktualisieren von Feldern mit Abhängigkeiten aus anderen UserForms
einlesen aus der temporären Datei und auswerten
OK_Button
- Abspeichern der Werte in der Registry für die nächjste Verwendung als
Vorgabewerte
- Abspeichern der Werte in der temporären Datei
Post by Friedel JantzenEs muß immer vor dem Seitenwechsel auf seine Seite
aktualisiert werden. Oder besser sofort? Aber wie organisiert man das
am besten mit vielen Controls?
Ist eigentlich egal, wichtig ist aber, dass es codemässig immer am gleichen
Ort geschieht, sonst hats du schon bald keine Übersicht mehr. Für mich ist
es beim Seitenwechsel (da die Seiten unabhängig voneinander sind, einander
nicht kennen und nur über die Schnittstelle 'Teporäre Datei' miteinander
Kommunizieren) für deinen Fall würde ich auch den Seitenwechsel bevorzugen.
Post by Friedel JantzenDer Weg des Benutzers durch die Seiten ist auch selten
linear möglich, weil es Alternativen geben kann
Sollte man in den Griff bekommen. Ich habe auch Seiten drin die Optional
sind bzw. in Abhängigkeit mit den ausgeführten Aktionen auf den Vorseiten
angezeigt werden oder eben nicht.
Kleiner Tip, geh davon aus, dass du nie weisst welche deine letzte Seite
ist. Ist dann einfacher zu programmieren, als wenn du weisst welche Seite
die letzte ist und dann dieses Konzept ändern musst, weil noch eine Seite
dazu gekommen ist. (Durfte diese Erfahrung machen, ist gar nicht so einfach,
das dann wieder in den Griff zu bekommen)
Post by Friedel JantzenEine Serie von Dialogen,
wie Du vorgeschlagen hast, ist da dann einfacher, als die
Baumstruktur auf die lineare Seitenfolge des MultiPage abzubilden,
vermute ich mal. Oder gibt's noch andere gute Ideen dazu?
Ich arbeite mit einer Schlaufe, welche dir Kontrolle über die einezlenen
Userforms im Griff hat. Sieht ungefähr so aus.
'Variablen für Formularseite vorbelegen
iFormularSeite = 1
iFormularSeiteMax = tgFORMULAR_MAXSEITEN
'Überprüfen ob die IntroSeite angezeigt werden muss.
If Not funcGetPrivateProfileString("", tgREGISTRY_KEY & "\Dokumente\" &
tDocAssistent.cName, "IntroAnzeigen", True) Then
iFormularSeite = iFormularSeite + 1
End If
'Wechsel zwischen den einzelnen Dialogmasken des Dokument-Assistenten.
Do While (iFormularSeite > 0) And (iFormularSeite <=
tgFORMULAR_MAXSEITEN)
Select Case iFormularSeite
Case 1
funcUserFormAnzeigen ("frmIntro")
Case 2
funcUserFormAnzeigen ("frmEmpfängerAdresse")
Case 3
funcUserFormAnzeigen ("frmDokumentBetreff")
Case 4
funcUserFormAnzeigen ("frmAbsenderDaten")
Case 5
funcUserFormAnzeigen ("frmAbsender")
Case 6
funcUserFormAnzeigen ("frmAbsenderGrussformel")
Case 7
funcUserFormAnzeigen ("frmBeilageKopiean")
End Select
iFormularSeite = iFormularSeite + iFormularSeiteOffset
Loop
Die Variable 'iFormularSeiteOffset' ist Public aus Modulebene und dient zur
Steuerung der einzelnen Seiten.
Weiter = 1
Zurück = -1
Abbrechen= 9999
Post by Friedel JantzenWenn Alternativen bestehen, muß ein bidirektionaler Assistent auch
die durchlaufene Seitenfolge speichern.
Das muss die einzelne Seite wissen, ob sie sich anzeigen muss oder nicht
(bzw. das hat bei mir die Funktion 'funcUserFormAnzeigen' im Griff.)
--
Thomas Gahler
MVP für WordVBA
- Windows XP, Office XP (SP2)