Page 1 of 1

Access violation after saving chart

Posted: Tue Feb 14, 2017 2:03 pm
by 16479503
Hello,

after JPEG export of a zoomed chart an access violation occurs, when I try to unzoom the chart.
Here is my code example:

Code: Select all

unit Unit1;
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, VclTee.TeeGDIPlus, Vcl.StdCtrls,
  Vcl.ExtDlgs, VCLTee.TeEngine, Vcl.ExtCtrls, VCLTee.TeeProcs, VCLTee.Chart,
  VCLTee.Series, Vcl.Imaging.jpeg;

type
  TForm1 = class(TForm)
    Chart1: TChart;
    SavePictureDialog1: TSavePictureDialog;
    ExportBtn: TButton;
    Series1: TFastLineSeries;
    procedure FormCreate(Sender: TObject);
    procedure ExportBtnClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

(*___________________________________________________________________________*)

function GetChartJPEG(AChart:TCustomChart): TJPEGImage;
var tmpBitmap:TBitmap;
begin
  Result:=TJPEGImage.Create;   { <-- create a TJPEGImage }
  tmpBitmap:=TBitmap.Create;   { <-- create a temporary TBitmap }
  try
    tmpBitmap.Width :=AChart.Width;   { <-- set the bitmap dimensions }
    tmpBitmap.Height:=AChart.Height;
    { draw the Chart on the temporary Bitmap... }
    AChart.Draw(tmpBitmap.Canvas,Rect(0,0,tmpBitmap.Width,tmpBitmap.Height));
    { set the desired JPEG options... }
    With Result do
    begin
      GrayScale            := False;
      ProgressiveEncoding  := True;
      CompressionQuality   := 100;  // % 0 - 100
      PixelFormat          := jf24bit;  // or jf8bit
      ProgressiveDisplay   := True;
      Performance          := jpBestQuality;  // or jpBestSpeed
      Scale                := jsFullSize;  // or jsHalf, jsQuarter, jsEighth
      Smoothing            := false;
      { Copy the temporary Bitmap onto the JPEG image... }
      Assign(tmpBitmap);
    end;
  finally
    tmpBitmap.Free;  { <-- free the temporary Bitmap }
  end;
end;

procedure TForm1.ExportBtnClick(Sender: TObject);
var
  FName: string;
begin
  SavePictureDialog1.Filter := 'JPG-Datei (*.jpg)|*.jpg';
  if not SavePictureDialog1.Execute then Exit;
  FName := SavePictureDialog1.FileName;
  if ExtractFileExt(FName) = '' then FName := FName + '.jpg';

  with GetChartJPEG(Chart1) do begin
    SaveToFile(FName);    { <-- save the JPEG to disk }
    Free;  { <-- free the temporary JPEG object }
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Series1.FillSampleValues(500);
end;

end.
It seems it makes a difference if the chart is zoomed or not before exporting the image.

Has anybody an idea why it happens?

Thanks
Juergen

Re: Access violation after saving chart

Posted: Wed Feb 15, 2017 7:49 am
by yeray
Hello Juergen,

I haven't been able to reproduce the problem with TeeChart Pro v2016.19 and RAD XE or RAD 10.1 Berlin Update 2.
What TeeChart version, IDE and OS version are you using?

Re: Access violation after saving chart

Posted: Wed Feb 15, 2017 1:31 pm
by 16479503
Hello Yeray,

I'm using TeeChart Pro v2016.19 and RAD 10.1 Berlin Update 1.
Meanwhile I found out, that the problem does not happen every time.
Sometimes when I start the program I can zoom the chart, then export the image, then unzoom many times without problems, but at any time it happens anyhow.
Some other time the problem occurs immediately after the first attempt.
It happens on other computer too.
I tried to find out some special conditions to produce the error - without success.
When I start the program in the debugger the error occurs in Vcl.Graphics in the procedure TCustomCanvas.Lock.

To demonstrate the error I have made a screen copy, available at https://goo.gl/photos/ZbaVPc1o82w627ZAA

Regards, Juergen.

Re: Access violation after saving chart

Posted: Thu Feb 16, 2017 7:20 am
by yeray
Hello Juergen,
JRadke wrote: I'm using TeeChart Pro v2016.19 and RAD 10.1 Berlin Update 1.
We have Update 2 installed on all the machines here. Do you have access to a machine with Update 2 installed to check if it makes any difference?

Re: Access violation after saving chart

Posted: Thu Feb 16, 2017 9:49 am
by 16479503
Hello Yeray,
sorry, indeed I have Update 2 installed on two machines. Strange to say on one machine Update 1 is displayed when I open Help | Info about, allthough the start displays says Update 2.
These are the complete version numbers on both machines:
Delphi 10.1 Berlin Version 24.0.25048.9432
TeeChart Pro v2016.19.161025 32bit VCL
Both machines are running with Windows 10 Pro 64Bit.
The error occurs on both machines.

Regards
Juergen

Re: Access violation after saving chart

Posted: Thu Feb 16, 2017 1:58 pm
by yeray
Hello Juergen,

I see the chart in your video is in 2D and has a gradient in the legend and in the back wall, but these properties may be defined in your dfm because they aren't in the .pas you pasted in the opening post.
There may be some property you've set at design-time that could be relevant here, because I still can't reproduce the problem here.

So, could you please attach the test project so we can reproduce the problem here?
Thanks in advance.

Re: Access violation after saving chart

Posted: Thu Feb 16, 2017 2:29 pm
by 16479503
Hi Yeray,

please find the complete test project here:
https://drive.google.com/file/d/0Bw_A3a ... sp=sharing

Regards
Juergen

Re: Access violation after saving chart

Posted: Thu Feb 16, 2017 3:57 pm
by yeray
Hello Juergen,

I could reproduce the problem with v2016.19 but it seems to work fine with the current sources we have here.
Since the compiled packages for Berlin are quite big (about 1.5Gb), if you are only interested on win32 I can send you a prerelease version of those binaries. If you need another personality I'm afraid you should wait until we publish the next maintenance release (expected at the beginning March).

Re: Access violation after saving chart

Posted: Fri Feb 17, 2017 6:39 am
by 16479503
Hello Yeray,
I'm a little relieved that you could reproduce the problem.
There is no hurry for an interim solution, so I'll wait for your next release in March.

Thank you.
Juergen

Re: Access violation after saving chart

Posted: Fri Apr 07, 2017 4:03 pm
by 16479503
Hi Yeray,

today I installed TeeChart VCL/FMX RELEASE 2017.21.170329 and hoped to solve the problem, but it sn't.
Please can you explain?

Regards
Juergen

Re: Access violation after saving chart

Posted: Mon Apr 10, 2017 7:46 am
by yeray
Hello,

I've run the test application you sent here several times using TChart v2017.21. One time it crashed but not the rest of the times.
So it seems I can't reproduce the problem in a consistent basis.

Re: Access violation after saving chart

Posted: Wed Dec 13, 2017 12:58 pm
by Marc
Hello Juergen,

I have been able to reproduce the problem with some regularity.

It seems to relate to a problem with the Canvas handle after it has been used for JPEG creation and then 'use returned to' the Chart for conventional canvas use, the problem aggravated when XOr is-being/has-been used to plot zoom rectangle.

This code resolves the problem in initial tests:

Code: Select all

procedure TForm1.ExportBtnClick(Sender: TObject);
var
  FName: string;
  OldCanvas : TCanvas;
begin
  OldCanvas := Chart1.Canvas.ReferenceCanvas;

  SavePictureDialog1.Filter := 'JPG-Datei (*.jpg)|*.jpg';
  if not SavePictureDialog1.Execute then Exit;
  FName := SavePictureDialog1.FileName;
  if ExtractFileExt(FName) = '' then FName := FName + '.jpg';

  with GetChartJPEG(Chart1) do begin
    SaveToFile(FName);    { <-- save the JPEG to disk }
    Free;  { <-- free the temporary JPEG object }
  end;

  Chart1.Canvas.ReferenceCanvas := OldCanvas;
end;
I'm not sure whether we can build the fix into the Chart itself (some kind of check) as the check itself on the Canvas.Handle could AV due to the invalid allocation. The code lines above are seem resilient so far.

We'll check whether there might be other, negative side effects if we build the modification into TeeChart's own export code.

Regards,
Marc Meumann

Re: Access violation after saving chart

Posted: Wed Dec 13, 2017 3:47 pm
by Marc
Hi,

as a footnote, TeeChart's own save routine appears to work correctly under similar circumstances:

eg. uses TeeJPEG, TeExport

Code: Select all

TeeSavePanel(TJPEGExportFormat,AChart);
Regards,
Marc