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.

    Ich habe das Problem nun folgendermaßen gelöst:

    VB.NET-Quellcode

    1. dim GescanntesBild as BitMap
    2. GescanntesBild = Scannen()
    3. Private Function Scannen() As Bitmap
    4. Dim ScanDialog As New WIA.CommonDialog
    5. 'Aufruf der Windows GUI zur Interaktion mit dem Gerät,
    6. 'rückgabe ist das erfasste Bild
    7. If Scannerdialog = 1 Then
    8. Dim Scannergebnis As WIA.ImageFile = Nothing
    9. Scannergebnis =
    10. ScanDialog.ShowAcquireImage(WIA.WiaDeviceType.ScannerDeviceType,
    11. WIA.WiaImageIntent.GrayscaleIntent, WIA.WiaImageBias.MaximizeQuality,
    12. WIAFormatJPEG, False, False, False)
    13. Application.DoEvents()
    14. If Scannergebnis IsNot Nothing Then
    15. Dim vector As WIA.Vector = Scannergebnis.FileData
    16. Dim Bild As New Bitmap(Image.FromStream(New MemoryStream(CType(vector.BinaryData(), Byte()))))
    17. Return Bild
    18. End If
    19. end if
    20. End Function


    Leider kann ich es noch nicht aus o.g. Grund ausprobieren.


    tron25 schrieb:

    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)

    ...


    Bearbeiten > Suchen und Ersetzen > Schnellersetzung


    Damit geht das ratzfatz. :)
    So, nun habe ich die Antwort von "FormFollowsFunction Der Name ist Programm" aus Poast 38 umgesetzt:

    VB.NET-Quellcode

    1. Elemente = Objektkatalogliste.Item(X).Split(CType(My.Resources.Neu, Char()))

    Leider kann ich das Programm immer noch nicht laufen lassen, da noch etwa 70 Fehler übrig sind.

    Bezieht sich das "Char()" auf den Parameter "c" oder auf den Trennstring?
    Der Literaltypzeichen c teilt dem Compiler mit, das es sich um den Datentyp Char handelt.
    learn.microsoft.com/de-de/dotn…data-types/char-data-type

    Char() ist ein CharArray.
    dotnetperls.com/char-array-vbnet

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

    Ups, ich habe, im ersten post von mir, vergessen StringSplitOptions mit anzugeben, sorry.

    VB.NET-Quellcode

    1. Dim myString As String = "Hier kommt die Maus"
    2. Dim stringSeparator As String() = {"kommt die"}
    3. Dim result As String() = myString.Split(stringSeparator, StringSplitOptions.None)
    4. Console.WriteLine(result(0))
    5. Console.WriteLine(result(1))


    Deine Zeile müsste dann so aussehen:
    Elemente = Objektkatalogliste.Item(X).Split(CType(My.Resources.Neu, Char()), StringSplitOptions.None)

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

    Ich habs umgeschrieben, danke.

    Nun komme ich wieder auf das Ausgangsthema zurück.
    Ich lasse zur Laufzeit Menüpunkte erstellen. Wenn nun einer dieser Menüpunkte ausgewählt wird, soll der Zustand der Checkbox abgefragt werden. Leider bekomme ich das nicht hin. Als ich "Option Strict" noch nicht auf "On" hatte, hat es funktioniert. Nun würde mich interessieren, wie der Compiler das gemacht hat.

    VB.NET-Quellcode

    1. 'Zuerst werden Menüeinträge erstellt.
    2. Dim DokubildEintrag As String() = AktuelleZeile.Split(","c)
    3. Dim Dokubild As New ToolStripMenuItem With {.Name = "Menueeintrag", .Text = DokubildEintrag(0), .CheckOnClick = True}
    4. DokuBilderMenue.DropDown.Items.Add(Dokubild)
    5. AddHandler Dokubild.Click, AddressOf DokuBildLaden
    6. 'Der folgende Abschnitt wird ausgeführt, wenn auf einen Menüpunkt geklickt wird.
    7. Dim Ausgewaehlt As Boolean = False
    8. For Each Eintrag In DokuBilderMenue.DropDownItems
    9. If Eintrag.ToString <> "" Then
    10. If Eintrag.ToString = Sender.ToString Then
    11. Ausgewaehlt = Eintrag.Checked
    12. End If
    13. End If
    14. Next
    15. '...

    Leider wird ".Checked" nicht akzeptiert. Es erscheint folgende Fehlermeldung:
    "Option Strict On" lässt spätes Binden nicht zu.
    In den Eigenschaften von "Eintrag" kann ich auch nichts finden, was mit "Checked" zu tun haben könnte.
    Vielen Dank. Das mit "Eintrag.Checked" hat funktioniert.

    Die Zeile

    VB.NET-Quellcode

    1. Elemente = Objektkatalogliste.Item(X).Split(My.Resources.Neu, StringSplitOptions.RemoveEmptyEntries)

    verursacht immernoch folgenden Fehler:
    Fehler bei der Überladungsauflösung, da keine zugreifbare "Split" mit diesen Argumenten aufgerufen werden kann:

    Laut der Hilfe über F1 würde die Zeile folgendermaßen heißen:

    VB.NET-Quellcode

    1. Elemente = Objektkatalogliste.Item(X).Split(String[My.Resources.Neu])

    Das funktioniert leider auch nicht. Auch wenn die eckigen Klammern durch Runde ersetzt werden, gibt es keinen Erfolg.

    Hat jemand eine Idee?
    Was genau steckt in My.Resources.Neu drin?
    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.
    My.Resources.Neu zeigt auf eine Sprachdatei. Je nach eingestellter Sprache kommt entweder "Neu" oder "New" als Rückgabewert heraus. Ich habe einen String, welcher aus mehreren Elementen besteht. Jedes Element besteht zudem aus mehreren Parametern. Alle Parameter und Elemente sind durch Kommata voneinander getrennt. Das Wort "Neu" bzw. "New" markiert den Anfangs jedes Elementes. Nun möchte ich den String in ein Array splitten. Als Trennstring dient nun das "My.Resources.Neu".
    Also (nochmal): Welchen Datentyp hat: My.Resources.Neu?
    Erzähl bitte nix von "zeigt auf SprachDatei", weil "zeigt auf SprachDatei" ist kein Datentyp.
    Datentypen sind sowas wie Char, String, Integer, DateTime etc.

    Daran anschliessend: Welche Argumente (je Argument bitte Name und Datentyp angeben) erwartet die Split()-methode?

    Tatsächlich sind es mehrere Split-Methoden, weil die Split-Methode ist überladen (das steht ja auch schon in der Fehlermeldung).

    Also Welche Argumente (je Argument bitte Name und Datentyp angeben) erwarten die verschiedenen Überladungen der Split()-methoden?

    Das passt eben nicht zusammen, was du ihnen gibst, und was sie erwarten.
    Wenn du herausfindest, was sie erwarten, ist es ein Kinderspiel, sie passend (also korrekt) aufzurufen.
    My.Resources.Neu liefert ein String zurück.
    Folgendes steht in der Hilfe zu "Split":
    Split(String[], StringSplitOptions)
    Hier wird eine Zeichenfolge anhand einer angegebenen Trennzeichenfolge und optional von Optionen in Teilzeichenfolgen unterteilt.
    Wahrscheinlich gibt es kleine Unterschiede zwischen C' und VB, die ich nicht gesehen habe, außer dem ";" am Zeilenende.
    Wenn in My.Resources.Neu nur ein einziger String steht, dann musst Du My.Resources.Neu in einen String umwandeln und dann:

    VB.NET-Quellcode

    1. Dim DerAufgespalteneText = DerZusammengesetzteText.Split({MyResourcesNeuInStringUmgewandelt}, StringSplitOptions.None)

    Wenn Der Text also Tralala und Trilalu und achsowaswiesowieso lautet und in My.Resources.Neu und drinsteckt, bekommst Du

    Quellcode

    1. Tralala
    2. Trilalu
    3. achsowaswiesowieso

    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.

    tron25 schrieb:

    Folgendes steht in der Hilfe zu "Split":
    Split(String[], StringSplitOptions)
    Hier wird eine Zeichenfolge anhand einer angegebenen Trennzeichenfolge und optional von Optionen in Teilzeichenfolgen unterteilt.
    Wenn das da steht, dann isses falsch.
    Die Zeichenfolge wird anhand mehrerer Trennzeichenfolgen unterteilt.
    Um genau zu sein: anhand eines Trennzeichenfolgen-Arrays.
    Noch genauer, nämlich in c# ausgedrückt: anhand eines String[].
    Beachte: String[] und String sind verschiedene Dinge.
    Du gibst ihm einen String - er will aber String[] haben.
    Gib ihm String[] - dann gehts.

    Wie macht man in vb.net aus einem String ein String() (mit dem String darinnen)?
    Ziemlich einfach:

    VB.NET-Quellcode

    1. dim strings = {"Hallo - ich bin der String in einem String()"}

    Ich habe jetzt "My.Resources.Neu" in geschweifte Klammern gepackt und die Fehlermeldung ist verschwunden.

    Der letzte von 2513 Fehlern betrifft die folgende Funktion. Dabei ist "Scannerdialog" ein Integer, der festlegt, ob zum Scannen das Scannerdialogfenster angezeigt werden soll oder die Standartwerte verwendet werden sollen. "Scannqualitaet" ist eine globale Integervariable.

    VB.NET-Quellcode

    1. Private Function Scannen() As Bitmap
    2. Dim ScanDialog As New WIA.CommonDialog
    3. Dim Bild As New Bitmap(0, 0)
    4. Try
    5. 'Aufruf der Windows GUI zur Interaktion mit dem Gerät,
    6. 'rückgabe ist das erfasste Bild
    7. If Scannerdialog = 1 Then
    8. Dim Scannergebnis As WIA.ImageFile = Nothing
    9. Scannergebnis = ScanDialog.ShowAcquireImage(WIA.WiaDeviceType.ScannerDeviceType, WIA.WiaImageIntent.GrayscaleIntent, WIA.WiaImageBias.MaximizeQuality, WIAFormatJPEG, False, False, False)
    10. Application.DoEvents()
    11. If Scannergebnis IsNot Nothing Then
    12. Dim vector As WIA.Vector = Scannergebnis.FileData
    13. Bild = New Bitmap(Image.FromStream(New MemoryStream(CType(vector.BinaryData(), Byte()))))
    14. End If
    15. Else
    16. Dim Scanner As WIA.Device = ScanDialog.ShowSelectDevice(WIA.WiaDeviceType.ScannerDeviceType, False, False)
    17. Dim DPI As Integer = Convert.ToInt16(ScannerDPI)
    18. Select Case ScannerQualitaet
    19. Case 0
    20. Scanner.Items(1).Properties("Current Intent").Value = 4 ' 4 = SW, 2 = Graustufe, 1 = Color
    21. Case 1
    22. Scanner.Items(1).Properties("Current Intent").Value = 2 ' 4 = SW, 2 = Graustufe, 1 = Color
    23. Case Else
    24. Scanner.Items(1).Properties("Current Intent").Value = 1 ' 4 = SW, 2 = Graustufe, 1 = Color
    25. End Select
    26. Scanner.Items(1).Properties("Horizontal Resolution").Value = DPI ' dots per inch/Horizontal
    27. Scanner.Items(1).Properties("Vertical Resolution").Value = DPI ' dots per inch/Vertikal
    28. Scanner.Items(1).Properties("Horizontal Start Position").Value = 0 ' x links oben
    29. Scanner.Items(1).Properties("Vertical Start Position").Value = 0 ' y links oben
    30. ' Scanner.Items(1).Properties("Horizontal Extent").Value = 8.5 * dpi // Breite = inch * dpi
    31. ' Scanner.Items(1).Properties("Vertical Extent").Value = 11 * dpi // Höhe = inch * dpi
    32. Me.Enabled = False
    33. InfoFormular.Text = My.Resources.Bitte_warten
    34. InfoFormular.Label1.Text = My.Resources.Scanvorgang_laeuft
    35. InfoFormular.ShowDialog()
    36. Application.DoEvents()
    37. Dim Scannergebnis As New WIA.ImageFile(Scanner.Items(1).Transfer())
    38. Application.DoEvents()
    39. If Scannergebnis IsNot Nothing Then
    40. Dim vector As WIA.Vector = Scannergebnis.FileData
    41. 'In der folgenden Zeile taucht eine Fehlermeldung auf.
    42. Bild = New Bitmap(Image.FromStream(New MemoryStream(CType(vector.BinaryData(), Byte()))))
    43. End If
    44. InfoFormular.Close()
    45. Me.Enabled = True
    46. End If
    47. Catch Fehler As Exception
    48. InfoFormular.Text = My.Resources.Fehler
    49. InfoFormular.Label1.Text = My.Resources.Fehler_Scanner_ueberpruefen
    50. InfoFormular.ShowDialog(Me)
    51. InfoFormular.Close()
    52. End Try
    53. Return Bild
    54. End Function

    Fehlermeldung:
    Fehler bei der Überladungsauflösung, da keine zugreifbare "New" diese Anzahl von Argumenten akzeptiert.

    Den Code habe ich mir aus dem Internet zusammengestellt. Als "Option Strict" noch "Off" war, hatte es funktioniert.

    Hat jemand eine Idee?
    Setze mal den Cursor hinter die (öffnende) Klammer und drücke Steuerung+Umschalt+Leertaste,
    dann werden dir die Überladungen angezeigt.
    Oder du guckst mal in die Doku, oder wo auch immer.
    learn.microsoft.com/de-de/dotn…?view=dotnet-plat-ext-7.0

    Ein bischen mehr Eigeninitiative, wäre angebracht.
    Ich habe mir in der Hilfe das Thema "WIA-Objekt" durchgelesen. Bin aber leider noch nicht schlauer. Ich verstehe nicht, warum die Version mit Dialogfenster funktioniert und ohne nicht. Die Beispiele, die ich gefunden habe, behandeln nur die Variante mit Dialogfenster.

    Dann werde ich wohl weitersuchen müssen. Schließlich muß es ja funktionieren.

    Neu

    In einem Beitrag von 2018 in diesem Forum habe ich ein ähnliches Thema gefunden.

    "Scanner mit einer bestimmten IP-Adresse mithilfe von wia ansteuern"

    Dort wird allerdings nur erklärt, wie die Eigenschaften im Scannerdialogfenster versteckt werden können.

    In der Hilfe von "FromStream" steht:
    FromStream(Stream, Boolean, Boolean)
    Erstellt ein Image aus dem angegebenen Datenstream. Optional werden dabei eingebettete Farbverwaltungsinformationen verwendet und die Bilddaten überprüft.

    Allerdings bekomme ich folgende Meldung:
    "Option Strict On" lässt keine impliziten Konvertierungen von "Object" in "ImageFile" zu.

    Laut Definition gibt "FromStream" ein Image zurück. Der bisherige Code lautet:

    VB.NET-Quellcode

    1. Dim GescanntesBild As Bitmap
    2. Dim Scanner As WIA.Device = ScanDialog.ShowSelectDevice(WIA.WiaDeviceType.ScannerDeviceType, False, False)
    3. Dim DPI As Integer = Convert.ToInt16(ScannerDPI)
    4. Select Case ScannerQualitaet
    5. Case 0
    6. Scanner.Items(1).Properties("Current Intent").Value = 4&nbsp; ' 4 = SW, 2 = Graustufe, 1 = Color
    7. Case 1
    8. Scanner.Items(1).Properties("Current Intent").Value = 2 ' 4 = SW, 2 = Graustufe, 1 = Color
    9. Case Else
    10. Scanner.Items(1).Properties("Current Intent").Value = 1 ' 4 = SW, 2 = Graustufe, 1 = Color
    11. End Select
    12. Scanner.Items(1).Properties("Horizontal Resolution").Value = DPI&nbsp; ' dots per inch/Horizontal
    13. Scanner.Items(1).Properties("Vertical Resolution").Value = DPI&nbsp; ' dots per inch/Vertikal
    14. Scanner.Items(1).Properties("Horizontal Start Position").Value = 0 ' x links oben
    15. Scanner.Items(1).Properties("Vertical Start Position").Value = 0 ' y links oben
    16. Dim Scannergebnis As WIA.ImageFile = Scanner.Items(1).Transfer()
    17. If Scannergebnis IsNot Nothing Then
    18. Dim vector As WIA.Vector = Scannergebnis.FileData
    19. GescanntesBild = New Bitmap(Image.FromStream(New MemoryStream(CType(vector.BinaryData(), Byte()))))
    20. End If


    Hat jemand eine Idee, wo der Denkfehler liegt?
    Ich nehme mir eure Vorschläge und Hinweise zu Herzen. Also bitte nur konstruktive Antworten.

    Neu

    In welcher Zeile für welche Anweisung kommt die Fehlermeldung? Ich wage zu behaupten bei Dim Scannergebnis As WIA.ImageFile = Scanner.Items(1).Transfer(). Dann wäre die Anmerkung

    tron25 schrieb:

    Laut Definition gibt "FromStream" ein Image zurück.
    nicht zielführend, weil sie auf eine andere Codestelle verweist.
    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.