OPBitmap: Problem beim zeichnen einfacher Linen

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

OPBitmap: Problem beim zeichnen einfacher Linen

Beitrag von pluto »

Hallo,
ich möchte mir ein Objekt erstellen, welches über verschiedene Fähigkeiten verfügt. Zum einen soll man alle Vier ränder über die Eigenschaft Border Verändern können zum anderen soll es vielseitige Möglichkeiten geben den Hintergrund Einfach anzupassen. Das ist eine Vorbereitung auf das Eigentliche Test Projekt.

Jedoch habe ich einige Probleme beim Zeichnen einfacher Linen. Hier mal die Relevante Soruce Code-Teile:

Code: Alles auswählen

uses
  Classes, SysUtils, uplOBBorder, uPLObSurface,opbitmap, lazbridge,
  opbitmapformats, Graphics;
 
...
public
    OPCanvas:TCanvasOPBitmap;
    OutCanvas:TCanvas;
    plopBitMap:TOPBitmap;
    Hintergrund:TOPPicture;
...
constructor TPLOBJ.Create(const aWidht, aheight:Integer);
 { plopBitMap:=TOPBitmap.Create;
  plopBitMap.Width:=aWidht; plopBitMap.Height:=aheight;
  plopBitMap.PixelFormat:=opBitmap.pf24bit;}
 
 
procedure TPLOBJ.Paint;
begin
  Hintergrund.Bitmap.Canvas.Brush.Color:=clBlack;
  Hintergrund.Bitmap.Canvas.FillRect(rect(0,0,Widht, Height));
  OPCanvas.Width:=Widht; OPCanvas.Height:=Height;
  OPCanvas.Canvas.Pen.Color:=Border.PenLeft.Color;
  OPCanvas.Canvas.MoveTo(0, 0);
//  OPCanvas.Canvas.LineTo(0, Height);
 
 { OPCanvas.Canvas.Pen.Color:=Border.PenRight.Color;
  OPCanvas.Canvas.MoveTo(Widht, 0);
  OPCanvas.Canvas.LineTo(Widht, Height);
 
  OPCanvas.Canvas.Pen.Color:=Border.PenTop.Color;
  OPCanvas.Canvas.MoveTo(0, 0);
  OPCanvas.Canvas.LineTo(Widht, 0);
 
  OPCanvas.Canvas.Pen.Color:=Border.PenBottom.Color;
  OPCanvas.Canvas.MoveTo(0, Height);
  OPCanvas.Canvas.LineTo(Widht, Height);}
 
  AssignOpBitmapToCanvas(Hintergrund.Bitmap,OutCanvas,Left, Top);
 
//  AssignOpBitmapToCanvas(OPCanvas,OutCanvas, Left, Top);
end; // TPLOBJ.Paint
Einige Probleme macht auch die unit Graphics weil es dort schon PixelFormat gibt. Ich hoffe jemand kann mir weiter Helfen. Danke :!:

edit01: Es gibt eine AV bei LineTO
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: OPBitmap: Problem beim zeichnen einfacher Linen

Beitrag von theo »

Was ist genau deine Frage?
Bei dem Code sehe ich nicht viel. Weder was Width ist noch wo OPCanvas created wird.

Eigentlich ist OpBitmap aber nicht für das Zeichnen (Striche, Kreise etc.) gedacht.
Das kann der normale LCL Canvas besser (Pen Modes, Widths etc...).

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: OPBitmap: Problem beim zeichnen einfacher Linen

Beitrag von pluto »

Ich wollte OpBitmap auch nur aus einem Grund nutzen: Wegen der Möglichkeit halbtranzparent Vierecke zu zeichnen.

Schau mal was bei Edit01 steht:
der Fehler kommt immer noch:
TApplication.HandleException Access violation
Stack trace:
$08295C9A TBITMAPDATA24__SETPIXEL, line 1159 of /home/Michael/daten/add_lazarus/opbitmap1_7/imglibs/opbitmap.pas
$08298E0B TOPBITMAPCANVAS__SETPIXEL, line 2279 of /home/Michael/daten/add_lazarus/opbitmap1_7/imglibs/opbitmap.pas
$0829E92C BRESENHAMLINE, line 575 of /home/Michael/daten/add_lazarus/opbitmap1_7/imglibs/ftbresenham.pas
$08298EE2 TOPBITMAPCANVAS__LINETO, line 2296 of /home/Michael/daten/add_lazarus/opbitmap1_7/imglibs/opbitmap.pas
$08096872 TPLOBJ__PAINT, line 122 of ./u/uPlOb.pas
$08088B4E TFORM1__BITBTN1CLICK, line 39 of Unit1.pas
$0815D0B4 TCONTROL__CLICK, line 2103 of ./include/control.inc
$0816FF2F TBUTTONCONTROL__CLICK, line 63 of ./include/buttoncontrol.inc
$08170565 TCUSTOMBUTTON__CLICK, line 164 of ./include/buttons.inc
$0817C2BF TCUSTOMBITBTN__CLICK, line 56 of ./include/bitbtn.inc
$0816FDFA TBUTTONCONTROL__WMDEFAULTCLICKED, line 26 of ./include/buttoncontrol.inc
$0806B1CB
$0815C49C TCONTROL__WNDPROC, line 1591 of ./include/control.inc
$08153B44 TWINCONTROL__WNDPROC, line 4786 of ./include/wincontrol.inc
$08234577 DELIVERMESSAGE, line 3549 of /home/Michael/lazarus-0.9.27.src/lcl/interfaces/gtk/gtkproc.inc

Code: Alles auswählen

procedure TPLOBJ.Paint;
begin
  Hintergrund.Bitmap.Canvas.Brush.Color:=clBlack;
  Hintergrund.Bitmap.Width:=Widht; Hintergrund.Bitmap.Height:=Height;
 
  Hintergrund.Bitmap.Canvas.FillRect(rect(0,0,Widht, Height));
  OPCanvas.Canvas.Pen.Color:=Border.PenLeft.Color;
  OPCanvas.Canvas.MoveTo(0, 0);
  OPCanvas.Canvas.LineTo(0, Height);
 
  OPCanvas.Canvas.Pen.Color:=Border.PenRight.Color;
  OPCanvas.Canvas.MoveTo(Widht, 0);
  OPCanvas.Canvas.LineTo(Widht, Height);
 
  OPCanvas.Canvas.Pen.Color:=Border.PenTop.Color;
  OPCanvas.Canvas.MoveTo(0, 0);
  OPCanvas.Canvas.LineTo(Widht, 0);
 
  OPCanvas.Canvas.Pen.Color:=Border.PenBottom.Color;
  OPCanvas.Canvas.MoveTo(0, Height);
  OPCanvas.Canvas.LineTo(Widht, Height);
 
  AssignOpBitmapToCanvas(Hintergrund.Bitmap,OutCanvas,Left, Top);
 
//  AssignOpBitmapToCanvas(OPCanvas,OutCanvas, Left, Top);
end; // TPLOBJ.Paint
Für mein Vorhaben reichen die Funktionen von OpCanvas eigentlich voll und ganz aus. Das LCL Canvas möchte ich nur nutzen um das ganze Sichtbar auf eine PaintBox zu zeichnen.
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: OPBitmap: Problem beim zeichnen einfacher Linen

Beitrag von theo »

Wie gesagt, ich seh hier nicht was du mit dem OPCanvas machst (Create, Dimensionen...).

Mach mal ein simples vollständiges Beispiel das den Fehler zeigt.

Das geht bei mir:

Code: Alles auswählen

procedure TForm1.FormPaint(Sender: TObject);
var op:TCanvasOPBitmap;
begin
op:=TCanvasOPBitmap.create;
op.PixelFormat:=pf24bit; //wieso auch immer
op.Width:=Width;
op.Height:=Height;
op.Canvas.Brush.Color:=clwhite;
op.Canvas.FillRect(Rect(0,0,op.Width,op.Height));
op.Canvas.Pen.Color:=clred;
op.Canvas.MoveTo(0,0);
op.Canvas.LineTo(0,op.height);
AssignOpBitmapToCanvas(op,Canvas,0,0);
op.free;
end;

Antworten