AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen GDIPlus (Erik van Bilsen) mit ‘(GDI+Error) Generic Error’ nach Zugriff auf WinControl
Thema durchsuchen
Ansicht
Themen-Optionen

GDIPlus (Erik van Bilsen) mit ‘(GDI+Error) Generic Error’ nach Zugriff auf WinControl

Ein Thema von HintByError · begonnen am 22. Dez 2018 · letzter Beitrag vom 24. Dez 2018
Antwort Antwort
HintByError

Registriert seit: 13. Dez 2018
Ort: Marburg
22 Beiträge
 
Delphi XE2 Professional
 
#1

AW2: Der Hinweis ist nicht zutreffend.

  Alt 23. Dez 2018, 18:00
[QUOTE=Uwe Raabe;1421765]
Das liegt daran, daß der Getter von Handle bei Bedarf ein neues Handle erzeugt. Sind bei dir nicht die Handle-Werte von PaintBox1 und PaintBox5 gleich? Du kannst das auch auf 6 und mehr Paintboxen ausdehnen, wirst aber vermutlich immer nur vier verschiedene Werte angezeigt bekommen.
Tatsächlich. In der Erwartung einer Null hatte ich nicht richtig beobachtet. Ein interessantes Detail, dass die Frage aufwirft, weshalb die VCL so sparsam mit Handlenummern umgeht. Vielleicht ist der Grund ein historisches Relikt. Ich halte es nicht für nötig. Die richtige Antwort auf den Ausgangsbeitrag findet sich in dem Beitrag von Fritzew.
Wolfgang Sauer
  Mit Zitat antworten Zitat
HintByError

Registriert seit: 13. Dez 2018
Ort: Marburg
22 Beiträge
 
Delphi XE2 Professional
 
#2

AW: GDIPlus (Erik van Bilsen) mit ‘(GDI+Error) Generic Error’ nach Zugriff auf WinCon

  Alt 23. Dez 2018, 18:07
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.
So ähnlich hatte ich es auch im ersten Ansatz programmiert. Über den Methodenzeiger TPaintBox.OnPaint wird gezeichnet und mit einem Aufruf von TPaintBox.Repaint wird der Inhalt aktualisiert. Wenn nur eine Darstellung benötigt wird, dann genügt dies. Es handelt sich bei dem richtigen Programm um eine Lady mittlerer Komplexität (ein Charting-Tool), siehe beigefügte Abbildung. In der oberen Leiste befinden sich 3 Auswahllisten für Finanztitel, Darstellungsbreite eines Intervalls und Variante der Darstellung. Mit den Ankreuzkästchen des offenen Menüs „Darstellungsoptionen“ lassen sich Linien in dem Diagramm ein- und ausblenden, wobei bei der Aktualisierung das Menü geöffnet bleibt. Es gibt 3 Methoden, die eine Ausgabe produzieren, und 2 davon wurden nicht über TPaintBox.OnPaint aufgerufen. Die 3. war die PaintBox.OnPaint selbst. Damit die beiden anderen auch von TPaintBox.OnPaint aufgerufen werden, ist der Code dahin gehend angepasst worden, dass über das Feld TPaintBox.Tag festgelegt wird, welche Methode innerhalb von PaintBox.OnPaint aufgerufen werden soll. Um die Sache zum Laufen zubringen, muss dann statt TPaintBox.Repaint tatsächlich TPaintBox.Invalidate verwendet werden. Wenn es nur um Teilbereiche geht, dann sollte man InvalidateRect verwenden. Eine der Routine zeichnet eine vertikale Positionsmarke in Form eines schmalen Rechteckes, die von der Mausposition abhängig ist. Diese Positionsmarke ist in der Abbildung nicht zu sehen. Für das Zeichnen einer solchen Positionsmarke hat sich gezeigt, dass die Blitting-Methode (BitBlT-Routine) mit dem direkten Speicherzugriff und das Zeichnen außerhalb von TPaintBox.OnPaint besser ist. Die Darstellung über TPaintBox.OnPaint reagiert hier zu träge, sodass man hier besser die Programmiertechnik der alten Dinosaurier verwendet. Man muss dabei dafür sorgen, dass vor der Initialisierung von IGPGraphics die benötigten Inhalte aus den Steuerelementen ausgewertet sind.

Vielen Dank für Deinen Beitrag, der mich effektiv weiter gebracht hat.
Angehängte Grafiken
Dateityp: png Bild 1.png (83,9 KB, 17x aufgerufen)
Wolfgang Sauer
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.771 Beiträge
 
Delphi 12 Athens
 
#3

AW: AW2: Der Hinweis ist nicht zutreffend.

  Alt 23. Dez 2018, 22:11
Ein interessantes Detail, dass die Frage aufwirft, weshalb die VCL so sparsam mit Handlenummern umgeht. Vielleicht ist der Grund ein historisches Relikt.
Delphi 1 lief damals noch auf Windows 3.x
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
HintByError

Registriert seit: 13. Dez 2018
Ort: Marburg
22 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Der Hinweis ist nicht zutreffend

  Alt 24. Dez 2018, 00:17
Zitat:
Delphi 1 lief damals noch auf Windows 3.x
Dazu muss ich aber einwenden, dass zu diesen Zeiten jede Menge Neues emuliert wurde. Windows 4.0 (sic!) erschien im August 1994 überraschenderweise oder unüberraschenderweise nicht. Je nach Hintergrundwissen. Das danach erscheinende Windows 95 hat mit einem Jahr zusätzlicher Entwicklungsarbeit richtig Hauruck gehabt. Die OWL (Object Windows Library) von TPW (Turbo Pascal for Windows) ist verschwunden und durch die VCL ersetzt worden. Windows 95 und Windows 98 konnten mit 8192 Selectoren mal 64 kByte 512 MByte adressieren. Das sind zwar nicht 4Gbyte, aber es liegt kein Anlass vor, noch so sparsam zu sein.
Wolfgang Sauer
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.771 Beiträge
 
Delphi 12 Athens
 
#5

AW: Der Hinweis ist nicht zutreffend

  Alt 24. Dez 2018, 08:59
aber es liegt kein Anlass vor, noch so sparsam zu sein.
Nein, natürlich nicht! Windows 3.11 wird ja von aktuellen Delphi-Versionen auch nicht mehr unterstützt. Es bedarf auch nur der Anpassung einer einzigen Konstante (CanvasListCacheSize) in Vcl.Controls um das zu ändern.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
HintByError

Registriert seit: 13. Dez 2018
Ort: Marburg
22 Beiträge
 
Delphi XE2 Professional
 
#6

AW: Der Hinweis ist nicht zutreffend

  Alt 24. Dez 2018, 20:24
Es bedarf auch nur der Anpassung einer einzigen Konstante (CanvasListCacheSize) in Vcl.Controls um das zu ändern.
Damit das mit der Änderung der Konstante erreicht wird, muss allerdings die Quellcodedatei Vcl.Controls.Pas mindestens in das Verzeichnis des Projektes kopieren und dann die nötige Änderung vornehmen. Wenn man mittels [Strg]-Click im uses-Abschnitt einfach nur die Datei in den Editor lädt, dann die Änderung vornimmt, dann hat dies keine Auswirkung. Die so geladene Datei kann man dann aber als Kopie mit der nötigen Änderung in das Projektverzeichnis legen. Das habe ich mal ausgeführt und Voilà man kann jetzt endlich mit CanvasListCacheSize=5 über 5 verschiedene Canvas-Handle-Nummern verfügen. Als Beweis habe ich ein Bildschirmfoto beigefügt.
Angehängte Grafiken
Dateityp: png Beweis.png (13,7 KB, 13x aufgerufen)
Wolfgang Sauer

Geändert von HintByError (24. Dez 2018 um 20:45 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:51 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