AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zur Unit_OpenPTC

Ein Thema von FragenderHerbert · begonnen am 4. Nov 2014 · letzter Beitrag vom 5. Nov 2014
Antwort Antwort
FragenderHerbert

Registriert seit: 4. Dez 2013
47 Beiträge
 
#1

Frage zur Unit_OpenPTC

  Alt 4. Nov 2014, 20:15
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:
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;
Aber die Zuweisung an _pixels endet in beiden Fällen mit einer Exception. Warum?


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?
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#2

AW: Frage zur Unit_OpenPTC

  Alt 4. Nov 2014, 23:02
Was willst Du mit diesem OpenPTC überhaupt machen?
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
FragenderHerbert

Registriert seit: 4. Dez 2013
47 Beiträge
 
#3

AW: Frage zur Unit_OpenPTC

  Alt 5. Nov 2014, 07:49
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#4

AW: Frage zur Unit_OpenPTC

  Alt 5. Nov 2014, 09:40
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?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 5. Nov 2014 um 13:17 Uhr)
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#5

AW: Frage zur Unit_OpenPTC

  Alt 5. Nov 2014, 12:34
Hast Du mal Graphics32 ausprobiert? Das funktioniert mit Lazarus, jedenfalls ist es bei Typhon schon lauffähig dabei. Da hast Du auch ein breiten Forum zum Fragen und auch einige Beispiele als Demos.
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
FragenderHerbert

Registriert seit: 4. Dez 2013
47 Beiträge
 
#6

AW: Frage zur Unit_OpenPTC

  Alt 5. Nov 2014, 12:49
[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 von himitsu:
Warum denn keine VCL, LCL, FMX, WinForms, DirectX und was es sonst noch alles für laaaaaaangjährig existierende grafische Ausgaben gibt?
Weil mich der Ehrgeiz gepackt hat, als ich das ptc Package im ../Source/Packages/ptc Ordner gefunden habe. Habe mit einem Computerfreund zusammen die Demos im Examples Ordner des Packages getestet und bin einigermaßen begeistert von der Ausgabegeschwindigkeit.

Zitat von Jens01:
Hast Du mal Graphics32 ausprobiert? Das funktioniert mit Lazarus, jedenfalls ist es bei Typhon schon lauffähig dabei. Da hast Du auch ein breiten Forum zum Fragen und auch einige Beispiele als Demos.
Nein, hab ich noch nicht. Muss mal schauen. Wenn das Supportforum wirklich auch Anfänger passend unterstützt, steig ich vielleicht um.
Angehängte Dateien
Dateityp: zip OpenPTCDelphi100.zip (12,8 KB, 0x aufgerufen)
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#7

AW: Frage zur Unit_OpenPTC

  Alt 5. Nov 2014, 13:03
Zitat:
Wenn das Supportforum wirklich auch Anfänger passend unterstützt, steig ich vielleicht um.
Na, ich meine nicht das Forum direkt, sondern das Forum des WWW sprich Delphi-Praxis u.a.
GR32 ist weiter verbreitet (glaub ich) und man bekommt eher eine Antwort als bei Unbekannterem.
Achtung: Bin kein Informatiker sondern komme vom Bau.
  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 06:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz