none
Wie konvertiert man ein Windows Form Projekt in eine Klasse RRS feed

  • Frage

  • Hallo zusammen,
    ich habe heute zwei Fragen auf meiner Liste stehen.

    Wie geht folgendes
    1.)
    Ich habe ein Formular erstellt als Windows Form Projekt. Daraus soll entstehen:
    a) eine Klasse
    b) in eigenem Namespace z.B meinNamespace
    c) im eigenen Verzeichnis z.B. ...\meineLibs
    d.) und auf der ToolBox Leiste 

    2.)
    Die beiden Datenklassen musste ich als friend deklarieren, weil draw diese verwendet.
    Jetzt sie von aussen sichtbar. Und das ist nicht erwünscht.
    Wie bekomme ich das hin?

    schöne Grüße
    Ellen



    Hier Struktur der Klasse

    Public Class Draw
    #Region "declarations"
    
        Friend DrawActive As Boolean
    
        Friend WriteOnly Property colorscheme() As Boolean
        '
        End Property
    
    #End Region
    
    #Region "process"
          '
        Friend WriteOnly Property mData() As String
        '
        End Property
    
     #End Region
    #Region "Form events"
    '
    '
    '
    #End Region
    #Region "utilities"
        '
        '
    #End Region
    
    End Class
    
    #Region "class data"
    
    Friend Class lineData
        Friend timeStamp As New List(Of Date)
        Friend linePt As New List(Of Point)
        Friend lineIsActive As Boolean
        Friend lineIsBinary As Boolean
        Friend lineCapture As String
        Friend linePen As New Pen(Color.Blue, 0.5)
    End Class
    
    Friend Class ioData
        Friend timeStamp As New List(Of Date)
        Friend binVal As New List(Of Boolean)
    End Class
    #End Region
    






    please, mark this as answer if it is THE answer -- best regards Ellen
    Dienstag, 16. März 2010 11:23

Antworten

  • Hallo Ellen,

    für den ersten Versuch:
    Füge der Projektmappe ein neues Projekt hinzu und wähle dort "Windows Forms Klassenbibliothek".

    Lege dort als Root-Namespace den von Dir gewünschten Namespace fest, z. B.:
    "EllenRamcke.Windows.Forms" (siehe auch Namen von Namespaces )
    Willst Du weiter gliedern, kannst Du das durch eine zusätzliche Namespace Angabe errreichen

    In dem ursprünglichen Projekt fügst Du die Klassenbibliothek als Verweis ein (als Projekte).
    Es dient dann als Test-Umgebung.

    Nun übertrage die Klassen (Kopieren und Einfügen geht über die Projektmappe)
    in die Klassenbibliothek und entferne sie aus dem ursprünglichen Windows Forms Projekt.

    Da nun die Klassen ausserhalb der ursprünglichen Projektmappe liegen mußt Du
    die Sichtbarkeit von Klassen und Eigenschaften von Friend auf Public ändern,
    soweit sie von aussen zugänglich sein sollen. Solche die nur in der Bibliothek
    intern genutzt werden können Friend bleiben und sind dann in der Voreinstellung
    nicht mehr für das andere Projekt zugänglich.

    Im Hinblick auf die Erweiterbarkeit  und Kapselung empfiehlt es sich, grundsätzlich
    mit Eigenschaften zu arbeiten, anstatt mit Feldern - siehe auch dort die
    Entwurfsrichtlinien für detailliertere Hinweise.

    Um das Ausgabeverzeichnis zu ändern, passe das Ausgabe-Verzeichnis in
    den Projekteinstellungen an. Wenn möglich solltest Du relative Pfade
     (z. B. ..\..\MeineLibs) verwenden, da dies ein späteres Verschieben der
    gesamten Projektkonfiguration erleichtert.

    Für eine permanente Ablage wäre eine Installation im GAC erforderlich.
    Das hatte ich heute morgen erst in einem Newsgroup Beitrag beantwortet.
    Ich empfehle, das aufzusparen bis die obigen Schritte sitzen.

    Für die Zukunft: Am besten fängt man direkt mit einer Klassenbibliothek an.

    Gruß Elmar

    • Als Antwort markiert Ellen Ramcke Dienstag, 16. März 2010 20:33
    Dienstag, 16. März 2010 11:59
  • Hallo Ellen,

    öffne mal die Projekt-Eigenschaften, dort kannst Du den "Anwendungstyp" von "Windows Forms-Anwendung" auf "Klassenbibliothek" umändern und auch den Namespace festlegen.

    "Friend" bedeutet, das die Methoden innerhalb des Projektes sichtbar sind. Bindest Du das Assembly in ein anderes Projekt ein, sind die nicht sichtbar.
    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    • Als Antwort markiert Ellen Ramcke Dienstag, 16. März 2010 20:33
    Dienstag, 16. März 2010 12:02
  • Hallo Ellen,

    zunächst mußt Du eine Instanz der Draw Klasse erstellen:

    Dim drawSettings As New ccontrol.Draw()
    
    drawSettings.colorscheme = RadioButton1.Checked

    Ob das auf Ebene des Formulars oder im FormClosing Ereignis
    besser aufgehoben ist, hängt von der weiteren Verwendung ab.

    (wobei WriteOnly Eigenschaften doch eher selten sind)

    Gruß Elmar

    • Bearbeitet Elmar Boye Dienstag, 16. März 2010 18:50 Codeformat
    • Als Antwort markiert Ellen Ramcke Dienstag, 16. März 2010 20:32
    Dienstag, 16. März 2010 18:50
  • Hallo Ellen,

    schön das es ein Problem weniger gibt.

    Wenn die beiden Datenklassen von aussen nicht zugänglich sein sollen,
    belasse es bei Friend. Damit kann nur innerhalb der (CControl) Assembly
    darauf zugegriffen werden, siehe Zugriffsebenen in Visual Basic .

    Und Instanzen davon innerhalb von Draw sollten Private oder auch Friend sein.

    Gruß Elmar
    • Als Antwort markiert Ellen Ramcke Dienstag, 16. März 2010 20:32
    Dienstag, 16. März 2010 20:03

Alle Antworten

  • Hallo Ellen,

    für den ersten Versuch:
    Füge der Projektmappe ein neues Projekt hinzu und wähle dort "Windows Forms Klassenbibliothek".

    Lege dort als Root-Namespace den von Dir gewünschten Namespace fest, z. B.:
    "EllenRamcke.Windows.Forms" (siehe auch Namen von Namespaces )
    Willst Du weiter gliedern, kannst Du das durch eine zusätzliche Namespace Angabe errreichen

    In dem ursprünglichen Projekt fügst Du die Klassenbibliothek als Verweis ein (als Projekte).
    Es dient dann als Test-Umgebung.

    Nun übertrage die Klassen (Kopieren und Einfügen geht über die Projektmappe)
    in die Klassenbibliothek und entferne sie aus dem ursprünglichen Windows Forms Projekt.

    Da nun die Klassen ausserhalb der ursprünglichen Projektmappe liegen mußt Du
    die Sichtbarkeit von Klassen und Eigenschaften von Friend auf Public ändern,
    soweit sie von aussen zugänglich sein sollen. Solche die nur in der Bibliothek
    intern genutzt werden können Friend bleiben und sind dann in der Voreinstellung
    nicht mehr für das andere Projekt zugänglich.

    Im Hinblick auf die Erweiterbarkeit  und Kapselung empfiehlt es sich, grundsätzlich
    mit Eigenschaften zu arbeiten, anstatt mit Feldern - siehe auch dort die
    Entwurfsrichtlinien für detailliertere Hinweise.

    Um das Ausgabeverzeichnis zu ändern, passe das Ausgabe-Verzeichnis in
    den Projekteinstellungen an. Wenn möglich solltest Du relative Pfade
     (z. B. ..\..\MeineLibs) verwenden, da dies ein späteres Verschieben der
    gesamten Projektkonfiguration erleichtert.

    Für eine permanente Ablage wäre eine Installation im GAC erforderlich.
    Das hatte ich heute morgen erst in einem Newsgroup Beitrag beantwortet.
    Ich empfehle, das aufzusparen bis die obigen Schritte sitzen.

    Für die Zukunft: Am besten fängt man direkt mit einer Klassenbibliothek an.

    Gruß Elmar

    • Als Antwort markiert Ellen Ramcke Dienstag, 16. März 2010 20:33
    Dienstag, 16. März 2010 11:59
  • Hallo Ellen,

    öffne mal die Projekt-Eigenschaften, dort kannst Du den "Anwendungstyp" von "Windows Forms-Anwendung" auf "Klassenbibliothek" umändern und auch den Namespace festlegen.

    "Friend" bedeutet, das die Methoden innerhalb des Projektes sichtbar sind. Bindest Du das Assembly in ein anderes Projekt ein, sind die nicht sichtbar.
    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    • Als Antwort markiert Ellen Ramcke Dienstag, 16. März 2010 20:33
    Dienstag, 16. März 2010 12:02
  • Hallo Olaf und Elmar,

    die dll habe ich jetzt hinbekommen.
    Das Projekt enthält noch eine weitere Klasse, diese hier:

    Public Class MDIForm1
    
        Private Sub MDIForm1_FormClosing(ByVal sender As System.Object, _
                                         ByVal e As System.Windows.Forms.FormClosingEventArgs) _
                                         Handles MyBase.FormClosing
            Draw.colorscheme = RadioButton1.Checked
    
    'Fehler	1	Der Verweis auf einen nicht freigegebenen Member erfordert einen Objektverweis.	
    
    
        End Sub
    End Class
    
    
    Das verstehe ich nicht. Die beiden Properties habe ich schon auf public gesetzt.
    Der Intelisense zeigt mir nicht die beiden Member der class Draw??
    In Projekt Eigenschaften --> Verweise  steht die dll in der Liste

    Im ObjectBrowser (F2) finde ich dieses:
    Public WriteOnly Property colorschem() As Boolean
         Member von ccontrol.Draw


    Gruß
    Ellen


    please, mark this as answer if it is THE answer -- best regards Ellen
    Dienstag, 16. März 2010 17:30
  • Hallo Ellen,

    zunächst mußt Du eine Instanz der Draw Klasse erstellen:

    Dim drawSettings As New ccontrol.Draw()
    
    drawSettings.colorscheme = RadioButton1.Checked

    Ob das auf Ebene des Formulars oder im FormClosing Ereignis
    besser aufgehoben ist, hängt von der weiteren Verwendung ab.

    (wobei WriteOnly Eigenschaften doch eher selten sind)

    Gruß Elmar

    • Bearbeitet Elmar Boye Dienstag, 16. März 2010 18:50 Codeformat
    • Als Antwort markiert Ellen Ramcke Dienstag, 16. März 2010 20:32
    Dienstag, 16. März 2010 18:50
  • Hallo Elmar,

    oh, wie konnte ich das nur vergessen natürlich! Geht jetzt.

    Ich möchte auf meine Frage 2 zurückkommen.
    Die beiden DatenKlassen ioData und lineData gehören ganz eng zur Klasse Draw und werden
    nur von dieser verwendet. Nach außen dürfen diese nicht sichtbar sein.
    Habe ich da vielleicht noch ein Designfehler?

    schöne Grüße
    Ellen






    please, mark this as answer if it is THE answer -- best regards Ellen
    Dienstag, 16. März 2010 19:13
  • Hallo Ellen,

    schön das es ein Problem weniger gibt.

    Wenn die beiden Datenklassen von aussen nicht zugänglich sein sollen,
    belasse es bei Friend. Damit kann nur innerhalb der (CControl) Assembly
    darauf zugegriffen werden, siehe Zugriffsebenen in Visual Basic .

    Und Instanzen davon innerhalb von Draw sollten Private oder auch Friend sein.

    Gruß Elmar
    • Als Antwort markiert Ellen Ramcke Dienstag, 16. März 2010 20:32
    Dienstag, 16. März 2010 20:03
  • Danke Elmar und Olaf.
    Bin wieder ein kleinen Schritt weiter
    Ellen
    please, mark this as answer if it is THE answer -- best regards Ellen
    Dienstag, 16. März 2010 20:32