Page 1 of 1
How to get width of entire table-cell's text, w/ mixed fonts
Posted: Mon Nov 28, 2016 1:32 am
by DXS
Hello
I am trying to 'manually' adjust a cell that is rotated 90 degrees. I assume that I need to set BestHeight to the required value - that works except for when I have fonts of mixed sizes - so, if above is correct method of adjusting cell height, how should I go about getting the total text length/width (given a mixture of font sizes in the same cell?
thank you,
Andy
Posted: Mon Nov 28, 2016 1:52 pm
by Sergey Tkachenko
A manual calculation may be complicated, so may be the best solution is format the document and then get sizes.
In formatted documents, you can use Cell properties DocumentWidth and DocumentHeight.
Note that for cells rotated by 90 or -90 degrees, DocumentWidth returns a vertical size, DocumentHeight returns a horizontal size.
To measure sizes, set a small BestHeight and include rvpaoNoWrap in Options of all paragraphs in the cell.
Posted: Wed Nov 30, 2016 9:52 pm
by DXS
Thank you for your help - I do have a followup:
I want the size of the column (which contains 90/270 degree rotated text) to match the current size of that cells contents. I have it so the width (height) grows and shrinks with the text length (according to its font). When I increase the font's size, the cell expands, however, then I decrease the font's size, the cell's size remains the same. I've tried setting the BestWidth:=0 or 10 (small values as suggested?), then setting the ...BestWidth := ...DocumentWidth, but I can't seem to get the cell to shrink back.
Can you show me a/the preferred way to do this?
Thank you,
Andy
Posted: Fri Dec 02, 2016 3:51 pm
by Sergey Tkachenko
Here is my test. It assumes you have RichViewEdit1 linked with RVStyle1.
Code: Select all
function GetNoWrapPara(RVStyle: TRVStyle): Integer;
var
ParaStyle: TParaInfo;
begin
ParaStyle := TParaInfo.Create(nil);
ParaStyle.Options := [rvpaoNoWrap];
Result := RVStyle.FindParaStyle(ParaStyle);
ParaStyle.Free;
end;
function GetTextStyle(RVStyle: TRVStyle; Size: Integer): Integer;
var
TextStyle: TFontInfo;
begin
TextStyle := TFontInfo.Create(nil);
TextStyle.Assign(RVStyle.TextStyles[0]);
TextStyle.Size := Size;
Result := RVStyle.FindTextStyle(TextStyle);
TextStyle.Free;
end;
procedure TForm3.ToolButton63Click(Sender: TObject);
var
Table: TRVTableItemInfo;
ParaNo, StyleNo: Integer;
procedure MakeAutoSize;
begin
Table.Cells[0,0].BestHeight := RVStyle1.PixelsToUnits(Table.Cells[0,0].DocumentWidth);
Table.Cells[0,1].BestHeight := RVStyle1.PixelsToUnits(Table.Cells[0,1].DocumentWidth);
Table.Cells[0,0].BestWidth := RVStyle1.PixelsToUnits(Table.Cells[0,0].DocumentHeight);
Table.Cells[0,1].BestWidth := RVStyle1.PixelsToUnits(Table.Cells[0,1].DocumentHeight);
end;
procedure MakeSmallSize;
begin
Table.Cells[0,0].BestHeight := 1;
Table.Cells[0,1].BestHeight := 1;
Table.Cells[0,0].BestWidth := 1;
Table.Cells[0,1].BestWidth := 1;
end;
begin
ParaNo := GetNoWrapPara(RVStyle1);
StyleNo := GetTextStyle(RVStyle1, 20);
Table := TRVTableItemInfo.CreateEx(1, 2, RichViewEdit1.RVData);
Table.CellBorderWidth := RVStyle1.PixelsToUnits(1);
Table.BorderWidth := RVStyle1.PixelsToUnits(1);
Table.CellPadding := RVStyle1.PixelsToUnits(20);
Table.Cells[0,0].Rotation := rvrot90;
Table.Cells[0,0].Clear;
Table.Cells[0,0].AddNL('Hello world!!!', StyleNo, ParaNo);
Table.Cells[0,1].Rotation := rvrot90;
Table.Cells[0,1].Clear;
Table.Cells[0,1].AddNL('Good bye!', StyleNo, ParaNo);
Table.Cells[0,1].AddNL('Good bye!', StyleNo, ParaNo);
MakeSmallSize;
if not RichViewEdit1.InsertItem('', Table) then
exit;
MakeAutoSize;
RichViewEdit1.Reformat;
Application.MessageBox('Making text smaller', 'Table Test');
MakeSmallSize;
StyleNo := GetTextStyle(RVStyle1, 10);
Table.Cells[0, 0].GetItem(0).StyleNo := StyleNo;
Table.Cells[0, 1].GetItem(0).StyleNo := StyleNo;
Table.Cells[0, 1].GetItem(1).StyleNo := StyleNo;
RichViewEdit1.Reformat;
MakeAutoSize;
RichViewEdit1.Reformat;
Application.MessageBox('Making text larger', 'Table Test');
MakeSmallSize;
StyleNo := GetTextStyle(RVStyle1, 30);
Table.Cells[0, 0].GetItem(0).StyleNo := StyleNo;
Table.Cells[0, 1].GetItem(0).StyleNo := StyleNo;
Table.Cells[0, 1].GetItem(1).StyleNo := StyleNo;
RichViewEdit1.Reformat;
MakeAutoSize;
RichViewEdit1.Reformat;
end;
For simplicity, this code uses Reformat to reformat the document. A more efficient way to reformat is using BeginItemModify and EndItemModify.
Update: I added calls to PixelsToUnits, so this code works when sizes are measured in twips as well.
Posted: Fri Dec 02, 2016 6:11 pm
by DXS
Hi Sergey,
That worked, thanks for the help
-Andy