Supportnet Computer
Planet of Tech

Supportnet / Forum / Datenbanken

Formular dynamisch erzeugen???





Frage

Hallo! Ich hab mal eine etwas speziellere Frage. Kann ich ein Formular dynamisch erzeugen lassen. Ich stell mir das so vor: Es werden von mir 5 Felder vordefiniert (Textfelder,Kombi ...). Der Nutzer gibt am Anfang dann in ein extra Textfeld ein, wie viele Zeilen a 5 Felder er im Formular haben möchte oder wählt das aus einem Kombifeld aus. Geht so etwas überhaupt in VBA? Oder geht es denn, dass ich beispielsweise 20 dieser Zeilen a 5 Felder erstelle und dann diese unsichtbar mache. Bei Eingabe bzw. Auswahl einer bestimmten Menge (bspw. 10), werden dann 10 dieser Zeilen sichtbar. Schwere Frage oder? Wie setzt man denn so etwas um. Danke schon mal. china

Antwort 1 von thomasn1975

Die Sache mit den unsichtbaren Feldern würde auf jeden Fall funktionieren, allerdings passt sich das Formular in der Größe nicht an die sichtbaren Felder an.

Um ein unsichtbares Feld zu definieren einfach im Entwurfsmodus im Eigenschaftsfenster unter "Format" bei "Sichtbar" "Nein" angeben. In VBA das Element mittels

Me.Text1.Visible = True

das Element sichtbar machen.

Antwort 2 von struppi

Hallo,
Ich hab sowas schon mal gemacht.
Habe ca. 50 Textfelder erzeugt. (liegen in gleicher Position ganz klein (0,01X0,01) auf dem Formular unsichtbar übereinander.
Diese lassen sich ja auch über den Index (Nummer) ansprechen.Man muß also die Namen nicht berücksichtigen. Das ist von Vorteil, beim Zuweisen der Eigenschaften in einer Schleife.
In einer Tabelle sind die Eigenschaften der Textfelder gespeichert.
ZB Inhalt,TipText,Größe,Position auf dem Formular.
Beim öffnen des Formulares wird per Recordset die Tabelle gelesen und die Eigenschaften den Textfelder hintereinander zugeordnet.
Anzahl der Datensätze in der Tabelle entspricht dann der Anzahl sichtbarer Textfelder. Man kann auf diese Art jede x-beliebige Eigenschaft zuordnen.
Die Größe des Formulares kann man im übrigen auch definieren, zb so:
DoCmd.MoveSize 0, 0, 31000, 12000
Es könnte also bei Bedarf auch mitwachsen.
In A97 kannst Du sehr leicht herausfinden welche Eigenschaft in der Entwurfsansicht welchen Namen unter VBA hat. Dazu setzt du den Curser einfach in die entsprechende Eigenschaftszeile und drückst F1.
gruß struppi


Antwort 3 von crachit

danke struppi für deine antwort. ich muss allerdings sagen, so richtig verstanden hab ichs nicht :-). kannst du es mir vielleicht nochmal erklären?

danke,
crachit

Antwort 4 von struppi

Hallo,
Ich hab mal ein Beispiel kopiert und werde mal die Sache schrittweise erklären:

Es gibt ein Function die bei öffnen des Formulares ausgeführt wird.

Private Sub Form_Open(Cancel As Integer)

In diese muß der Code geschrieben werden

DoCmd.MoveSize 0, 0, 31000, 12000

Positionieren und Größe einstellen des Formulares

Dim rs As Recordset, i, Leistung As Integer

Dimensionieren der Variablen

Set rs = CurrentDb.OpenRecordset("SELECT TabAnlagen.*, TabStatus.*FROM TabAnlagen LEFT JOIN TabStatus ON TabAnlagen.ID = TabStatus.AnlagenID  WITH OWNERACCESS OPTION;")

Recordset Object erzeugen und SQL-Abfrage laden. Die Abfrage muß sich auf eine Tabelle beziehen in der die Eigenschaften der Textfelder gespeichert sind

i = 0
rs.MoveFirst

Do Until rs.EOF
With Forms![FormWerk1](i)

In einer Schleife werden jetzt die Datensätze der Eigenschaftstabelle abgerufen. Jeder Durchlauf entspricht einem Datensatz.
i ist der index und wird bei jedem Durchlauf um 1 erhöht.
Damit können jetzt die Textfelder angesprochen werden >With Forms![FormWerk1](i)<
Wobei FormWerk1 das Formular ist.

.Value = CStr(rs!Inhalt)

Liest den Inhalt des Textfeldes aus der Tabelle un ordnet ihm der Value-Eigenschaft zu.

.Visible = True
.Left = CInt(rs!links)
.Top = CInt(rs!oben)
.ControlTipText = CStr(rs!Position) & vbCrLf & CStr(Nz(rs!AnlagenName, "Kein Name")) & vbCrLf & "Hier können weitere dynamische Infos folgen: " & Time

Die Eigenschaften Sichtbar Abstand von oben und von Links und der Tiptext werden zugeordnet.

Select Case CInt(Nz(rs!Betriebsbereit, 0))
Case 1
.BackColor = 12240524
Case 2
.BackColor = 8421631
Case 3
.BackColor = 32986
End Select

Hier wird die Hintergrundfarbe zugeordnet je nachdem welche Zahl in der Tabelle unter "Betriebsbereit" gespeichert wurde.

If CBool(Nz(rs!Ausgeschalten, 0)) = False Then
.SpecialEffect = 4
Else
.SpecialEffect = 2
End If

Hier wird ein Spezialeffekt zugeordnet je nach Eintrag im Feld "Ausgeschalten" der Tabelle

If CBool(Nz(rs!RepAuftrag, 0)) = True Then .BackColor = 16744448
If CBool(Nz(rs!NoInfo, 0)) = True Then .SpecialEffect = 3

Weitere Eigenschaftszuweisungen

End With
i = i + 1
rs.MoveNext

Loop

Nächster Datensatz und erneuter Durchlauf bis alle Datensätze abgearbeitet wurden.Bei 10 Datensätzen würde man jetzt 10 Steuerelemente (Textfelder) auf dem Formular sehen.
gruß dtruppi

Antwort 5 von tststs

Warum so kompliziert? Ein gebundenes Endlosformular mit 5 Steuerelementen reicht.Wenn ich 20 Zeilen haben will dann füge ich 20 leere Datensätze an die zugrundeliegende leere Tabelle an.Datensatznummer und Spalte identifizieren dann eindeutig jedes Feld.Hinterher kannste dann in aller Ruhe auf den abgespeicherten Daten rumreiten wie Du willst.

Mit ner Schleife fügste die Datensätze an.Ein einzelnes Feld reicht schon, ist egal welches.

dim db as Database
set db=Currentdb
For i = 1 to 20
db.Execute "INSERT INTO Tabelle (Feld1) VALUES (Null);"
Next

Antwort 6 von scrooge26

Danke struppi und danke tststs für die Hilfe.
Ich werd gleich mal beide ausprobieren. Eine Frage hab ich noch an tststs:
Ich möchte, dass der Anwender am Anfang auswählen kann wieviele Felder er auf dem Formular hat. D.h., "For i = 1 to 20" müsste variabel sein. Gibt der Anwender 50 ein, so sollen 50 Felder erscheinen.

Gruß
scrooge26