Probleme bei Zuweisungen und Konvertierungen

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Probleme bei Zuweisungen und Konvertierungen

    Hallo,

    ich habe ein Problem mit Zuweisungen und Konvertierungen. In einer Datei steht zum Beispiel:

    UserForm.Text = Überschrift
    TextBox.Text = Hilfe

    Ich lese nun die Datei aus und weise die einzelnen Texte (Strings) Variablen zu, Beispiel:

    Variable(1) = UserForm.Text
    Variable(2) = Überschrift

    Mein Problem ist jetzt, wie kann ich die Variable(1) so Zuweisen/Konvertieren, dass ich im Quellcode eingeben kann : Variable(1) = Variable(2). Das Ergebnis müsste sein, Das die Überschrift in der Windows-Form >UserForm< = „Überschrift“ heißt.

    Kann mir jemand hier helfen?

    Zusatz: Die Datei wird mir vorgegeben, ich muss diesen Weg gehen.

    Gruß
    Hubertus
    Du hast es mit drei Variablen zu tun in die Du die Zeilen zerlegen musst.

    VName
    VEigenschaft
    VWert

    Zunächst prüfst Du, welches Objekt den Namen hat
    Dann weist Du der Eigenschaft den Wert zu.

    Mal sehen, wie das zu programmieren ist.

    Ansatz zum Zerteilen:

    Quellcode

    1. Private O As New List(Of String)
    2. Private P As New List(Of String)
    3. Private V As New List(Of String)
    4. Private Zeilen(1) As String
    5. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    6. Zeilen(0) = "Form1.Text = Überschrift"
    7. Zeilen(1) = "TextBox.Text = Hilfe"
    8. ZeilenZerlegen()
    9. End Sub
    10. Sub ZeilenZerlegen()
    11. Dim I1, I2 As Integer
    12. For Each Z As String In Zeilen
    13. I1 = Z.IndexOf(".")
    14. I2 = Z.IndexOf("=")
    15. O.Add(Z.Substring(0, I1).Trim)
    16. P.Add(Z.Substring(I1 + 1, I2 - I1 - 1).Trim)
    17. V.Add(Z.Substring(I2 + 1).Trim)
    18. Next
    19. End Sub

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „horstfh“ ()

    Hubertus schrieb:

    Zusatz: Die Datei wird mir vorgegeben, ich muss diesen Weg gehen.
    Sollen wir Deine Hausaufgaben machen?
    Du bekommst einen Einser, hast aber keine Ahnung?
    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!
    Hm, klingt für mich eher nach Internationalisierung, sodass man verschiedene Sprachdateien rausgibt und sich das Form entsprechend der Sprachdatei anpasst. Wieviele Begriffe hast Du denn? Also Userform.Text, TextBox.Text, …
    Eine brute-force-Methode (da hard coded => unflexibel) wäre, wenn Du den Teil vor und nach dem = auswertest und dann eine entsprechende Auswertung machst:

    VB.NET-Quellcode

    1. If ReadOutControlElementProperty = "UserForm.Text" Then Form1.Text = ReadOutControlElementPropertyValue
    wobei die Variablen ReadOutControlElementProperty und ReadOutControlElementPropertyValue natürlich erstmal mit den entsprechenden Dateiinhalten befüllt werden müssen, aber das ist ja ne einfache String.Split-Geschichte. Hat jemand nen flexibleren Vorschlag? Von Grundsatzinternationalisierungsalternativen mal abgesehen, wenn meine Vermutung denn zutreffend sein sollte.

    EDIT: Es ließen sich bestimmt auch Paare anlegen, die man in einer DB hinterlegen könnte und dann in einer Schleife auswertet, ggf. mit Reflection, sodass man solche Paare hat:

    Quellcode

    1. Pair1 = UserForm.Text, Form1.Text
    2. Pair2 = TextBox.Text, TextBox13.Text

    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.

    Hubertus schrieb:

    Mein Problem ist jetzt, wie kann ich die Variable(1) so Zuweisen/Konvertieren, dass ich im Quellcode eingeben kann : Variable(1) = Variable(2). Das Ergebnis müsste sein, Das die Überschrift in der Windows-Form >UserForm< = „Überschrift“ heißt.
    Mir ist die Fragestellung bisserl wirr.
    Das Ergebnis von Variable(1) = Variable(2) ist, dass Variable(1) den gleichen Wert hat wie Variable(2), und sonst nix.
    Was hat iein Form damit zu tun, welches "UserForm" heisst - oder "Überschrift" - wie war das nochmal?
    Hallo VaporiZed,

    du hast völlig Recht. In den Dateien werden andere Texte in anderen Sprachen festgelegt. Die Datei umfasst sämtliche Buttons, DGV Spaltenüberschriften usw.
    Ich könnte natürlich die gesamte Datei in Variablen oder Array einlesen jeden einzelen Butten und so weiter einzeln ansprechen, Beispiel
    - UserForm.Button1.Text = Variable(1)
    - UserForm.Text = Variable(2)
    - usw.

    aber dass wäre natürlich völliger blödsinn. Ich will die Datei in einer Schleife einlesen dann dementsprechend die Zuweisung durchführen.

    Gruß
    Hubertus
    Tja, das ist eben nicht so leicht, da die Textdaten der Datei als Eigenschaftendaten der control elements interpretiert werden müssen. Und dann sind wir wie geschrieben beim Thema Reflection, welches ermöglicht, eine Klasse oder eben ein control element zu analysieren und es zu manipulieren. Da kann man dann auch die Eigenschaften z.B. eines Buttons per Text suchen und diesen Eigenschaftswert ändern. Anders geht es m.E. nur Hartcodierung nicht.
    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.
    Ich würde das Rad hier nich neu erfinden. Nutze doch die dafür vorgesehene Methode. Du setzt in deinem Fenster Localizable auf true, stellst die Sprache ein und änderst alle Controls der Sprache entsprechend. Ist Windows nun Englisch, zeigt dein Programm direkt das englische Form an. Wenn du es trotzdem händisch lösen willst, würde ich über Serialisierung gehen.

    Hubertus schrieb:

    es geht doch nicht nur um Übersetzung Deutsch-Englisch usw.
    Gugst Du hier: Programme mehrsprachig erstellen
    Und Deine Spaltenüberschriften werden da auch mit erledigt.
    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!
    Hallo,

    vielleicht drücke ich mich immer noch falsch aus. Noch mal, es geht nicht nur Übersetzungen zB. Deutsch-Englich, dies hätte ich einfach umsetzten könen.
    Es kann zwei verschiedene deutsche Dateien geben.
    In der ersten deutschen Datei wird in der DGV-Spalte-Überschrift >0< der Text "Datum" eingetragen
    In der zweiten deutschen Datei kann zB. für die selbe Spalte "Artikel-Nr." eingetragen sein.
    Diese Texte können sich auch in den jeweiligen Dateien ändern, deshalb wurde dieser Weg vorgegeben. Welche Excel-Dateien in die DGV eingeladen werden soll, wird in einer Config_Datei festgelegt.
    In beiden Fällen ändert sich natürlich der Inhalt der DGV. Selbstverständlich passen sich die DGV-Spalten der jeweiligen Eingaben automatisch an.

    Gruß
    Hubertus

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

    @Hubertus Da muss ich noch mal nachfragen:
    Das Hauptfenster ruft einen Unterdialog auf, der je nach Config zur Spalte "Datum" oder zur Spalte "Artikel-Nr." führt
    oder
    Das Programm wird aufgerufen und das Hauptfenster meldet sich je nach Config mit Spalte "Datum" oder mit Spalte "Artikel-Nr."?
    ====
    Haste schon mal überlegt, das ganze mit zwei DGV abzubilden, da haste den ganzen Aufwand nicht?
    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 verstand, dass die komplette Beschriftung des Forms und dessen CEs dateiinhaltsabhängig sein soll.
    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.
    Hallo,

    das Programm soll etwas universell sein. Es soll für verschiedene Aufgaben vorgesehen sein. Konfigurierbar über eine Config-Datei, in dem der Aufbau der Controls festgelegt wird. So sind zB. die DGV's ohne Spalten programmiert. Die Spalten werden erst zur Laufzeit, je nach zu ladender Excel-Datei erstellt.
    Sämtliche control elements sollen zur Laufzeit angepasst werden. Das eigentliche Programm funktioniert auch schon, nur die Textzuweisungen der einzelnen CEs machen mir noch Probleme.

    Gruß
    Hubertus
    @Hubertus Das wird so nicht ganz funktionieren.
    Wenn Du die Tabellen von Excel holst, musst Du auch deren Überschriften von Excel holen, alles andere wäre Tinnef.
    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!
    Wenn ich Dich richtig verstehe, sind in einem Form alle CEs wie Labels, DGVs, Texboxen angelegt. Du hast es bisher geschafft, deren Größe und Position durch eine externe Datei vorzugeben, zumindest versteh ich folgenden Text so:

    Hubertus schrieb:

    Konfigurierbar über eine Config-Datei, in dem der Aufbau der Controls festgelegt wird. […] Sämtliche control elements sollen zur Laufzeit angepasst werden. Das eigentliche Programm funktioniert auch schon, nur die Textzuweisungen der einzelnen CEs machen mir noch Probleme.

    Wenn der restliche Kram schon erledigt ist und es nur noch um die Beschriftung geht, dann verweise ich nochmal auf das Thema Reflection, welches ermöglicht, eine CE-Eigenschaft per Text zu suchen und deren Wert festzulegen. Falls das nicht ausreichend sein sollte, gib bitte nochmal kurz einen Hinweis, was ich da falsch verstanden oder übersehen habe.
    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.
    Hallo VaporiZed,

    im Prinzip hast du völlig Recht. Das Programm besteht aus mehreren Windows-Forms, in denen ich die jeweiligen Beschriftungen (Buttos, Frame-Überschriften usw.) im nachhinein einfügen muss. Ein Zusatz noch, die einzuladenen Dateien in die DGV's können sowohl Excel, wie auch CSV-Dateien sein. Dieses wird in der Config festgelegt, die immer anpassbar sein muss. Die Lade-Funktion wird dem entsprechend festgelgt.
    Im Prinzip soll/muss das ganze Programm eine "eierlegende Vollmichsau" sein.
    Was nun die Reflection angeht, so habe ich bis jetzt keinerlei Erfahrung damit. Es wäre super, wenn du mir hier auf die Sprünge helfen könntest.

    Danke für deine Mühe
    Gruß
    Hubertus
    Das ganze läuft über die Funktion GetType. Ein Beispiel, welches Dir auch noch einiges an Ausbaufähigkeit lässt:

    VB.NET-Quellcode

    1. For Each pi In Me.Controls(0).GetType.GetProperties
    2. If pi.Name = "Text" Then pi.SetValue(Me.Controls(0), "bla")
    3. Next

    Das erste CE, welches auf dem Form liegt, wird dahingehend geprüft, ob es eine Property namens Text besitzt. Wenn ja, wird diese Property (also der Text/die Beschriftung) auf "bla" festgelegt. Hast Du also als erstes CE ein Label mit der Aufschrift "blubb", wird die Beschriftung des Labels von "blubb" in "bla" umgewandelt. Die Ausweitung auf alle anderen CEs und der Einbau der passenden Beschriftungen für jedes CE bekommst Du selber raus ;) .
    btw: Ich hab mir mal einen Localizer/Customizer nach der Methodik zusammengeschustert. Die Columns eines DGV damit zu erfassen, ist mir noch nicht gelungen. Klar, man kann explizit abfragen, ob ein CE ein DGV ist und dann damit rumhantieren und es manipulieren, aber eine allgemeine Herangehensweise hab ich noch nicht raus. Schließlich gibt es ein paar CEs, die auf solch eine Weise behandelt werden müssen.
    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.