Hallo zusammen,
kann mir bitte jemand erklären warum ich keine mehrere Variablen zu mehreren Forms in einem "Private Sub" deklarieren?
z.B:
Private Sub BlaBla()
Dim F1 as Form, F2 as Form, F3 as Form
Set F1= Forms ("abc")
Set F2= Forms ("def")
Set F3= Forms ("ghi")
.
.
.
.
End Sub
Bei der Ausführung bekomme ich immer wieder eine Meldung dass irgendein Form welche ich schon definiert bzw. an einem Variable zugewiesen habe, nicht gefunden wurde usw..
woran liegt es?
Danke für die Lösungsvorschläge im Vorab.
Zorlayan
Hallo,
vielleicht könntest Du die gesamte Aufgabe beschreiben und konkret den vollständigen Code zeigen.
Solche Abstraktionen nützen nicht viel.
Vermutlich und meiner trüben Glaskugel nach ist ein referenziertes Formular nicht geladen (geöffnet).
Hallo Zorlayan,
Versuche es mal mit einer präziseren Referenz auf das Form-Objekt; -
Dim F1 As Access.Form
Es könnte sein, das es Verweise auf eine/mehrere Bibliothek(en) gibt, die auch
ein Form-Objekt zur Verfügung stellen.
gruss ekkehard
Hallo!
Zur Sicherheit nachgefragt:
Du weißt, dass Access.Forms(...) nur die geöffneten Formulare enthält?
/edit: gerade gesehen, die Glaskugel von Franz zeigt auch diese Fehlermöglichkeit an. ;)
mfg
Josef
Servus,
vielen Dank für den Hinweis.
Werde mal probieren.
;)
Hallo Josef,
Jein, - für ein (noch) leeres Form-Objekt (Dim) dachte ich wäre das egal, da
kommt es doch erstmal nur auf das korrekte Objekt an.
Bei der Zuweisung kann man dann ja auf ".AllForms" zugreifen.
gruss ekkehard
leider hat nicht funktoniert, Access ist in der Meinung dass das Formular nicht existiert :)
Ich habe die Code wieder in langem Format geschrieben wenigstens so funktioniert ohne Fehler ;)
z.B.
Forms.XYZ!TextFeld1
Hallo!
ZitatForms.XYZ!TextFeld1
Wenn das funktioniert, muss auch
Forms("XYZ")!TextFeld1.Value = ...
' oder
dim frm as Form
set frm = Forms("XYZ")
frm!TextFeld1.Value = ...
' oder
dim frm as Form_XYZ
set frm = Forms("XYZ")
frm!TextFeld1.Value = ...
funktionieren.
Falls einer der obigen Code-Blöcke nicht funktioniert, bitte einmal ein Beispiel zeigen, bei dem es nicht funktioniert.
mfg
Josef
Ich würde die Referenzierung über das Klassenmodul des Formulars machen.
Das geht so:
Du dimensionierst die Variablen mit dem Klassenmodul (intellisense funktioniert, was uns zeigt, dass Du richtig stehst) und referenzierst dann das Formular zu der Variablen.
Erstens muss das Formular dafür nicht geöffnet sein (ich vermute das als Ursache), 2. referenzierst Du auf ein Klassenmodul, was in der objektorientierten Programmierten Umgebung ja nicht falsch sein kann ;).
Tausend Worte...., einfach mal ein Bespiel, wie ich das mache:
Private frmInfo As Form_FRMInformation (Im Modulkopf außerhalb der Prozedur)
Set frmInfo = New Form_FRMInformation (Innerhalb der Prozedur, wenn Du es neu öffnen willst)
oder so, z.B. ein bereits verknüpftes Sub-Form:
Private PrintOptions As Form_FRMPrintOptions (Im Modulkopf außerhalb der Prozedur)
Set PrintOptions = Me.FRMPrintOptions.Form (Innerhalb der Prozedur, wenn es bereits in einem Form verwendet wird)
Du hast damit auch eindeutige Vorteile: Du kannst die Publics aus der Klasse ansprechen, incl. Properties usw.
Damit das geht braucht dein referenziertes Formular (genauer das Klassenmodul) natürlich auch ein Klassenmodul, was bei Standardeinstellung erst entsteht, wenn min. eine Codezeile drin ist oder die HasModulProperty entsprechend gesetzt wurde. Das ist von Access natürlich etwas doof gehandhabt.
Wenn Du ein Formular referenziert hast, dass noch nicht geöffnet ist (z.b. als Popup aufgehen soll), also der erste Fall von den beiden oben, meine Deutschlehrerin würde mich jetzt wieder prügeln: "was sollen die Schachtelsätze?" - ich würde entgegnen, dann nehme ich halt Gedankenstriche (oder Klammern( auch gerne geschachtelt)) - , dann zauberst Du das mit .visible = true herbei.
In dem Zusammenhang ist das Verständnis zur Objektlebenszeit wichtig:
Würdest Du z.B. das Klassenmodul innerhalb einer Prozedur deklarieren, wäre das Objekt gleich wieder gekillt, nach Durchlauf. Da ich vermute, dass dies in den seltensten Fällen gewünscht sein wird, Modulkopf.
Probier mal aus :)
Hallo,
was Josef oben meinte ist, daß die "Forms"-Collection nur bereits geöffnete Formulare enthält, entsprechend funktioniert ein Set auch nur, wenn (im Beispiel) alle drei Formulare vor Ausführung des Codes schon offen sind.
Die Zuweisung an eine Objektvariable "Access.Form" verwendet nur das generische "Form"-Objekt, entsprechend kann man hier nicht spezifizieren, welches Formular man an die Variablen F1-F3 übergeben möchte, wenn sie noch NICHT geöffnet sind.
Will man also die Objektvariablen verwenden UND das Formular öffnen, muß man entweder eine Einzelinstanz des Formulares mit DoCmd.OpenForm öffnen - dann funktioniert die Zuweisung wie im Code - oder, wie Milvus beschrieben hat, die Objektvariable als Klassenmodulname deklarieren, so daß man das Formular damit auch öffnen kann (ohne OpenForm).
Bei der Objektvariable als Klassenmodulname muß beim Formular mindestens "HasModule" auf True gestellt werden, wenn es keinen Code enthält. Mit der ersten Codezeile wird das automatisch eingerichtet.
Vorteil ist, daß man damit auch per IntelliSense an alle selbst definierten z.B. Public Subs eines Formulares kommt. Das ist auch bei Verwendung des generischen "Form" möglich, allerdings wird es dann nicht vom Compiler unterstützt.
@Ekkehard: Das "Access.Form" bei Dir war richtig, Josef meinte das "Access.Forms" (mit s) aus dem Ursprungscode, bei dem nur das "Access." nicht dabei stand.
Die "AllForms"-Auflistung hat dagegen nichts mit Form-Objekten zu tun, der Datentyp ist "AccessObject".
Gruß
Christian