Grafik zeichnen bei Form_Load ?

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von EaranMaleasi.

    Grafik zeichnen bei Form_Load ?

    Hi!

    Folgendes Problem:

    Ich habe eine Statistiksoftware mit einer Datentabelle. Auf Knopfdruck geht eine neue Form auf und präsentiert die Daten als Grafik.

    Erste Idee: Das Berechnen und Zeichnen der Grafik unter Form2_Load() zu integrieren. Funktioniert aber nicht, die Grafik ist nicht zu sehen. Selbst wenn ich am Beginn me.Show und/oder me.Refresh schreibe, wird die Grafik nicht gezeichnet. Ich vermute, Form2_Load() geschieht zu früh.

    Zweite Idee: Das Berechnen und Zeichnen der Grafik unter Form2_Activate() zu integrieren. Funktioniert prima mit einem entscheidenden Nachteil: Bei jedem Fensterwechsel und Rückkehr zum Grafikfenster wird die Grafik ungewollt neu gezeichnet. Klar, es wird ja auch "Activate" wieder ausgelöst.

    Wie mache ich es also richtig?

    Danke vorab.
    Am Ende von Form_Load() wird die Paint() aufgerufen. Wenn die Prozedur leer ist, wird die Form gelöscht.
    Wenn Du was darstellen willst, rufe

    VB.NET-Quellcode

    1. Me.Invalidate()
    2. Me.Update()
    auf und pack alle Zeichenaufgaben in die Paint-Routine.
    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!

    skyscater schrieb:

    Probiers mal im Paint-Ereignis.
    mfg.skyscater

    Paint() wird jedesmal aufgerufen, wenn auf der Form etwas gezeichnet wird, d.h. ich lande in einer Endlosschleife.

    Eine Lösung wäre, in Form2_Activate() einen Startwert auf TRUE zu setzen und das nochmalige Zeichnen zu verhindern, wenn dieser Wert auf TRUE ist. Aber besonders schön finde ich das nicht.

    heinkurz schrieb:

    Paint() wird jedesmal aufgerufen, wenn auf der Form etwas gezeichnet wird, d.h. ich lande in einer Endlosschleife.
    Völlig falsch.
    Paint() wird bei Update() aufgerufen.
    Mit Invalidate(...) wird kundgetan, welche Teilfläche(n) neu gezeichnet werden sollen.
    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!

    heinkurz schrieb:

    Paint() wird jedesmal aufgerufen, wenn auf der Form etwas gezeichnet wird, d.h. ich lande in einer Endlosschleife.
    Nein, es wird jedes mal aufgerufen, wenn sich die Form neu zeichnen soll. Das ist ein Unterschied

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Ich habe ein ähnliches Problem und konnte hier meine Lösung finden.
    ... obwohl der Thread hier sehr alt ist hilft es vielleicht auch anderen Nutzern (schließlich ist die Problemstellung immer noch vorhanden).

    Die einfache Lösung ist in der Tat, die Anzeige-Routinen in das PAINT-Ereignis zu überführen (Anzeige-Routinen hatte ich zuvor im Load-, bzw. Activated-Ereignis ... nix wurde angezeigt).
    ... um Endlos-Aufrufe zu vermeiden benötigt die Form lediglich ein einfaches Flag (siehe unten).

    (Anmerkung: Das "Zeichnen" der Form wird nicht unmittelbar nach dem Load-Ereignis ausgelöst ... sonst würde Form_Activated bereits greifen)

    VB.NET-Quellcode

    1. Public Class dlgTabelle
    2. Private erster_Aufruf As Boolean
    3. Private Sub dlgTabelle_Load(sender As Object, e As EventArgs) Handles Me.Load
    4. erster_Aufruf = True
    5. ...
    6. End Sub
    7. Private Sub dlgTabelle_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    8. If erster_Aufruf = False Then Exit Sub
    9. erster_Aufruf = False
    10. Anzeige_Ergebnis()
    11. Application.DoEvents()
    12. ...
    13. End Sub


    ... falls ich dabei etwas übersehe dann gern hier ergänzen.

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

    Mal abgesehen davon, daß du hier eien (Thread)Leiche ausgegraben hast, ist .DoEvents() der falsche Weg.
    Warum nicht Application.DoEvents()?