Hallo Zusammen,
ich möchte aus einem Modul heraus alle Buttons durchlaufen und diese nach bestimmten Kriterien zu blockieren (Enabled = false) beziehungsweise freizugeben (Enabled=true)
Public Sub SetButtons()
'Alle Eingabefelder zurücksetzen
Dim xxx As Integer
Dim ctr As Control
'Wie spreche ich die Controls im Formular frm_Main an ?
For xxx = 0 To Controls.Count - 1
Set ctr = Controls(xxx)
If ctr.ControlType = acCommandButton Then
ctr.Enabled = False
End If
Next xxx
Set ctr = Nothing
End Sub
Kann mir jemand da mal einen Tip geben
Danke und gruß Dieter
Wenn es gerade das aktive Formular ist kannst du es mit
Screen.ActiveForm ansprechen
for xxx = 0 to Screen.ActiveForm.controls.count
...
hallo lumbumba,
Dein Tip funktioniert nicht aus einem Modul heraus, da ich die Funktion beim Öffnen schon aufrufe. Ich habe das jetzt so gelöst.
'Alle Buttons sperren
Dim xxx As Integer
Dim ctr As Control
For xxx = 0 To Forms!frm_main.Form.Controls.Count - 1
Set ctr = Forms!frm_main.Form.Controls(xxx)
If ctr.ControlType = acCommandButton Then
ctr.Enabled = False
End If
Next xxx
Set ctr = Nothing
Leider habe ich nun ein weiteres Problem an dem ich fast verzweifle, und zwar kann es passieren dass ich den Button der den Focus hat versuche zu sperren (enabled=false) ich weis einfach nicht wie ich diesen Fehler umgehen kann. Das aktive Control (screenobjekt) auslesen functioniert nicht da das Fenster noch nicht geöffnet ist, sonst hätte ich die Namen verglichen aber no GO. Hast du einen Tip wie ich das hinbekomme?
Gruß Dieter
Jup beim Öffnen eines Formulars funktioniert diese Angabe nicht.
Wenn du es jetzt eh in ein Modul auslagerst dann kann du ja den Formularnamen mit übergeben
wie
Public Sub SetButtons(sFrmName as string)
'Alle Buttons sperren
Dim xxx As Integer
Dim ctr As Control
dim f as Access.form
Set f = Forms(Form_ & sFrmName).Form
For each ctr in f.Controls
If ctr.ControlType = acCommandButton Then
ctr.Enabled = False
End If
Next
Set ctr = Nothing
zu 2. das kannst du ggf umgehen wenn du vorher den Focus auf ein anderes Control setzt. Ich nehme mal an du willst nicht alle Controls in dem Formular disable'n.
deinNichtDiseabledControl.Setfocus
Call SetButtons
Hallo lumbumba,
das ist soweit ok. Ich habe jetzt den Focus auf einen versteckten Button gesetzt (der von der Routine übersprungen wird), aber es gelinkt mir nicht den Focus abzufragen um ihn dann wieder auf das vorher aktive Control zu setzen (weder aktiveControl im Screenobjekt noch direkt in der Formularabfrage funktionieren).
Schlechter Tag heute komme überhapt nicht vorran.
Gruß Dieter
Ich weis jetzt zwar nicht genau was du machen willst und wie dein Formular im einzelnen funktioniert, aber du mußt vor jedem Aufruf deiner SetButtons - Sub das aktuelle Control speichern. Dazu oben vor deiner Ersten Sub/Funktion z.B. folgende Zeile Einfügen:
Private AC as Control
und wenn du jetzt deine SetButtons aufrufen willst dann
Set AC = Me.ActiveControl 'Speichere aktives Control
Call SetButtons
und wenn du jetzt irgendwann wieder auf das Control den Focus setzen willst (muß wieder enabled=True sein), dann ein
AC.Setfocus
Hallo Lumbumba,
wie ich schon sagte funktioniert ActiveControl hier nicht, weil das Formular nicht geöffnet ist und damit auch kein Control den Focus hat. Ich muss das irgendwie anderst ansetzen, wahrscheinlich ist es besser wenn ich das Ereignis
beim Anzeigen verwende den da sollte deine beschriebene vorgehensweise
funktionieren. Aber da muss ich einiges umbauen, denn mein Hauptformular ist nicht gebunden.
Trotzdem danke für deine Tips
Gruß Dieter
Hallo,
Zitatweil das Formular nicht geöffnet ist
Es wird m.E. sowieso ein wenig schwierig sein mit Steuerelementen eines NICHT geöffneten Forms zu arbeiten.
Warum machst du das Form dazu nicht auf?
DoCmd.OpenForm "frm_main", , , , , acHidden
machst
dann deinen Controlxerxes und schließt das Form danach wieder ....
So bleibts im Hintergrund, ist offen und trotzdem nicht sichtbar während du die Controls bearbeitest
Grüße
Peter
Hallo Database,
darauf bin ich noch gar nicht gekommen, muss ich testen ob das klappt (kann ich allerdings erst heute Nachmittag).
Gebe dir auf jeden Fall Bescheid ob das die Lösung war.
Danke und Gruß Dieter
Moin!
Vielleicht etwas verspätet: Die Command-Knöpfe zu deaktivieren, bevor das Formular geöffnet ist, funktioniert IMHO nicht. Mach es doch bei dem Ereignis Form_load. Denn wenn das Ereignis aufgerufen wird, sieht Du das Formular noch gar nicht.
Das Modul könnte dann so aussehen:
Public Sub Sperren(strFormular As String)
Dim ctl As Control
Dim frm As Form
Set frm = Forms(strFormular)
For Each ctl In frm.Controls
If ctl.Tag = "deaktivieren" Then ctl.enabled = false
Next
End Sub
Kommentar:
- die zu deaktivierenden Control müssen entsprechend markiert sein, d.h. im Eigenschaftsblatt steht das Wort "deaktivieren" unter Marke
- weiterhin hat es den Nachteil, dass das Modul alle Controls des Formulars durchgeht, was zu Performanceverluste führen könnte.
- bevor das Modul aufgerufen wird, muss der Fokus auf ein beliebiges Control gesetzt werden, das nicht deaktiviert werden soll
Hallo zusammen,
Die Routinen sind alle OK, es lag an den Unterformularen, diese werden zuerst geöffnet, erst danach wird das Hauptformular geöffnet. Da die Buttons im Hauptformular sind und die Routine in den Unterformularen aufgerufen wurden, konnte man den aktiven Button zu diesem Zeitpunkt nicht feststellen. Sorry, dass ich das erst jetzt festgestellt habe. Draufgekommen bin ich durch den Tip von Hondo, da habe ich mir gedanken gemacht wann wird welches Formular geöffnet und angezeigt.
Danke an euch alle, es funktioniert jetzt
Gruß Dieter