Combo-Box Erster Eintrag, Typenkonvertierung, Msg-Box mit schließen

  • VB.NET

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

    hi, was treibst Du denn da? bitte schildere uns kurz Dein vorhaben. keinen code, einfach kurz, was Dein project machen soll.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @SpaceyX

    Ich will mit einem System eine Position im Raum bestimmen. Visual brauch ich für die Visualisierung. In der ersten Form will ich ein paar Parameter eingeben und die ganzen Labels sind zum markieren der Fahrwege. Den Raum habe ich in 64 Quadrate aufgeteilt. Ich hätte das lieber mit Buttons gemacht, aber so wie ich gelesen habe kann man da die Farbe nicht so leicht ändern.
    Wenn alles eingestellt und die Fahrwege markiert sind will ich Form1 schließen und Form2 öffnen. Dort sollen die Fahrzeug-Parameter eingetragen werden. Wenn das fertig ist soll sich Form2 schließen und Form3 öffnen. Dort soll (wie in Form1) die 64 Quadrate angezeigt werden mit den Fahrwegen und den Positionen meiner Fahrzeuge (Hierzu brauche ich dann noch die Ansteuerung meiner COM Schnittstelle für den Arduino, aber erstmal soll die Visu stehen, bevor ich mich da ran wage). Wenn etwas unverständlich geschrieben ist, schreibe ich das gerne auch noch etwas ausführlicher.
    UUUUIIIII! Da ist einiges zu machen. Ich lass den Form-Aufruf-Spaß für RodFromGermany, das ist sein Spezialgebiet. Aber sonst werden wir alles nur schrittweise durchgehen können:
    • Die ganze A1_Click : Änderung(A1)-Geschichte für zig Buttons lässt sich auf sehr wenig Code zusammenschmelzen. Dazu vorher die Frage: sind diese ganzen Buttons fest drin? Werden die ggf. durch neue Sachen im Praxisalltag mehr oder weniger werden?
    • IIF() ist VB6; If() verwenden (ist auch typsicher)
    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.
    @VaporiZed Ohje. Das hatte ich befürchet. Also die Sache mit den 64 Abfragen! Das wäre ja wunderbar, wenn man das kürzer machen könnte.
    Ich denke ich hab mir das etwas kompliziert gedacht...
    Die Quadrate sollen auch mal ausgeblendet werden, je nachdem welche Länge und Breite eingestellt wird, aber soweit war ich noch nicht.
    Aber von der Sache her sind sie immer da. Sie sind nur zum markieren der Fahrwege in meinem Raum.

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

    ok. mach Dir erstmal keine gedanken, um irgendwelche quadrate oder sonst was. davon bist Du noch ne meile weg.

    was Du brauchst, ist ein anständiges datenmodell. ohne dies kommt genau das raus, was Du im moment hast.

    gut, Du willst fahrzeuge darstellen? dann überlege, welche eigenschaften ein fahrzeug haben soll, was es machen soll und evtl. was alles mit diesem fahrzeug passieren soll.

    übertrage das in eine klasse vom typ fahrzeug. falls Du hier an eine hürde stösst, dann sag bescheid und man kann es geimeinsam lösen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @SpaceyX

    Also ich habe maximal vier Fahrzeuge. Jedes Fahrzeug soll als Punkt oder von mir auch als Kreuz dargestellt werden. Für jedes Fahrzeug brauch ich eine andere Farbe. (Auch wenn ich die Quadrate erstmal vergessen soll - ich muss sie jetzt erwähnen, weil ich es sonst nicht beschreiben kann)
    Dann sollen die Punkte in dem Quadrat angezeigt werden, auf dem es sich gerade befindet. Das ist für den Fahrzeugteil eigentlich auch schon alles gewesen.

    Achso falls du auf die Fahrzeug-Parameter hinaus wolltest. Ich habe für jedes Fahrzeug ein maximales Gewicht, eine Nennspannung des Akkus und den Akku-Typ der vom User eingetragen werden soll.

    VB.NET-Quellcode

    1. Public Class Fahrzeug
    2. Public Property FahrzeugID As Integer
    3. Public Property FahrzeugFarbe As Color
    4. Public Property FahrzeugPosition As Point
    5. Public Property MaxGewicht As Double
    6. Public Property Nennspannung As Double
    7. Public Property AkkuTyp As String
    8. Public Sub New(id As Integer, farbe As Color, pos As Point, maxGew As Double, spannung As Double, akkuTyp As String)
    9. Me.FahrzeugID = id
    10. Me.FahrzeugFarbe = farbe
    11. Me.FahrzeugPosition = pos
    12. Me.MaxGewicht = maxGew
    13. Me.Nennspannung = spannung
    14. Me.AkkuTyp = akkuTyp
    15. End Sub
    16. Public Sub ZeichneFahrzeug()
    17. End Sub
    18. End Class


    So könnte evtl. ein Fahrzeug-Datentyp aussehen. Kannst Du damit was anfangen oder ist das noch außerhalb Deiner möglichkeiten?
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @Julia Fang zunächst an und befasse Dich mit dem Aufruf von und der Kommunikation zwischen Dialogen unter .NET.
    Dein Code diesbezüglich ist suboptimal. X(
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    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!
    @SpaceyX
    Ich verstehe was dort passiert aber von alleine hätte ich das nicht schreiben können :huh: kommt das jetzt eigentlich in den Code für meine Form oder muss ich dafür ne extra datei anlegen?

    @RodFromGermany
    Den Link hatte ich mir gestern schon durchgelesen... ganz ehrlich, viel verstehen tue ich davon nicht. Ich hatte nie die Möglichkeit VB von Grund auf zu lernen, bisher war es immer nur notwendig Code anzupassen und nicht neu zu schreiben. Mir fehlt es einfach an den Grundlagen und den Fachtermini.
    @Julia: Auch wenn die Frage nicht an mich ging, würde ich jede neue Klasse in eine neue Datei packen. Denn wenn Du sie in eine bestehende Datei packst, gibt es zwei unschöne Möglichkeiten:
    1. Du hängst die neue Klasse ans Dateiende -> Deine Datei wird groß und unübersichtlich und Du hast keine Vorteile, außer dass Du keine neue Datei anlegen musst, aber dieser Mikrovorteil wiegt nicht die Nachteile auf.
    2. Du packst die Fahrzeugklasse in die bestehende Hauptformklasse, bettest sie also dort ein. Ganz böse, da Daten und GUI-/Benutzeroberflächencode getrennt werden sollten. Immer. Außerdem entstehen Abhängigkeiten, die alles komplizierter machen, da die Fahrzeugklasse von der Mainklasse abhängig wird und somit von anderen Klassen außerhalb nicht/schwer verfügbar wird.
    Zum Thread von RfG. Ich fasse kurz zusammen, mithilfe einer Analogie.
    Form1 = Klasse = Bauplan -> ist wie die Bezeichnung "Mensch".
    Ein durchschnittlicher Mensch hat einige feste Eigenschaften: Augenfarbe, Größe, Gewicht, Name, Geschlecht, ...
    Wenn man jetzt sagt: Sag mir allgemein, wie schwer irgend Mensch ist, geht das nicht, da nicht alle Menschen gleich viel wiegen. Man muss also nach einem Individuum fragen: Wieviel wiegt jener Mensch. Während "Mensch" (also im Programmcode "Form1") zwar klarmacht, dass er feste Eigenschaften mitbringt, wird erst durch die Festlegung auf einen bestimmten Menschen klar, wie diese Eigenschaften konkret aussehen. Daraus ergibt sich, dass Form1.Show() syntaktisch falsch ist.
    Man muss z.B. sagen: "NeueDialogForm" ist eine Form1 bzw. ist vom Typ Form1, und sie soll folgende konkrete Eigenschaftenmerkmale haben: Größe ist 300x200 Pixel, Hintergrundfarbe = grün. Zeige mir "NeueDialogForm".
    Das entspricht im Leben: "NeuesBaby" ist ein Mensch, und es wird folgende Eigenschaften haben: Augenfarbe wird grün sein, es trägt den Namen "Jürgen Munz" und wird ein Junge sein. Zeige mir "NeuesBaby".
    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.

    Julia schrieb:

    viel verstehen tue ich davon nicht
    Die richtigen Probleme kommen dann, wenn Du mehrere Instanzen derselben Form öffnen willst, wenn Du auf Properties anderer Formen zugreifen musst, insbesondere aus anderen Threads.
    Freue Dich also auf den Tag, wenn etwas oder nix passiert und Du es Dir absolut nicht erklären kannst. ;(
    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!
    @VaporiZed
    ich weiß leider nicht wo ich anfangen und aufhören soll mit dem Ordnen und aufräumen. Ich weiß es kostet dich sicher viel Zeit, aber kannst du mir vielleicht dabei helfen?
    Ich habe jetzt 4 Forms und 1 Klasse und irgendwie steht immer noch das selbe drin. (ich habe die items jetzt in den eigenschaften befüllt, damit der Code nicht so lang wird)
    Muss ich mir quasi wie eine Art Hauptcode anlegen in dem ich auf alle anderen zugreife? Warum kann ich den Code nicht in den Forms drin stehen lassen?
    Was noch ganz prima wäre, wenn du mir vielleicht verraten kannst, wie man diese 64 if-Abfragen zusammen schmelzt.

    Julia schrieb:

    wie man diese 64 if-Abfragen zusammen schmelzt.
    Was nützt es, wenn Du aus Ranz-Code schlechten Code machst, wenn Du die Grundlagen ignorierst, die Du brauchst, um ein solches Problem anständig zu lösen.
    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!

    Julia schrieb:

    Mir fehlt schlichtweg einfach die Zeit bei 0 anzufangen.
    Sorry.
    Dann empfehle ich Dir, bei 0 anzufangen, dann sparst Du die Zeit später.
    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!
    @Julia: Auch wenn es nicht viel bringen wird, um den Code von grundauf besser zu machen, will ich Dich diesbezüglich nicht verhungern lassen.
    Wenn Du nur Deine 64 Buttons in Form1 hast und sonst keine weiteren Buttons, ginge es mit:

    VB.NET-Quellcode

    1. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    2. For Each ctl As Control In Controls
    3. If TypeOf ctl Is Button Then
    4. AddHandler DirectCast(ctl, Button).Click, AddressOf Änderung
    5. End If
    6. Next
    7. End Sub
    8. Private Sub Änderung(sender As Object, e As EventArgs)
    9. Dim CurrentButton = DirectCast(sender, Button)
    10. CurrentButton.BackColor = If(CurrentButton.BackColor = Color.ForestGreen, SystemColors.ActiveBorder, Color.ForestGreen)
    11. End sub

    Dann können alle Kandidaten wie A1_Click weg.
    In der Prozedur "Änderung" sollen schon Buttons verändert werden, richtig? Da lbl dafür ein ungewöhnlicher Name ist, den Du Dir da ausgesucht hast.
    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.
    Kein Thema. Dann einfach alle Stellen, bei denen in meinem Code Button steht, durch Label ersetzen. Du kannst dann natürlich auch noch If-Abfragen einbauen, wenn bestimmte Labels da nicht erfasst werden sollen, z.B. weil sie wirklich normale Beschriftungen sind oder einen bestimmten Namen haben oder nicht die passende bunte-Felder-Größe haben usw..
    Also z.B.

    VB.NET-Quellcode

    1. For Each ctl As Control In Controls
    2. If TypeOf ctl Is Label Then
    3. If ctl.Text = "Klicken Sie auf die hiesigen bunten Felder, um eine Fahrzeugstrecke einzuzeichnen" OrElse ctl.Name = "Label1" OrElse ctl.height <> 64 Then Continue For
    4. AddHandler DirectCast(ctl, Label).Click, AddressOf Änderung
    5. End If
    6. Next


    EDIT: Oder ein etwas einfacherer "Filter": Du setzt für alle Labels auf Deiner Form, die durch Anklicken sich nicht verändern sollen, einen beliebigen Wert in die Label-Eigenschaft "Tag" im Designer und fragst dann jene Tag-Eigenschaft in der o.g. Schleife ab. Wenn ein Label diesen selbst festgelegten Eigenschaftswert hat, wird es übersprungen, ansonsten wird das Label.Click-Ereignis mit der (in Post#37 modifizierten) "Änderung"-Prozedur verknüpft.
    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.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „VaporiZed“ ()

    Hey @VaporiZed

    vielen Dank dafür, das hat soweit geklappt.
    Wäre nett, wenn du mir nochmal auf die Sprünge helfen könntest.

    Ich hab jetzt deinen Code entsprechend angepasst, damit ich mit Änderung der Farbe auch gleich die Tag Eigenschaft des Labels geändert wird.

    VB.NET-Quellcode

    1. Private Sub Änderung(sender As Object, e As EventArgs) 'Änderung der Farben und der Tag-Eigenschaft zur Bestimmung des Fahrweges
    2. AktuellesLabel = DirectCast(sender, Label)
    3. If AktuellesLabel.Tag.ToString = "on" Or AktuellesLabel.Tag.ToString = "off" Then
    4. AktuellesLabel.BackColor = If(AktuellesLabel.BackColor = Color.ForestGreen, SystemColors.ActiveBorder, Color.ForestGreen)
    5. Else
    6. AktuellesLabel.BackColor = SystemColors.Control
    7. End If
    8. If AktuellesLabel.BackColor = Color.ForestGreen Then
    9. AktuellesLabel.Tag = "on"
    10. Else
    11. AktuellesLabel.Tag = "off"
    12. End If
    13. End Sub


    Das funktioniert auch soweit. Jetzt wollte ich diese Tag-Eigenschaft nutzen um mir ein Array zu beschreiben. Nach dem Prinzip, das wenn ein Tag "on" wird der jeweilige Bereich des Arrays mit True beschrieben, ansonsten mit False. Das Array wollte ich mir dann in einer anderen Form zunutze machen. Aber ich bekomme es wieder mal nicht hin.

    Damit wollt ich es jetzt erstmal probieren das Array überhaupt zu beschreiben (auch wenn hier nun leider alle Labels abgefragt werden):

    VB.NET-Quellcode

    1. For Each ctl As Control In Controls
    2. If TypeOf ctl Is Label Then
    3. For i As Integer = 0 To 77
    4. If FahrwegMarkiert.Tag = "on" Then
    5. AuswahlFahrweg(i) = True
    6. ElseIf FahrwegMarkiert.Tag = "off" Then
    7. AuswahlFahrweg(i) = False
    8. End If
    9. Next
    10. End If
    11. Next


    Aber das klappt leider gar nicht. Ich lasse mit dann mit einer MsgBox das ganze ausgeben:

    VB.NET-Quellcode

    1. MeinString += AuswahlFahrweg(i).ToString
    2. MsgBox(MeinString)


    Da erhalte ich allerdings immer nur False.

    Hast du noch eine Idee?