Übergabe der Form an eine Public Funcition

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Übergabe der Form an eine Public Funcition

    Hi,

    habe folgende public function:

    Public Function myfunction(byval fpsql as string, byval fpform as form = nothing) as boolean

    select case fpform.text

    case "A"

    with windows.application1.frmAuftrag

    .bestand = 0

    ' usw.

    end with

    case "B"

    with windows.application1.frmKorrekturAuftrag

    .bestand = 0

    ' usq.

    end with

    end select

    Die Anweisungen zwischen with und end with sind in allen Fällen die gleichen. Ich möchte mir das Kopieren der Anweisungen sparen und nur einen einzigen with end with - Block verwenden. Wer weiß, wie es geht?

    vbanfaenger schrieb:

    VB.NET-Quellcode

    1. Public Function myfunction(byval fpsql as string, byval fpform as form = nothing) as boolean
    2. select case fpform.text
    3. '...

    knallt sofort, wenn fpform = Nothing ist.
    Das musst Du zuerst abfangen.
    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!
    Hi,

    was meinst Du mit dem Hinweis: Benutze doch bitte den Quellcode. Soll ich den kompletten Programmteil hochladen?

    Hi Rod,

    also ich habe jetzt mal das optional beim Parameter fpform weggelassen und den Wert nicht auf nothing gesetzt. Wenn ich mir jetzt fpform anzeigen lasse, dann steht da wie gewünscht: WindowsApplication.frmUpdateAuftrag, wenn ich den Auftrag korrigiere und WindowsApplication1.frmAuftrag, wenn ich einen neuen Auftrag anlege. Für beide sollen aus der Funktion heraus in der aufrufenden Form die Werte gesetzt werden. Wenn ich jetzt schreibe with WindowsApplication1.fpform, dann meckert VB und sagt fpform ist kein Menmer von WindowsApplication1. Was muss ich anstellen, damit es funktioniert?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „vbanfaenger“ ()

    Nutze den

    VB.NET-Quellcode

    1. -Tag. Markiere den Quellcode und drücke auf den VB-Button über dem Edit-Fenster.
    2. Dein Deklarator [b]Form[/b] ist falsch.
    3. [vb]Public Function myfunction(byval fpsql as string, byval fpform as MyForm) as boolean
    4. select case fpform.text
    5. With .fpform
    6. '...
    sollte funktionieren.
    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!
    Mach Dir ein paar Funktionen, ein ReadInt(Name), ReadString(Name) usw.,
    da hast Du in der Ausleseschleife nur noch Einzeiler.
    Oder Du nimmst ein typisiertes Dataset und sagst ihm, was er bei DbNull zu tun hat, aber da hab ich nicht die große Ahnung.
    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!

    vbanfaenger schrieb:

    Mein eigentliches Problem ist jedoch, irgendwie mit fpform einen einzigen with-Block hinzubekommen.

    Das hängt von Deiner (nicht geposteten) Deklaration von den beiden genannten Formen ab:

    Wenn beide ( frmAuftrag, frmKorrekturAuftrag ) auf einer gemeinsamen Grundform beruhen und diese mit Inherits geerbt haben, so ist es einfach: übergebe die jeweilige Form an eine Sub(frm as GrundForm) , die die entsprechenden Änderungen vornimmt.

    Falls nicht , so wäre der Zugriff über die jeweilige Control-Collection noch eine (etwas umständlichere) Möglichkeit.

    Hoffe das war halbwegs klar ausgedrückt ...

    vbanfaenger schrieb:

    im Prinzip verstehe ich Dich.

    Gut, das ist schon einmal etwas. Wenn Du bei Deinen beiden Formen gemeinsame Eigenschaften setzen willst, so muss der Compiler auch wissen dass frmAuftrag.Bestand und frmKorrekturAuftrag.Bestand quasi zusammenhängen. Nur aufgrund des gemeinsamen Namens kann er das nicht wissen.

    Wenn Du beide genannten Formen im Designer definiert hast, und in beiden Textboxen namens Bestand definiert hat, so weisst Du zwar dass sie das gleiche meinen, aber sonst kann keiner die Verbindung herstellen. Dennoch könntest Du über frmauftrag.Controls("Bestand") und frmKorrekturAuftrag.Controls("Bestand") auf die jeweilgen Buttons zugreifen - nicht schön aber praktikabel. Ginge auch über Reflection, aber das lassen wir hier lieber ...

    vbanfaenger schrieb:

    dann habe ich eine Vorlage erstellt und aus der Vorlage habe ich die Form frmKorrektur erstellt

    Leider verstehe ich da nicht was Du mit einer Vorlage meinst, bzw. wie Du die frmKorrektur erstellt hast. ...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kangaroo“ ()

    Hi, Kangaroo,

    wie gesagt die aufrufenden Forms sehen alle gleich aus und zwar wie folgt:

    Option Explicit on

    Option Strict on

    Imports System.IO

    Imports System.Data.OleDb

    Public Class frmAuftrag ' frmUpdateAuftrag usw.

    Dim sql as string

    sql = "select bezdeutsch, bezdeutsch" ' usw.

    sql = sql & " from tabartikel where artikelnr = " & Format(cint(mskArtikel.text),"#######0")

    if not lies_artikel(sql, me) then

    msgbox("Artikel " & mskArtikel.text & " nicht vorhanden!")

    mskArtikel.select

    else

    ' alles i. O.

    end if

    End Class

    Wie schalte ich den "Vererbungsknopf" ein?

    Wenn alle Forms von einer übergeordneten Form erben, lade ich dann nicht alle Controls auf den untergeordneten Forms gleichzeitig mit den gleichen Werten?

    Ich habe nun versucht, das Problem zu lösen, indem ich den Parameter fpform als Objekt deklariert habe. Das geht gut, so lange ich auf die Variablen des aufrufenden Moduls zugreife z. B. auf .bestand.

    Bei der Anweisung fpform.controls("txt40.text") = bezdeutsch streikt der Compiler mit der Meldung: Der öffentliche Member txt40 für den Typ frmAuftrag wurde nicht gefunden.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „vbanfaenger“ ()

    Genau so ist es:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Using dlg As New Form2
    4. dlg.ShowDialog()
    5. End Using
    6. End Sub
    7. End Class
    8. Public Class Form2 : Inherits Form1
    9. End Class

    Sinnvoller ist es, eine gemeinsame Basisfunktionalität nicht in die Form1 zu packen, sondern in eine FormBase:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class FormBase
    2. ' pack hier Deine Funktionalität rein
    3. End Class
    4. Public Class Form1 : Inherits FormBase
    5. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    6. Using dlg As New Form2
    7. dlg.ShowDialog()
    8. End Using
    9. End Sub
    10. End Class
    11. Public Class Form2 : Inherits FormBase
    12. End Class

    Du musst zuerst die Formen erstellen und sie danach von FormBase ableiten.
    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!