bmp speichern mit e.Graphics.DrawLine in PictureBox_Paint

  • VB.NET
  • .NET (FX) 1.0–2.0

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    bmp speichern mit e.Graphics.DrawLine in PictureBox_Paint

    Hallo liebes Forum,

    ich habe jetzt schon recht lange an folgende Problematik rumgebastelt... Ich hoffe ihr könnt mir helfen.

    Ich habe ein TabContro mit 3 pages. Auf Page(1) und Page(2) sind jeweils zwei PictureBoxen wo via Paint-Event gezeichnet wird.

    VB.NET-Quellcode

    1. Public Sub PB_querX_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PB_querX.Paint
    2. If ergX(0, 0) = Nothing Or drawQuer = False Then Exit Sub
    3. Dim p1, p2 As Drawing.Point
    4. Dim zngPanel As PictureBox
    5. 'Zeichnen der Achse
    6. zngPanel = sender
    7. zngPanel.Refresh()
    8. p1.X = 0
    9. p1.Y = zngPanel.Height / 2
    10. p2.X = zngPanel.Width
    11. p2.Y = zngPanel.Height / 2
    12. e.Graphics.DrawLine(penAchse, p1, p2)
    13. sender.Update()
    14. ' ... noch viel mehr code
    15. End Sub


    Beim wechseln der page:

    VB.NET-Quellcode

    1. Private Sub TabControl1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TabControl1.MouseClick
    2. drawQuer = True : PB_querX.Invalidate()
    3. drawBiege = True : PB_biegeX.Invalidate()
    4. drawQuer = True : PB_querY.Invalidate()
    5. drawBiege = True : PB_biegeY.Invalidate()
    6. End Sub
    7. Private Sub TabControl1_TabIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabControl1.TabIndexChanged
    8. Call TabControl1_MouseClick(sender, Nothing)
    9. End Sub


    Das Problem sieht nun so aus: Wenn ich auf der Page(0) bin, löse ich button_click Ereignis aus und dort dann call saveForPDF().

    VB.NET-Quellcode

    1. Sub saveForPDF()
    2. ' Prüfen ob Verzeichnis existiert, sonst anlegen
    3. If Dir("C:\Temp\", FileAttribute.Directory) = "" Then MkDir("C:\Temp\")
    4. Me.TabControl1.SelectedIndex = 0
    5. Threading.Thread.Sleep(1000)
    6. ' Kräftedarstellung als Bilder im Temp-Ordner abspeichern um in PDF zu laden
    7. Dim bmp1 As New Bitmap(Panel_AK_X.Width, Panel_AK_X.Height)
    8. Using fs As Graphics = Graphics.FromImage(bmp1)
    9. fs.CopyFromScreen(Me.Location.X + Panel_AK_X.Location.X + 12, _
    10. Me.Location.Y + Panel_AK_X.Location.Y + TabControl1.Location.Y + 50, _
    11. 0, 0, bmp1.Size)
    12. End Using
    13. bmp1.Save("C:\Temp\AKX.png", Drawing.Imaging.ImageFormat.Png)
    14. ' Kräftedarstellung als Bilder im Temp-Ordner abspeichern um in PDF zu laden
    15. Dim bmp2 As New Bitmap(Panel_AK_Y.Width, Panel_AK_Y.Height)
    16. Using fs As Graphics = Graphics.FromImage(bmp2)
    17. fs.CopyFromScreen(Me.Location.X + Panel_AK_Y.Location.X + 12, _
    18. Me.Location.Y + Panel_AK_Y.Location.Y + TabControl1.Location.Y + 50, _
    19. 0, 0, bmp2.Size)
    20. End Using
    21. bmp2.Save("C:\Temp\AKY.png", Drawing.Imaging.ImageFormat.Png)
    22. Me.TabControl1.SelectedIndex = 1
    23. Threading.Thread.Sleep(500)
    24. ' Querkraftverlauf als Bilder im Temp-Ordner abspeichern um in PDF zu laden
    25. Dim bmp11 As New Bitmap(PB_querX.Width, PB_querX.Height)
    26. PB_querX.DrawToBitmap(bmp11, New System.Drawing.Rectangle(0, 0, PB_querX.Width, PB_querX.Height))
    27. bmp11.Save("C:\Temp\qkvX.png", Drawing.Imaging.ImageFormat.Png)
    28. ' Biegemomentenverlauf als Bilder im Temp-Ordner abspeichern um in PDF zu laden
    29. Dim bmp12 As New Bitmap(PB_biegeX.Width, PB_biegeX.Height)
    30. PB_biegeX.DrawToBitmap(bmp12, New System.Drawing.Rectangle(0, 0, PB_biegeX.Width, PB_biegeX.Height))
    31. bmp12.Save("C:\Temp\bmvX.png", Drawing.Imaging.ImageFormat.Png)
    32. If yEbene = True Then
    33. Me.TabControl1.SelectedIndex = 2
    34. Threading.Thread.Sleep(500)
    35. ' Querkraftverlauf als Bilder im Temp-Ordner abspeichern um in PDF zu laden
    36. Dim bmp21 As New Bitmap(PB_querY.Width, PB_querY.Height)
    37. PB_querY.DrawToBitmap(bmp21, New System.Drawing.Rectangle(0, 0, PB_querY.Width, PB_querY.Height))
    38. bmp21.Save("C:\Temp\qkvY.png", Drawing.Imaging.ImageFormat.Png)
    39. ' Biegemomentenverlauf als Bilder im Temp-Ordner abspeichern um in PDF zu laden
    40. Dim bmp22 As New Bitmap(PB_biegeY.Width, PB_biegeY.Height)
    41. PB_biegeY.DrawToBitmap(bmp22, New System.Drawing.Rectangle(0, 0, PB_biegeY.Width, PB_biegeY.Height))
    42. bmp22.Save("C:\Temp\bmvY.png", Drawing.Imaging.ImageFormat.Png)
    43. End If
    44. Me.TabControl1.SelectedIndex = 0
    45. End Sub


    Die .png Dateien von Page(0) sind TippiToppi. Die von Page(1) und Page(2) jedoch sind Leer. Wie bekomme ich das hin, dass diese nicht leer sind?

    Vielen Dank schon mal vorab.
    1. Visual Studio - Empfohlene Einstellungen

    Dann wirste erstmal nen paar Fehler bekommen.

    Refresh und Update sind da eh unnötig und bringen nur Nachteile. Anstelle auf eine PictureBox zu zeichnen und anschließend ein Bild daraus zu machen,warum machst du nicht direkt ein Bild und zeigst das dann einfach in den jeweiligen PictureBoxen an, die kannst du dann auch entsprechend abspeichern.
    msdn.microsoft.com/de-de/libra….fromimage(v=vs.110).aspx
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    @Icke Willkommen im Forum. :thumbup:
    Oder Du machst eine Prozedur, der Du das Graphics-Objekt übergibst, wo Du reinmalen kannst, was da reingehört.
    Kann ein PictureBox-Paint oder eine Bitmap sein.
    Und:
    Permanente Pausen mit Sleep(500) sind suboptimal.
    Und2:
    Wenn Du da mehrere Bitmaps generiert und nach dem Speichern nicht weggeräumt hast, wird der RAM knapp.
    Also:

    VB.NET-Quellcode

    1. Using bmp22 As New Bitmap(PB_biegeY.Width, PB_biegeY.Height)
    2. PB_biegeY.DrawToBitmap(bmp22, New System.Drawing.Rectangle(0, 0, PB_biegeY.Width, PB_biegeY.Height))
    3. bmp22.Save("C:\Temp\bmvY.png", Drawing.Imaging.ImageFormat.Png)
    4. End Using
    Und3 Teste mal dies:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Using bmp = New Bitmap(100, 100)
    3. Dim g = Graphics.FromImage(bmp)
    4. g.Clear(Color.White)
    5. g.DrawRectangle(Pens.Green, 10, 10, 80, 80)
    6. bmp.Save("C:\Temp\test.png", Imaging.ImageFormat.Png)
    7. End Using
    8. End Sub

    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!

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

    Vielen Dank schon mal für die schnelle Reaktion. Ich muss mal schauen ob es eine Benachrichtigung per mail gibt, damit ihr nicht lange auf eine Reaktion warten müsst... Sorry.

    @jvbsl
    Ich bin mir nicht sicher was die "deppeneinstellung" mit dem Problem zu tun hat. Vielleicht kannst du mir hierzu einen kleinen crash curse verpassen?
    Update ist das eine aber da mein Graph quasi eine Zoom Funktion hat, muss ich zwangsläufig ein refresh setzen damit die PictureBox wieder leer ist und neu "bemalt" werden kann. Und erst das Bild generieren und dann als in die PictureBox einbinden geht über mein Horizont...

    @RodFromGermany
    Die Thematik mit Sleep(500) ist daraus entstanden, dass ich die Vermutung habe dass das Bild erzeug wird bevor die PictureBox geladen wurde.

    Nochmal zur Problemstellung, denn ich glaube ich habe mich etwas ungeschickt ausgedrückt.
    Auf der page(0) werden numerische Eingaben gemacht, woraus ich dann die Werte für die Graphen (Page(1) und ggf. Page(2)) berechne. Dann möchte ich die Werte und die Graphen in einer PDF speichern, um diese als Dokumentation zu haben oder um zu einem späteren Zeitpunkt wieder einzulesen, zu ändern oder weiter zu verarbeiten. Vor dem übertragen der Werte in die PDF sollen die Bilder der Graphen im "temp" Ordner gespeichert werden, damit ich diese dann in die PDF laden kann. Somit rufe ich die Page(0) auf und speichere die ersten beiden Bilder. (Funktioniert tadellos) Dann wechsle ich den TabControl.Index zu (1) um die Page(1) anzeigen zu lassen. Die Graphen werden neu erstellt und dann gespeichert werden. Und hier liegt das Problem. Das PictureBox.Paint event wird scheinbar garnicht ausgeführt... Denn Bild zeigt zwar die Labels welche ich eigefügt habe, aber nicht die Linien... Im vb wird, im normal Fall, nicht parallel gearbeitet, daher denke ich dass der Aufruf PB_querX.Invalidate() übergangen wird... Warum auch immer. Der Debugger übergeht das Event ganz fleißig... ;(

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Icke“ ()

    Für das neu zeichnen hast du ja Invalidate(hast du ja bereits verwendet). Aber nicht Update/Refresh, die machen noch vieles anderes (für diesen Fall) unnötiges Zeug. Dann wenn du ein Bitmap verwendest was wie gesagt sowieso sinnvoll ist und du dort das bereits vorhandene löschen musst(also nur wenn sich auch tatsächlich etwas ändert), dann gibt es Graphics.Clear:
    msdn.microsoft.com/de-de/libra…hics.clear(v=vs.110).aspx

    Die "Deppeneinstellung" hat direkt nichts mit dem Problem zu tun, aber mit vielen anderen Problemen. Es verleitet einfach schlechten Code zu führen, für den entweder der Compiler oder die Runtime raten muss, was du eigt. vor hattest und somit nicht ganz klar ist was passiert(Das kann sich dann theoretisch zwischen Runtime-Versionen sogar unterscheiden).
    bmp speichern mit e.Graphics.DrawLine in PictureBox_Paint
    Wird z.B. über Latebinding gemacht. Zur Runtime wird er über Reflection überprüfen ob eine Update-Methode in diesem Objekt vorhanden ist und diese Aufrufen. Late-Binding ist eine häufige Fehlerquelle, vorallem bei Refactoring und Codeänderungen.(Klar manchmal benötigt man Late-binding, aber die seltenen Anwendungsfälle lassen sich an einer Hand abzählen und selbst dabei ist für Latebinding ein eigener Wrapper besser, der die ganzen Typüberprüfungen und Reflection zeugs nur einmal macht und nicht bei jedem call, denn das ist auch noch verdammt teuer. Aber ich denke Late-binding kannst du dir dann angucken wen du es brauchst. Gut möglich dass du es nie brauchen wirst).

    Die Idee mit dem Sleep ist ansich gar nicht so dumm, es hat nur einen Haken: Es passiert wie alles andere auch im UI Thread. Also legst du den UI-Thread schlafen. Während der UI-Thread schläft können die Controls nichts machen, die MessageQueue wird nicht abgearbeitet, somit wird WndProc niemals aufgerufen und dadurch wird auch nie das Paint-Event aufgerufen, somit wird während dem Sleep das zeug nie gezeichnet. Theoretisch könnte das über Threading funktionieren, aber selbst da kannst du dich nicht darauf verlassen, der User kann viel machen um dir dazwischen zu funken und die Ausgabe doch irgendwie zu zerstören(Und man sollte - im sinnvollen Rahmen - immer für den DAU programmieren).

    Wie gesagt das ganze direkt auf Bitmaps zeichnen und in den PictureBoxen nur die Bitmaps anzeigen. Wenn es um Zoom und Offset geht, kannst du ja das Bitmap immer noch mit Graphics auf die Picturebox zeichnen, sofern dies den Output nicht beeinflussen soll.

    Falls du dann tatsächlich mit dieser Lösung irgendwann an die Grenzen des RAMs stoßen solltest(wofür 100 Seiten denk ich noch nicht reichen), dann kannst du die Bitmaps immer noch cachen, jenachdem wie einfach die Zeichen-Operationen sind, reicht sogar ein Bitmap für alle Seiten. Aber erst mal würde ich ein Bitmap pro Seite anlegen.

    Da kanst du dann eigt. auch schon gucken was man sinnvoll zusammenfassen kann, das kann dir auch die Übersicht erleichtern.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    Icke schrieb:

    Dann möchte ich die Werte und die Graphen in einer PDF speichern
    Ich hoffe, Du meinst XML.
    Leg Dir eine serialisierbare Klasse an, die Du mit den Daten befüllst, die kannst Du dann ganz easy als XML speichern und laden, gugst Du hier im ersten Snippet (WritewData, LoadData).
    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!
    @RodFromGermany
    Nein, denn dann hätte ich es geschrieben... in xml habe ich alle "primelfaktoren", Werkstoffkennwerte, etc. welche als "konstanten" betrachtet werden. Änderungen daran werden dann via DataGridView gemacht. Die PDF nutze ich rein aus Dokumentations-, Tausch- und Speicher/Laden zwecke. So können Kollegen die Berechnungen nachvollziehen, und ggf. anpassen. Das gesamte Projekt besteht aus vielen Teilgebieten, welche einzeln berechnet werden oder aufbauend durchgeführt werden... Daher fand ich die Idee toll, alle "User-Eingaben" und "Ergebnisse" in einer PDF zur Doku, oder zu Speichern oder zum upload in das Programm. Bis jetzt stelle ich keine negativen Sachen vor. Oder ist mir nur noch nichts aufgefallen?!

    @jvbsl
    Danke für die ausführliche Erläuterung. Leider bin ich heute nicht dazu gekommen. Ich werde mich morgen damit beschäftigen und dann Rückmeldung geben.

    Icke schrieb:

    Die PDF nutze ich rein aus Dokumentations-, Tausch- und Speicher/Laden zwecke.
    Zum Laden :?:
    Oder zeigst Du die nur an?
    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!

    Icke schrieb:

    wenn es auch mit einer geht...
    Du bist der erste überhaupt, von dem ich weiß, der aus einer PDF Daten ausliest, um sie als solche zu verwenden.
    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!
    @jvbsl

    Ich habe mich die letzten Abende mit der "Deppeneistellung" beschäftigt...

    jvbsl schrieb:

    Dann wirste erstmal nen paar Fehler bekommen.


    Paar Fehler??? Auweia, wir reden hier von mehr als 100 in einer Datei... Ich verstehe den Sinn eines expliziten Aufrufs, sei es nun Variablendefinition oder Methoden. Das würde für mich bedeuten, dass ich alle Strings aus Objekten in Variablen packen muss und dann erst im code verarbeiten kann. Ich habe zwar immer darauf geachtet, dass die ein numerischer Wert auch nur eine numerische Eingabe vom User zulässt, aber um es konsequent zu machen müsste ich doch alles umschreiben. Und ich muss dann sehr kreativ werden, was die Variablennamen angeht damit es übersichtlich bleibt...

    Zurück zum eigentlichen Thema:

    Beim umschreiben und ausprobieren der Vorschläge ist mir dann etwas aufgefallen. Mit

    VB.NET-Quellcode

    1. Me.TabControl1.SelectedIndex = 1


    wird das Event

    VB.NET-Quellcode

    1. TabControl1_TabIndexChanged


    nicht ausgelöst. Jedenfalls nicht immer. Warum das so ist kann ich nur vermuten, aber ich denke es liegt am Mac und der virtuellen Maschine. Darauf hin habe ich es nun so gelöst:

    VB.NET-Quellcode

    1. Sub saveForPDF()
    2. '....
    3. Me.TabControl1.SelectedIndex = 1
    4. Call TabControl1_MouseClick(Me.TabControl1, Nothing)
    5. '....
    6. End Sub
    7. Private Sub TabControl1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TabControl1.MouseClick
    8. Select True
    9. Case sender.SelectedIndex = 1
    10. drawQuer = True : PB_querX.Invalidate()
    11. drawBiege = True : PB_biegeX.Invalidate()
    12. Case sender.SelectedIndex = 2
    13. drawQuer = True : PB_querY.Invalidate()
    14. drawBiege = True : PB_biegeY.Invalidate()
    15. End Select
    16. End Sub
    17. Private Sub TabControl1_TabIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabControl1.TabIndexChanged
    18. Call TabControl1_MouseClick(sender, Nothing)
    19. End Sub


    Es funktioniert sowohl auf meinem Rechner als auch einem Rechner mit Win10 exzellent. Ich bedanke mich bei euch für die Hilfe und freue mich darauf evtl. auch mal anderen helfen zu können.

    @RodFromGermany

    RodFromGermany schrieb:

    Du bist der erste überhaupt, von dem ich weiß, der aus einer PDF Daten ausliest, um sie als solche zu verwenden.


    Ist das gut oder schlecht? Wie schon erwähnt, bis lang habe ich nichts nachteiliges feststellen können... Bin für deine Gedankengänge offen. :)
    Nun du kannst ja mal zeigen, wo du sonst noch so Fehler hast(im Code oben hab ich dir ja sowieso schon gesagt was unnötig ist.
    100 Fehler heißen, du hast mind. diese 100 Sachen auch falsch gemacht.
    Der Code wird dadurch vlt. ein paar zusätzliche Dinge bekommen, aber unübersichtlicher wird er bestimmt nicht, eher im Gegenteil.
    Ich frag mich z.B. wieso du irgendwo überhaupt einen string in Objekten gespeichert hast?
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    Icke schrieb:

    Ist das gut oder schlecht?
    Kann ich nix zu sagen, ich hab solch noch nicht gemacht.
    Bei mir werden Daten XML- oder binär serialisiert.
    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!
    Case sender.SelectedIndex dürfte bei Option Strict On gar nicht laufen, da sender vom Typ Object ist und damit keine Property SelectedIndex hat.
    btw: Ich halte es für … abwegig, einen EventHandler mittels eines EventHandlers aufzurufen (Post#11, Zeile 30). Einfach das ganze Gesums aus TabControl1_MouseClick in eine passende Sub mit gutem Namen und vernünftigen Parametern packen und alle EventHandler sollen diese Sub aufrufen. Da ist man viel flexibler. Und aufgeräumter ist es auch.
    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.
    Zu den genannten Fehler "Update" und "Refresh" kann ich nur sagen, dass das "Refresh" durch .Invalidate() wirklich doppelt gemoppelt ist... Das "Update" der PictureBox jedoch ist nötig, sonst wird das gemalte nicht in der PictureBox dargestellt. Frag mich nicht warum das so ist...

    Als Ingenieur hänge ich an den mathematischen Operatoren... Bei "Option Strict On" wird mir vorgeschlagen "<>" durch "isnot" und "=" durch "is" zu ersetzen. Was bei Strings und Boolean durchaus Sinn macht. Bei numerischen Vergleichen machen natürlich die mathematischen Operatoren mehr Sinn. Ich werde Stück für Stück alles durchgehen und korrigieren.

    jvbsl schrieb:

    Ich frag mich z.B. wieso du irgendwo überhaupt einen string in Objekten gespeichert hast?


    Der Text in einer TextBox ist doch bei "TextBox.Text" => ein String?! Ebenso andere Objekte. Somit muss ich erst die Eingabewerte in einer Variablen, (Integer, double, ...) je nach bedarf, hinterlegen um Sie dann im richtigem Kontext zu verarbeiten...

    Aber ich werde mir die Mühe machen und alles mal anpassen. Danke :)
    Hi, ich muss dann doch noch mal nerven... ;)

    Bei Option Strict On​ bin ich gerade an einer Stelle angekommen wo ich eine Frage habe:

    VB.NET-Quellcode

    1. For Each items As Object In Panel_AK_X.Controls
    2. If (TypeOf items Is PictureBox) Then
    3. If items.Name Is "pf_" & DGV_N_X.Rows(DGV_N_X.CurrentRow.Index).Cells("bezeichnungX").Value & "x" Then Panel_AK_X.Controls.RemoveByKey(items.Name) : Panel_AK_X.Update()
    4. If items.Name = "pf_" & DGV_N_X.Rows(DGV_N_X.CurrentRow.Index).Cells("bezeichnungX").Value & "axialX" Then Panel_AK_X.Controls.RemoveByKey(items.Name) : Panel_AK_X.Update()
    5. End If
    6. If (TypeOf items Is Label) Then
    7. If items.Name Is "name_" & DGV_N_X.Rows(DGV_N_X.CurrentRow.Index).Cells("bezeichnungX").Value & "x" Then Panel_AK_X.Controls.RemoveByKey(items.Name) : Panel_AK_X.Update()
    8. End If
    9. Next


    Ich könnte jetzt zwei For Each Schleifen generieren wo ich einmal nach Picturebox und einmal nach Label suche... Aber gibt es da nicht eine Möglichkeit, wie man in diesem Fall "ein spätes binden" zulassen kann? oder muss ich echt alle Elemente zweimal durchlaufen?

    @VaporiZed und @jvbsl

    Ja das macht Sinn. Daher habe ich es jetzt so gemacht:

    VB.NET-Quellcode

    1. Sub changeTabControl(ByVal oObject As TabControl)
    2. Select Case True
    3. Case oObject.SelectedIndex = 1
    4. drawQuer = True : PB_querX.Invalidate()
    5. drawBiege = True : PB_biegeX.Invalidate()
    6. Case oObject.SelectedIndex = 2
    7. drawQuer = True : PB_querY.Invalidate()
    8. drawBiege = True : PB_biegeY.Invalidate()
    9. End Select
    10. End Sub
    11. Private Sub TabControl1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TabControl1.MouseClick
    12. Dim oObject As TabControl = TabControl1
    13. Call changeTabControl(oObject)
    14. End Sub
    15. Private Sub TabControl1_TabIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabControl1.TabIndexChanged
    16. Dim oObject As TabControl = TabControl1
    17. Call changeTabControl(oObject)
    18. End Sub


    Ich denke wenn ich ​Dim oObject as ..... = ..... immer als Standard definiere so kann ich ​oObject in dieser ​Sub nutzen oder als Parameter weitergeben. Ich denke das dies doch dann eine saubere Lösung ist. Oder? Und ich hätte mal die Fehlerliste bis ganz nach unten scrollen sollen... =>Die maximale Fehleranzahl wurde überschritten<=
    aaaaaaahhhhhh :S Naja nützt ja nix. Also dann frisch an Werk... :D

    Icke schrieb:

    Aber gibt es da nicht eine Möglichkeit
    So was:

    VB.NET-Quellcode

    1. For Each btn As Button In Me.Controls.OfType(Of Button)()
    2. btn.Enabled = False
    3. Next
    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!

    Icke schrieb:

    Der Text in einer TextBox ist doch bei "TextBox.Text" => ein String?! Ebenso andere Objekte. Somit muss ich erst die Eingabewerte in einer Variablen, (Integer, double, ...) je nach bedarf, hinterlegen um Sie dann im richtigem Kontext zu verarbeiten...
    Ich finds immer ganz wichtig, sich präzise auszudrücken. Letztendlich ist das sogar das einfachste - also wo du sagst:
    "Der Text in einer TextBox ist doch bei "TextBox.Text" => ein String?!"
    und bist nicht ganz sicher, sagt der Programmierer:
    "Die Textbox.Text - Property ist vom Datentyp String"
    Und das ist ganz sicher.

    Mit sowas: "Ebenso andere Objekte." kann man garnix anfangen. Was kann das meinen? Dass andere Objekte auch vom Datentyp String sein können? Ja - das ist sicher richtig - aber niemand weiß in welcher Hinsicht das irgendwas zu irgendeiner Klärung beizutragen vermag.

    Weiter gehts: "Somit muss ich erst die Eingabewerte..." Was meinst du mit "Eingabewert"? - den Textbox-Text? - meinetwegen
    "...in einer Variablen, (Integer, double, ...) je nach bedarf, hinterlegen..." in einer Variablen kann man nur ein Datentyp sein (Integer oder double,...) - meinst du evtl. mehrere verschiedene Variablen? - meinetwegen, aber ob du das wirklich musst, was ich erahne, was du zu müssen glaubst - ich glaubs nicht, dass du das musst.
    "...um Sie dann im richtigem Kontext zu verarbeiten..." ja, das richtige tun, im richtigen Kontext - das ist auch unbestreitbar richtig - hilft nur zu nix weiter.

    Was ich mir vorstellen könnte, was weiter hülfe, wären ein paar Code-Zeilen von dir - da kann man dann ganz konkret sagen: "Ja, in diesem Kontext nimm besser ein NumericUpdown statt einer Textbox", oder "Ja, wenn du den Integer in der Textbox anzeigen willst, musste ihn nach String konvertieren" - sowas.

    Also am konkreten Beispiel kommt man glaub sehr schnell auf den richtigen Trichter, was abstrakt allgemein formuliert und noch unter Verwendung ungenauer Begrifflichkeiten "wahrhaft unaussprechlich" ist ;)



    Edit - Bockmist! Der ganze Post womöglich obsolet - ihr seid ja schon dabei, konkreten Code anzugugge.
    @ErfinderDesRades

    Danke für die Antworten:

    ErfinderDesRades schrieb:

    "Die Textbox.Text - Property ist vom Datentyp String"

    ErfinderDesRades schrieb:

    "Ja, wenn du den Integer in der Textbox anzeigen willst, musste ihn nach String konvertieren"


    Und Danke für die Informationen:

    ErfinderDesRades schrieb:

    sich präzise auszudrücken

    ErfinderDesRades schrieb:

    konkreten Beispiel


    Und nun...
    Da ich eine Fragestellung in einem Forum gestellt habe und mir schon in der ersten Antwort verdeutlicht wurde, das ich fehlerhaften Code erzeuge, verdeutlicht doch dass ich KEIN Programmierer bin.

    Da du meine Fragen oder Unsicherheiten beantwortet hast, ist meine Ausdrucksweise präzise genug. Dennoch möchte ich es dir einmal vor Augen führen:

    ErfinderDesRades schrieb:

    "Der Text in einer TextBox ist doch bei "TextBox.Text" => ein String?!"
    und bist nicht ganz sicher

    Ist doch gar nicht so schwer zu verstehen. Und ja, ein Programmierer würde es anders ausdrücken. Überraschung, ich bin kein Programmierer....

    ErfinderDesRades schrieb:

    Mit sowas: "Ebenso andere Objekte." kann man garnix anfangen. Was kann das meinen? Dass andere Objekte auch vom Datentyp String sein können? Ja - das ist sicher richtig - aber niemand weiß in welcher Hinsicht das irgendwas zu irgendeiner Klärung beizutragen vermag.
    Die wenigsten Phrasen ergeben einen Sinn wenn diese aus Zusammenhang gerissen wurden. Dies ist eine sehr präzise Feststellung, da es auch andere Objekte mit einem ".Text Property vom Datentyp String" gibt! "Kann man garnix anfangen" Über überflüssige Angaben könnte man gerne diskutieren. Jedoch nicht mit dir. Denn wer im Glashaus sitzt sollte nicht mit Steinen werfen. Denn aus deinem ganzen Text habe ich die obigen zwei Informationen und zwei Antworten rausziehen können.

    Icke schrieb:

    Der Text in einer TextBox ist doch bei "TextBox.Text" => ein String?! Ebenso andere Objekte. Somit muss ich erst die Eingabewerte in einer Variablen,
    Ja, das ist schon etwas schwierig, den Rückschluss von "Eingabewert" auf "Der Text in einer TextBox". Aber auch ist dir gelungen. Daher meinen Glückwunsch...

    ErfinderDesRades schrieb:

    Weiter gehts: "Somit muss ich erst die Eingabewerte..." Was meinst du mit "Eingabewert"? - den Textbox-Text? - meinetwegen
    "...in einer Variablen, (Integer, double, ...) je nach bedarf, hinterlegen..." in einer Variablen kann man nur ein Datentyp sein (Integer oder double,...) - meinst du evtl. mehrere verschiedene
    Die Aussage: "je nach bedarf" impliziert ein "oder". Das ist dir nicht präzise genug? Auweia!

    ErfinderDesRades schrieb:

    ...um Sie dann im richtigem Kontext zu verarbeiten..." ja, das richtige tun, im richtigen Kontext - das ist auch unbestreitbar richtig - hilft nur zu nix weiter.
    Doch es hilft, jedoch nicht dir! Es ist eine Aussage damit die anderen (welche mir Hilfestellung gaben) sehen, dass ich es verstanden haben was ich bis dato missachtet habe. Es ist eine Form der Höflichkeit, den anderen gegenüber. Aber da deine erste Antwort zu diesem Thema vor Arroganz nur so trieft, bezweifel ich, dass dir ein höflicher Umgang geläufig ist.

    @RodFromGermany

    Damit ich das richtig verstehe: Hier ​For Each btn As Button In Me.Controls.OfType(Of Button)() werden NUR alle Buttons der Userform durchlaufen und alle anderen Objekte der Userform werden nicht berücksichtigt?