Page 1 of 1

Adjust margins for PrintProportional

Posted: Fri Feb 27, 2009 11:40 am
by 10047319
Dear Steema Team,

We used to print the content of the TChart (ver 8.02) with PrintProportional=true. The recent demand from the customer is to make automatic margins customizable. I tried to change PrintMargins property, but in proportional mode it seems to be disregarded (a bug or intention?).

If I set PrintProportional=false, then margins are ok, but the whole chart conent changes. Unfortunately this is inacceptable.

My question is: how can I adjust margins in PrintProportional mode?

Thank you,
Manfred

Posted: Fri Feb 27, 2009 1:01 pm
by 10047319
To be more precise: I can of course mimic PrintProportional mode actually having PrintProportional=false by manually doing a bunch of tricky calculations. But this looks like a code duplication as soon as similar calculations have been already implemented by Steema in PrintProportional mode. The only thing I lack is a possibility to control the size of a (smallest) automatic margin.

Ideal situation would be:

Code: Select all

Chart->PrintProportional = true;
Chart->PrintMargins = TRect(5,5,5,5);
Giving the picture where the smallest margin is 5% and another one is bigger just enough to make the printed chart proportional to the original one.

Posted: Mon Mar 02, 2009 2:16 pm
by yeray
Hi Manfred,

Yes, the printproportional property could force the chart to be proportional, so that when the user changes one of the margins, the other is would be set automatically. I've added it to the wish list to be implemented in further releases (TV52013915).

In the meanwhile you could control the margins customly doing something similar to this:

Code: Select all

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  Chart1.PrintMargins := Rect(5,5,5,5);
  Chart1.PrintProportional := False;
  //Chart1.PrintResolution := -70;
  ChartPreviewer1.Chart := Chart1;
  ChartPreviewer1.Execute;
end;

procedure TForm1.ChartPreviewer1AfterDraw(Sender: TObject);
begin
  ChartPreviewer1.Chart.Title.Text.Text := inttostr(Chartpreviewer1.Chart.Width);
  if Chart1.PrintMargins.Left > 10 then
  begin
    ChartPreviewer1.PreviewPanel.Color := clblue;
    Chart1.PrintProportional := False;
    Chart1.PrintMargins := Rect(10,Chart1.PrintMargins.Top, chart1.PrintMargins.Right,chart1.PrintMargins.Bottom);
    ChartPreviewer1.PreviewPanel.Repaint;
  end;
end;

Posted: Mon Mar 02, 2009 3:11 pm
by 10047319
Hi Yeray,

Thank you for your response and willing to help. The problem is that we don't use a preview component and just post the TChart directly to the printer. So in a meantime I've implemented the proportional-mimic logic by myself. Here's my solution just in case it might be helpful for TV52013915 or someone encounters a similar problem

Code: Select all

void __fastcall TMyChart::Print()
{
   // #3350: Margins
   const double marginCm  = MyCustomMargin; // !!!
   const HDC    hdc       = Printer()->Handle;
   const double hPxPerCm  = double(GetDeviceCaps(hdc, LOGPIXELSX)) / 2.54;
   const double vPxPerCm  = double(GetDeviceCaps(hdc, LOGPIXELSY)) / 2.54;
   const double hMarginPx = marginCm * hPxPerCm;
   const double vMarginPx = marginCm * vPxPerCm;

   // Mimic proportional printing
   const double W     = Printer()->PageWidth;
   const double H     = Printer()->PageHeight;
   const double k     = double(Width) / double(Height);
   const double coeff = k * H / W;
   double hMarginPercent, vMarginPercent;
   if (coeff <= 1.0)
   {  vMarginPercent = vMarginPx / H;
      hMarginPercent = (1.0 - (1.0-2.0*vMarginPercent)*coeff)/2.0;
   }
   else
   {  hMarginPercent = hMarginPx / W;
      vMarginPercent = (1.0 - (1.0-2.0*hMarginPercent)/coeff)/2.0;
   }

   hMarginPercent *= 100;
   vMarginPercent *= 100;

   PrintMargins = TRect(hMarginPercent,vMarginPercent,hMarginPercent,vMarginPercent);
   PrintProportional = false;

   TChart::Print();
}
Regards,
Manfred

Posted: Mon Mar 02, 2009 3:54 pm
by yeray
Hi Manfred,

Thanks for your code, we'll consider if it's a good solution for the general problem.