Page 1 of 1

Table Printing problem

Posted: Fri Aug 31, 2007 10:00 am
by yoon jin suk
I uses TrichViewEdit ver1.9.38 for Delphi 7.

When Editing a table..it works well.

But when printing a table..

the one row line is printed two line.

My table option is..

table.BorderVSpacing := -1;
table.BorderHSpacing := -1;
table.CellBorderStyle := rvtbColor;
table.CellBorderColor := clBlack;
table.CellBorderWidth := 1;
table.CellHSpacing := -1;
table.CellVSpacing := -1;
table.CellPadding := 3;
table.BestWidth := 0;

I have changed above option's value..
But result is same..
(When any object(ex. the blank) is placed in front of table, and behind table.. the printing works well.. it's so weird)

Please answer for my question.

Posted: Fri Aug 31, 2007 11:45 am
by Sergey Tkachenko
Please send me RVF file with this table

Posted: Sat Sep 01, 2007 2:47 am
by yoon jin suk
I send a mail with the sample file.

Posted: Sun Sep 02, 2007 1:22 pm
by Sergey Tkachenko
I received it, please wait while I test it

Posted: Thu Sep 06, 2007 11:28 pm
by yoon jin suk
I am waiting for a long time.

When do you think this problem is solved?

Posted: Sat Sep 08, 2007 11:38 am
by Sergey Tkachenko
Sorry for delay.

The problem is in OnDrawBorder event.
You use it to draw a hairline border (i.e. border having width = 1 pixel both on screen and on printer). On screen, hairline borders look exactly like normal borders (if CellBorderWidth=1).
But on printing, real width of border with CellBorderWidth=1 is calculated as Printer_Resolution/Screen_Resolution. For example, 600/96 = 6 pixels (on this printer, width=6 pixels looks like width=1 pixel on screen).
But in this event you draw border that always has width=1 pixel (so, the higher resolution printer has, the narrower this border looks)
This is the source of this problem. You draw border around each cell. But cells overlap each other (because CellHSpacing=CellVSpacing=-1), overlapping width = 1 screen pixel. On printer, this screen pixel becomes several pixels (as in the example above, 6 pixels). So you can see wrong output.

The solution is drawing only bottom and right sides of each cells (except for the cells in the top row and the left column).
The example is here:
http://www.trichview.com/support/files/ ... border.zip
Besides, I removed your OnSendingToPrinter event - it's not allowed to change document in this event.

Posted: Tue Sep 11, 2007 2:49 am
by yoon jin suk
Thank you for your kindly answer.

Your sample works well.

1. But for example..when I change the cell's color to clWindow..

table.Cells[0, 0].Color := clWindow;
table.Cells[0, 1].Color := clWindow;

The first column's right line is not shown.
How can I print the table with color cells?

I just insert above code at the Button1Click on the your sample code.

2. Please test my previous sample program by this step.
1) Execute sample program.
2) Press the 'Table' button three times.
3) Press the 'Print' button.

The center table's print result is good.
Not only table object but also other objects(ex. Enter, Other characters)
lead to same result.

so..when the table is in center position by other object..
the print result is good.
Why is that?

Posted: Mon Sep 17, 2007 12:44 am
by yoon jin suk
Hi.
Are you very busy?
Please help me.

My second question is may be TRichviewEdit's bug..

Posted: Mon Sep 17, 2007 3:54 pm
by Sergey Tkachenko
The following changes should help.
1) Change OnDrawBorder
(the most important change is moving (Left, Top, Right, Bottom) rectangle to the top left by one pixel)

Code: Select all

procedure TForm1.DoDrawBorder(Sender: TRVTableItemInfo;
  Canvas: TCanvas; Left, Top, Right, Bottom, Width: Integer; LightColor,
  Color, BackgroundColor: TColor; Style: TRVTableBorderStyle;
  Printing: Boolean; VisibleBorders: TRVBooleanRect; Row, Col: integer;
  var DoDefault: Boolean);
begin
  if Width = 0 then exit;

  dec(Left);
  dec(Top);
  dec(Right);
  dec(Bottom);

  Canvas.Pen.Color := Color;
  Canvas.Pen.Style := psInsideFrame;
  Canvas.Pen.Width := 1;
  Canvas.Brush.Style := bsClear;

  if Row<0 then
    Canvas.Rectangle(Left, Top, Right, Bottom)
  else begin
    Canvas.MoveTo(Left, Top);
    if Sender.Cells[Row, Col].VisibleBorders.Top and
       ((Row=0) or not Sender.Cells[Row-1, Col].VisibleBorders.Bottom) then
      Canvas.LineTo(Right, Top)
    else
      Canvas.MoveTo(Right, Top);
    if Sender.Cells[Row, Col].VisibleBorders.Right then
      Canvas.LineTo(Right, Bottom)
    else
      Canvas.MoveTo(Right, Bottom);
    if Sender.Cells[Row, Col].VisibleBorders.Bottom then
      Canvas.LineTo(Left, Bottom)
    else
      Canvas.MoveTo(Left, Bottom);
    if Sender.Cells[Row, Col].VisibleBorders.Left and
       ((Col=0) or not Sender.Cells[Row, Col-1].VisibleBorders.Right) then
      Canvas.LineTo(Left, Top)
    else
      Canvas.MoveTo(Left, Top);
  end;

  DoDefault := False;
end;
2) Change table parameters (it's not necessary to use overlapping borders, so -1 are changed to 0):

Code: Select all

  table.CellBorderStyle := rvtbColor;
  table.CellBorderColor := clBlack;
  table.CellBorderWidth := 1;
  table.CellHSpacing := 0;
  table.CellVSpacing := 0;
  table.CellPadding := 3;
  table.BorderVSpacing := 0;
  table.BorderHSpacing := 0;

Posted: Fri Dec 14, 2007 2:08 am
by yoon jin suk
Hi.

Your solution was very useful.
Table row line is printed correctly.

But recently I found a problem.

When the table is on the page break..
so the table is splited by two page.

The first row's first horizon line of second page's table
is not printed.
It's correct result by your solution logic.

So..how can I know page break point?
-> If I know page break point, I can fix your solution.
Or..Is there other solution?