Private Objektmodule dürfen in öffentlichen...

DrMueller

Erfahrenes Mitglied
Hallo Leute mal wieder,
folgendes, merkwürdiges Problem, das, nachdem mir jemand die Lösung gesagt hat, mir sicher ein Kopfschütteln bereiten wird. Also folgendes ist die Messagebog:
Private Objektmodule dürfen in öffentlichen
Objektmodulen nicht als Parameter oder Rückgabetypen
für öffentliche Prozeduren, als öffentliche Datenmitglieder,
oder als Felder öffentlicher, benutzerdefinerter Typen verwendet werden.
Der Code lautet wie folgt:

Code:
Public Sub putfensterinMiddle(ByRef f As Form)
  Dim iScreenBreite As Integer
  Dim iScreenHoehe As Integer
  Dim iFensterBreite As Integer
  Dim iFensterHoehe As Integer
  Dim iFensterTop As Integer
  Dim iFensterLeft As Integer
  
  iScreenBreite = Screen.Width
  iScreenHoehe = Screen.Height
  
  iFensterBreite = f.Width
  iFensterHoehe = f.Height
  
  iFensterLeft = iScreenBreite / 2
  iFensterLeft = iFensterLeft - (iFensterBreite / 2)
  
  iFensterTop = iScreenHoehe / 2
  iFensterTop = iFensterTop - (iFensterHoehe / 2)
  
  f.Top = iFensterTop
  f.Left = iFensterLeft
End Sub

Diese Funktion ist bei einem Klassenmodul (cls) eingefügt.
Doch irgendwie motzt das Programm wegen dem f as form und gibt eben die oben genannte Fehlermeldung aus.
Ich kenne mich nicht so genau damit aus, aber ich dachte Form sei eigentlich frei benutzbar oder gibts da irgendwie Einschränkungen?
 
Hi
schreib mal anstatt "Public Sub", "Private Sub" dann sollte es gehen.
Nein keine Einschränkungen, er motzt auch nicht weger der Form, sondern wegen irgendwelcher "Deklarierungen".
Wenn das nicht hinhaut - mach mal byref weg.
Aber je mehr ich darüber nachdenke, stelle ich fest... eigendlich dürfte er gar nicht meckern. Hmm egal.
Cu
 
Public darf ich leider nicht wegnehmen, da ich das ja dann in allen Forms benutzen will.
Ohne byref funktionierts auch nicht. Aber auch das Byref ist ja Pflicht, da sonst gar nix passiert.
Schön blöd, bei nem anderen CLS gehts, aber dann stimmt die Strukturierung nicht mehr. tt
 
Hi.

Kann es sein, das du den Typ Form in deiner Klasse als privat deklariert hast? Oder eine private Klasse namens Form?

Versuch mal
Visual Basic:
Public Sub putfensterinMiddle(ByRef f As VB.Form)
Gruß
 
War eine sehr gute Idee, leider kommt die Fehlermeldung immer noch.
Ich kapier schon net wieso in der Fehlermeldung zwei mal hintereinander Objektmodul steht.
Naja muss ich wohl weiter testen, wäre aber natürlich für jede Idee, egal was für Eine, froh.
 
Es funktioniert, wenn Du die Sub in ein Modul anstatt in eine Klasse tust. Gibt es einen triftigen Grund, dies unbedingt in eine Klasse zu tun?

Wenn Du es in eine Klasse tust, muss der Aufruf wie folgt sein:

Code:
Private Sub Command1_Click()
   Dim Cl As New Class1
   Cl.putfensterinMiddle frmMain
End Sub

Ich habe mir hier eben mal eine nackste Klasse "Class1" angelegt, da klappt es so auch.

Vermutlich hängt das eher mit dem Aufruf zusammen. Die Prozedur selbst ist in Ordnung.

Ronald
 
Bei uns herscht eigentlich die Regel, das Publics nicht in Forms kommen. Dazu ist ja das witzige, dass ich zwei CLS habe, das andere jedoch rein datenbanktechnische Funktionen verwaltet. Als ich es versuchsweise dort hinein getan habe, hat er geklappt.
Auch wenn ich ByRef fo As VB.Form als Wert rausnehme, funktioniert es. Am "f" kanns also auch nicht liegen, da ich f versuchsweise neu als fo deklariert habe. Das Einzige was bleibt, ist also das VB.form.
 
Ich meinte auch nicht, dass die Prozedur in eine Form gehört, da gehören Publics wirklich nicht hin. Ich habe von einem Modul geredet. Und da gehören derartige Prozeduren schon hin.

Ronald
 
Das Projekt ist von der Logik her so aufgebaut:
1. Ne Menge Formulare
2. 2 Module: Konstantendeklraration und Spezialcode für Foldersearch
3. 2 Klassenmodule, ein Allgemeines (dort hätte ich eben die Sub gern drin) und eine, die für die Datenbankstruktur zuständig ist.

Wenn ich jetzt die Sub vom Allgemeinen in das Datenbankstruktur Klassenmodul verschiebe, funktioniert es mit dem Form.

Wenn ich in anderen Projekten die Funktion als Private direkt in ein Form stelle, funktioniert es auch.

Es funktioniert also genau in diesem Klassenmodul nicht, und der Grund ist diese Form Deklaration.
Deswegen kann ich mir gar keinen Reim darauf machen.
 
Zum vorherigen Problem: Ich habs einfach in die einzelnen Forms als private gepackt, ist zwar nicht gerade effizent, aber besser als Stunden über ein Problem nachzudenken.
Meine andere Frage:
So wie ichs unten mache, wird das Form ja einfach abgeschnitten. Dies ist als Test wegen der Breite etc. zwar zu gebrauchen, darf aber natürlich nicht drin bleiben.
Daher gibts eine einfache Möglichkeit, Forms und Controls zu skalieren? Am besten noch, dass, wenn der User das Form verändert, die Controls ebenfalls mitskalieren.
 

Neue Beiträge

Zurück