Dim _nF as new {formname} ... _nf.showdialog > {formname} ersetzen ...

  • VB.NET
  • .NET (FX) 4.0

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Vainamo V.

    Dim _nF as new {formname} ... _nf.showdialog > {formname} ersetzen ...

    Hallo zusammen,

    nach sehr sehr langer Zeit bin ich auch mal wieder hier :)


    Eine Grundlegende Frage habe ich an euch ^^

    Gibt's irgendwie eine Möglichkeit bei einem ...as new {Formname} durch einen "String" zu ersetzen?

    Selle mir das so vor:

    VB.NET-Quellcode

    1. Dim NAME as new String = TreeView1.SelectedNode.Tag
    2. Dim _neuesF as new NAME
    3. _neuesF.showdialog


    Wobei hier TreeView1.SelectedNode.Tag den Formname.vb ausgeben würde.

    Bastel seit Stunden da rum und Google & Co. hat mich zum ersten mal seit langem nicht weitergebracht - oder ich bin blind 8o


    Vielleicht könnt's ma einen Tipp geben?

    Vielen Dank voraus, Viele Grüße
    Michl

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „michl75“ ()

    Also die Sub New() ist auf diese Weise nicht aufruf-bar.

    Aber man kann Type-Objekte verwalten, und jedes Type-Objekt einem String zuordnen. Bzw. son Type-Objekt hat ja eine Name-Property die kann man auch gleich als Zuordnungs-String hernehmen.
    Die ZuordnungsStrings kannste im TreeView anzeigen, und wenn einer geklickst wird, kannste das zugeordneten Type-Objekt ermitteln.
    Und aus einem Type-Objekt kann man auch ein richtiges Objekt erstellen, mit Hilfe der Activator-Klasse.
    Das dann auf Form casten, und dann ist die .ShowDialog() - Methode verfügbar.
    Alles in allem ein ziemlich umständliches Verfahren.

    Also guck dir die Type-Klasse im ObjectBrowser an, sowie die Activator-Klasse - die kann nämlich derlei Objekte erstellen, und mit dem Gettype-Schlüsselwort musste dich natürlich auch vertraut machen, das brauchste ja, um vom TypNamen das entsprechende Type-Objekt abzuleiten.
    Hallo ErfinderDesRades,

    ich dachte mir schon, dass du darauf antworten würdest :) ... dein Wissen hätte ich gern! ..ohne dabei "auszurutschen" ... Danke für deine Antwort.

    Ich werde mir das mal ganz in Ruhe ansehen das ganze. Scheint mir doch ein recht großer Aufwand zu sein für das eine oder andere Form. Ob sich das lohnt... naja.


    Vielen Dank nochmal!
    Gruß Michl
    Hi,

    habe nun nochmal daran rumprobiert... mein Ansatz :) ... er funktioniert auch!

    Bin ich da auf dem Richtigen Weg?

    VB.NET-Quellcode

    1. Private Sub tv_menue_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) _
    2. Handles tv_menue.DoubleClick
    3. OpenFormAsString(tv_menue.SelectedNode.Tag.ToString)
    4. End Sub
    5. Private Sub OpenFormAsString(ByVal formname As String)
    6. Dim f As New Form
    7. For Each t As Type In Me.GetType().Assembly.GetTypes()
    8. If t.Name.Equals(formname) Then
    9. f = System.Activator.CreateInstance(t)
    10. f.Show()
    11. End If
    12. Next
    13. End Sub
    @michl75 Es ist die Frage, was Du im TreeView ablegst.
    Wenn Du da den Type der Klasse, nicht aber type.Tostring() ablegst, kannst Du mit

    C#-Quellcode

    1. DeineKlasse dc = Activator.CreateInstance(type) as DeineKlasse;

    VB.NET-Quellcode

    1. Dim dc = CType(Activator.CreateInstance(type), DeineKlasse)
    eine Instanz dieser Klasse anlegen.
    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!
    Du musst lediglich sicherstellen, dass der Eintrag im TreeView korrekt ist, dann kannst du über einen Einzeiler die Form aufrufen.

    C#-Quellcode

    1. ((Form) Activator.CreateInstance(Type.GetType("Namespace.Formname"))).Show();

    Wobei der Einzeiler sehr fehleranfällig ist und nicht wirklich viele Möglichkeiten außer anzeigen bietet. Da empfiehlt sich dann eher sowas draus zu machen:

    C#-Quellcode

    1. try {
    2. var Type = Type.GetType("Namespace.Formname", true);
    3. var Instance = Activator.CreateInstance(Type) as Form;
    4. Instance.Show();
    5. } catch { }


    Edit:

    michl75 schrieb:

    Im Treeview wird unter Tag der tatsächliche "Programmname" angegeben.

    Moment, Programmname? Willst du etwa andere Programme starten? Das funktioniert so natürlich nicht.


    Grüße
    Väinämö
    nein nein... schon ein Form innerhalb ... Keine "externen" Programme!

    Und danke für deine Ausführungen!! Ich werde mir das nachher (nach dem Essen) mal in ruhe anschauen und mal genau nachlesen was auch unter MSDN - will's ja nicht einfach C&P machen sondern auch kapieren ... hoffentlich :)

    Nochmals Danke!

    @michl75 Du bist etwas zu wortkarg.
    Poste mal den Code, mit dem Du den TreeView befüllst.
    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!

    michl75 schrieb:

    habe nun nochmal daran rumprobiert... mein Ansatz ... er funktioniert auch!

    Bin ich da auf dem Richtigen Weg?
    Sehr interessanter, trickreicher Ansatz :thumbsup:

    Ist sicherlich von allen Ansätzen die langsamste Lösung, eine Assembly nach allen darin vorhandenen Typen zu durchsuchen.
    Aber man müsste es echt mal messen, denn wenn diese langsamste Lösung nur mw. 100ms dauert, dann wäre das doch locker zu verkraften, aber mit Kusshand!
    Das wird ja nicht ständig aufgerufen, sondern vlt. zB 1 - 2 mal pro Stunde - was kehren mich da 100 Millisekunden?

    Was bei so Reflection-Hacks immer ein Problem ist, dass der Code keine Compiler-Unterstützung hat.
    Also wenn du im Treeview da iwie einen falschen Buchstaben drinne hast bricht das Chaos aus.
    Ebenso, wennn du dich unterstehst, ein Form mal umzubenennen.



    Anneres Thema:
    Deinem Code sieht man an, dass du Option Strict Off proggst.
    Das ist (imo) absolutely NoGo.
    Ändere die Einstellungen deines VisualStudios, weil so wie du arbeitest, kannst du Datentypen gar nicht wahrnehmen, ihre Eigenheiten respektieren und für dich arbeiten lassen - im Grunde kannst du unter diesen Einstellungen die ganze objektorientierte Programmiersprache VB.Net garnet richtig verstehen und erlernen.

    Also absolute Priorität hat: Visual Studio - Empfohlene Einstellungen
    @ErfinderDesRades Die Methode durch alle Types der Assembly zu loopen dauert bei mir 8,8ms. Meine Methode (siehe oben) dauert 8,1ms. Der Unterschied ist wirklich zu verkraften :D (in einem Testprojekt mit 2 Klassen/Forms, wie das bei großen komplexen Assemblies ist weiß ich nicht)

    Grüße
    Väinämö