http://blog.sina.com.cn/game7788
夸父
下面代碼主要處理刪除文檔中的文本樣式,處理對(duì)象包括所有的文本元素,制表符,標(biāo)記列表等文本類型的元素,對(duì)于其它元素不起作用。
在使用此功能時(shí),需要注意的是,當(dāng)文檔中同時(shí)存在UNICODE和非UNICODE文本編碼時(shí),或者存在不同的語(yǔ)言字符集的非UNICODE文本,那么此功能可能會(huì)使部分文本信息丟失,所以使用此功能時(shí)最好保證文檔中的字符編碼格式相同。同時(shí),
這個(gè)功能不是普通的編輯操作,因此使用后是不可以撤消的,使用前請(qǐng)務(wù)必清除撤消緩沖區(qū)。
procedure RemoveFormatting(RVData: TCustomRVData; RemoveMarkers, KeepLinks: Boolean);
var i, HypertextStyleNo: Integer;
UnicodeTo, UnicodeHTo: Boolean;
{.............................................................}
procedure DoRemoveFormatting(RVData: TCustomRVData); //主要實(shí)現(xiàn)方法
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;
上面是主要實(shí)現(xiàn)方法,如果要在文檔中正式使用此方法,調(diào)用下面的代碼即可.
RemoveFormatting(RichViewEdit1.RVData, True, True);
NormalizeRichView(RichViewEdit1.RVData);//還原編輯器原始狀態(tài),這步很重要,主要起修復(fù)作用,可以理解為格式化
RichViewEdit1.DeleteUnusedStyles(True, True, True);
RichViewEdit1.ClearUndo;
RichViewEdit1.Format;
|