Erstellung eines variablen Variablennamens (var*) zur Deklarierung als Objekt

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von ThomasG82.

    Erstellung eines variablen Variablennamens (var*) zur Deklarierung als Objekt

    Moin,

    Ich hänge an einem im Prinzip einfachen Vorgangs.

    Ich habe eine FOR Schleife (i=1 to...). Soweit auch alles ohne Probleme.
    Nun muss ich die Zahl, welche sich in der Schleife aktuell hinter i verbirgt, als Namenszusatz für eine Variable nutzen.
    Sprich 'var' & i also var1 und var2 und var3 usw.

    Ich bin aber leider gerade zu doof dafür.

    Zur Erklärung - ich will eigene Hilfeobjekte für bestimmte Dinge in einer Form erstellen. Die Erstellung der Bezugsobjekte klappt. Aber ich bekomme die Variablennamen nicht zusammen gesetzt und kann somit die Hilfe Container nicht erstellen.

    Probiert haste ich es bisher als

    VB.NET-Quellcode

    1. DIM (HilfeContainer & i) AS...
    Sowas ist nicht möglich. Was genau hast Du denn vor?
    Das muss sich auch anders lösen lassen.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Willkommen im Forum.
    Joa, oder ne List(Of DeinTyp). Die kannst Du beliebig erweitern (DeineListe.Add()) und dann die einzelnen Variablen durch den Index in der Liste ansprechen (DeineListe(i))
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke für die Idee des Array - ja hab ich auch schon dran gedacht aber das trifft es irgendwie nicht richtig.

    @Trade - ok, das hätte ich jetzt nicht gedacht, denn ich weiß, dass ich das damals vor vielen Jahren in einer anderen Sprache machen konnte.

    Ich hab hier nochmal etwas Code eingefügt um zu verdeutlichen was mein Problem ist bzw. wo ich hin will:

    VB.NET-Quellcode

    1. For i = 0 To OfficeProgrammeInstalliert.Count - 1
    2. Dim ProgImageNr As Integer = i + 1
    3. 'Sichtbarkeit des PictureBoxs/Logo festlegen
    4. CType(Me.Controls("ProgImage" & ProgImageNr), PictureBox).Visible = True
    5. 'Festlegen des Logos des Programmes
    6. CType(Me.Controls("ProgImage" & ProgImageNr), PictureBox).Image = _
    7. My.Resources.ResourceManager.GetObject("logo_" & OfficeProgrammeInstalliert(i) & "1")
    8. 'Festlegen des ToolTip für das Programm
    9. PB_ToolTip.SetToolTip(Me.Controls("ProgImage" & ProgImageNr), "Microsoft " & _
    10. OfficeProgrammeInstalliert(i).Substring(0, 1).ToUpper & _
    11. OfficeProgrammeInstalliert(i).Substring(1, OfficeProgrammeInstalliert(i).Length - 1))
    12. 'Übergabe für späteres Klick-Event des PictureBoxs
    13. CType(Me.Controls("ProgImage" & ProgImageNr), PictureBox).Tag = OfficeProgrammeInstalliert(i)
    14. Me.HelpProviderProgs.SetHelpNavigator(CType(Me.Controls("ProgImage" & ProgImageNr), PictureBox), HelpNavigator.AssociateIndex)
    15. Me.HelpProviderProgs.SetHelpKeyword(CType(Me.Controls("ProgImage" & ProgImageNr), PictureBox), ("https://products.office.com/de-de/" & OfficeProgrammeInstalliert(i)))
    16. Me.HelpProviderProgs.SetShowHelp(CType(Me.Controls("ProgImage" & ProgImageNr), PictureBox), True)
    17. next


    Soweit so gut - läuft auch alles. Aber wenn ich in den

    VB.NET-Quellcode

    1. HelpProvider
    hier

    VB.NET-Quellcode

    1. Me.HelpProviderProgs
    etwas reinschreibe dann gilt es ja für alle verknüpften Objekte. Die verknüpfe ich ja über die Schleife am Ende. Aber die Internetadresse, die bei Nutzung der Hilfe aufgerufen werden soll ist unterschiedlich. Aber klar - der letzte Wert der Schleife ergibt für alle den Endwert.
    So war meine Idee, in der Schleife jeweils einen eigenen HelpProvider zu erstellen (HelpProvider(i)) um die jeweils gültigen Werte einzufügen. Ich könnte zwar von Anfang an die Max-Anzahl an HelpProvidern über den Designer festlegen aber somit hätte ich Dinge im Prog, die ich nicht nutze und somit unnötigen Ballast.

    Kann man mir da helfen?



    So, ich danke erstmal für die Antworten.

    Ich schließe das Thema mal ab, denn wie @Trade schon sagte wird es die Methode, die ich gerne hätte, so nicht geben.
    Also probiere ich es über den HelpProvider direkt und darin hinterlegte Informationen, vlt. funktioniert das ja.

    Danke erstmal ;(

    Beiträge zusammengefügt. ~Thuderbolt

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

    Mach doch eine OfficeProgram-Klasse, die alle Informationen enthält und eben auch einen HelpProvider.
    Dann noch eine List(Of OfficeProgram). Ist das ein Weg?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Naja die <List(Of T)> wäre zwar eine Methode aber das Problem ist ja eigentlich für mich der <HelpProvider>.

    Daher hab ich einen anderen Beitrag geöffnet in dem ich nach dem HelpProvider gefragt habe.
    Mit geht es ja darum, dass ich entweder für jedes meiner PictureBox-Elemente einen eigenen HelpProvider benötige um das jeweilige Ziel festzulegen oder aber ich im HelpProvider verschiedene Ziele hinterlegen kann um später darauf zuzugreifen.
    Das hinterlegen und drauf zugreifen wäre für mich idealer, so spare ich Code (den kann ich in meiner Schleife einbauen) und ich muss nicht so viele Objekte erstellen, was zu Performance Vorteilen führt.

    Und selbst wenn ich List(Of OfficeProgram) nutze spricht der HelpProvider ja nicht darauf an, wenn er das Ziel abfragt - oder doch?

    Also plastisches Beispiel:

    VB.NET-Quellcode

    1. 'PictureBox1 mit HelpProvider1 (usw...)
    2. HelpProvider1.SetHelpNavigator(CType(Controls("ProgImage" & "1"), PictureBox), HelpNavigator.AssociateIndex)
    3. HelpProvider1.SetHelpKeyword(CType(Controls("ProgImage" & "1"), PictureBox), OfficeProgrammeInstalliert(1))
    4. HelpProvider1.SetShowHelp(CType(Controls("ProgImage" & "1"), PictureBox), True)
    5. HelpProvider1.HelpNamespace = "https://www.hilfeseite.de" & OfficeProgrammeInstalliert(1)
    6. 'PictureBox2 mit HelpProvider2 (usw...)
    7. HelpProvider2.SetHelpNavigator(CType(Controls("ProgImage" & "2"), PictureBox), HelpNavigator.AssociateIndex)
    8. HelpProvider2.SetHelpKeyword(CType(Controls("ProgImage" & "2"), PictureBox), OfficeProgrammeInstalliert(2))
    9. HelpProvider2.SetShowHelp(CType(Controls("ProgImage" & "2"), PictureBox), True)
    10. HelpProvider2.HelpNamespace = "https://www.hilfeseite.de" & OfficeProgrammeInstalliert(2)

    Somit müsste ich aber jedem Objekt in meiner UserForm ein einzelnen HelpProvider zuordnen, den ich also auch vorher erstellen muss.
    (bei 10 Objekten kein Problem, bei Anzahl n Objekten aber in einer automatischen Schleife besser)

    Deshalb hätte ich lieber:

    VB.NET-Quellcode

    1. 'PictureBox(i) mit HelpProvider(i) (usw...)
    2. HelpProviderProgs.SetHelpNavigator(CType(Controls("ProgImage" & ProgImageNr), PictureBox), HelpNavigator.AssociateIndex)
    3. HelpProviderProgs.SetHelpKeyword(CType(Controls("ProgImage" & ProgImageNr), PictureBox), OfficeProgrammeInstalliert(i))
    4. HelpProviderProgs.SetShowHelp(CType(Controls("ProgImage" & ProgImageNr), PictureBox), True)
    5. HelpProviderProgs.HelpNamespace = "https://www.hilfeseite.de" & OfficeProgrammeInstalliert(i)


    Und somit komme ich zu dem Problem, dass ich entweder dynamisch HelpProvider erstelle oder aber meinem einem HelpProvider (HelpProviderProgs) im Hintergrund irgendwie dynamisch den HelpNamespace für diese PictureBox mitteile und später aufrufe. ?( :huh:
    @ThomasG82 Gehen wir mal zurück zu Feld Nummer 1.
    Beschreib mal verbal und völlig ohne Code, was Du eigentlich machen willst.
    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!
    OK - Zurück zu Schritt 1

    Ich habe eine Oberfläche mit bis zu 10 Bildern. Wenn der Nutzer mit der Maus über die Bilder fährt erhält er einen ToolTip, jedem Bild einzeln entsprechend unterschiedlich.
    Wenn er nun oben auf das Fragezeichen klickt und er mit dem Fragezeichen Courser seiner Maus auf das Bild klickt öffnet sich eine Internetseite, auf welcher er mehr Informationen erhält.
    Nun soll aber, da die Bilder ja unterschiedlich sind, auch das Ziel im Internet unterschiedlich sein.

    Den jeweiligen ToolTip kann man einzeln festlegen - so geschehen.
    Jetzt habe ich versucht dem HelpProvider.HelpNamespace eines jeden Bildes das Ziel auf der Website zu übergeben.

    Da die Befüllung der PictureBoxen aber in einer FOR-Schleife erfolgt und somit immer der letzte Eintag im HelpProvider.HelpNamespace landet habe ich überlegt, dass ich innerhalb der FOR-Schleife einfach für jede PictureBox einen eigenen HelpProvider erstelle. Der Name müsste ja dynamisch sein (HelpProvider(i)), da sich (i) ja mit jedem Durchlauf der Schleife erhöht.
    Jetzt wurde mir ja leider schon gesagt, dass ich im DIM-Vorgang (Dim (HelpProviderProgs & i.ToString) As Object = New System.Windows.Forms.HelpProvider()) keine dynamische Variable nutzen kann, also i als Zähler wird nicht gehen.

    Deswegen bin ich nun dazu übergegangen mich um den HelpProvider an sich zu kümmern und weg von der Idee zu gehen für jedes Objekt einen eigenen HelpProvider zu erstellen.
    Denn wenn ich einen ToolTip in der Form habe und den aber individuell anpassen kann dann muss das doch auch mit einem HelpProvider gehen.

    (Sorry war doch schon wieder Code dabei)

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

    na, das musst du datensatz-mässig angehen.
    Offensichtlich gehören bei dir folgende Dinge zusammen:
    • Bild
    • TooltipText
    • HelpProvider-Daten (ich kenn mich mit dem Ding nicht aus)
    • Url
    Also bastel dir eine Klasse, wo diese Dinge zusammengefasst sind.

    VB.NET-Quellcode

    1. Public Class Data
    2. Public PicBox As PictureBox
    3. Public Tooltiptext As String
    4. Public HelpProviderDies As String
    5. Public HelpProviderDas As String
    6. Public Url As String
    7. End Class
    So ungefähr - und gib der Klasse einen besseren Namen als 'Data'.
    Dann kannste dir eine List(Of Data) anlegen, und da tuste deine Datensätze hinein, soviele wie du brauchst und Pictureboxen hast oder was weiss ich (Stichwort For-Schleife).
    So, mit dieser Liste kannste dein Kram verwalten, und wenn die Maus über eine Picbox, kannste den Datensatz dazu finden, und hast die HelpProvider-Kram, TooltipText, Url und Zeugs.

    Wie gesagt: nur so ungefähr, weil ich HelpProvider nicht kenne, und k.A., was der machen soll.
    Wichtig halt die GrundIdee: Zusammengehörendes in einer Klasse zusammenfassen, und eine Liste davon anlegen.
    Ok, danke erstmal für den Tipp.
    Auf die Idee bin ich noch gar nicht so wirklich gekommen alle in eine Klasse zu packen und damit insgesamt für alles zu arbeiten.
    Werde es mal probieren und dann eine Rückmeldung geben ob es so geht.
    Wäre natürlich ideal da ich ein festes Objekt habe und nur den Inhalt erweitern muss und nicht auf dynamische Variablennamen zurückgreifen muss.
    Was ja auch schon in Post#6 stand.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ja hab ich auch schon entdeckt. Jetzt hab ich es aber erst verstanden. Manchmal ist meine Leitung echt laaaaang

    So ich habe es jetzt noch mal als eigene Klasse probiert. Resultat gleich null.
    Es liegt also am HelpProvider. Da dieser ja noch aus Zeiten der Help-Datei kommt wurde an ihm leider auch nichts verändert.
    Ich kann pro HelpProvider nur eine Help-Datei oder eine Internetseite im HelpNamespace hinterlegen. Um die Hilfe dann zu unterteilen muss man das HelpKeyword nutzen. Dies ist bei Internetseiten unpraktisch, da diese dann automatisch zwischen HelpNamespace und HelpKeyword ein # haben.
    (internetseite.de#keyword)
    Somit werde ich es wohl über ein ClickEvent abfangen. Entweder bekomme ich es über das ClickEvent des HelpProvider's oder ich muss es über ein ClickEvent der PictureBox machen.
    Danke trotzdem für alle Ideen (hätte auch schneller gehen können wenn ich richtig gelesen hätte).
    Schade aber trotzdem vielen Dank

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

    ThomasG82 schrieb:

    Resultat gleich null.
    Vielleicht baust Du Dir zur Vertiefung des Verständnisses mehrere kleine Testprogramme, in denen Du je eines Deiner Features einzeln untersuchst, insbesondere den HelpProvider.
    Wenn jedes dieser Einzel-Tests so laufen wie Du es willst, packe sie zu einem neuen Projekt zusammen.
    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!