delphi使用RichView控制元件 表格儲存和複製
TRichView表格儲存和複製
介紹
很少直接呼叫 TRVTableItemInfo.SaveToStream
。通常將表格儲存到 RVF 檔案或帶有主文件的流中,通過TCustomRichView.SaveRVFToStream
方法。
很少直接呼叫 TRVTableItemInfo.LoadFromStream
。 通常表格是從 RVF 檔案或帶有主文件的流中載入的,通過TCustomRichView.LoadRVFFromStream
方法。
使用TRVTableItemInfo.SaveToStream
實現複製表,使用TRVTableItemInfo.SaveRowsToStream
實現複製行。
方法
表儲存到Stream中TRVTableItemInfo.SaveToStream
procedure SaveToStream(Stream: TStream);
將表儲存到 Stream 中。
表的行儲存到Stream中TRVTableItemInfo.SaveRowsToStream
將表的指定行索引(從 Index 到 Index+Count-1)儲存到 Stream 中。
procedure SaveRowsToStream(Stream: TStream; Index, Count: Integer);
輸出的Stream與 SaveToStream
相容。
即使由於單元格合併 RowSpan>1
從Stream載入表TRVTableItemInfo.LoadFromStream
procedure LoadFromStream(Stream: TStream);
從 Stream 中載入表。
必須使用 SaveToStream
或 SaveRowsToStream
方法儲存表。 只有 TRVStyle
中的文字、段落和列表樣式集合與儲存時相同,才能正確載入表格。
例子
複製表格
uses RVTable, RVItem; procedure TForm1.Button1Click(Sender: TObject); var Table: TRVTableItemInfo; Row, Col: Integer; begin //建立5行4列的表格 Table := TRVTableItemInfo.CreateEx(5, 4, RichViewEdit1.RVData); //設定表格邊框和背景色 Table.Color := clNone; Table.BorderStyle := rvtbColor; Table.CellBorderStyle := rvtbColor; Table.BorderWidth := 1; Table.CellBorderWidth := 1; //新增表格資料 for Row := 0 to Table.RowCount - 1 do for Col := 0 to Table.ColCount - 1 do begin Table.Cells[Row, Col].BestWidth := 60; Table.Cells[Row, Col].BestHeight := 20; Table.Cells[Row, Col].Color := clCream; Table.Cells[Row, Col].Clear; Table.Cells[Row, Col].AddFmt('%d,%d', [Row, Col], 0, 0); end; //合併單元格(從第3行第2列開始,合併2行) Table.MergeCells(2, 1, 1, 2, True); //將表格新增到文件中 RichViewEdit1.InsertItem('', Table); end; procedure TForm1.Button2Click(Sender: TObject); var Item: TCustomRVItemInfo; Table, NewTable: TRVTableItemInfo; Rve: TCustomRichViewEdit; Stream: TMemoryStream; begin //獲取當前選擇的表格 if not RichViewEdit1.CanChange or not RichViewEdit1.GetCurrentItemEx(TRVTableItemInfo, Rve, Item) then Exit; Table := TRVTableItemInfo(Item); Stream := TMemoryStream.Create; try //從第3行開始,複製3行表格(複製開始行中包含合併nil的單元格,會將nil主單元格的內容複製) Table.SaveRowsToStream(Stream, 2, 3); Stream.Position := 0; //建立新表格(載入資料會將原先表格中的內容都清除,建立表格時行和列不起作用) NewTable := TRVTableItemInfo.CreateEx(3, 3, Rve.RVData); //載入複製資料 NewTable.LoadFromStream(Stream); //新增分頁符 Rve.InsertPageBreak; //將表格新增到文件中 Rve.InsertItem('', NewTable); finally Stream.Free; end; end;
分表函式
function SplitTable(rve: TCustomRichViewEdit; table: TRVTableItemInfo;
RowCountInFirstTable: Integer; PageBreak: Boolean): Boolean;
var r, c, mr, mc: Integer;
newtable: TRVTableItemInfo;
Stream: TMemoryStream;
begin
Result := False;
if RowCountInFirstTable>=table.RowCount then
exit;
for c := 0 to table.ColCount-1 do
if table.Cells[RowCountInFirstTable, c] = nil then begin
table.Rows.GetMainCell(RowCountInFirstTable, c, mr, mc);
if mr<RowCountInFirstTable then
exit;
end;
Stream := TMemoryStream.Create;
table.SaveRowsToStream(Stream, RowCountInFirstTable,
table.RowCount-RowCountInFirstTable);
Stream.Position := 0;
newtable := TRVTableItemInfo.CreateEx(0, 0, rve.RVData);
newtable.LoadFromStream(Stream);
if PageBreak then
newtable.PageBreakBefore := True;
Stream.Free;
rve.BeginUndoGroup(rvutModifyItem);
rve.SetUndoGroupMode(True);
try
table.DeleteRows(RowCountInFirstTable, table.RowCount-RowCountInFirstTable, True);
// table.GetItem 與.GetItem(table) 相同,但速度更快
rve.SetSelectionBounds(table.GetMyItemNo, 1, table.GetMyItemNo, 1);
rve.InsertItem('', newtable);
finally
rve.SetUndoGroupMode(False);
end;
Result := True;
end;
將表分為兩個表。
引數
rve 包含table的編輯器。
table 要劃分的表。
RowCountInFirstTable 第一個表具有的行數。第一個表具有的行數 = RowCountInFirstTable, 第二個表具有的行數 = table.RowCount
-RowCountInFirstTable.
PageBreak 如果為 True,將在表之間插入分頁符。
返回值 True 表被劃分。
rve和table可以通過
RichViewEdit1.GetCurrentItemEx
獲取。這是一個編輯操作,使用者可以撤銷和重做。