Eigene subs/functions einbinden

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Eigene subs/functions einbinden

    Hallo miteinander,
    ich komme von Delphi XE und habe dort meine eigenen subs/functions in einer separaten Datei (Inhalt als Unit deklariert) geschrieben.
    Eingebunden werden sie in Delphi, indem man den Namen der "Unit" in der "uses"-Anweisung aufführt.

    Meine bisherigen Versuche, diese (natürlich umgeschrieben) aus einer separaten .vb-Datei mit Imports einzubinden, sind kläglich gescheitert. Schlimmstenfalls wird ein Objektverweis verlangt.

    Wie binde ich diese subs/functions am sinnvollsten ein ?
    Es wäre toll, wenn diese, wie normale Anweisungen, ohne Vorsätze wie z.B. "MeineSubs." oder ähnliches verwendet werden könnten.
    Hat jemand ein Code-Beispiel oder einen Hilfe-Link zur Hand ?
    Charly
    Falls ich mit meiner Frage nerve, dann bitte nicht antworten !
    If nothing goes right ... go left ! ;)
    Zauberwort: Klassen:

    VB.NET-Quellcode

    1. Public Class A
    2. Public Sub New()
    3. End Sub
    4. Public Sub Test()
    5. Messagebox.Show("hi")
    6. End Sub
    7. End Class
    8. Public Class B
    9. Public Shared Sub Testit()
    10. Dim aclass As New A
    11. aclass.Test()
    12. End Sub
    13. End Class

    Du musst die Klasse nicht direkt importieren, sofern sie nicht in einer Lib sind oder in einem Namespace.

    LG
    Vielen Dank, es läuft !
    Was sich mir bei Deinem Quellcode allerdings nicht erschließt ist die Zeile 14: Dim aclass As New A.
    A.Test() läuft bei mir genauso.
    Hat das außer der Umbenennung des Zugriffs auf die Klasse eine weitere Bedeutung ?
    Charly
    Falls ich mit meiner Frage nerve, dann bitte nicht antworten !
    If nothing goes right ... go left ! ;)
    Es gibt verschiedene Arten von Klassen. Als Beispiel hab ich hier eine "normale" Klasse verwendet und eine Klasse, die eine statische Methode hat. Der Unterschied besteht darin, dass die normale Klasse(Klasse A) zu erst instanziert werden muss(also new) um auf die Methode Test zuzugreifen. Ansonsten würde man praktisch ins Leere reinprogrammieren. Bei der anderen Klasse kann man hingegen auf die Methode Testit zugreifen ohne die Klasse zu instanzieren, da die Methode als statisch deklariert ist(Stichwort:Shared(in anderen Sprachen static)).

    LG

    ChOoSeMyNaMe schrieb:

    Es gibt verschiedene Arten von Klassen.
    Du meinst hier offsichtlich verschiedene Arten von Methoden, nicht von Klassen.
    Weil die "Klassen-Art" ist ja gleich, und genau genommen gibt es keine verschiedenen Arten Klassen.
    Naja, man könnte ein Modul doch als besondere Art Klasse auffassen, nämlich wo nur statische Member drin sind. Aber das liegt hier ja nicht vor.

    So - ich hoffe, damit genug Verwirrung gestiftet zu haben, um @CharlyVB zu überzeugen, dass er sich ein gutes Buch downloaden soll, und nicht versuchen, programmieren nur mit Fragen in Foren zu erlernen.
    Foren sind prima, um die richtige Richtung gewiesen zu bekommen, aber zum Aufbau fundierter Kenntnisse - vor allem der Grund-Kenntnisse! - setze man auf gute, vorzugsweise kostenlose Bücher, wie sie u.a. in Entwickler-Ressourcen und Tools, Bücher und WebCasts gelistet sind.

    Als Appetit-Happen bringt vlt. auch Grundlagen: Fachbegriffe was, aber das ist ganz absichtlich unfundiert gehalten und soll anregen, fundiertes Knowhow selbst zu recherchieren in allen Punkten, die man nicht mit absoluter Sicherheit verständnismäßig einfach abnicken kann.

    Ausserdem steht noch gleichzeitig Visual Studio - Empfohlene Einstellungen auf dem Plan, damit VB.Net überhaupt als richtig objektorientierte Sprache funktioniert - ist schlimm, aber ist so, dass mans erst dafür einrichten muss, und zwar noch bevor man ühaupt einen Schimmer davon hat, was das eiglich bedeutet (der Schimmer kommt erst mit der Zeit).

    Edit: Huch!

    CharlyVB schrieb:

    A.Test() läuft bei mir genauso.
    Das kann ja garnet sein, wenn du Choomseimakenekj's Code verwendest. Oder wie hast du das zuwege gebracht?
    Zum Code-Posten nutze übrigens den VB-Tag - oder hier noch eine umfangreichere Anleitung der VBP-Möglichkeiten:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    CharlyVB schrieb:

    A.Test() läuft bei mir genauso.
    Ist A eine von Form abgeleitete Klasse?
    Da ist von Microsoft noch eine alte VB6-Kompatibilität implementiert, die wir hier nicht (mehr) nutzen wollen.
    Gugst Du hier, wie Formen (Dialoge) instanziiert und aufgerufen werden.

    CharlyVB schrieb:

    aus einer separaten .vb-Datei mit Imports einzubinden
    Du kannst in .NET selbstverständlich die Implementierung einer Klasse aud mehrere Dateien verteilen:

    VB.NET-Quellcode

    1. Public Partial Class A
    2. Implements IxSonstwas
    3. ' Inhalt Datei 1
    4. End Class

    VB.NET-Quellcode

    1. Partial Class A
    2. ' Inhalt Datei 2
    3. End Class

    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!
    Ich glaube, CharlyVB hat schon einiges an Plan, er kommt nur mit den Unterschieden zwischen Delphi und C#/VB.NET noch nicht ganz klar.

    In Delphi werden die verschiedenen Klassen und Methoden in sogenannte Units gepackt. Das sind stinknormale Quelltext-Dateien mit Klassen und Methoden und sogar globalen Variablen und globalen Prozeduren/Funktionen. Um so eine Unit nun in einer Anwendung nutzen zu können, muß man sie in einem Uses-Block angeben. Der Compiler übersetzt das ganze dann und linkt die in der Unit verwendeten Routinen zusammen.

    Dies ist in C#/VB nicht nötig. Du packst deine Source-Codedatei einfach ins Projekt und kannst das Zeug in der "Unit" dann einfach verwenden, den Rest macht der Compiler für dich. Mußte ich mich auch erst dran gewöhnen und man merkt erst mit der Zeit, wie weit Delphi selbst als XE8 hinter den modernen Sprachen herhinkt - sowohl Sprachfeature-technisch als auch IDE-technisch ;)

    Wie dem auch sei. Einen Unterschied macht es, wenn du die ausgelagerten Sourcecode-Teile in einen Namespace einschließt. Dann muß die Datei wie üblich ins Projekt hinein. Zusätzlich muß dieser Namespace mit einer imports-Anweisung in jeder Quelltext-Datei, wo das Zeug verwendet wird, mit angegeben werden - aber das war es dann auch schon.
    Vielen Dank, Ihr seid Klasse !

    Mein Prinzip ist "Learning by doing". Dabei stütze ich mich auf Bücher (hier: Einstieg in Visual Basic 2013) ebenso wie auf Hilfedateien und Foren. Aber leider findet man dort nicht immer das, was man sucht.
    Sicher oft auch deshalb, weil man falsch sucht oder, wie hier, das Problem eigentlich gar keines ist.

    Dass A.Test() im obigen Beispiel nicht geht, will ich gerne glauben. Dass es mit meinen Texten trotzdem ging, liegt sicher an meinen Definitionen. Ich arbeite Euere Beiträge noch gründlich durch und kriege das schon noch raus.

    Leider kann man als Neuling in VB, wie auch in anderen Sprachen, schlecht abschätzen, was ein wirkliches Problem ist und was nicht. Und bevor ich eine Frage stelle, erfinde ich das Rad (Ähnlichkeit mit Benutzernamen ist rein zufällig) mit meinen Möglichkeiten lieber neu. Wenns aber nicht weiter geht, dann muss man eben fragen.

    Ich tausche mich lieber mit jemanden direkt aus, bevor ich ein Forum zumülle und vielleicht blöde Fragen stelle. Diese Hemmung ist altersbedingt (Rentenantrag ist gestellt) und mangels Ansprechpartner zurzeit nicht vermeidbar.

    Nochmals vielen Dank.
    Eines meiner 2 Grundsatzprobleme ist damit schon gelöst.
    Charly
    Falls ich mit meiner Frage nerve, dann bitte nicht antworten !
    If nothing goes right ... go left ! ;)

    CharlyVB schrieb:

    Dass A.Test() im obigen Beispiel nicht geht, will ich gerne glauben.
    Das ist eiglich nix zum glauben, sondern zum Ausprobieren.
    Kopier den Code in ein VB.Net-Projekt, und sieh, wie der Compiler dich anmeckert. Learning by Doing eben ;)

    Hingegen ich glaube nicht, dasses bei dir läuft, wie du in post#3 behauptest.
    Und das könntest du halt bestätigen oder widerlegen durch ein Codebeispiel von dir, wo's doch läuft (und ich's ausprobieren kann).

    ErfinderDesRades schrieb:

    So - ich hoffe, damit genug Verwirrung gestiftet zu haben, um @CharlyVB zu überzeugen, dass er sich ein gutes Buch downloaden soll, und nicht versuchen, programmieren nur mit Fragen in Foren zu erlernen.


    Nach QBasic, COBOL, Clipper und zuletzt seit etwa 20 Jahren Delphi hatte ich nicht erwartet, mit meiner ersten Frage in einem Forum so auf die Schnauze zu fallen. Meine Aversion gegen eigene Fragen in Foren hat damit neue Nahrung bekommen.

    Aber zu Deiner Frage in der Hoffnung, die Beweisführung einwandfrei hinzubekommen:
    Aufruf in Form:

    VB.NET-Quellcode

    1. Public Class SpM_FormList
    2. Dim lNoAction As Boolean = False
    3. Private Sub SpM_FormList_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. Me.SpM_DatenTableAdapter.Fill(Me.SpM_DatenbankDataSet.SpM_Daten)
    5. Charly.IniReadPos(Me)
    6. End Sub

    Die Routine Charly.IniReadPos(Me) liegt in einer separaten .vb-Datei, welche wie folgt beginnt:

    VB.NET-Quellcode

    1. Public Class Charly
    2. Public Shared Sub IniReadPos(ByRef oFenster As Form)
    3. ...

    Der Aufruf läuft, ohne dass eine Anweisung "Dim CharlyClass as New Charly" vorhanden wäre und ich diese Sub dann mit "CharlyClass.IniReadPos(Me)" aufrufen würde/müsste.

    Ich hoffe, keine böswillige Absicht unterstellt zu bekommen, nur weil das läuft und ich nicht sagen kann warum.
    Charly
    Falls ich mit meiner Frage nerve, dann bitte nicht antworten !
    If nothing goes right ... go left ! ;)
    Deine Funktion ist auch statisch (als Shared deklariert), d.h. sie kann nicht auf Klassenmember oder Funktionen zugreifen wenn diese nicht auch statisch sind. Statisch bedeutet, dass Felder/Funktionen nur einmal existieren und zwar statisch ;) . Jede Instanz greift aufs Selbe zu, deswegen kann man diese Felder/Funktionen auch ohne Instanz zugreifen. Entfernst du das Wörtchen Shared, dann wird das nicht mehr funktionieren.
    Jo - eine statische Methode ist ein Riesen-Unterschied zu dem, was ChoosenName in Post#2 vorgegeben hatte.

    CharlyVB schrieb:

    mit meiner ersten Frage in einem Forum so auf die Schnauze zu fallen.
    Also von Foren-Fragen stellen wollte ich dich ganz bestimmt nicht abbringen - die sind auch unerhört wichtig.
    Manch einer murkelt sich da über Jahre was als Einzelkämpfer zurecht, und fragt erst, wenner dann iwann gar nimmer weiter kommt. Und dann öffnet man vlt. ein Türchen in eine ganz neue Welt, und das ist dann eine gute und eine schlechte Nachricht: Die Gute ist die neue Welt, die schlechte, dass seine komplette bisherige Arbeit für die Tonne ist.

    Und was heisst "auf Schnauze fallen" - ja, hier springen lauter penetrante, streitsüchtige, kleinliche, nervtötende Rechthaber herum, und ich bin evtl. einer der Schlimmsten. Aber grade wenn ich ein Rechthaberei-Kämpfchen "verliere", grade dann habe ich gewonnen, nämlich was gelernt.

    CharlyVB schrieb:

    Dass A.Test() im obigen Beispiel nicht geht, will ich gerne glauben. Dass es mit meinen Texten trotzdem ging, liegt sicher an meinen Definitionen.

    Und schon ists geklärt.
    Vielen Dank @Gonger96

    ErfinderDesRades schrieb:

    Und was heisst "auf Schnauze fallen" - ja, hier springen lauter penetrante, streitsüchtige, kleinliche, nervtötende Rechthaber herum, und ich bin evtl. einer der Schlimmsten.

    Solche Typen vermutlich in fast allen Foren zu finden, leider.
    Aber gib mir erst mal die Chance zu nerven, dann verstehe ich auch Deine Reaktion.
    Trotzdem habe ich aus Deinem Beitrag lernen können.
    Auf gute Zusammenarbeit ...
    Charly
    Falls ich mit meiner Frage nerve, dann bitte nicht antworten !
    If nothing goes right ... go left ! ;)

    CharlyVB schrieb:

    Aber gib mir erst mal die Chance zu nerven, dann verstehe ich auch Deine Reaktion.
    Du musst auch unsere Reaktion verstehen.
    Permanent kommen solche Nerver, da ist es schon sinnvoll, gleich das Nerven in gewisse Schranken zu weisen. ;)
    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!