Discussion:
UserForm.MultiPage: Neue Seiten einfügen
(zu alt für eine Antwort)
Friedel Jantzen
2003-12-18 14:49:35 UTC
Permalink
Hallo alle!

Muß Euch wieder mit einer blöden Anfängerfrage belästigen:
Wie füge ich dauerhaft neue Seiten in ein MultiPage-Control ein?

Ich habe in einem Makro Seiten mit der Add-Methode eingefügt,
die auch während des Makros sichtbar waren.
Sie waren aber nicht im Entwurfsmodus des UserForm in der Liste
des Eigenschaftsfensters zu sehen, so daß ich im Entwurfsmodus
auch keine Controls einfügen konnte. Sie sind anscheinend nicht
gespeichert worden. Stimmt das?

Wenn ich das MultiPage-Control im Entwurfsmodus in das UserForm
einfüge, werden nur 2 Seiten mit eingefügt. Wie bekomme ich
mehr Seiten dazu?

Vielen Dank für Eure Geduld!
Friedel
Thomas Gahler
2003-12-18 15:09:12 UTC
Permalink
Hallo Friedel
Post by Friedel Jantzen
Wie füge ich dauerhaft neue Seiten in ein MultiPage-Control ein?
Das Kontextmenü hilft dir weiter :-)


Rechte Maustaste auf einem der beiden Register -> Neu Seite


--
Thomas Gahler
MVP für WordVBA

- Windows XP, Office XP (SP2)
Friedel Jantzen
2003-12-21 14:01:33 UTC
Permalink
Hallo Thomas,
danke für Deine schnelle Antwort!
Post by Thomas Gahler
Post by Friedel Jantzen
Wie füge ich dauerhaft neue Seiten in ein MultiPage-Control ein?
Das Kontextmenü hilft dir weiter :-)
Rechte Maustaste auf einem der beiden Register -> Neu Seite
Heureka!
Jetzt weiß ich auch, warum ich das bisher nicht gefunden habe:
Die Register habe ich ausgeschaltet (Style: fmTabStyleNone),
um das MultiPage-Feature für einen "Assistenten" zu nutzen.
Dies Kontextmenü steht dann nicht mehr zur Verfügung.
Um weitere Seiten hinzuzufügen, mußte ich den Style kurz
mal wieder auf die Vorgabe fmTabStyleTabs setzen.

Grüße aus Süddeutschland,
Friedel
(1 1/2 Std. bis zur Schweizer Grenze, wo wir gerne in den
Bergen wandern!)
Thomas Gahler
2003-12-21 19:13:17 UTC
Permalink
Hallo Friedel
Post by Friedel Jantzen
um das MultiPage-Feature für einen "Assistenten" zu nutzen.
Hast dich also für diesen Weg entschieden (macht ja MS bei seinen Assistenen
auch). War mir damals zu unübersichtlich.



--
Thomas Gahler
MVP für WordVBA

- Windows XP, Office XP (SP2)
Friedel Jantzen
2003-12-23 14:25:01 UTC
Permalink
Hallo Thomas,
danke für Deine Antwort!
Post by Thomas Gahler
Post by Friedel Jantzen
um das MultiPage-Feature für einen "Assistenten" zu nutzen.
Hast dich also für diesen Weg entschieden (macht ja MS bei seinen Assistenen
auch). War mir damals zu unübersichtlich.
Wegen der vielen Controls?
Das versuche ich, mit systematischen Namen in
den Griff zu kriegen, so wie: ed00RNr,
für ein Edit-Control auf Page 0 für den String RNr.
Was hast Du schon probiert?

Frohe Weihnachten und ein gutes Neues Jahr
Dir und allen hier,
Friedel
Thomas Gahler
2003-12-23 14:49:18 UTC
Permalink
Hallo Friedel
Post by Friedel Jantzen
Post by Thomas Gahler
War mir damals zu unübersichtlich.
Wegen der vielen Controls?
Ja
Post by Friedel Jantzen
Das versuche ich, mit systematischen Namen in
Dann viel Glück beim «Versuch» :-)
Post by Friedel Jantzen
Was hast Du schon probiert?
Verstehe deine Frage nicht, was meinst du genau?



--
Thomas Gahler
MVP für WordVBA

- Windows XP, Office XP (SP2)
Friedel Jantzen
2003-12-28 13:01:02 UTC
Permalink
Hallo Thomas, hallo Alle!
Danke für Deine Antwort.
Post by Thomas Gahler
Post by Friedel Jantzen
Post by Thomas Gahler
War mir damals zu unübersichtlich.
Wegen der vielen Controls?
Ja
[...]
Post by Thomas Gahler
Post by Friedel Jantzen
Was hast Du schon probiert?
Verstehe deine Frage nicht, was meinst du genau?
Die Werte der Controls müssen z.B. irgendwie initialisiert werden,
und am Schluß des Dialogs ausgelesen.
Wir haben hier besprochen, daß Temporäre Dateien
oder Dokumentvariablen Möglichkeiten sind,
die Werte zu speichern.
Ich benenne die Controls z.B. ed_01_Nachname, chk_03_NeueVersion ...
und speichere dann Felder der Form ControlName=Wert .
Am Namen kann ich den Typ erkennen und alle gewünschten Controls
in einer For Each-Schleife auslesen und speichern:

Dim aC As Control
For Each aC In Controls
If InStr(aC.Name, "ed_") = 1 Then ' Der _ dient als Separator
AVal = Controls(aC.Name).Text
Else
...

Eine Eigenschaft wie Control.Type habe ich nicht gefunden,
habe ich was übersehen?
Durch 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?

Ein 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. Wie das grundsätzlich
geht, ist klar. Es muß immer vor dem Seitenwechsel auf seine Seite
aktualisiert werden. Oder besser sofort? Aber wie organisiert man das
am besten mit vielen Controls?

Der Weg des Benutzers durch die Seiten ist auch selten
linear möglich, weil es Alternativen geben kann
(Beispiel: * Standard-Installation * Benutzerdef. Installation),
und damit entsteht eine Baumstruktur. Eine 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?

Wenn Alternativen bestehen, muß ein bidirektionaler Assistent auch
die durchlaufene Seitenfolge speichern. Das kann kompliziert werden,
wenn der Benutzer öfters vor und zurück geht und dabei Werte ändert.
Habt Ihr dafür ein paar Tipps?

Ein gutes Neues Jahr wünscht Dir und allen
Friedel
Thomas Gahler
2003-12-28 16:50:48 UTC
Permalink
Hallo Friedel

Lnagsam müssen wir den Thread umbenennen :-)
Post by Friedel Jantzen
Am 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 Jantzen
Eine 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 Jantzen
Durch 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 Jantzen
Ein 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 Jantzen
Es 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 Jantzen
Der 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 Jantzen
Eine 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 Jantzen
Wenn 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)
Friedel Jantzen
2003-12-31 14:59:15 UTC
Permalink
Hallo Thomas,
danke für Deine ausführliche Antwort.
So gute Infos gibts selten!

[>...]
Post by Thomas Gahler
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)
Guter Tip! Könnte auch den anderen NGlern hier einigen Frust ersparen.

[>...]

Ein frohes Neues Jahr Dir und allen hier,
Friedel

Loading...