Auf alle UFOs im Navigationsunterformular zugreifen

Moderator: ModerationP

Auf alle UFOs im Navigationsunterformular zugreifen

Beitragvon Dieterlem » 12. Aug 2019, 16:02

Hallo Access Freunde,

ich habe bezüglich meines Anliegens nichts finden können und hoffe, dass ihr mir weiter helfen könnt.
Ich habe ein Navigationsformular, auf dem sich eine Checkbox cmdEdit befindet. Mit diesem möchte ich die Editiermöglichkeit des Formulars Ein- bzw Ausschalten.
Dazu verwende ich folgenden Code:
Code: Alles auswählen
Private Sub chkEditieren_Click()
    With Me.Navigationsunterformular.Form
        .AllowAdditions = Me.chkEditieren
        .AllowDeletions = Me.chkEditieren
        .AllowEdits = Me.chkEditieren
     
        If Me.chkEditieren = -1 Then         'wenn editierbar
            .Section(acDetail).BackColor = BackColorWS
            .Section(acDetail).AlternateBackColor = BackColorWSa
        ElseIf Me.chkEditieren = 0 Then      'wenn gesperrt
            .Section(acDetail).BackColor = BackColorBL
            .Section(acDetail).AlternateBackColor = BackColorBLa
        End If
    End With
End Sub

Dies funktioniert soweit auf ganz gut, Jedoch nur auf das im Navigationsunterformular geladene Formular.
Ich möchte es jedoch so erweitert haben, dass auch die UFOs angesprochen werden. Ich könnte die Unterformulare jetzt per Name ansprechen, doch dies würde nur explizit für ein bestimmtes Formular (welches gerade im Navigationsunterformular geladen ist) funktionieren.

Wie kann ich alle UFOs des gerade im Navigationsunterformular geladenen Formulars ermitteln und gem. des bestehenden Codes ansprechen?

Danke schon einmal für eure Hilfe

Gruß
Dieterlm
langsam verstehe ich es besser...und doch bleiben noch soo viele Fragen.
Dieterlem
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 181
Registriert: 04. Mär 2007, 20:15
Wohnort: Pfalz

Re: Auf alle UFOs im Navigationsunterformular zugreifen

Beitragvon Gast » 12. Aug 2019, 16:52

du kannst mit etwas Disziplin bei der Namensgebung der Formulare
über SQL die Formularnamen aus der Systemtabelle MsysObjects auslesen und entsprechend filtern.
Code: Alles auswählen
' -32768: Formulare
' -32766: Makro
' -32764: Berichte
' -32761: Module
' -32756: Datenzugriffseite
'      1: Tabellen
'      4: eingebundene ODBC-Tabellen
'      5: Abfragen
'      6: eingebundene Tabellen
SELECT MsysObjects.Name
FROM MsysObjects
WHERE (((MsysObjects.Flags)=0) AND ((MsysObjects.Type)=-32768) AND ((Left$([Name],4))="Ufo_"))
ORDER BY MsysObjects.Name;

Diese kann man dann mit einer AllForms-Auflistung durchlaufen und entsprechend bearbeiten
Gast
 

Re: Auf alle UFOs im Navigationsunterformular zugreifen

Beitragvon knobbi38 » 12. Aug 2019, 17:31

Hallo,
Dies funktioniert soweit auf ganz gut, Jedoch nur auf das im Navigationsunterformular geladene Formular.
Ich möchte es jedoch so erweitert haben, dass auch die UFOs angesprochen werden.

Welche UFOs meinst du? Hat das geladene Formular noch selber UFOs oder was ?

Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1826
Registriert: 02. Jul 2015, 14:23

Re: Auf alle UFOs im Navigationsunterformular zugreifen

Beitragvon Dieterlem » 12. Aug 2019, 17:39

Hallo und danke für deine Hilfe,

Ich verstehe leider dein Ansatz nicht. Mit dieser Abfrage erhalte ich doch "nur" eine Namentliche Auflistung ALLER UFO´s die ich in der Datenbank habe.
Die Namen sind mir ja aber bekannt. Ich brauche die UFO´s die im aktuell geladenem Formular des Navigationsunterformulars sind.


Gruß
Dieterlm
langsam verstehe ich es besser...und doch bleiben noch soo viele Fragen.
Dieterlem
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 181
Registriert: 04. Mär 2007, 20:15
Wohnort: Pfalz

Re: Auf alle UFOs im Navigationsunterformular zugreifen

Beitragvon Dieterlem » 12. Aug 2019, 17:42

knobbi38 hat geschrieben:Hallo,
Welche UFOs meinst du? Hat das geladene Formular noch selber UFOs oder was ?
Ulrich


Genau. Die Formulare die im Navigationsformular sind haben teilweise UFO's

Gruß
Dieterelm
langsam verstehe ich es besser...und doch bleiben noch soo viele Fragen.
Dieterlem
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 181
Registriert: 04. Mär 2007, 20:15
Wohnort: Pfalz

Re: Auf alle UFOs im Navigationsunterformular zugreifen

Beitragvon Gast » 12. Aug 2019, 17:45

bei präziseren Fragestellungen gibt es auch präzisere Antworten.
siehe Nachfrage von Knobbi38
Gast
 

Re: Auf alle UFOs im Navigationsunterformular zugreifen

Beitragvon Dieterlem » 12. Aug 2019, 17:53

Sorry ich dachte es wäre klar beschrieben:
Dieterlem hat geschrieben:Wie kann ich alle UFOs des gerade im Navigationsunterformular geladenen Formulars ermitteln und gem. des bestehenden Codes ansprechen?


Also ich meine alle UFO's die im aktuell geladenen Navigatiosunterformular sind. Da dies ja ständig variiert kann ich sie nicht ansprechen.


Gruß
Dieterlem
langsam verstehe ich es besser...und doch bleiben noch soo viele Fragen.
Dieterlem
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 181
Registriert: 04. Mär 2007, 20:15
Wohnort: Pfalz

Re: Auf alle UFOs im Navigationsunterformular zugreifen

Beitragvon Gast » 12. Aug 2019, 18:00

evtl. doch über ??
Code: Alles auswählen
MsgBox Me.DeinUFOSteuerelement.Name
Gast
 

Re: Auf alle UFOs im Navigationsunterformular zugreifen

Beitragvon Gast » 12. Aug 2019, 18:06

das war Quatsch...zugegeben.
Gast
 

Re: Auf alle UFOs im Navigationsunterformular zugreifen

Beitragvon Dieterlem » 12. Aug 2019, 18:24

ich habe da mal was gebastelt:


For Each ctrl In Me.Navigationsunterformular.Form
If InStr(1, ctrl.Name, "_ufo", vbTextCompare) Then
Me.Navigationsunterformular.Form.Controls(ctrl.Name).Form.Section(acDetail).BackColor = BackColorBL
End If
Next


So funktioniert es. Ist bestimmt nicht der Königsweg, aber es funktioniert.
Falls jemand eine bessere Lösung hat, wäre ich sehr dankbar.


Gruß
Dieterlem
langsam verstehe ich es besser...und doch bleiben noch soo viele Fragen.
Dieterlem
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 181
Registriert: 04. Mär 2007, 20:15
Wohnort: Pfalz

Re: Auf alle UFOs im Navigationsunterformular zugreifen

Beitragvon knobbi38 » 12. Aug 2019, 23:45

Hallo Dieterlem,

die Namen der UFOs brauchst du nicht. Das geladene Navigationsunterformular enthält Controls vom Typ "SubForm". Du brauchst also nur immer die Controlsauflistung einer Form durchlaufen und nach einem SubForm-Control suchen. Über die Eigenschaft .Form kommst du an das geladene UFO und an alle anderen Eigenschaften.
Jedes Control in Access hat eine ControlType Eigenschaft, welche einen Enumwert von Access.acControlTyp enthält. Das SubForm-Control hat den ControlType acSubform = 112.

AirCode-Beispiel mit einem Toogle-Button:
Code: Alles auswählen
' im Navigationsformular:
Private Sub tglEdit_Click()
 
  If tglEdit.Value Then
    ' aktiv
    ChangeEditability True
  Else
    ' inaktiv
    ChangeEditability False
  End If
End Sub

Private Sub ChangeEditability(ByVal Editable As Boolean)
  Dim frm As Form
  Dim ctl As Control
 
  Set frm = Me!Navigationsunterformular.Form
 
  Debug.Print "Form: "; frm.Name
 
  frm.AllowEdits = Editable
 
  For Each ctl In frm.Controls
    If ctl.ControlType = AcControlType.acSubform Then
      Debug.Print "UFO: "; ctl.Form.Name
      ctl.Form.AllowEdits = Editable
      ' Todo: further settings
    End If
  Next
End Sub

Es gilt zu beachten, daß hier nur UFOs der ersten Ebene ausgewertet werden. Für eine allgemeine Lösung müßte man eventuell die Suche nach den SubForm-Controls rekursiv gestalten, aber das überlasse ich dem OP, genauso wie die optischen Rückmeldungen mit z.B. Section(acDetail).BackColor.

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1826
Registriert: 02. Jul 2015, 14:23

Re: Auf alle UFOs im Navigationsunterformular zugreifen

Beitragvon Dieterlem » 13. Aug 2019, 00:31

Hallo und herzlichen Dank für die Hilfe.

Die Beschreibung ist ja super und hilft mir weiter. Ich denke damit kann ich mein Vorhaben umsetzen. Ich werde es morgen gleich mal ausprobieren.

Vielen Dank.
Gruß
Dieterlem
langsam verstehe ich es besser...und doch bleiben noch soo viele Fragen.
Dieterlem
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 181
Registriert: 04. Mär 2007, 20:15
Wohnort: Pfalz

nachgefragt

Beitragvon Beaker s.a. » 13. Aug 2019, 10:58

Hallo Ulrich,
Code: Alles auswählen
For Each ctl In frm.Controls

Macht es da einen Unterschied ob ich nun den Namen oder den ControlType
vergleiche?
gruss ekkehard
Ereignisorientierte Programmierung:
Alles, was geschieht, geschieht.
Alles, was während seines Geschehens etwas anderes geschehen
läßt, läßt etwas anderes geschehen.
Alles, was sich selbst im Zuge seines Geschehens erneut geschehen
läßt, geschieht erneut.
Beaker s.a.
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 830
Registriert: 14. Jul 2012, 21:56
Wohnort: Bremen

Re: Auf alle UFOs im Navigationsunterformular zugreifen

Beitragvon Dieterlem » 13. Aug 2019, 11:16

Das Ergebnis ist gleich und die prinzipielle Vorgehensweise auch. Jedoch müssen in meiner Version die Ufos auch richtig benannt sein. Bei der anderen Version spielt das keine Rolle. Ist also nicht so Fehleranfällig.

Die Version von Ulrich läuft ohne Schwierigkeiten bei mir.


Gruß
Dieterlm
langsam verstehe ich es besser...und doch bleiben noch soo viele Fragen.
Dieterlem
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 181
Registriert: 04. Mär 2007, 20:15
Wohnort: Pfalz

Re: Auf alle UFOs im Navigationsunterformular zugreifen

Beitragvon knobbi38 » 13. Aug 2019, 11:44

Hallo Ekkehard,

wenn ich die Namen der SubForm-Steuerelemente kenne, kann man beides nehmen, dann ist es egal. Schwieriger wird es, wenn die UFOs zur Laufzeit nachgeladen werden. Dann ist die Version mit ControlType universeller, weil ich dann die Namen nicht mehr kennen muß, um sie ansprechen zu können.

Ich bevorzuge i.d.R. den objektorientierten Ansatz. Weil jedes Formular die eigenen Steuerelemente kennt, könnte man auch über eine Property der Form die SubForm-Steuerelemente sich als Referenz übergeben lassen, beispielsweise mit einem ArrayOfObjects oder einer Collection.
Alternativ könnte man auch ein Property in der Form anlegen, der man den gewünschten Zustand übergibt und die Form kümmert sich selber intern um alles oder aber man erweitert eine Form mit einer Wrapper Klasse und überträgt die Funktionalität in diese Klasse. Damit alles "ordentlich" gemacht wird, verpackt man das o.a. noch in ein Interface und verwendet nur noch dieses Interface für die Steuerung.

Da ich selber oft mit dynamischen SubForms arbeite, habe ich in allen möglichen SubForms ein Interface implementiert, über welches ich dann die Initialisierung, das Auslesen von Keydaten, Statusänderungen usw. bewerkstelligen kann. Eine Navigationsklasse verwendet dann u.a. dieses Interface, um Aufgaben nach dem Laden bzw. vor dem Entladen einer SubForm automatisch zu erledigen.

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1826
Registriert: 02. Jul 2015, 14:23

Nächste

Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste