Menüeinträge zur Laufzeit erstellen und markieren

  • VB.NET
  • .NET (FX) 3.0–3.5

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

    Dann schau Dir die Doku zu DeleteDirectory an, denn da steht drin, was als 2. Parameter erwartet wird. Es ist kein Boolean (True/False).
    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.
    jo, mit "zu Beispiel 1: Welchen Datentyp erwartet die Methode, und was gibst du ihr stattdessen?" meinte ich natürlich nicht Beispiel 2: Aufteilen(), sondern Beispiel 1, und darin die Methode, die das Problem macht: My.Computer.FileSystem.DeleteDirectory()
    Und nu antworte die Frage: Welchen Datentyp erwartet die Methode, und was gibst du ihr stattdessen?

    ups, die Frage ist nicht 100% korrekt, sie lautet: Welche Datentypen erwartet die Methode, und was gibst du ihr stattdessen?



    hihi - ich gab den Hinweis ausdrücklich zu Beispiel 1, aber (richtig!) gelöst hast du damit Beispiel 2

    Aber ich korrigier noch bischen:

    tron25 schrieb:

    ein Array, welches mit Zeichenketten gefüllt ist, eigendlich ein String() ist.
    Ein Array, welches für Zeichenketten vorgesehen ist (es muss ja garnet gefüllt sein), das ist ein String(), ganz ohne eigentlich.

    Deine Lösung von Post#18, Beispiel#2 besteht darin, dass du die Datentypen zueinander passend gemacht hast: in PunktbildImportieren() ist Abschnitt als String() deklariert.
    Folglich (und so isses nu ja auch) muss Aufteilen() auch String() returnen, und nix anneres, sonst passt es nicht zusammen - was dir die Fehlermeldung ja auch sagtete:

    tron25 schrieb:

    'Fehlermeldung:
    '"Option Strict On" lässt keine impliziten Konvertierungen von "Array" in "String()" zu.
    "Ein Array ist kein String()" steht da - oder?
    und Array kann auch nicht implizit zu String() konvertiert werden, steht da auch noch.
    Markiert war sicherlich Zeile #6, wo der Methoden-Returnwert (guck hin - damals wars noch Array) an Abschnitt (vom Typ String()) zugewiesen wurde.



    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Vielen Dank. Jetzt kann ich all meine "DeleteDirectory"-Zeilen richtig schreiben. Die Sache mit dem Array als String() habe ich auch schon korrigiert.

    Was ist Code-Technisch besser?
    Beispielsweise:

    VB.NET-Quellcode

    1. Public Structure GrafikBrailleRechteck
    2. Public ArrayLinks As Integer
    3. Public ArrayOben As Integer
    4. Public ArrayBreite As Integer
    5. Public ArrayHoehe As Integer
    6. End Structure
    7. Public Braille As GrafikBrailleRechteck
    8. BraillezeilePicture.Height = BraillezeilePicture.Width / Braille.ArrayBreite * 3


    Entweder Klammere ich "Braille.Arraybreite" in ein "CDbl()" oder ich deklariere die Struktur selbst als Double. Double braucht aber mehr Platz, als ein Integer. Welche Version würdet ihr nehmen?

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

    Waswiewower? Wenn BraillezeilePicture eine PicBox ist, ist BraillezeilePicture.Height und BraillezeilePicture.Width von einem bestimmten Typ. Nämlich welchem?
    Dann wäre aber dieser Typ nicht auf Anhieb mit Deiner Rechnung kompatibel, weil da ein anderer Datentyp entsteht. Auch hier: welcher?
    Du brauchst also kein CDBl()
    Die Gedanken nach dem Speicherplatz kannst Du Dir heutzutage sparen, solange Du nicht mit einem Spielzeugtaschenrechner arbeitest, auf dem ein Speicherplatzproblem ggf. relevant wär.

    tron25 schrieb:

    ich deklariere die Struktur selbst als Double
    Dieser Satz ergibt leider gar keinen Sinn.
    Wenn die Bestandteile als Integer Sinn ergeben und als Double nicht, belass es bei Integer. Oder kann ArrayLinks (was immer das ist) einen Wert von 0,4 haben?
    Vielleicht noch eingeworfen: das Stichwort Integerdivision.
    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 habe nachgeschaut. Die Width- und Height-Eigenschaften einer Picturebox sind Integer. Dann verstehe ich nicht, wo das Problem liegt, denn "Braille.Arraybreite" ist ebenfalls ein Integer. Die Fehlermeldung sagt aber, das kein Double implizit in ein Integer umgewandelt werden kann. Wegen der Integerdivision wird unter Umständen das Ergebnis abgerundet. Das ist aber nicht schlimm, da ein Braillepunkt mehrere Pixel groß ist. Außerdem wird das Ergebnis nur dafür gebraucht, um einen Punkt visuell auf dem Bildschirm darzustellen. Es ist daher nicht wichtig, ob er ein Pixel weiter links oder Rechts anfängt.

    tron25 schrieb:

    das kein Double implizit in ein Integer umgewandelt werden kann
    Richtig. Nur interpretierst Du diese Aussage falschrum. Die Zielvariable (BraillezeilePicture.Height) ist ein Integer, der zuzuweisende Wert (nämlich das Ergebnis Deiner Berechnung) ist aber ein Double. Es kommt als bei Deiner Berechnung ein Double-Wert raus und Du versuchst, diesen Wert in eine Integervariable zu pressen. Dabei würde ein Teil des Ergebnisses ggf. verloren gehen (nämlich die Nachkommastellen). Und deshalb meckert der Compiler, um Dich darauf hinzuweisen, dass da was passiert, was Du vielleicht nicht willst (nämlich Datenverlust). Wenn Du aber mit Integerdivision arbeitest oder das Berechnungsergebnis explizit (z.B. durch CInt()) von einem Double-Wert in einen Integer-Wert umwandelst, ist der Compiler zufrieden, weil Du klarmachst: »Ich will einen Integer-Wert aus dem Ergebnis machen. Ich weiß, was ich tu.«
    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.
    Verstehe ich das richtig, wenn ich sage, dass ich überall, wo das Ergebnis eventuell ein Double sein könnte und dieses aber in ein Integer geschrieben werden soll, die Berechnung in ein CInt() packen soll?

    Dann habe ich ja noch Einiges vor mir, denn ich habe nach dem Umstellen in "Structure Explicit On" noch ungefähr 2500 Einträge in der Fehlerliste.

    Vielen Dank für die Erklärungen und bis Bald ;-).

    tron25 schrieb:

    wo das Ergebnis eventuell ein Double sein könnte
    Nicht sein könnte, sondern ist. Aber ja, dort muss wohl überall mit CInt oder Integer-Division (falls zutreffend) gearbeitet werden.

    tron25 schrieb:

    Structure Explicit On
    Du meinst wahrscheinlich Option Strict On. Und wenn Du dabei bist, aber es noch nicht gemacht hast: Auch gleich alle Mitteilungen/Einstellungen bei Projekteigenschaften -> Kompilieren von Keine oder Warnung auf Fehler umstellen, wie ich in dem erwähnten Thread schrieb.
    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 schrieb:

    ... muss mit Integer-Division ... gearbeitet werden...
    Was ja ein Kinderspiel ist, wenn man weiss, was das ist (nämlich \).

    Also statt

    tron25 schrieb:

    VB.NET-Quellcode

    1. BraillezeilePicture.Height = BraillezeilePicture.Width / Braille.ArrayBreite * 3

    mach:

    VB.NET-Quellcode

    1. BraillezeilePicture.Height = BraillezeilePicture.Width \ Braille.ArrayBreite * 3
    So einfach ist Strict On
    Danke, da kann ich meine bisher etwa 300 schon angepaßten Zeilen umschreiben. Ich hatte nähmlich aus

    VB.NET-Quellcode

    1. C = A / B

    Folgendes

    VB.NET-Quellcode

    1. C = cint(A / B)

    gemacht. Zum Glück habe ich noch eine Sicherung von vor den Veränderungen.

    Bevor ich wieder eine Ehrenrunde drehe, habe ich da noch eine Frage:
    Gibt es da auch eine elegantere Methode für:

    VB.NET-Quellcode

    1. Dim Wert as string
    2. dim X as integer
    3. Wert = val(X)

    als

    VB.NET-Quellcode

    1. Dim Wert as string
    2. dim X as integer
    3. Wert = cint(val(X))

    X ist ein Integer und Val() gibt eine Gleitkommazahl zurück.

    tron25 schrieb:

    Bevor ich wieder eine Ehrenrunde drehe, habe ich da noch eine Frage:

    So wie du das hier schreibst, willst du einen Integer Wert in einer String Variablen haben.
    Da hat Val keinen Sinn.
    Wert = CStr(X)

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

    tron25 schrieb:

    Wegen der Integerdivision wird unter Umständen das Ergebnis abgerundet.
    Wenn Du solch eine Aussage in Post#25 machst, gehe ich davon aus, dass Du Dich mit dem Thema beschäftigt hast. Daher verstehe ich Deine Aussage ein paar Posts später nicht:

    tron25 schrieb:

    Danke, da kann ich meine bisher etwa 300 schon angepaßten Zeilen umschreiben.
    Nuja, wie auch immer.
    Das Ehrenrundenthema: Ggf. Wert = X.ToString, ggf. CStr(X), wenn wirklich ein String rauskommen soll. Recherchier den Unterschied in den möglichen Ergebnissen, bevor Du anfängst.
    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.
    Dann bist Du bei Integer.TryParse oder gar Integer.Parse
    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, aber nun habe ich das nächste Problem:
    Aus den Zeilen

    VB.NET-Quellcode

    1. Dim AktuellerEintrag() as String
    2. AktuellerEintrag = Objektkatalogliste.Item(X).Split(",")

    werden

    VB.NET-Quellcode

    1. Dim AktuellerEintrag() as String
    2. AktuellerEintrag = Objektkatalogliste.Item(X).Split(","c)

    Nun habe ich einen Zeiger auf eine Sprachdatei. Wie kann ich das umschreiben?

    VB.NET-Quellcode

    1. Dim AktuellerEintrag() as String
    2. AktuellerEintrag = Objektkatalogliste.Item(X).Split(My.Resources.Neu)

    Ich weiß nicht, wie ich das "c" drankriegen kann.
    Ich habe eine Liste, in der jeder Eintrag ein bestimmtes Element darstellt. Die einzelnen Parameter sind durch Kommata voneinander getrennt.

    Beispiel:
    Dreieck,1,,6,5,10,10,2,1

    Dieser Eintrag bewirkt, das ein Dreieck in einem vordefinierten Rechteck gezeichnet wird. Das Rechteck kann in der Größe und Position angepaßt werden.

    Der Eintrag besteht aus folgenden Parametern:

    Form, Zeichnen (Ja/Nein), Beschreibung, Position links, Position oben, Breite des Rechtecks, Höhe des Rechtecks, Richtung der Spitze, Rahmenbreite

    Es gibt auch Elemente, die in einem Eintrag zusammengefaßt werden, wie z.B. einzelne Punkte oder Mausklicks. Diese werden dann mit dem Schlüsselwort Neu" voneinander getrennt.

    Beispiel:
    Freies Zeichnen,1,,Neu,0,0,1,1,"Neu",5,5,2,2

    Hier werden 1 Punkt und eine Fläche, die 2 Punkte breit und hoch ist gezeichnet, Das Fokusrechteck befindet sich einmal bei 0,0 und ist 1 Braillepunkt breit und hoch. Im zweiten Fall befindet sich das Rechteck an der Position 5,5 und ist insgesamt 4 Braillepunkte groß.

    Dadurch, das das Programm mehrsprachig ist, steht je nach eingestellter Sprache "Neu" oder "New" oder etwas anderes da. Jetzt möchte ich einen Eintrag nach diesem Schlüsselwort trennen, um die einzelnen Elemente ansprechen zu können.

    Leider kann ich das Beispiel noch nicht testen, da ich derzeit dabei bin, die Fehlerliste abzuarbeiten. Diese habe ich bekommen, nachdem ich die Projekteigenschaft "Option Strict" auf "On" gesetzt habe. von 2500 Fehlern habe ich nur noch ca. 140 übrig.

    Allerdings stehe ich bei einem neuen Fehler, bei dem ich nicht weiterkomme.

    VB.NET-Quellcode

    1. Dim GescanntesBild As Bitmap
    2. Dim ScanDialog As New WIA.CommonDialog
    3. 'Aufruf der Windows GUI zur Interaktion mit dem Gerät,
    4. 'rückgabe ist das erfasste Bild
    5. If Scannerdialog = 1 Then
    6. Dim Scannergebnis As WIA.ImageFile = Nothing
    7. Scannergebnis = ScanDialog.ShowAcquireImage(WIA.WiaDeviceType.ScannerDeviceType, WIA.WiaImageIntent.GrayscaleIntent, WIA.WiaImageBias.MaximizeQuality, WIAFormatJPEG, False, False, False)
    8. Application.DoEvents()
    9. If Scannergebnis IsNot Nothing Then
    10. Dim vector As WIA.Vector = Scannergebnis.FileData
    11. 'In der nächsten Zeile erscheint ein Fehler.
    12. GescanntesBild = Image.FromStream(New MemoryStream(CType(vector.BinaryData(), Byte())))
    13. End If
    14. End If


    "Option Strict On" lässt keine impliziten Konvertierungen von "Image" in "Bitmap" zu.

    Wie kann ich ein "Image" in ein "Bitmap" umwandeln?

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