Benutzer mit den meisten Antworten
Wie konvertiert man ein Windows Form Projekt in eine Klasse

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
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
-
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
-
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
-
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
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
-
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
-
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 -
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
-
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 -
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