Mit VB.Net ein neues Steuerelemt erstellen, auch für Office (speziell aber Access)
Hallo zusammen,
ich bin gerade dabei mir ein neues Steuerelemt für VB.Net und Office (speziell Access ab 2007) zu bauen. Leider habe ich nichts passendes für mein nun folgendes Problem gefunden.
Alle Beispiele sind entweder nur auf Funktionen o.ä. ausgelegt, oder so einfach, dass diese keine eigenen Eigenschaften haben.
Grundsätzliches:
Mein DLL-Projekt habe ich als 'Windows-Forms-Steuerelemtbibliothek (.NET Framework)' erstellt.
Als Netframework habe ich die 4.8 genommen.
Die Einstellung 'Assembly COM-sichtbar machen' und 'Für COM-Interop registrieren' sind beide aktiv.
Ziel CPU ist AnyCPU
Erstellt wird das Ganze mit Microsoft Visual Studio Enterprise 2022 (64-Bit) - Current, Version 17.8.1 auf einem Win10 22H2 64Bit System
Das Dll-Projekt wird als Admin ausgeführt. Das Testprojekt normal
Jetzt habe ich mir im DLL-Projekt zwei Steuerelemente eingebaut, die später das neue Steuerelement ergeben sollen.
Da das neue Control später neue Möglichkeiten haben soll, habe ich diese eingefügt (siehe Code).
Mein Control soll die Möglichkeit haben, aus festgelegten Eigenschaften sich Designs auszuwählen. Klar, das die nur ich festlegen kann, aber das wahr erst einmal so ein Grundgedanke, dass man hier doch ein paar als Vorschlag festlegen könnte.
Wenn ich die DLL mit F5 starte, dann wird auch alles so wie es soll, im Testfenster umgesetzt.
Wird aber die DLL in das normale Projekt eingebunden (als .Net Framework-Komponente), dann funktioniert das Ändern der Eigenschaften nur in der Entwurfsansicht. Starte ich das Programm auch mit F5,
dann werden die Änderungen von meinen neuen Eigenschaften nicht übernommen.
Bevor ich jetzt den Code zeige, wollte ich einmal ein paar generelle Fragen stellen
1. Ist für die Office-Anwendung die 'Windows-Forms-Steuerelemtbibliothek (.NET Framework)' überhaupt die richtige Ausgangsbasis? Wenn nein, welche wäre hier die Richtige?
2. Kann ich so einfach zwischen den Anwendungstypen hin und her wechseln? Eigentlich wollte ich nur ein Projekt erstellen und damit VS und Office abdecken.
3. Jedes neue DLL-Control ist doch eine Kopie aus der DLL und hat somit, was die Eigenschaften betrifft, sein eigenes "Gehirn". Nur ist hier vielleicht die Frage, wie sollte ich das Gehirn nutzen, über Variablen oder über die My.Settings?
Aktuell arbeite ich im fast fertigen Projekt mit Variablen. Hier im Beispiel habe ich mal mit My.Settings versucht. Leider auch ohne den kpl. Erfolg.
4. Hier habe ich ein kleines Erklärtutorial Dynamic Link Library’s (DLL’s) in vb.NET Erstellen entdeckt, welches drei interessante Zeilen für mich nennt.
Imports System.Runtime.InteropServices ' Zugriff auf die DLL ermöglichen
<Microsoft.VisualBasic.ComClass()>
<System.Runtime.InteropServices.ComVisible(True)>
Da man (siehe oben) so ein paar Grundeinstellungen vornehmen muss, würde mich interessieren, was diese drei Zeilen genau machen? Setzten Sie diese Einstellungen kpl. so, wie ich es später brauche oder ist das eine zusätzliche Absicherung.
Wenn man die drei Zeilen als Ersatz für das Einstellen des Projektes sehen kann, dann wäre es natürlich die schönere Art die Einstellungen vorzunehmen.
So rein vom optischen würde ich sagen, dass es die Einstellungen sind.
4. Sollte mein Code kpl. falsch sein, könntet Ihr mir ein funktionierendes Grundgerüst nennen, auf dem ich dann aufbauen kann?
Das nun folgende Beispiel ist eine Kopie meines bisherigen Codes und beinhaltet nur eine neue (alte) Eigenschaft 'Checked'. Da das Projekt noch 2 Grafiken hat, soll je nach Wert von Checked die eine oder andere Grafik angezeigt werden.
Was aber leider nicht so klappt wie ich mir das denke bzw. wünsche.
Es wäre also toll, wenn sich jemand mal den Code bzw. die beiden Projekte ansehen könnte und mir meine Fehler aufzeigen könnte.
Vielen Dank
Volker
Spoiler anzeigen
Thema verschoben; Das Thema wird automatisch dort erstellt, wo man sich befindet, wenn man auf [✱ Neues Thema] klickt. ~VaporiZed
Hallo zusammen,
ich bin gerade dabei mir ein neues Steuerelemt für VB.Net und Office (speziell Access ab 2007) zu bauen. Leider habe ich nichts passendes für mein nun folgendes Problem gefunden.
Alle Beispiele sind entweder nur auf Funktionen o.ä. ausgelegt, oder so einfach, dass diese keine eigenen Eigenschaften haben.
Grundsätzliches:
Mein DLL-Projekt habe ich als 'Windows-Forms-Steuerelemtbibliothek (.NET Framework)' erstellt.
Als Netframework habe ich die 4.8 genommen.
Die Einstellung 'Assembly COM-sichtbar machen' und 'Für COM-Interop registrieren' sind beide aktiv.
Ziel CPU ist AnyCPU
Erstellt wird das Ganze mit Microsoft Visual Studio Enterprise 2022 (64-Bit) - Current, Version 17.8.1 auf einem Win10 22H2 64Bit System
Das Dll-Projekt wird als Admin ausgeführt. Das Testprojekt normal
Jetzt habe ich mir im DLL-Projekt zwei Steuerelemente eingebaut, die später das neue Steuerelement ergeben sollen.
Da das neue Control später neue Möglichkeiten haben soll, habe ich diese eingefügt (siehe Code).
Mein Control soll die Möglichkeit haben, aus festgelegten Eigenschaften sich Designs auszuwählen. Klar, das die nur ich festlegen kann, aber das wahr erst einmal so ein Grundgedanke, dass man hier doch ein paar als Vorschlag festlegen könnte.
Wenn ich die DLL mit F5 starte, dann wird auch alles so wie es soll, im Testfenster umgesetzt.
Wird aber die DLL in das normale Projekt eingebunden (als .Net Framework-Komponente), dann funktioniert das Ändern der Eigenschaften nur in der Entwurfsansicht. Starte ich das Programm auch mit F5,
dann werden die Änderungen von meinen neuen Eigenschaften nicht übernommen.
Bevor ich jetzt den Code zeige, wollte ich einmal ein paar generelle Fragen stellen
1. Ist für die Office-Anwendung die 'Windows-Forms-Steuerelemtbibliothek (.NET Framework)' überhaupt die richtige Ausgangsbasis? Wenn nein, welche wäre hier die Richtige?
2. Kann ich so einfach zwischen den Anwendungstypen hin und her wechseln? Eigentlich wollte ich nur ein Projekt erstellen und damit VS und Office abdecken.
3. Jedes neue DLL-Control ist doch eine Kopie aus der DLL und hat somit, was die Eigenschaften betrifft, sein eigenes "Gehirn". Nur ist hier vielleicht die Frage, wie sollte ich das Gehirn nutzen, über Variablen oder über die My.Settings?
Aktuell arbeite ich im fast fertigen Projekt mit Variablen. Hier im Beispiel habe ich mal mit My.Settings versucht. Leider auch ohne den kpl. Erfolg.
4. Hier habe ich ein kleines Erklärtutorial Dynamic Link Library’s (DLL’s) in vb.NET Erstellen entdeckt, welches drei interessante Zeilen für mich nennt.
Imports System.Runtime.InteropServices ' Zugriff auf die DLL ermöglichen
<Microsoft.VisualBasic.ComClass()>
<System.Runtime.InteropServices.ComVisible(True)>
Da man (siehe oben) so ein paar Grundeinstellungen vornehmen muss, würde mich interessieren, was diese drei Zeilen genau machen? Setzten Sie diese Einstellungen kpl. so, wie ich es später brauche oder ist das eine zusätzliche Absicherung.
Wenn man die drei Zeilen als Ersatz für das Einstellen des Projektes sehen kann, dann wäre es natürlich die schönere Art die Einstellungen vorzunehmen.
So rein vom optischen würde ich sagen, dass es die Einstellungen sind.
4. Sollte mein Code kpl. falsch sein, könntet Ihr mir ein funktionierendes Grundgerüst nennen, auf dem ich dann aufbauen kann?
Das nun folgende Beispiel ist eine Kopie meines bisherigen Codes und beinhaltet nur eine neue (alte) Eigenschaft 'Checked'. Da das Projekt noch 2 Grafiken hat, soll je nach Wert von Checked die eine oder andere Grafik angezeigt werden.
Was aber leider nicht so klappt wie ich mir das denke bzw. wünsche.
Es wäre also toll, wenn sich jemand mal den Code bzw. die beiden Projekte ansehen könnte und mir meine Fehler aufzeigen könnte.
Vielen Dank
Volker
Quellcode
- Imports System.ComponentModel ' Wird für die Kategorisierung der neuen Eigenschaften benötigt. Ohne diese Zeile bekommen wir in den Zeilen <Category> eine Fehlermeldung
- Imports System.Runtime.InteropServices ' Zugriff auf die DLL ermöglichen
- <Microsoft.VisualBasic.ComClass()>
- Public Class TestDLL
- ' OT MS: Bewirkt, dass die aktuelle Klasse oder Schnittstelle die Attribute, Variablen, Eigenschaften, Prozeduren und Ereignisse von einer
- ' anderen Klasse oder Gruppe von Schnittstellen erbt.
- ' Dies bedeut also, dass man die Eigenschaften, die bei allen hier verwendeten Steuerelemten gleich sind, auch direkt nutzen kann.
- ' Diese Eigenschaften müssen alle nicht extra eingebaut werden, sondern werden "durchgeschleift" und an alle Steuerelemente dieses Controls weitergeleitet.
- ' Es sind also nur neue Aktionen hinzuzufügen, die es noch nicht gibt bzw. bei denen etwas anderes passieren soll.
- ' Multiline bspw. gibt es bei der Textbox, aber nicht bei der Picturebox. Also muss diese Eigenschaft wieder eingebaut werden und auch die Ansteuerung der Textbox muss erfolgen.
- Inherits UserControl ' Nimmt uns schon einmal sehr viel Arbeit ab.
- ' Hier werden die Aufrufe für die ggf. einzelnen Aktionen deklariert
- Public Event Standard_Aktion_ausfuehren As EventHandler
- Sub New()
- ' ****************************************************************
- ' Hier werden ein paar Grundeinstellungen für die neuen Eigenschaften festgelegt,
- ' sobald das neue Steuerelement in die Hauptform eingefügt wird
- ' ****************************************************************
- ' Dieser Aufruf ist für den Designer erforderlich.
- InitializeComponent()
- My.Settings.Checked = True
- My.Settings.Save()
- ' Wenn der Checked-Wert auf False steht,
- If My.Settings.Checked = False Then
- ' dann die passende Grafik für Aus anzeigen
- PBox_Button.BackgroundImage = My.Resources.ResourceManager.GetObject("Grafik_01_Aus")
- Else
- ' andernfalls für Ein
- PBox_Button.BackgroundImage = My.Resources.ResourceManager.GetObject("Grafik_01_Ein")
- End If
- End Sub
- ' Ein Versuch, dass die Grafik richtig beim neuzeichnen angezeigt wird.
- Shadows Sub paint()
- ' Wenn der Checked-Wert auf False steht,
- If My.Settings.Checked = False Then
- ' dann die passende Grafik für Aus anzeigen
- PBox_Button.BackgroundImage = My.Resources.ResourceManager.GetObject("Grafik_01_Aus")
- Else
- ' andernfalls für Ein
- PBox_Button.BackgroundImage = My.Resources.ResourceManager.GetObject("Grafik_01_Ein")
- End If
- End Sub
- #Region "Neue Eigenschaften"
- ' *************************************************************************
- ' Die nachfolgenden Zeilen stellen die sichtbaren neuen Eigenschaften dar.
- ' *************************************************************************
- ' Über <Category ...> kann man für jede folgende neue Eigenschaft eine bestehende oder neue Kategorie festlegen, unter der dann diese Eigenschaft zu finden ist.
- ' Ich habe mich hier für eine durch den Buchstaben A anfangne Kategorie entschieden. Dadurch stehen die neuen Eigenschaften ganz oben. Lässt man die Zeile weg, so gibt es eine Kategorie 'Sonstige'
- ' Da die folgenden Eigenschaften immer gleich aufgebaut sind, habe ich mir die Beschriftung nur in die erste eingetragen.
- <Category("Alternative Eigenschaften")>
- <System.Runtime.InteropServices.ComVisible(True)>
- Public Property Checked As Boolean
- ' Wenn der Wert der Eigenschaft zurück gegeben werden soll,
- Get
- ' dann wird hier der aktuelle Wert zurück gegeben
- Return My.Settings.Checked
- End Get
- ' Soll er hingegen geändert werden,
- Set(value As Boolean)
- ' dann bekommt die interne Variable den aktuellen Wert erst einmal zugewiesen
- My.Settings.Checked = value
- My.Settings.Save()
- ' und danach wird die ggf. notwendige Aktion aufgerufen
- RaiseEvent Standard_Aktion_ausfuehren(Me, EventArgs.Empty)
- End Set
- End Property
- #End Region
- #Region "und die neuen Aktionen"
- Private Sub HandleStandard_Aktion_ausfuehren(sender As Object, e As EventArgs) Handles Me.Standard_Aktion_ausfuehren
- ' ****************************************************************
- ' Hier wird auf Änderungen der Eigenschaft reagieren
- ' ****************************************************************
- ' Aufgrund der neuen Einstellung wird die Anzeige der Grafik bzw. der Textbox neu durchgeführt
- ' Hier kommen also alle Aktionen hin, die dann auf die aktuellen Einstellungen der Eigenschaften reagieren.
- ' Wenn der Checked-Wert auf False steht,
- If My.Settings.Checked = False Then
- ' dann die passende Grafik für Aus anzeigen
- PBox_Button.BackgroundImage = My.Resources.ResourceManager.GetObject("Grafik_01_Aus")
- Else
- ' andernfalls für Ein
- PBox_Button.BackgroundImage = My.Resources.ResourceManager.GetObject("Grafik_01_Ein")
- End If
- End Sub
- ' Hier mal die drei Möglichkeiten, später die Umschaltung von dem Wert Checked vorzunehmen
- Private Sub PBox_Button_Click(sender As Object, e As EventArgs) Handles PBox_Button.Click
- If Checked = True Then
- Checked = False
- Else
- Checked = True
- End If
- End Sub
- Private Sub TestDLL_Click(sender As Object, e As EventArgs) Handles Me.Click
- If Checked = True Then
- Checked = False
- Else
- Checked = True
- End If
- End Sub
- Private Sub TextBox1_Click(sender As Object, e As EventArgs) Handles TextBox1.Click
- If Checked = True Then
- Checked = False
- Else
- Checked = True
- End If
- End Sub
- #End Region
- End Class
Thema verschoben; Das Thema wird automatisch dort erstellt, wo man sich befindet, wenn man auf [✱ Neues Thema] klickt. ~VaporiZed
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()