vb6.0 zugriff auf Controls eines zur Laufzeit erstellten Form

  • VB6

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von guenni.

    vb6.0 zugriff auf Controls eines zur Laufzeit erstellten Form

    Hallo Forum...

    Ich habe ein Problem mit Commandbutton und Textboxen in einem Form das ich zur Laufzeit erstelle.
    Ich muss vorausschicken das ich Autodidaktisch VB 6.0 programmiere.
    Nun mein Problem:
    Ich habe ein Grundformular ("frmEingabe") mit Commandbutton.

    Visual Basic-Quellcode

    1. Private WithEvents txtDatum As TextBox
    2. Private WithEvents cmdSpeichern As CommandButton
    3. Private WithEvents cmdAbbrechen As CommandButton
    4. Private WithEvents cmdWeitere As CommandButton
    5. Private WithEvents cmdPlus As CommandButton
    6. Private Sub cmdAbbrechen_Click()
    7. Unload Me
    8. End Sub
    9. Private Sub cmdPlus_Click()
    10. End Sub
    11. Private Sub cmdSpeichern_Click()
    12. Call frmEingabeSpeichern
    13. End Sub
    14. Private Sub cmdWeitere_Click()
    15. Call frmEingabeSpeichern
    16. Unload Me
    17. If Vergleich = True Then
    18. MsgBox "kein Gas in Hemmoor"
    19. Else
    20. Call Tempform
    21. End If
    22. End Sub
    23. Private Sub Form_Load()
    24. End Sub
    25. Private Sub txtDatum_LostFocus()
    26. Me.txtDatum.Text = Format(Me.txtDatum, "dd.mm.yyyy")
    27. End Sub


    In einem Temporären Form füge ich unterschiedliche Textboxen hinzu und stelle es dar.

    Visual Basic-Quellcode

    1. Public Function Tempform() As frmEingabe
    2. If FormGeöffnet = False Then
    3. Dim temp As frmEingabe
    4. Set temp = New frmEingabe
    5. temp.optAbrechnunstag.Value = False
    6. Set rsDat = DBauslesen
    7. rsDat.MoveLast
    8. Dim x As Integer: Dim leftform As Integer
    9. With temp
    10. .Caption = "Eingabe " & Energie & " " & Ort
    11. Call MakeLabel(temp, "lblLetzterEintrag", 100, 100, 1500, 315, "Letzter Eintrag")
    12. Call MakeTextbox(temp, "txtLastDay", 1650, 100, 1200, 315, rsDat.Fields(1)): y = 2: leftform = 1800
    13. Call MakeTextbox(temp, "txtlastStand", 2900, 100, 800, 315, rsDat.Fields(2))
    14. Select Case strDBTabelle
    15. Case "StromOederquart", "GasOederquart", "StromHemmoor"
    16. Call MakeLabel(temp, "lblDatum", 100, 500, 1000, 350, "Datum"): y = y + 1
    17. Call MakeTextbox(temp, "txtDatum", 1650, 500, 1000, 350, "")
    18. .cmdPlus.Move 2700, 500, 400, 350: .cmdPlus.Visible = True
    19. Case "Autostrom"
    20. Dim lblName() As String: Dim txtName() As String
    21. ReDim lblName(rsDat.Fields.Count)
    22. ReDim txtName(rsDat.Fields.Count)
    23. For i = 1 To rsDat.Fields.Count - 1
    24. lblName(i) = "lblLabel" & i: txtName(i) = "txtText" & i
    25. Call MakeLabel(temp, lblName(i), 100, (i + 1) * 400, 1700, 350, rsDat.Fields(i).Name): y = y + 1: leftform = 0
    26. Call MakeTextbox(temp, txtName(i), 1800, (i + 1) * 400, 1700, 350, "")
    27. Next
    28. End Select
    29. y = y * 400
    30. .cmdSpeichern.Move 120, y, 1000, 400: .cmdSpeichern.Visible = True
    31. .cmdAbbrechen.Move 1200, y, 1000, 400: .cmdAbbrechen.Visible = True
    32. .cmdWeitere.Move 2300, y, 1000, 400: .cmdWeitere.Visible = True
    33. .Move leftform, 0, 5000, .cmdSpeichern.Top + 1100
    34. End With
    35. End If
    36. Set Tempform = temp
    37. Set temp = Nothing
    38. End Function


    Die Texboxen generiere ich in folgendem Modul-

    Visual Basic-Quellcode

    1. Public Function MakeTextbox(xForm As Form, xName As String, xleft As Integer, xtop As Integer, xwidth As Integer, xheight As Integer, xtext As String) As TextBox
    2. Dim xtextbox As TextBox
    3. Set xtextbox = xForm.Controls.Add("VB.TextBox", xName) '"Was für ein Control","Name der Textbox"
    4. With xtextbox
    5. .Visible = True: .FontBold = True: .Alignment = 2
    6. .Left = xleft: .Top = xtop: .Width = xwidth: .Height = xheight: .Text = xtext
    7. End With
    8. Set MakeTextbox = xtextbox
    9. End Function


    Der Text in Textboxen wird auch dargestellt...Aber die Click Funktion der Button wird nicht ausgeführt.
    Zum Speichern von Eingaben in den Textboxen kann ich nicht auf die Textbox zugreifen.

    WO LIEGT MEIN FEHLER??

    kann mir jemand helfen oder einen Tip geben???

    vielen Dank im Voraus-
    LG Günni
    Hi. Du hast zwar eine Funktion MakeTextbox die auch eine TextBox zurück gibt, rufst aber diese Funktion mit Call auf und weist damit deinen WithEvents nichts zu.

    Korrekt wäre zB: Set txtDatum = MakeTextbox(...
    Mfg -Franky-
    Hallo Franky,
    vielen Dank für die rasche Antwort.
    Leider bringt das nicht den gewünschten Erfolg.
    ich habe jetzt den code im temp Form entsprechend geändert. Aber nix passiert.

    Visual Basic-Quellcode

    1. With temp
    2. .Caption = "Eingabe " & Energie & " " & Ort
    3. Call MakeLabel(temp, "lblLetzterEintrag", 100, 100, 1500, 315, "Letzter Eintrag")
    4. Set txtLastDay = MakeTextbox(temp, "txtLastDay", 1650, 100, 1200, 315, rsDat.Fields(1)): y = 2: leftform = 1800
    5. Set txtLastStand = MakeTextbox(temp, "txtLastStand", 2900, 100, 800, 315, rsDat.Fields(2))
    6. Select Case strDBTabelle
    7. Case "StromOederquart", "GasOederquart", "StromHemmoor"
    8. Call MakeLabel(temp, "lblDatum", 100, 500, 1000, 350, "Datum"): y = y + 1
    9. Set txtDatum = MakeTextbox(temp, "txtDatum", 1650, 500, 1000, 350, "")
    10. Set txtStand = MakeTextbox(temp, "txtStand", 3700, 500, 1000, 350, "")
    11. .cmdPlus.Move 2700, 500, 400, 350: .cmdPlus.Visible = True


    Die Button reagieren jetzt, weil ich ,nach deinem Hinweis auf die Withevents Zuweisung , diese aus dem Grundform gelöscht habe.
    Hast Du vielleicht noch einen anderen Tipp warum txtDatum.click z.B keine Reaktion auslöst.
    und wie kann ich den Textboxen des erzeugten Form Text zuweisen???

    LG Günni
    @Coldfire: Das gibt es m.E. nicht in VB6
    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.

    guenni schrieb:

    Hast Du vielleicht noch einen anderen Tipp warum txtDatum.click z.B keine Reaktion auslöst.

    Müsste das nicht exakt so gehen wie mit dem Button-Click? Wenn ich dich richtig verstanden habe, klappt das nämlich nun. Ich sehe in deinem Code allerdings bisher keine Click-Prozedur für die Textbox.

    guenni schrieb:

    und wie kann ich den Textboxen des erzeugten Form Text zuweisen???

    Machst du das nicht schon? Oben schreibst du:

    guenni schrieb:

    Der Text in Textboxen wird auch dargestellt...
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Hallo Marcus,

    danke für dein Interesse an meinem Problem.
    ich erläutere es jetzt mal etwas genauer.
    ich habe ein "Grundform"(frmEingabe) auf dem 4 Commandbutton fest installiert sind (Speichern,Abbrechen,Weitere,und +1)
    dieses soll jetzt als Grundlage für Verschiedene Eingabeform dienen.
    in der Tempform Function erzeuge ich nun ein temporäres form der Grundform.
    dieses Temporäre form erweitere ich nun, je nach Eingabeanforderungen, um mehr oder weniger Textboxen und Label.
    in den Zeilen 11-13 der Tempform Function füge ich nun textboxen und label hinzu deren Daten aus einer Access Datenbank stammen.
    Das heißt der "Text" steht schon fest, wird im Temporären Form eingetragen, und im dargestellten Form, das dann das fertige Tempform darstellt, auch angezeigt. das meinte ich mit der Text in den entsprechenden Boxen wird dargestellt. nach dem Select case werden dann weitere, abhängige, Textboxen dargestellt dessen Text ich nach der Eingabe verarbeiten will.
    Versuche ich jetzt aber auf den Text in den Boxen des angezeigten Form zuzugreifen, mit Click, lost focus, oder Value Abfragen gelingt dies nicht.
    es stimmt... ich habe keinen click Function, dafür aber eine Lostfocus Anweisung ,die natürich auch nicht ausgführt wird.
    Die click function der Button funktioniert jetzt weil ich das withevent des Button entfernt habe, diese sind ja auf der form fest installiert. ein weiteres withevent das nicht gesetzt wird macht natürlich auch nichts, übertönt aber praktisch das Event das bei der Installation schon gesetzt wird. daher funktionierten die Button am Anfang nicht.
    ich hoffe ich konnte das jetzt etwas mehr verdeutlichen wo mein Problem liegt und Du mir vielleicht helfen kannst.

    Vielen Dank im voraus.
    LG Günni
    Ich war ein wenig arbeitstechnisch sehr eingespannt. Daher erst jetzt eine Antort von mir. Kleines minimales Beispiel.

    Form (frmMain)

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Sub Command1_Click()
    3. Call CreateTempForm
    4. End Sub
    5. Private Sub CreateTempForm()
    6. Dim tmpForm As Form
    7. Set tmpForm = New frmTemp
    8. tmpForm.Caption = "Test"
    9. tmpForm.ScaleMode = vbPixels
    10. ' Positionsangaben in Pixel!
    11. Set tmpForm.txtDatum = MakeTextbox(tmpForm, "Datum", 10, 10, 100, 20, "Text")
    12. tmpForm.Show
    13. End Sub


    Form (frmTemp)

    Visual Basic-Quellcode

    1. Option Explicit
    2. ' muss Public sein!
    3. Public WithEvents txtDatum As TextBox
    4. Private Sub txtDatum_Click()
    5. Debug.Print "Click"
    6. End Sub


    und ein Modul

    Visual Basic-Quellcode

    1. Option Explicit
    2. Public Function MakeTextbox(ByVal xForm As Form, _
    3. ByVal xName As String, _
    4. ByVal xLeft As Integer, _
    5. ByVal xTop As Integer, _
    6. ByVal xWidth As Integer, _
    7. ByVal xHeight As Integer, _
    8. ByVal xText As String) As TextBox
    9. Dim tb As TextBox
    10. Set tb = xForm.Controls.Add("VB.TextBox", xName) '"Was für ein Control","Name der Textbox"
    11. With tb
    12. .Visible = True: .FontBold = True: .Alignment = 2
    13. .Left = xLeft: .Top = xTop: .Width = xWidth: .Height = xHeight: .Text = xText
    14. End With
    15. Set MakeTextbox = tb
    16. End Function
    Mfg -Franky-
    Hallo Franky

    Vielen Dank für deine Hilfe.
    von der Funktionalität ist es wie ich es mir vorgestellt habe.
    Darum versuche ich jetzt die gewonnenen Erkenntnisse in meinem Projekt unter zu bringen.

    Ich hab's gefunden. Man solls nicht glauben, aber es fehlte nur ein Punkt.
    Das withevents public sein muss habe ich auch heraus gefunden.
    der Punkt fehlte, in meinem Code, nach der Set Anweisung für das event im tempForm.

    also nochmals
    Vielen Dank...
    Ich habe einiges gelernt. :)
    LG Günni

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