Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Controls eines formulars durchlaufen aus einem Modul heraus

Begonnen von Optiplex, November 29, 2010, 19:13:55

⏪ vorheriges - nächstes ⏩

Optiplex

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

lumbumba

Wenn es gerade das aktive Formular ist kannst du es mit
Screen.ActiveForm ansprechen

for xxx = 0 to Screen.ActiveForm.controls.count
...
---

Optiplex

#2
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

lumbumba

#3
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

---

Optiplex

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

lumbumba

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
   
---

Optiplex

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

database

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

Optiplex

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

klamotte

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


Optiplex

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