Hallo,
ich habe ein Formular für das Eintragen von Arbeitsstati für verschiedene Abteilungen.
Bisher hatte jede Abteilung ein eigenes Formular, in dem die für die Abteilungen relevanten Felder in der Datenblattansicht angezeigt werden.
Diese unzähligen Formulare möchte ich jetzt durch eines für alle ersetzen.
Dazu habe ich ein Hauptformular mit einer Buttonleiste (Optionsgruppe) und ein Unterformular in der Datenblattansicht.
Je nachdem, welche Abteilung (Key) angewählt wird, baut sich das Unterformular neu auf.
Es gibt eine Tabelle1 mit allen Steuerelementen und deren Bezeichnungen.
Es gibt eine Tabelle2 mit dem Layout, d.h. welches Feld aus Tabelle1 wird angezeigt, in welcher Reihenfolge und die zuletzt eingestellte Breite.
In der abfr_Layout werden die beiden Tabellen zusammengeführt, also Breite, Reihenfolge mit den Namen und Bezeichnungen.
Set rsLay = cDB.OpenRecordset("SELECT * " _
& "FROM abfr_Layout " _
& "WHERE FSForm = " & Key _
& " AND FSUser = " & UserID _
& " ORDER BY Reihenfolge")
If rsLay.EOF Then
MsgBox "Ich finde das Formular " & Key & " nicht"
GoTo Ende
Else
rsLay.MoveLast
SpaltZahl = rsLay.RecordCount
rsLay.MoveFirst
For Each ctl In Forms.frm_HaFo.RahmenFP.Controls
If ctl.ControlType = acTextBox Then
a = a + 1
rsLay.FindFirst "StElement = '" & ctl.Name & "'"
' Debug.Print a, rsLay!Reihenfolge, rsLay!Stelement, ctl.Name, rsLay.NoMatch
If rsLay.NoMatch _
Or rsLay!Breite = 0 _
Or rsLay!Sichtbar = 0 _
Or rsLay!Sichtbar = 3 _
Then
ctl.ColumnHidden = True
ctl.ColumnOrder = SpaltZahl
Else
ctl.ColumnHidden = False
ctl.ColumnWidth = rsLay!Breite
ctl.ColumnOrder = rsLay!Reihenfolge
End If
End If
Next
End IfDas funktioniert soweit.
Nun möchte ich die Spalte beim Aufbau aber auch noch umbenennen. Ein ctl.Caption = "blah" ergibt den Fehler Objekt unterstützt diese Eigenschaft oder Methode nicht
Könnt Ihr mir da weiterhelfen?
Gruß
Doming
Ich denke, dass es das ist, was du benötigst:
ctl.Properties("DatasheetCaption") = "blah"
Hallo Doming,
leider zeigst du nicht, wie ctl definiert ist, denn grundsätzlich funktioniert der Zugriff über die Controls-Auflistung und eine Zuweisung an die Caption Eigenschaft ebenfalls.
Wenn du tatsächlich ein Formular mit verschiedenen Ansichten darstellen möchtest, lässt sich das mit Klassen umsetzen. Du solltest vielleicht mal einen Blick auf das MVP-Entwurfsmuster (OOP) werfen. Suche nach den Begriffen ,,Model View Presenter", dann wirst du einige Hinweise finden, da dieses Muster sehr gebräuchlich ist. Vielleicht nicht gerade in Access, aber einige Anregungen kannst du übernehmen.
Gruß Knobbi38
Hallo,
wenn kein "Option Explicit" verwendet wurde, ist ctl ein Variant. Wenn es deklariert wurde, sollte es als "Access.Control" deklariert werden, der generische Controltyp (die Basisklasse). IntelliSense zeigt Dir dann nur die Eigenschaften, die von allen Controls genutzt werden können. Wenn Du es expliziter und compilersicherer möchtest, kannst Du nach dem Test auf den Controltyp eine "ctl_Textbox As Access.TextBox" Deklaration verwenden und mit "Set ctl_Textbox = ctl" die spezifische Textbox-Klasse verwenden, so daß Dir alle Eigenschaften der Textbox in IntelliSense angezeigt werden und der Compiler prüfen kann, ob die Eigenschaft, die Du im Code hast, existiert. Dieser hätte Dir dann "Caption" bereits angemeckert, was er bei generischem "ctl" nicht kann, da die Eigenschaft nicht bei allen Controls existieren.
Eine Textbox hat keine Caption, nur ein Label Control.
Die DatasheetCaption ist für Datasheet-Spaltenbeschriftung, kann unabhängig von Caption gesetzt werden und kann auch direkt verwendet werden, man benötigt nicht die Properties Collection.
Statt ControlType zu testen, kannst Du auch eine If-Sonderform verwenden:
If ctl Is Access.TextBox Then
Das ist nicht schneller oder besser, aber meist lesbarer.
Gruß
Christian
Hallo und danke für die Antworten,
der Deklarationsteil sieht so aus
Dim a As Long
Dim frm As String
Dim ctl As Control
Dim ctlNm As String
Dim cDB As DAO.Database
Dim rsLay As DAO.Recordset
Auf Caption bin ich gekommen, weil ich beim Einlesen der Steuerelement-Tabelle in einer Schleife die Textboxen ausgelesen und über ctl.Control(0).Caption das dazugehörige Label-Element angesprochen habe.
ctl.Properties("DatasheetCaption") = "blah" werde ich nachher mal ausprobieren, vielen Dank
Gruß
Doming
Hallo,
noch ein kleiner Hinweis:
eine .DatasheetCaption Eigenschaft habe ich im Objektmodell nicht gefunden, aber über die Properties-Auflistung läßt sie sich ansprechen (#1).
Es gilt jedoch zu beachten, dass eine Zuweisung an diese Property eine höhere Priorität besitzt, als eine direkte Zuweisung an die Caption Eigenschaft des zugeordneten Labels für die Spalte.
In der For Each Schleife in dem Beispielcode, werden alle Textboxen angesprochen. Für eine Textbox kann über die Textbox.Controls-Auflistung auf das zugehörige Label zugegriffen werden, was in der Datenblattansicht dem Label im Header entspricht:
ctl.Controls(0).Caption = "Spaltenüberschrift"
Knobbi38
Hallo Ulrich,
Du hast recht, ich hatte das wohl verwechselt mit den "Datasheet..."-Properties, die im Formular selbst zu finden sind, auf die man direkt zugreifen kann.
Gruß
Christian