3 Probleme:ClassLib eigene Form

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von GimpTutWorks.

    3 Probleme:ClassLib eigene Form

    Hallo,
    Hab da Folgende Probleme:

    Problem 1:
    Kurz und knapp:

    Ich hab eine Classlib, die eine Form darstellt(Inherits Windows.Forms.Form)
    Nun hab ich dort via dieser Classlib einen Button, der die gezeigte Form wieder schließen soll.

    MyBase.Close() wird nicht klappen, da das ButtonClick Event kein Event dieser Form ist.
    Me geht auch nicht...

    Nu hab ich nicht soviel Erfahrung damit, Form Classes zu machen(ist ein Wunder, dass ich's überhaupt soweit geschafft hab)

    Was kann ich da machen?




    Problem 2:
    Die Position des Buttons lasse ich in der Form gernerieren, zu der die Lib zugewiesen wurde.

    Dies hab ich so mit Strings bewerkstelligt:

    ClassCode:

    VB.NET-Quellcode

    1. Public Shared PitButtonLocation As String
    2. Select Case PitButtonLocation
    3. Case "center"
    4. PitButton.Location = New Point(CInt(MyBase.ClientRectangle.Width / 2 - (PitButton.Width / 2)), CInt((MyBase.ClientRectangle.Height / 2) - (PitButton.Height / 2)))
    5. Case "topcenter"
    6. PitButton.Location = New Point(CInt(MyBase.ClientRectangle.Width / 2 - (PitButton.Width / 2)), 12)
    7. Case "bottomcenter"
    8. PitButton.Location = New Point(CInt(MyBase.ClientRectangle.Width / 2 - (PitButton.Width / 2)), (MyBase.ClientRectangle.Height - 35))
    9. Case "leftcenter"
    10. PitButton.Location = New Point(12, CInt((MyBase.ClientRectangle.Height / 2) - (PitButton.Height / 2)))
    11. Case "rightcenter"
    12. PitButton.Location = New Point(CInt((MyBase.ClientRectangle.Width - 12) - (PitButton.Width)), CInt((MyBase.ClientRectangle.Height / 2) - (PitButton.Height / 2)))
    13. Case "topleft"
    14. PitButton.Location = New Point(12, 12)
    15. Case "topright"
    16. PitButton.Location = New Point(CInt(MyBase.ClientRectangle.Width - 12) - PitButton.Width, 12)
    17. Case "bottomleft"
    18. PitButton.Location = New Point(12, CInt(MyBase.ClientRectangle.Height - 12) - PitButton.Height)
    19. Case "bottomright"
    20. PitButton.Location = New Point(CInt(MyBase.ClientRectangle.Width - 12) - PitButton.Width, CInt(MyBase.ClientRectangle.Height - 12) - PitButton.Height)
    21. Case Else
    22. End Select


    FormCode:

    VB.NET-Quellcode

    1. Dim mpit1 As New mpit
    2. mpit1.PitButtonLocation = "center"


    Klappt ja alles wie es soll, aber ich möchte den User nicht überfordern und ich würde das gerne so machen, wie das z.B. bei BackColor so ist, dass schon diese AutoBox da erscheint wo dann alle Möglichkeiten an Colors drinne stehen.
    Aber wie mache ich das? Ich weiß nicht wonach ich suchen muss...

    Hat da jemand einen Rat?




    Problem 3:


    Ich hab das Problem, dass wenn ich die Variablen der Classe von der Parentform aus verändern will, diese Anweisungen grün unterkringelt werden...

    Screenshot:



    Und hier nochmal die ganze Class:

    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Imports System.Drawing.Drawing2D
    3. Imports System.Windows.Forms
    4. Public Class mpit
    5. Inherits Windows.Forms.Form
    6. Public Shared PitSize As Size
    7. Public Shared PitBackground As Color
    8. Private Shared WithEvents PitButton As New Button
    9. Public Shared PitButtonText As String
    10. Public Shared PitTitle As String
    11. Public Shared PitButtonLocation As String
    12. Private Sub mpit_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
    13. MyBase.Text = PitTitle
    14. MyBase.Size = New Size(PitSize.Width, PitSize.Height)
    15. MyBase.BackColor = PitBackground
    16. PitButton.Text = PitButtonText
    17. PitButton.BackColor = DefaultBackColor
    18. PitButton.Size = New Size(75, 23)
    19. Select Case PitButtonLocation
    20. Case "center"
    21. PitButton.Location = New Point(CInt(MyBase.ClientRectangle.Width / 2 - (PitButton.Width / 2)), CInt((MyBase.ClientRectangle.Height / 2) - (PitButton.Height / 2)))
    22. Case "topcenter"
    23. PitButton.Location = New Point(CInt(MyBase.ClientRectangle.Width / 2 - (PitButton.Width / 2)), 12)
    24. Case "bottomcenter"
    25. PitButton.Location = New Point(CInt(MyBase.ClientRectangle.Width / 2 - (PitButton.Width / 2)), (MyBase.ClientRectangle.Height - 35))
    26. Case "leftcenter"
    27. PitButton.Location = New Point(12, CInt((MyBase.ClientRectangle.Height / 2) - (PitButton.Height / 2)))
    28. Case "rightcenter"
    29. PitButton.Location = New Point(CInt((MyBase.ClientRectangle.Width - 12) - (PitButton.Width)), CInt((MyBase.ClientRectangle.Height / 2) - (PitButton.Height / 2)))
    30. Case "topleft"
    31. PitButton.Location = New Point(12, 12)
    32. Case "topright"
    33. PitButton.Location = New Point(CInt(MyBase.ClientRectangle.Width - 12) - PitButton.Width, 12)
    34. Case "bottomleft"
    35. PitButton.Location = New Point(12, CInt(MyBase.ClientRectangle.Height - 12) - PitButton.Height)
    36. Case "bottomright"
    37. PitButton.Location = New Point(CInt(MyBase.ClientRectangle.Width - 12) - PitButton.Width, CInt(MyBase.ClientRectangle.Height - 12) - PitButton.Height)
    38. Case Else
    39. End Select
    40. MyBase.Controls.Add(PitButton)
    41. End Sub
    42. Private Shared Sub PitButton_Click(sender As Object, e As System.EventArgs) Handles PitButton.Click
    43. End Sub
    44. End Class


    Was läuft da schief?




    Ich danke schonmal im Voraus für eure Hilfe.

    Ps: 1. Ich erwarte nicht unbedingt Komplette Lösungsvorschläge.
    2. Ich verbitte mir dämliche Kommentare, weil dieser Post meiner Meinung nach schon dazu anstiftet ^^
    (Ich kann schon viel, aber nicht alles... und wer nicht fragt bleibt dumm:D)
    3. meine räschtschraipfeler könnt ihr gerne Patentieren.
    Problem 3: Verwende "Shared" nicht, wenn du offensichtlich nicht weißt, was es bewirkt. Dann verschwinden auch die grünen Linien.

    Problem 2: Wenn du den User aus einer Auflistung von Positions-Möglichkeiten wählen lassen willst, dann nimm eine Auflistung (=Enumeration).
    Enumeration

    VB.NET-Quellcode

    1. Public Enum PitButtonLocationEnumeration
    2. topleft
    3. topcenter
    4. topright
    5. middleleft
    6. middlecenter
    7. ' ... und so weiter
    8. End Enum

    Dann hat der Benutzer nur mehr diese Möglichkeiten, und kann keine fehlerhaften Werte zuweisen.
    Ich würde des weiteren die PitButtonLocation als Property definieren (Shared hast du ja schon entfernt)
    Property bewirkt, dass du bei Zuweisung oder Abfrage zusätzlich Code ausführen kannst, im unteren Fall die Positionierung des Buttons.
    Denn es besteht ja im Programm die GefahrMöglichkeit, dass der User die Position im späteren Verlauf ändern möchte. (Bei den meisten Controls ist es so)
    Property und Positionierung des Buttons

    VB.NET-Quellcode

    1. Private _pitbuttonlocation As PitButtonLocationEnumeration
    2. Public Property PitButtonLocation As PitButtonLocationEnumeration
    3. Set(value As PitButtonLocationEnumeration)
    4. _pitbuttonlocation = value
    5. positionzuweisen()
    6. End Set
    7. Get
    8. Return _pitbuttonlocation
    9. End Get
    10. End Property
    11. Sub Positionzuweisen()
    12. Select Case PitButtonLocation
    13. Case PitButtonLocationEnumeration.middlecenter 'Hier wird die Enumeration verwendet.
    14. PitButton.Location = New Point(CInt(MyBase.ClientRectangle.Width / 2 - (PitButton.Width / 2)), CInt((MyBase.ClientRectangle.Height / 2) - (PitButton.Height / 2)))
    15. 'Case... hier deine restlichen Zuweisungen
    16. End Select
    17. End Sub

    Falls du mit der Autobox (wo alle Möglichkeiten drinnstehen...) eine grafische Darstellung der Auswahlmöglichkeiten im Eigenschaftenfenster meinst: das ist momentan außer Reichweite.

    Problem 1:
    Wenn deine Library ein Usercontrol werden soll, dann hat es doch sicher eine ParentForm-Eigenschaft, auf die man zugreifen kann.
    Da du aber von Form erbst, würde ich mal spontan ohne testen meinen: Me.Close.
    zu 1.: Generiere Dir ein Event, das genau dies bewirkt.
    zu 2.: Wie @der_Kurt: sagt: bau Dir ein Enumber.
    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!
    Hey danke vielmals für eure Antworten.

    Das Problem ist, es soll eine art Individuelle MessageBox werden, die man erst Komplett im FormLoad "designen" kann und hinterher bei bestimmten Aktionen wie Messageboxen aufrufen kann.

    Wie man MessageBoxen so kennt, schließen die sich beim klicken auf Ok.(Ohne weitere Zeilen Code)

    Und ich hab keine ahnung, wie ich die Class außerhalb der eigenen Events innerhalb der Class ansprechen kann.

    Ich will ja nicht, dass der User dann noch die Handles erstellen muss.
    ich finde deine Benamung sehr fragwürdig. ClassLib - das bedeutet alles andere als eine individuelle Messagebox. Ich weiß auch nicht, was du damit benannt hast: Hast du ein Dll-Projekt erstellt, was so heißt , undwas deine Messagebox enthält?

    Und was ist "Class"? Ist das deine Messagebox? Warum nennst du sie dann nicht auch so "AlertBox", NotifyBox, TrivialDialog, MyMessagebox, GimpBox, FlexBox - es gibt so viele Namen, die wenigstens einen Bezug zur Bestimmung einer Messagbox haben.
    Class ist halt was ganz anneres - Klassen sind die unterste Grundlage der Programmierung. Das ist wie wenn ich meinen Sohn als "Materie" bezeichne - inhaltlich richtig, aber einen noch weniger charakterisierenden Namen gibts kaum.

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

    thx - ich glaub, ich hab jetzt verstanden. (obwohl ich finde, es tut durchaus was zur sache, weil wenn man deine Frage nicht versteht, wirst du kaum sinnvolle Antworten bekommen).

    Kommen wir zum nächsten VerständnisProblem:

    GimpTutWorks schrieb:

    Und ich hab keine ahnung, wie ich die Class außerhalb der eigenen Events innerhalb der Class ansprechen kann.

    "Class außerhalb der eigenen Events innerhalb der Class ansprechen" - das ist also deine Frage - äh... :?: :wacko: :?:

    aber vlt. nütztes ja was, Eingabe-Form zu studieren. Die funzt auch wie eine Messagebox.
    hab da nichts gefunden...

    Ich möchte gerne wissen, wie ich die "MessagePit" schließen kann, durch klicken auf den in der Classlib deklarierten button.
    (Ohne das man in der Form, in der auf die Lib Verwiesen wird, noch was dazu deklariert werden muss.)
    Ich habs mit MyBase versucht, aber dann kommt die Meldung die im Screenshot im Hauptpost zu sehen ist...
    oh, da habe ich doch nichts verstanden.

    weil laut post#8 ist MessagePit eine lib, und es ist mir ganz unerfindlich, wie man eine lib schließen können soll.
    Und dann gibts jetzt auch wieder eine ClassLib, dann haben wir schon 2 libs - aber tut nichts zur sache: hauptsache du verstehst deine Fragen selber.