VB 2010: von einer Form auf ein Modul zugreifen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    VB 2010: von einer Form auf ein Modul zugreifen

    Hallo zusammen,

    ich befasse mich seit neuem mit Visual Basic 2010 und versuche gerade, ein Programm, das ich mal vor Jahren mit VBA (Access) gemacht habe, in VB umzustricken. In dem Programm verwalte ich Kunden, Aufträge etc. (für meinen eigenen Laden).
    Zu meinem Anliegen: ich habe etliche Forms, in denen ich beim Öffnen (form_load) die Text-, Combo- und ähnliche Felder sperren möchte, damit der Anwender nicht versehentlich etwas ändert und es nicht merkt. Erst mit Klick auf die Schaltfläche <Bearbeiten> sollen diese Felder zum Edtieren freigegeben werden. Nach dem Speichern werden sie wiederum gesperrt.
    Um nicht auf jeder Form das gleiche Programm (nennen wir es "TextfelderSperren") hineinzuschreiben, hatte ich es bei VBA mit einem Modul gemacht. Also vom jeweiligen Formular mit Call TextfelderSperren die entsprechende Sub aufgerufen. Damit wurden die Felder gesperrt und ich hatte das entsprechende Formular vor mir. Mit Klicken auf <Bearbeiten> wurde wiederum die Sub im Modul mit Call TextfelderEntsperren aufgerufen und ich konnte die Felder editieren.
    Nun wollte ich es so oder so ähnlich mit meinem VB.Programm machen, aber ich hänge da seit Tagen fest.
    Als Beispiel:

    VB.NET-Quellcode

    1. Module1
    2. Option Explicit On
    3. Module Module1
    4. Public Sub TextfelderSperren(frm As Form, ctl As Control)
    5. For Each ctl In frm.Controls
    6. If TypeOf ctl Is TextBox Or TypeOf ctl Is MaskedTextBox Then
    7. ctl.Enabled = False
    8. End If
    9. Next
    10. End Sub
    11. End Module
    12. So und jetzt die eigentliche Form:
    13. Private Sub frmKunden_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    14. ... das Formular frmKunden wird geladen
    15. Danach auf das Module1...
    16. Call TextfelderSperren(frmKunden, ctl)
    17. End Sub


    So... funktioniert (logischerweise :?: ) nicht, aber irgendwie weiß ich nicht weiter. Wie mache ich der Call-Anweisung klar, welche Form ich gerade geöffnet habe und welche Controls ich deaktivieren möchte?

    Ich hoffe, dass ich mich einigermaßen verständlich gemacht habe und dass das Thema nicht schon mal dran war. Ich habe nämlich nichts gefunden. Lieben Dank für Eure Tips.

    LG
    Olaf

    Falsches Unterforum. Nutze die richtigen Code-Tags. Bitte beachten. Verschoben & editiert ~fufu

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „fufu“ ()

    @highlander232 Willkommen im Forum. :thumbup:
    Bevor Du Dich mit Moduln befasst oder nicht, beginne drastisch umzudenken :!:
    Wenn Du tatsächlich so viele Formen hast, die gemeinsame Elemente haben, mach Dir eine gemeinsame Basisklasse, in die Du den bwetreffenden Code auslagerst.
    In der FormX.Designer.vb machst Du dies:

    VB.NET-Quellcode

    1. <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    2. Partial Class Form1
    3. Inherits System.Windows.Forms.Form
    4. ' ...
    5. End Form
    ==>

    VB.NET-Quellcode

    1. <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    2. Partial Class Form1
    3. Inherits MyFormBaseClass
    4. ' ...
    5. End Form
    und

    VB.NET-Quellcode

    1. Class MyFormBaseClass
    2. Inherits System.Windows.Forms.Form
    3. ' ...
    4. End Form
    Die Klasse MyFormBaseClass generierst Du Dir im Designer.
    (Fast) feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Entweder Du verwendest in Zeile#19 einfach statt TextfelderSperren(frmKunden, ctl) eben TextfelderSperren(Me, ctl). Oder Du packst entsprechende CEs in ne GroupBox und deaktivierst diese Box von Anfang an, bis der [Bearbeiten]-Button gedrückt wird.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Vielen Dank für Eure Antworten.
    Ich habe den Vorschlag von VaporiZed ausprobiert, Hurra...nur noch eine Fehlermeldung: Fehler 1 "ctl" wurde nicht deklariert. Auf das Objekt kann aufgrund seiner Schutzstufe möglicherweise nicht zugegriffen werden. E:\TASBusDispo\TASBusDispo\TASBusDispo\frmKunden.vb 16 37 TASBusDispo

    ctl hatte ich doch im Modul deklariert. Oder muss ich das woanders deklarieren? Ratlos ?(
    Wozu brauchst Du ctl überhaupt als Parameter? Lass es in Zeile#5 und #19 einfach weg. Wie Du schon angemerkt hast: ctl wird ja nur in dem Modul gebraucht. Und auch dort impliziert in Zeile#6 deklariert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Nur mit TextfelderSperren(Me) hat's nicht gefunzt. Jetzt habe ich versuchsweise ctl nochmal in der Form-Sub als Control deklariert und jetzt ging es. Versteh ich jetzt nicht so ganz, aber ist ja auch schon etwas später :sleeping:

    Aber auf jeden Fall schon mal vielen Dank für Deine Hilfe.
    ?(

    Bei diesen Angaben sollte es doch wohl gehen:

    VB.NET-Quellcode

    1. Option Explicit On
    2. Module Module1
    3. Public Sub TextfelderSperren(frm As Form)
    4. For Each ctl In frm.Controls
    5. If TypeOf ctl Is TextBox Or TypeOf ctl Is MaskedTextBox Then
    6. ctl.Enabled = False
    7. End If
    8. Next
    9. End Sub
    10. End Module
    11. Private Sub frmKunden_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    12. TextfelderSperren(Me)
    13. End Sub
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.