Page 1 of 1
How Can I Build a Style Programatically ?
Posted: Fri Dec 31, 2010 10:03 pm
by andyhill
How Can I Build a Style Programatically and use when inserting line (need to use TextStyle with Bold Attribute) ?
rvs2.ResetTextStyles;
rvs2.ResetParaStyles;
//
rvs2.TextStyles.AddFont('Times New Roman', 12, clBlack, clWhite, [want bold]);
rvs2.ParaStyles.Add;
rvs2.ParaStyles[0].Alignment:= rvaCenter;
rve2.Style:= rvs2;
//
rve2.Clear;
rve2.AddNL('Test 1', 0, 0);
rve2.AddNL('Test 2', 0, 0);
rve2.AddNL('', 0, 0);
rve2.AddNL(ClientName, 0, 0);
rve2.AddNL('CLIENT NOTES', 0, 0);
rve2.AddNL('', 0, 0);
Fails to use my TextStyle ?
append other rve's here
Merge rve streams and files
Posted: Sat Jan 01, 2011 7:54 am
by andyhill
function TfRichView.RVCopy(RVSource, RVDest: TCustomRichView): Boolean;
var
MyStream: TMemoryStream;
begin
try
MyStream:= TMemoryStream.Create;
try
RVSource.SaveRVFToStream(MyStream, False);
MyStream.Position:= 0;
Result:= RVDest.InsertRVFFromStream(MyStream, RVDest.ItemCount);
RVDest.FormatTail;
except
Result:= False;
end;
finally
MyStream.Free;
end;
end;
...
PrintIt:= psd.Execute;
if PrintIt then begin
//
ClientName:= '';
case fMain.Table0.FieldByName('Gender').AsInteger of
1: ClientName:= 'Mr ';
2: ClientName:= 'Mrs ';
3: ClientName:= 'Ms ';
4: ClientName:= 'Miss ';
end;
ClientName:= ClientName+fMain.Table0.FieldByName('FirstName').AsString+' '+fMain.Table0.FieldByName('LastName').AsString;
//////////////////////////////////////////////
// Clear rvs2 Styles
rvs2.ResetTextStyles;
rvs2.ResetParaStyles;
//////////////////////////////////////////////
// Add Text Style for heading
rvs2.TextStyles.AddFont('Times New Roman', 12, clBlack, clWhite, []); // !!! I Want Bold ?
//////////////////////////////////////////////
// Add Paragraph Styles
rvs2.ParaStyles.Add;
rvs2.ParaStyles[0].Alignment:= rvaCenter;
rvs2.ParaStyles.Add;
rvs2.ParaStyles[1].Alignment:= rvaLeft;
//////////////////////////////////////////////
// Assign rvs2
rve2.Style:= rvs2;
rve2.Clear;
//////////////////////////////////////////////
// Add text
rve2.AddNL('Business Name', 0, 0);
rve2.AddNL('Business Address', 0, 0);
rve2.AddNL('', 0, 0);
rve2.AddNL(ClientName, 0, 0);
rve2.AddNL('CLIENT NOTES', 0, 0);
rve2.AddNL('', 0, 0);
//////////////////////////////////////////////
// Append rve to rve2
RVCopy(rve, rve2);
rve2.AddNL('', 0, 0);
//////////////////////////////////////////////
// Add Table to rve2
table:= TRVTableItemInfo.CreateEx(3, 1, rve2.RVData);
table.BorderStyle:= rvtbRaisedColor;
table.CellBorderStyle:= rvtbLoweredColor;
table.BorderWidth:= 1;
table.CellBorderWidth:= 1;
table.CellPadding:= 5;
table.CellVSpacing:= 1;
table.CellHSpacing:= 1;
table.BorderVSpacing:= 1;
table.BorderHSpacing:= 1;
//////////////////////////////////////////////
// Size table
for r:= 0 to table.Rows.Count-1 do begin
for c:= 0 to table.Rows[r].Count-1 do begin
table.Cells[r, c].BestWidth:= 700; // !!! I want page width
end;
//
{ !!! I want to add rve3 stream, rve4 file and rtf file into this table (3 rows [one per item]) ?
//////////////////////////////////////////////
// Row 1
if r = 0 then begin
with table.Cells[r, 0] do begin
Color:= clInfoBk;
Clear;
RVCopy(rve3, rve2); // !!! NOT THIS WAY ???
end;
end;
}
end;
//////////////////////////////////////////////
// Add table to rve2
rve2.AddItem('', table); // !!! I want to add table Left Aligned ?
//////////////////////////////////////////////
// Assign to rvprint
RVPrint1.AssignSource(rve2);
//////////////////////////////////////////////
// Set margins
RVPrint1.LeftMarginMM:= 10;
RVPrint1.RightMarginMM:= 10;
RVPrint1.TopMarginMM:= 10;
RVPrint1.BottomMarginMM:= 10;
//////////////////////////////////////////////
// Format
RVPrint1.FormatPages(rvdoALL);
//////////////////////////////////////////////
// Print
if RVPrint1.PagesCount > 0 then RVPrint1.Print('LBAnalysis', 1, False);
//
end;
Posted: Sat Jan 01, 2011 5:30 pm
by Sergey Tkachenko
ResetTextStyles and ResetParaStyles do not clear styles. They assign default styles to them (styles that you can see when you place a new TRVStyle component on the form).
Use
rvs2.TextStyles.Clear;
rvs2.ParaStyles.Clear;
Posted: Sat Jan 01, 2011 7:59 pm
by andyhill
Thank you Seregy.
You did not explain:-
1) How to add Bold Attribute to text style ?
2) How to select Text Attribute when using ADDNL ?
3) How to insert rv stream/file into table cell, either during table construction -or- locating table and cell in editor ?
Insert RVF File into Table Cell Programatically
Posted: Sat Jan 01, 2011 9:05 pm
by andyhill
rve2.AddItem('MyTempTable', table);
//
for i:= 0 to rve2.TopLevelEditor.ItemCount -1 do begin
ItemInfo:= rve2.TopLevelEditor.GetItem(i);
if ItemInfo.ItemText = 'MyTempTable' then begin
ItemNo:= rve2.TopLevelEditor.GetItemNo(ItemInfo);
Offs:= rve2.TopLevelEditor.GetOffsBeforeItem(ItemNo);
rve2.TopLevelEditor.SetSelectionBounds(ItemNo, Offs, ItemNo, Offs); // FAILS (I want to select ROWn, CELLn)
rve2.TopLevelEditor.InsertRVFFromFileEd('D:\D2011\Editor\test.rvf');
end;
end;
//
Posted: Sun Jan 02, 2011 12:46 pm
by Sergey Tkachenko
Well, it's much easier to answer to questions that were asked
1) Specify Style=[fsBold]. You can use AddFont, or just Add and then assign properties, for example:
Code: Select all
with rvs2.TextStyles.Add do begin
FontName := 'Times New Roman';
Size := 12;
Color := clBlack,
BackColor := clWhite,
Style := [fsBold];
end;
2) rve2.AddNL has StyleNo parameter - index in rvs2.TextStyles (assuming that rve2.Style = rvs2). You use 0 in your first code sample, so all text is added using rvs2.TextStyles[0]. If you change ResetTextStyles to TextStyles.Clear, then rvs2 will have only one text style, added by AddFont, and your code will use this style.
Posted: Sun Jan 02, 2011 1:06 pm
by Sergey Tkachenko
3) If you want to load RVF to a cell, there a problem: cells do not support loading RVF containing text/paragraph/list styles. A workaround is shown in this demo:
http://www.trichview.com/support/files/copyfromcell.zip
However, if you want to use editing method for inserting RVF in the caret position, it's no problem.
In your code, you insert the table directly in rve2:
Code: Select all
rve2.AddItem('MyTempTable', table);
So, when searching for this table, you need to use methods of rve2, not rve2.TopLevelEditor. Otherwise, if the caret is in a table cell, the code searches in this table cell.
Code: Select all
var i: Integer;
table: TRVTableItemInfo;
RVData: TCustomRVFormattedData;
for i:= 0 to rve2.ItemCount -1 do
if (rve2.GetItemStyle(i)=rvsTable) and (rve2.GetItemText(i)='MyTempTable') then begin
table := TRVTableItemInfo(rve2.GetItem(i));
// 1. Before working with selection in a table cell, activate its editing.
// It can be done by table.EditCell or by Cell.Edit.
table.EditCell(ROW, COLUMN);
// 2. Cell is in an editable state.
// However, the caret is not necessary inside it.
// It may be in a cell of some table inside this cell.
// Moving the caret to the beginning of this cell
RVData := TCustomRVFormattedData(table.Cells[ROW, COLUMN].GetRVData);
RVData.SetSelectionBounds(0, RVData.GetOffsBeforeItem(0), 0, RVData.GetOffsBeforeItem(0));
// 3. Now the caret is in our cell, so rve2.TopLevelEditor edits this cell.
rve2.TopLevelEditor.InsertRVFFromFileEd('D:\D2011\Editor\test.rvf');
exit;
end;