kleines Reflection Problem

schachmat

Erfahrenes Mitglied
Hallo...

ich habe folgende Zeile irgendwo in meinem Algorithmus (Die is so einfach, dass sollten sogar C++ler verstehen;))

Code:
Dim Prop As PropertyInfo = TCurr.GetProperty("cmdBack1")

wobei TCurr der Typ von frmNeu is, also der eines Forms...

cmdBack1 ist in einem Panel (Step1) eingelagert.

Nach dieser Zeile hat Prop aber immer den Wert Nothing/NULL auch wenn ich erstmal Step1 nehme statt cmdBack1, gehts nicht. Sind das denn keine Eigenschaften von frmNeu?

Auch mit GetMember bringt das nichts, da das zurückgegebene Array dann immer leer ist...

Danke schonmal für alle geistigen Ergüsse, aber auch für (helfende) Nachfragen.
 
Also ich persönlich tue mir schwer dir zu sagen, ob cmdBack1 eine Eigenschaft von frmNeu ist, denn ich kenne ja DEINEN Sourcecode nicht. Sogesehen musst du das selbst wissen. Hast du dafür eine Property definiert oder ist das lediglich eine private Variable, oder gar doch eine Methode? Kann man darauf öffentlich zugreifen? Fragen die DU beantworten musst.
 
Das is ein ganz normaler Knopf, den ich auf mein frmNeu gezogen hab... und dann sollte er zumindest ein Member von frmNeu sein, oder?

/Edit1: So... is wie folgend definiert:

Code:
Friend WithEvents cmdBack1 As System.Windows.Forms.Button

sollte also eine ganz normale Membervariable sein, auf die man auch von auserhalb der Klasse zugreifen kann (Friend), oder?
 
Zuletzt bearbeitet:
Das was du da vorhast ist äußerst schmutzig. Erstelle doch eine öffentliche Methode, die dann den gewünschten Part ausführt.

Zudem hast du die Frage gestellt, ob es sich dabei um Eigenschaften handelt. Daher darfst du dich über meine Antwort nicht wundern, denn Eigenschaften sind nicht mit Membervariablen gleichzusetzen.

Vielleicht sind hier noch ein paar Lernsessions bezüglich Basiswissen notwendig.
 
Ok, ich gebs zu, jetzt hast du mich total verwirrt....^^

Also ich hab dies eine Zeile aus einer Funktion gezogen, die ich irgendwo als Antwort auf eine Frage gefunden habe. Hier mal die ganze Funktion:
Code:
            Dim TCurr As Type = My.Forms.GetType
            Dim Member As MemberInfo = Nothing
            Dim data As Object = My.Forms
            Dim Ziel As String = (... z.B. "frmNeu.cmdBack1.Text") 
            Dim Wert As String = (... z.B. "Zurück")
            Dim names() As String = Split(Ziel, ".")
            For Each name As String In names
                If TypeOf Member Is PropertyInfo Then
                    data = CType(Member, PropertyInfo).GetValue(data, Nothing)
                ElseIf TypeOf Member Is FieldInfo Then
                    data = CType(Member, FieldInfo).GetValue(data)
                End If
                Dim Prop As PropertyInfo = TCurr.GetProperty(name)

                If Not Prop Is Nothing Then
                    TCurr = Prop.PropertyType
                    Member = Prop
                Else
                    Dim field As FieldInfo = TCurr.GetField(name)
                    If Not field Is Nothing Then
                        TCurr = field.FieldType
                        Member = field
                    End If

                End If
            Next
            If TypeOf Member Is PropertyInfo Then
                CType(Member, PropertyInfo).SetValue(data, Wert, Nothing)
            Else
                CType(Member, FieldInfo).SetValue(data, Wert)
            End If

Das ganze soll einfach ein paar Eigenschaften in meinen Fenstern zuweisen...
Bei frmNeu.Text funktionierts übrigens noch Nur bei den Controls in frmNeu eben nicht mehr...:confused:
 
Was willst du denn überhaupt machen? Also was soll das Endziel sein? Du gräbst da Sourcecode aus, den du anscheinend selber nicht verstehst und auch nicht genau weißt was er tut. Vielleicht wäre es zuerst sinnvoller sich damit zu beschäftigen was du machen willst, anstatt eine Problemlösung für etwas zu suchen, was so eventuell gar nicht sinnvoll ist.
 
Also ich denke zumindest einmal, dass ich den Code versteh... Ich tu normal nie irgendwelchen Code benutzen, von dem ich nicht mindestens den Sinn verstehe.

Um das ganze besser zu erklären: Das is ein Teil meiner Vielsprachigkeitsfunktionalität^^ Ich geh dann in einer Schleife die Liste durch und setz die .Text-Eigenschaften entsprechend...

Die Liste sieht ungefähr so aus:

Anzahl=3
a1="frmHaupt.Text=Halloblublub"
a2="frmNeu.Text=Neuen Eintrag anlegen"
a3="frmNeu.cmdBack1.Text=Zurück"

wobei das ROTE Gleichheitszeichen die Trennung ist. Das Ganze wird in den in einem meiner anderen Treads erwähnten Resourcendateien als Zeichenfolgen gespeichert.

Und das ganze ist nur der Versuch, eine rießige Funktion zu umgehen, die ungefähr so aussehen müsste:

frmHaupt.Text = My.Resources.Blablub.HauptTitel
frmNeu.Text = My.Resources.Blablub.NeuTitel
frmNeu.cmdBack1.Text = My.Resources.Blablub.NeuBack1

Bei dieser Funktion braucht man ja für jede Beschriftung, die Mehrsprachig sein soll (also eigendlich alle) eine eigene Zeile... Da hab ich halt nach einer anderen, auch auf zukünftige Projekte umsetzbaren Lösung gesucht... Bin halt ein kleiner Perfektionist.

Ich hoffe du verstehst mein Problem jetzt ein wenig besser... Und hoffentlich kannst du mir dabei auch helfen. Vielleicht gibt es da ja sogar schon eine ähnliche fertige Lösung irgendwo.... Hab aber noch nichts gefunden...
 
Du willst ja eigentlich nur die Text-Eigenschaft von Controls setzen bzw. von den Formen (was ansich schon wieder ein Fehler ist, denn du könntest ja ComboBoxen etc. auch verwenden, was ist mit denen bzw. wie stellst du dies in deiner Ressource dar?)

Wenn du eine Form aufrufst, setzt du die Text-Eigenschaft, das ist kein Problem. Dann gehst du einfach in die Controls-Auflistung und holst dir dort alle Controls (du musst natürlich den Typ der einzelnen Controls abfragen, denn es könnte sich wiederum um ein Container-Control handeln), holst dir den gesamten Namen und schlagst diesen in deiner Ressource nach. Wenn gefunden, dann Wert setzen, wenn nicht, dann weitergehen.

Auf Fields etc. abzufragen kann an dieser Stelle unangenehm werden, da du vielleicht einen Wert gesetzt hast, dann du nicht übersetzt haben willst etc.
 
So einen Ansatz hatte ich auch schon probiert. Aber da kam dann auch relativ schnell ein Problem und ich hab nach einer anderen Lösung gesucht... Naja... werds jetzt wohl nochmal versuchen umzusetzen... Wenn dann wieder ein Problem auftaucht frag ich einfach hier ;)
 
So.... hab mich nach einer "Faulenzer-Woche" gestern abend wieder drangesetzt und bin jetzt schon wieder ziemlich schnell auf das Hindernis gestoßen.... Und das is wirklich ein komisches Problem. Hier mal die Fehlermeldung:

10142006162731yl2.jpg


Diese Fehlermeldung tritt in der Rot markierten Zeile auf:

Code:
Public Sub LadeSprache2(ByVal pre As String, ByRef Ctrls As ControlCollection)
        For Each Ctrl As Control In Ctrls
            If Not ResMgr.GetString(pre & Ctrl.Name & "_Text") = Nothing Then Ctrl.Text = ResMgr.GetString(pre & Ctrl.Name & "_Text")
            Select Case TypeName(Ctrl)
                Case "SplitContainer"
                    Dim blub As SplitContainer = CType(Ctrl, SplitContainer)
                    LadeSprache2(pre, blub.Panel1.Controls)
                    LadeSprache2(pre, blub.Panel2.Controls)
                Case Else
                    If Ctrl.Controls.Count > 0 Then LadeSprache2(pre, Ctrl.Controls)
            End Select

        Next
    End Sub

    Public Sub LadeSprache()
        ResMgr = My.Resources.Projektname.ResourceManager
        For Each Wdw As Form In Forms 'Forms is ne selber definierte auflistung mit allen Forms
            Wdw.Text = ResMgr.GetString(Wdw.Name & "_Text")
            LadeSprache2(Wdw.Name & "_", Wdw.Controls)
        Next
    End Sub

Ich finde das verwirrend, dass der ControlCollection nicht in ControlCollection umwandeln kann:suspekt:

Aber in den SelectCase Block kommt dann auch noch die Abfrage, obs z.B. ne Combobox is und da tut er dann die Einträge adden ;)
 
Zurück