http://blog.sina.com.cn/game7788
夸父
下面代码主要处理删除文档中的文本样式,处理对象包括所有的文本元素,制表符,标记列表等文本类型的元素,对于其它元素不起作用。
在使用此功能时,需要注意的是,当文档中同时存在UNICODE和非UNICODE文本编码时,或者存在不同的语言字符集的非UNICODE文本,那么此功能可能会使部分文本信息丢失,所以使用此功能时最好保证文档中的字符编码格式相同。同时,
这个功能不是普通的编辑操作,因此使用后是不可以撤消的,使用前请务必清除撤消缓冲区。
procedure RemoveFormatting(RVData: TCustomRVData; RemoveMarkers, KeepLinks: Boolean);
var i, HypertextStyleNo: Integer;
UnicodeTo, UnicodeHTo: Boolean;
{.............................................................}
procedure DoRemoveFormatting(RVData: TCustomRVData); //主要实现方法
var i, r, c, StyleNo, StyleNoTo: Integer;
PB, UnicodeFrom, ThisUnicodeTo: Boolean;
table: TRVTableItemInfo;
begin
for i := RVData.ItemCount-1 downto 0 do begin
RVData.GetItem(i).ParaNo := 0;
StyleNo := RVData.GetItemStyle(i);
case StyleNo of
rvsTable:
begin
table := TRVTableItemInfo(RVData.GetItem(i));
for r := 0 to table.RowCount-1 do
for c := 0 to table.ColCount-1 do
if table.Cells[r,c]<>nil then
DoRemoveFormatting(table.Cells[r,c].GetRVData);
end;
rvsListMarker:
if RemoveMarkers then begin
PB := RVData.PageBreaksBeforeItems[i];
RVData.DeleteItems(i, 1);
if i<RVData.ItemCount then begin
RVData.GetItem(i).SameAsPrev := False;
RVData.GetItem(i).PageBreakBefore := PB;
end;
end;
rvsTab:
if RVData.GetRVStyle.TextStyles[
TRVTabItemInfo(RVData.GetItem(i)).TextStyleNo].Jump and KeepLinks then
TRVTabItemInfo(RVData.GetItem(i)).TextStyleNo := HypertextStyleNo
else begin
TRVTabItemInfo(RVData.GetItem(i)).TextStyleNo := 0;
RVData.SetItemTag(i, '');
end;
1..MaxInt:
begin
if KeepLinks and RVData.GetRVStyle.TextStyles[StyleNo].Jump then begin
ThisUnicodeTo := UnicodeHTo;
StyleNoTo := HypertextStyleNo;
end
else begin
ThisUnicodeTo := UnicodeTo;
StyleNoTo := 0;
RVData.SetItemTag(i, '');
end;
UnicodeFrom := RVData.GetRVStyle.TextStyles[StyleNo].Unicode;
RVData.GetItem(i).StyleNo := StyleNoTo;
if UnicodeFrom and not ThisUnicodeTo then begin
RVData.GetItem(i).ItemOptions := RVData.GetItem(i).ItemOptions-[rvioUnicode];
RVData.SetItemTextR(i,
RVU_UnicodeToAnsi(RVData.GetStyleCodePage(0), RVData.GetItemTextR(i)));
end
else if not UnicodeFrom and ThisUnicodeTo then begin
RVData.GetItem(i).ItemOptions := RVData.GetItem(i).ItemOptions+[rvioUnicode];
RVData.SetItemTextR(i,
RVU_AnsiToUnicode(RVData.GetStyleCodePage(0), RVData.GetItemTextR(i)));
end;
end;
end;
end;
end;
{.............................................................}
begin
HypertextStyleNo := 0;
if KeepLinks then
for i := 0 to RVData.GetRVStyle.TextStyles.Count-1 do
if RVData.GetRVStyle.TextStyles[i].Jump then begin
HypertextStyleNo := i;
break;
end;
UnicodeTo := RVData.GetRVStyle.TextStyles[0].Unicode;
UnicodeHTo := RVData.GetRVStyle.TextStyles[HypertextStyleNo].Unicode;
DoRemoveFormatting(RVData);
end;
上面是主要实现方法,如果要在文档中正式使用此方法,调用下面的代码即可.
RemoveFormatting(RichViewEdit1.RVData, True, True);
NormalizeRichView(RichViewEdit1.RVData);//还原编辑器原始状态,这步很重要,主要起修复作用,可以理解为格式化
RichViewEdit1.DeleteUnusedStyles(True, True, True);
RichViewEdit1.ClearUndo;
RichViewEdit1.Format;
|