![]() |
Frage zur Unit_OpenPTC
Hallo,
ich habe ein Problem mit dem Open PTC - Grafikpaket für Delphi. Ich habe das Testprogramm DelphiOpenPTCTester aus dem Paket OpenDelphiPTC100 studiert und aus den gewonnenen Erkenntnissen folgende Unit gebaut:
Delphi-Quellcode:
unit Unit_PTCConsole;
interface uses Unit_OpenPTC; var _format : PTC_FORMAT; _surface : PTC_SURFACE; _console : PTC_CONSOLE; _pixels : pointer; _width, _height : integer; { wenn TPixel-Klasse funktioniert, dann obige globale Variablen in Interfaceteil } type TPixels = class(TObject) private function GetPixels(x, y: Integer): Longint; procedure SetPixels(x, y: Integer; const Value: Longint); public constructor Create; destructor Destroy; override; property pixels[x,y: Longint]: Longint read GetPixels write SetPixels; end; procedure BeginToPaint; //nicht BeginPaint / EndPaint, weil letztere in procedure EndToPaint; //der VCL existent var Pixels: TPixels; //Instanz meiner Pixels Klasse für bequemere Zuweisung. implementation procedure BeginToPaint; begin _pixels := ptc_surface_lock(_surface); // just use normal pointer. dont use dynamic array or bug ! // get surface dimensions _width := ptc_surface_width(_surface); _height := ptc_surface_height(_surface); Pixels := TPixels.Create; end; // // longint(pointer(longint(_pixels) + x*4 + y*_width*4)^) := (r shl 16) + (g shl 8) + b; // procedure EndToPaint; begin ptc_surface_unlock(_surface); // copy to console ptc_surface_copy(_surface,_console); // update console ptc_console_update(_console); Pixels.Free; end; { TPixels } constructor TPixels.Create; begin inherited Create; end; destructor TPixels.Destroy; begin inherited; end; function TPixels.GetPixels(x, y: Integer): Longint; begin Result := Longint(_pixels); end; procedure TPixels.SetPixels(x, y: Integer; const Value: Longint); begin longint(pointer(longint(_pixels) + x*4 + y*_width*4)^) := Value; end; initialization _console := ptc_console_create(); _format := ptc_format_create_direct(32,$00FF0000,$0000FF00,$000000FF,0); ptc_console_option( _console, 'windowed output' ); ptc_console_open_format(_console,'Delphi example',_format,0); _surface := ptc_surface_create(ptc_console_width(_console),ptc_console_height(_console),_format); if (ptc_console_key(_console)<>0) then ; finalization ptc_console_close(_console); ptc_surface_destroy(_surface); ptc_format_destroy(_format); ptc_console_destroy(_console); end. Wenn ich nun jedoch den Zeiger _pixels verwenden will. erhalte ich eine EAccessviolation und der Pointer _pixels ist nicht initialisiert. eine Draw Funktion in einer anderen Unit könnte ja so aussehen:
Delphi-Quellcode:
Aber die Zuweisung an _pixels endet in beiden Fällen mit einer Exception. Warum?
procedure <TAnyControl>.Draw;
begin BeginToPaint; //lock surface und Übergabe des Surface Zeigers an _pixel //nun entweder: longint(pointer(longint(_pixels) + x*4 + y*_width*4)^) := myColoredPixel; //oder Pixels[X, Y] := myColoredPixel; EndToPaint; //surface wieder frei geben. end; Das Testprogramm funktioniert einwandfrei. Ich habe dort dieselben Schritte per ButtonClick ausgeführt, die ich in derselben Reihenfolge in der Unit_PTCConsole in der Prozedur BeginToPaint aufgeführt habe. Warum funktioniert das Testprogramm aber nicht meine Unit? |
AW: Frage zur Unit_OpenPTC
Was willst Du mit diesem OpenPTC überhaupt machen?
|
AW: Frage zur Unit_OpenPTC
Zuerst einmal um paar Grafik Zeichenfunktionen erweitern. Text kann PTC auch noch nicht ausgeben. Bisher existiert da nur die nackte Grafik Engine. Die Funktionen zum Zeichenen von Linien, Kreisen, Ellisen, Rechtecken,... möchte ich gerne nachrüsten. Ebenso braucht es eine Textausgabe.
Ja, ich weiß, es gibt ptcGraph. Aber wie gut funktioniert das. Wie stelle ich dort einen passenden Grafikmodus ein. Scheint nicht ganz so simpel zu sein, wie in der originalen Graph Unit. Hatte jedenfalls in Lazarus damit kein Glück. Andere Frage, Lässt diech die Unit ptcGraph auch mit Delphi übersetzen. Dann könnte ich mir die geplante Arbeit sparen. WinGraph hängt sich auf. Hab ich gestern mit Delphi probiert. gdriver = m1280x1024 gdriver = m800x600 gdriver = 640x480 jeweils mode = D8Bit Sollte doch unter Windows funktionieren, tut es aber nicht. Die WinGraph Konsole erscheint zwar, aber danach ist Ende. Programm eingefroren in Turbo Delphi, das danach nur noch mit Taskmanager beendet erden kann und auch muss, da ein "Schwerer Debuggerfehler" auftritt und Delphi dann auch nicht mehr arbeitet. gdriver := Detect; klappt leider auch nicht. Sollte ptcGraph nicht für Delphi übersetzbar sein oder danach Schwierigkeiten machen, will ich die Funktionen selber implementieren. Unter Windows sollte doch dann eine Pseudoprozedur InitGraph funktionieren, die nur Dummy Parameter erhält, in Wirklichkeit aber dieselbe Grafikauflösung einstellt, die ich aktuell in Windows benutze. Wenn das erst mal funktioniert, kann ich mich andere Modi kümmern. Wenn aber der Fenstermodus eh mit allen Grafikmodi ebenso funktioniert, wie der Vollbildmodus, dann ist es für meine Zwecke genug, wenn einfach derselbe Grafikmodus verwendet wird, den ich in meinem Windoes eh eingestellt habe. Nun die Frage, muss ich die Zeichenfunktionen nachrüsten oder kann ich ptcGraph doch verwenden. Wenn das wenigstens mit Lazarus geht, wie muss dann InitGraph(gdriver, gmode, ''); aussehen, damit der Grafikmodus idiotensicher funktioniert? |
AW: Frage zur Unit_OpenPTC
Um das nochmal klarzustellen, damit ich das jetzt richtig verstehe: Du willst also unbedingt in einer Console Grafik ausgeben?
Wenn ja, warum dann keine VCL, LCL, FMX, WinForms, DirectX und was es sonst noch alles für laaaaaaangjährig existierende grafische Ausgaben gibt? |
AW: Frage zur Unit_OpenPTC
Hast Du mal
![]() |
AW: Frage zur Unit_OpenPTC
Liste der Anhänge anzeigen (Anzahl: 1)
[quote=himitsu]Um das nochmal klarzustellen, damit ich das jetzt richtig verstehe: Du willst also unbedingt in einer Console Grafik ausgeben?
Nein, nicht auf einer Text-Console. Der Zeiger auf den Ausgabebildschirm heißt nur console, ist aber in Wirklichkeit ein Grafikbildschirm, der so weit alle gängigen Grafikmodi unterstützt.
Delphi-Quellcode:
//die folgende Anweisung erzeugt einen virtuellen Bildschirm
_console := ptc_console_create(); //nun wird das Pixelformat eingestellt, also TrueColor (32 Bit/Pixel) und die Farbmaske für //Blau, Grün und Rot _format := ptc_format_create_direct(32,$00FF0000,$0000FF00,$000000FF,0); //Will ich diesen Grafikbildschirm im Vollbildmodus oder als Fenster? Hier als Fenster! ptc_console_option( _console, 'windowed output' ); //Jetzt wird die Grafikconsole mit dem eingestellten Pixelformat geöffnet ptc_console_open_format(_console,'Delphi example',_format,0); //Nun wird ein Zeiger auf die echte (sichtbare) Bildschirmoberfläche erzeugt _surface := ptc_surface_create(ptc_console_width(_console),ptc_console_height(_console),_format); //Wenn ich nun Zeichnen will, muss ich folgendes machen: _pixels := ptc_surface_lock(_surface); // just use normal pointer. dont use dynamic array or bug ! // get surface dimensions (Ausdehnung des Grafikbildschirmes. _width := ptc_surface_width(_surface); _height := ptc_surface_height(_surface); //Dann sollte ich zeichnen können. Im Testprogramm funktioniert das auch, aber nicht mit //derobigen //Unit. //So hier: //Nur Beispiel wie ein Pixel ausgegeben wird. Longint(pointer(longint(_pixels) + x*4 + y*_width*4)^) := (r shl 16) + (g shl 8) + b; Longint(pointer(longint(_pixels) + x*4 + y*_width*4)^) := ColorValue as Longint //der Multiplikator 4, weil 4 Byte je Pixel //Wenn alles gezeichnet ist, muss noch das hier gemacht werden //Surface wieder frei geben ptc_surface_unlock(_surface); // copy to console ptc_surface_copy(_surface,_console); // update console, Jetzt ist das Pixel oder das Bild zu sehen. ptc_console_update(_console); Mein Problem ist jetzt aber, das der Zeiger _pixels nicht korrekt zugewiesen wird. Eigenartiger Weise funktioniert aber mein Testprogramm, das ich als Anhang mal mit poste. Zitat:
Zitat:
|
AW: Frage zur Unit_OpenPTC
Zitat:
GR32 ist weiter verbreitet (glaub ich) und man bekommt eher eine Antwort als bei Unbekannterem. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:46 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 by Thomas Breitkreuz