Eigenes Control - Entfernen von properties

  • VB.NET
  • .NET (FX) 1.0–2.0

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

    Eigenes Control - Entfernen von properties

    Guten Tag
    Momentan versuche ich ein eigenes Control (Command Prompt) zu erstellen. Dazu habe ich ein neues erstellt, welches von der Richtextbox erbt. Nun wollte ich dort einige Eigenschaften ausblenden/entfernen. Momentan habe ich dazu folgenden Code:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Windows.Forms
    3. Imports System.Drawing
    4. Imports System.Design
    5. Imports System.ComponentModel
    6. Public Class CommandControl
    7. Inherits Windows.Forms.RichTextBox
    8. Public Sub New()
    9. Me.BackColor = Color.Black
    10. Me.ForeColor = Color.LimeGreen
    11. End Sub
    12. <Browsable(False), EditorBrowsable(EditorBrowsableState.Never)> _
    13. Overrides Property Multiline() As Boolean
    14. Get
    15. End Get
    16. Set(value As Boolean)
    17. End Set
    18. End Property
    19. End Class
    20. Public Class CommandControlControlDesigner
    21. Inherits System.Windows.Forms.Design.ControlDesigner
    22. Protected Overrides Sub PreFilterProperties(ByVal properties As System.Collections.IDictionary)
    23. MyBase.PreFilterProperties(properties)
    24. properties.Remove("Multiline")
    25. End Sub
    26. End Class

    Jedoch wird die Eigenschaft "Multiline" immer noch im Designer angezeigt. Was ist an diesem Code falsch/Wo ist da der Fehler?
    Mit freundlichen Grüssen
    LukiLeu
    Du müsstest das ganze schon als Shadows deklarieren, jedoch kann man durch Casten das Ganze am Ende wieder einsehen.
    Tipp: Erbe von Control und mach es ganz selbst.

    Es heißt btw ​Properties.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Trade schrieb:

    Tipp: Erbe von Control und mach es ganz selbst.

    Was meinst du damit genau? Ich erbe ja bereits vom Richtextbox-Control.

    VB.NET-Quellcode

    1. Inherits Windows.Forms.RichTextBox
    oder?
    Ich buch das mal unter "Jugned forscht ab" :)
    also wenn ich deinen Code übernehme ausser der Klasse unten...
    wird weder im Designer also in der IDE rechts dein Multiline angezeigt,
    noch wenn du innerhalb der Form draufzugreiftst also "commandcontrol1. ... machst

    ps. CommandControl ist echt kein Guter Name. Du solltest schon leicht deutlich machen, was das Teil ist.
    Eines tages weisst du nicht mehr was "commandcontrol" macht, ( bei z.B. myOwn_RTFBox schon ) wenn du deine alten Quellcodes mal ansiehst, oder was ändern musst.

    Vielleicht einfach mal dein Projekt im Menüpunkt "build" Neu erstellen. Ist vielleicht bei dir noch nicht aktualisiert.
    Vom Control, nicht RichTextBox.
    Also, Inherits Control.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    RoulettePilot schrieb:

    also wenn ich deinen Code übernehme ausser der Klasse unten...
    wird weder im Designer also in der IDE rechts dein Multiline angezeigt

    Das ist spannend, ich hatte bis anhin immer das ganze über "Build Solution" neu erstellt --> Multiline war immer noch drin. Nun habe ich es einmal noch mit "Rebuild Solution" neu erstellt --> siehe da, Multiline war weg.

    Nun Besten Dank allen Helfern, auch wenn es ein sehr blöder Fehler meinerseits war.
    Grüsse
    LukiLeu

    RoulettePilot schrieb:

    wenn er die RTB-Eigenschaften haben will?

    Dann muss er die halt eigens implementieren.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Trade schrieb:

    Vom Control, nicht RichTextBox.
    Also, Inherits Control.
    Was soll das?
    @LukiLeu Lass Dein Control von RichTextBox erben und 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!
    Dann hat er keinesfalls fertige Properties drin, wie eben das was er nicht wollte.

    RodFromGermany schrieb:

    Lass Dein Control von RichTextBox erben und feddich.

    Macht er doch schon? Oo
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Trade schrieb:

    Macht er doch schon?
    Er schon. Du wolltest es ihm doch ausreden, deswegen hab ich ja auch Dich und nicht ihn zitiert.
    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!
    Na klar, wenn er die vorgegebenen Properties nicht haben möchte und er ganz sichergehen will, dann soll er das ganz selber machen. Dann hat er nämlich nur das eigene drin. Hab ich bei nem Control auch gemacht ;)
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ich glaube, Du hast Deinen Designer nicht dem Control zugewiesen. Sollte so aussehen:

    VB.NET-Quellcode

    1. <DesignerAttribute(GetType(CommandControlControlDesigner1))>
    2. Public Class CommandControl
    3. .
    4. .
    5. .

    Multiline verschwindet dann im Designer, ist aber in der Intellisense immer noch zu sehen.
    Mit dem Attribut

    VB.NET-Quellcode

    1. <EditorBrowsable(EditorBrowsableState.Never)>

    wird die Property auch in der Intellisense ausgeblendet.

    ABER:

    Zuweisungen und auslesen sind nach wie vor möglich.

    VB.NET-Quellcode

    1. Me.CommandControl1.Multiline = True
    2. Dim b As Boolean = CommandControl1.Multiline


    Du solltest also die Property so behendeln, das entsprechende Werte gesetzt oder zurückgegen werden. Könnte z.B. so aussehen

    VB.NET-Quellcode

    1. <EditorBrowsable(EditorBrowsableState.Never)>
    2. Shadows Property Multiline() As Boolean
    3. Get
    4. Return False
    5. End Get
    6. Set(value As Boolean)
    7. ' nix tun
    8. End Set
    9. End Property
    Schau mal:

    VB.NET-Quellcode

    1. ​Dim cmdControl As New CommandControl
    2. DirectCast(cmdControl, RichTextBox).Multiline = True
    Das funktioniert tadellos.
    Dagegen lässt sich auch nichts machen, solange du von RichTextBox erbst. Trade hat schon recht, wenn die Properties verschwinden sollen, dann darfst du nicht von RichTextBox erben. Du musst deswegen aber nicht unbedingt alles selbst implementieren, füge deinem Control einfach eine RichTextBox hinzu, die nach außen hin nicht zugreifbar ist, und leite Aufrufe dorthin um.
    Das Gerede von Richtextbox selber basteln halte das für Quatsch.
    Richtextbox ist ein hochentwickeltes Control, also von uns allen ist sicherlich niemand imstande, auch nur annähernd gleichwertiges zu coden.
    Werft mal einen Blick zB in die FastColoredTextbox von CodeProject, mal so als Beispiel, was alles zu machen wäre.
    So größenordnungsmäßig dürfte das der Umfang eines selbstgebastelstes Richtextbox-Control sein - also wir sprechen uns dann in 3 Jahren wieder ;) .


    Na gut :P Ich gebe mich geschlagen. :rolleyes:
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: