Eigenes Steuerelement

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Newhack.

    Eigenes Steuerelement

    Hallo,
    ich versuche mich gerade daran ein eigenes Steuerelement zu erstellen um einen Terminkalender umzusetzen.

    Hatte das ganze schonmals per Klassen im eigentlichen Projekt realisiert, jedoch soll die Verwendung mittels des Steuerelements vereinfacht werden.

    Nun zu meinem Problem:

    Das Steuerelement soll dynamisch eine Anzahl an Wochtagen beinhalten (hier erstmal 8):

    Quellcode

    1. Public Wochentag(7) As Wochentage


    Im Konstruktur werden die einzelnen Arrayelemente zugewiesen:

    Quellcode

    1. Public Sub New()
    2. MyBase.New()
    3. For i As Integer = 0 To 7
    4. Wochentag(i) = New Wochentage()
    5. Next
    6. InitializeComponent()
    7. bMonatsansicht = False
    8. End Sub



    und in der Paint methode des Steuerelementes sollen die Wochentage dargestellt werden. Dahinter verbirgt sich ein einfaches Panel:

    Quellcode

    1. Private Sub grafik(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Me.Paint
    2. If bMonatsansicht Then
    3. Label1.Text = "monat"
    4. Else
    5. Label1.Text = "woche"
    6. For i As Integer = 0 To 7
    7. 'Wochentage(i).SetGet_Datum = Date.Now
    8. Wochentag(i).SetGet_Hoehe = 100
    9. Wochentag(i).SetGet_Breite = Me.Width / 8
    10. Wochentag(i).SetGet_Position = New Point(i * Me.Width / 8, 0)
    11. Wochentag(i).parent = Me
    12. Next
    13. End If
    14. End Sub


    so sollen sich halt die Einträge der Wochentage automatisch an das Steuerelement anpassen bei Resize.

    Wenn ich das ganze nun in der Testumgebung für das Steuerelement mal starte funktioniert es auch.

    Sobald ich jedoch das Steuerelement in ein neues Projekt mal testweise einfüge, kommt ein Fehler und das Steuerelement wird mit einem roten Kreuz dargestellt.
    Sieht so aus als kann er keine Elemente in dem Array finden welche in der Paint-Methode verwendet werden. Jedoch sollte dies doch mit dem Konstruktur des Steuerelements behoben sein??

    Hoffe ihr könnt mir helfen :)
    Pack mal den Aufruf

    VB.NET-Quellcode

    1. InitializeComponent()


    an die erste Stelle in Deinem Konstruktor. Ich hab da noch was im Hinterkopf, dass dies der erste Aufruf sein sollte, aber keine Gewähr.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Falsche Dimensionierung, VB ist Null-basiert:

    VB.NET-Quellcode

    1. Public Wochentag(6) As Wochentage ' in C# stünde hier eine 7
    2. For i As Integer = 0 To 6
    3. Wochentag(i) = New Wochentage()
    4. Next
    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!

    RodFromGermany schrieb:

    Falsche Dimensionierung, VB ist Null-basiert:

    VB.NET-Quellcode

    1. Public Wochentag(6) As Wochentage ' in C# stünde hier eine 7
    2. For i As Integer = 0 To 6
    3. Wochentag(i) = New Wochentage()
    4. Next
    sollen schon 8 Elemente sein, ein leeres Feld gefolgt von den 7 WochenTagen.

    SpaceyX schrieb:

    Pack mal den Aufruf

    VB.NET-Quellcode

    1. InitializeComponent()


    an die erste Stelle in Deinem Konstruktor. Ich hab da noch was im Hinterkopf, dass dies der erste Aufruf sein sollte, aber keine Gewähr.
    Leider kein Erfolg damit :(

    Newhack schrieb:

    Das Steuerelement soll dynamisch eine Anzahl an Wochtagen beinhalten (hier erstmal 8)

    RodFromGermany schrieb:

    Falsche Dimensionierung, VB ist Null-basiert:


    :P

    Zu deinem Problem: Prüfe, bevor du in der Paint-Funktion auf die Wochentage zugreifst, ob die Länge des Arrays 8 ist. If Wochentag.Length > 0 Then und dann erst dein Zugriff darauf.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Hast Du Dir mal Haltepunkte gesetzt und den Code Schritt für Schritt debuggt? Nehmen die Variablen die gewünschten Werte an?
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    vb-checker schrieb:

    Newhack schrieb:

    Das Steuerelement soll dynamisch eine Anzahl an Wochtagen beinhalten (hier erstmal 8)

    RodFromGermany schrieb:

    Falsche Dimensionierung, VB ist Null-basiert:


    :P

    Zu deinem Problem: Prüfe, bevor du in der Paint-Funktion auf die Wochentage zugreifst, ob die Länge des Arrays 8 ist. If Wochentag.Length > 0 Then und dann erst dein Zugriff darauf.
    habs mal reingemacht, die Bedingung wird erfüllt.

    SpaceyX schrieb:

    Hast Du Dir mal Haltepunkte gesetzt und den Code Schritt für Schritt debuggt? Nehmen die Variablen die gewünschten Werte an?
    In dem Testprojekt kann ich nicht in das Steuerelement debuggen.


    Hier mal der Fehler welcher auftritt:
    Unten ist das Steuerelement aus dem Testcontainer zu sehen.

    Newhack schrieb:

    habs mal reingemacht, die Bedingung wird erfüllt.

    wann, beim Debuggen? Eine Zeichen-Funktion kannst du so natürlich nicht richtig debuggen, weil während du debuggst, kann die nicht gezeichnet werden und sowas :D

    Aber wenn du doch in der Fehlermeldung die Zeilenangabe hast, warum verrätst du uns nicht, welche verdammte Zeile das ist? :|
    In dem Testprojekt kann ich nicht in das Steuerelement debuggen.

    Ist Einstellungssache. Extras -> Optionen -> Debugger und dann gib t es da so eine option, um Fremdcode, falls verfügbar, auch zu debuggen.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    vb-checker schrieb:

    Newhack schrieb:

    habs mal reingemacht, die Bedingung wird erfüllt.

    wann, beim Debuggen? Eine Zeichen-Funktion kannst du so natürlich nicht richtig debuggen, weil während du debuggst, kann die nicht gezeichnet werden und sowas :D

    Aber wenn du doch in der Fehlermeldung die Zeilenangabe hast, warum verrätst du uns nicht, welche verdammte Zeile das ist? :|

    aus der paint methode

    Quellcode

    1. Public Sub grafik(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Me.Paint
    2. If bMonatsansicht Then
    3. Label1.Text = "monat"
    4. Else
    5. If (Wochentag.Length > 0) Then
    6. Label1.Text = "woche"
    7. For i As Integer = 0 To 7
    8. Wochentag(i).SetGet_Hoehe = 100
    9. Wochentag(i).SetGet_Breite = Me.Width / 8
    10. Wochentag(i).SetGet_Position = New Point(i * Me.Width / 8, 0)
    11. Wochentag(i).parent = Me
    12. Next
    13. End If
    14. End If
    15. End Sub


    die

    Quellcode

    1. Wochentag(i).SetGet_Hoehe = 100
    Kalender.vb, Zeile 53.
    Setz mal davor einen Haltepunkt hin und sieh Dir die Variablen an.
    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!
    Wie gesagt bei der Steuerelemententwicklung kann ich ja debuggen. Da funktioniert auch alles beim Starten und alle Elemente im Array sind richtig zugeordnet.

    Jedoch bei der Verwendung des Steuerelement aus der Toolbox in einem neuen Projekt kommt der Fehler, noch bevor ich überhaupt kompiliert habe...
    Kann es sein dass beim Einfügen des Steuerelement nur die Paintmethode verwendet wird und der Konstruktor quasi erstmal überschritten wird?
    Da musste eben beide Projekte offen haben und mit der Info aus dem einen den Fehler im anderen finden. :D
    Oder gleich mal das Projekt dort mit reinziehen.
    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!

    Newhack schrieb:

    Kann es sein dass beim Einfügen des Steuerelement nur die Paintmethode verwendet wird und der Konstruktor quasi erstmal überschritten wird?

    Ja, schon möglich. Daher solltest du ja die If-Abfrage im Paint-Event machen.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Ok also in den Konstruktor ist er reingesprungen und hat alle Elemente erstellt. Auch die Länge des Array innerhalb der Paintmethode war richtig. Jedoch war der Zugriff auf die einzelnen Elemente nicht machbar... naja

    Hab es jetzt mittels einer Liste gelöst.

    Danke an euch