![]() |
GDIPlus (Erik van Bilsen) mit ‘(GDI+Error) Generic Error’ nach Zugriff auf WinControl
Liste der Anhänge anzeigen (Anzahl: 2)
Beschreibung des Symptoms
Es liegt eine initialisierte lokale Variable g des Typs IGPGraphics vor, die bereit ist, in eine Steuerelement der Klasse TPaintBox Bildschirmausgaben zu tätigen. Wenn nach der Initialisierung von g ein Zugriff auf die Felder von Instanzen der Klassen TComboBox, TListBox oder TMemo erfolgt, wird die nachfolgende Zeichenoperation mittels g mit der Fehlermeldung „(GDI+Error) Generic Error“ abgebrochen. Wird nach dem Zugriff g neu initialisiert, dann tritt der Fehler nicht mehr auf. Interpretation Offensichtlich hat der lesende Zugriff auf die Klassen TComboBox, TListBox und TMemo einen schreibenden Seiteneffekt auf die lokale Variable g zur Folge. Aufgrund der Kapselung dürfte ein solcher Effekt nicht eintreten. Die Klassen TComboBox, TListBox und TMemo enthalten alle eine Klasse vom Typ TStringlist. Wenn man auf eine separate Instanz des Typs TStringList vor der GDI-Operation einen Zugriff ausführt, dann tritt kein Fehler auf. Der Code von Erik van Bilsen ist minimalistisch und offensichtlich fehlerfrei. Kommt der Seiteneffekt aus dem Betriebssystem oder aus der VCL? Demonstrationsprogramm Rechts auf dem Formular befindet sich ein Optionsfeld, in dem der Fall ausgewählt werden kann. Die Schaltfläche „GDI Test“ bringt dann die Zeichenoperationen zur Ausführung. Es wird ein Kreuz in der Zeichenfläche im Formular unten ausgeführt. Bei den Optionen „Kein Zugriff“ und „Zugriff mit Neuinitialisierung“ wird, ohne eine Fehlermeldung hervorzurufen, gezeichnet. Quellcode befindet sich in der angehängten .zip-Datei. |
AW: GDIPlus (Erik van Bilsen) mit ‘(GDI+Error) Generic Error’ nach Zugriff auf WinCon
Die VCL erlaubt nur eine begrenzte Zahl (4) gleichzeitig von TControlCanvas geöffneter Device Contexts zu einer bestimmten Zeit. Deswegen wird der Device Context eines TControlCanvas (das Handle) intern freigegeben, wenn eine andere TControlCanvas-Instanz eines benötigt. Ich vermute mal, daß nach dem Zugriff auf das jeweils andere Control das PaintBox1.Canvas.Handle auf 0 steht (kannst du ja mal prüfen).
|
Der Hinweis ist nicht zutreffend.
Liste der Anhänge anzeigen (Anzahl: 1)
Im Demoprogramm zeigt sich im Debugger, dass die Handle PaintBox1.Canvas.Handle gültig bleibt, d. h., nicht den Wert 0 annimmt.
Es wundert mich warum die VCL die Zahl der offene Canvas-Handle-Nummern limitieren sollte. Die verfügbaren Handle-Nummern werden vom Betriebssystem verwaltet und sind von dessen Seite „limitiert“. Prinzipiell können bei 32-Bit-Betrieb in dem Pool der Canvas-Handle-Nummern 4 Milliarden Nummern angelegt werden, was dann einem Speichervolumen von 16 Gigabyte bei einem Adressraum vom maximal 4 Gigabyte entspricht. Wenn ich ein Formular mit 5 TPaintBox-Instanzen anlege und die gleichzeitig offenen Handle-Nummern mittels der Anweisung
Code:
ausgeben lasse, dann erhalte ich keinen Nullwert bei den Handlenummern. Siehe angehängtes Bild.
ShowMessage(IntToStr(PaintBox1.Canvas.Handle) + #13#10 +
IntToStr(PaintBox2.Canvas.Handle) + #13#10 + IntToStr(PaintBox3.Canvas.Handle) + #13#10 + IntToStr(PaintBox4.Canvas.Handle) + #13#10 + IntToStr(PaintBox5.Canvas.Handle)); |
AW: GDIPlus (Erik van Bilsen) mit ‘(GDI+Error) Generic Error’ nach Zugriff auf WinCon
Liste der Anhänge anzeigen (Anzahl: 1)
Gewöhne Dir an nur im WM_Paint zu zeichnen.
Das ist in meinen Augen einer der grössten DesignFehler von Windows das außerhalb des PaintEvents gezeichnet werden kann. Ich habe das Projekt mal angepasst: Es wird nur im onPaint der Paintbox gezeichnet. |
AW: Der Hinweis ist nicht zutreffend.
Zitat:
Ändere mal den Aufruf so und vergleiche den ersten und letzten Wert:
Delphi-Quellcode:
Lass die PaintBox5 weg und die Werte sind gleich.
ShowMessage(
IntToStr(PaintBox1.Canvas.Handle) + #13#10 + IntToStr(PaintBox2.Canvas.Handle) + #13#10 + IntToStr(PaintBox3.Canvas.Handle) + #13#10 + IntToStr(PaintBox4.Canvas.Handle) + #13#10 + IntToStr(PaintBox5.Canvas.Handle) + #13#10 + IntToStr(PaintBox1.Canvas.Handle) ); |
AW2: Der Hinweis ist nicht zutreffend.
[QUOTE=Uwe Raabe;1421765]
Zitat:
|
AW: GDIPlus (Erik van Bilsen) mit ‘(GDI+Error) Generic Error’ nach Zugriff auf WinCon
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Vielen Dank für Deinen Beitrag, der mich effektiv weiter gebracht hat. |
AW: AW2: Der Hinweis ist nicht zutreffend.
Zitat:
|
AW: Der Hinweis ist nicht zutreffend
Zitat:
|
AW: Der Hinweis ist nicht zutreffend
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz