📄 crvdata.pas
字号:
FirstCP := nil;
LastCP := nil;
finally
if not Clearing then
Exclude(State, rvstClearing);
end;
end;
{------------------------------------------------------------------------------}
function TCustomRVData.GetOffsBeforeItem(ItemNo: Integer): Integer;
begin
if TCustomRVItemInfo(Items.Objects[ItemNo]).StyleNo<0 then
Result := 0
else
Result := 1;
end;
{------------------------------------------------------------------------------}
function TCustomRVData.GetOffsAfterItem(ItemNo: Integer): Integer;
begin
if TCustomRVItemInfo(Items.Objects[ItemNo]).StyleNo<0 then
Result := 1
else
Result := RVU_Length(Items[ItemNo], GetItemOptions(ItemNo))+1;
end;
{------------------------------------------------------------------------------}
function TCustomRVData.ReplaceTabs(const s: String; StyleNo: Integer;
UnicodeDef: Boolean): String;
begin
if GetRVStyle = nil then begin
{$IFNDEF RVDONOTUSEUNICODE}
if UnicodeDef then
Result := RV_ReplaceTabsW(s,8)
else
{$ENDIF}
Result := RV_ReplaceTabsA(s,8)
end
else
{$IFNDEF RVDONOTUSEUNICODE}
if GetRVStyle.TextStyles[StyleNo].Unicode then
Result := RV_ReplaceTabsW(s, GetRVStyle.SpacesInTab)
else
{$ENDIF}
Result := RV_ReplaceTabsA(s, GetRVStyle.SpacesInTab);
end;
{------------------------------------------------------------------------------}
function TCustomRVData.LoadText(const FileName: String; StyleNo, ParaNo: Integer;
AsSingleParagraph: Boolean): Boolean;
var f: TextFile;
s: String;
ANP: Boolean;
FirstTime, ProcessPageBreaks, PageBreak: Boolean;
ConvertToUnicode: Boolean;
{$IFNDEF RVDONOTUSEUNICODE}
CodePage: TRVCodePage;
{$ENDIF}
{........................................................}
procedure AddString(const s: String;
ConvertToUnicode, AsSingleParagraph: Boolean;
var FirstTime, PageBreak: Boolean);
var s2: String;
begin
{$IFNDEF RVDONOTUSEUNICODE}
if ConvertToUnicode then
s2 := RVU_AnsiToUnicode(CodePage, s)
else
{$ENDIF}
s2 := s;
AddNL(s2,StyleNo,ParaNo);
if AsSingleParagraph and FirstTime then begin
SetAddParagraphMode(False);
FirstTime := False;
end;
if PageBreak then begin
PageBreaksBeforeItems[Items.Count-1] := True;
PageBreak := False;
end;
end;
{........................................................}
procedure AddStringFF(var s: String;
ProcessPageBreaks,
ConvertToUnicode, AsSingleParagraph: Boolean;
var FirstTime, PageBreak: Boolean);
var P: Integer;
begin
if ProcessPageBreaks then begin
if s='' then
AddString(s, ConvertToUnicode, AsSingleParagraph, FirstTime, PageBreak);
while s<>'' do begin
P := RV_CharPos(PChar(s), #$0C, Length(s));
if P<>0 then begin
if P>1 then
AddString(Copy(s,1,P-1), ConvertToUnicode, AsSingleParagraph, FirstTime, PageBreak);
s := Copy(s, P+1, Length(s));
PageBreak := True;
end
else begin
if s<>'' then
AddString(s, ConvertToUnicode, AsSingleParagraph, FirstTime, PageBreak);
break;
end;
end;
end
else
AddString(s, ConvertToUnicode, AsSingleParagraph, FirstTime, PageBreak);
end;
{$IFNDEF RICHVIEWDEF6}
{........................................................}
procedure AddUnixString(var s: String;
ProcessPageBreaks,
ConvertToUnicode, AsSingleParagraph: Boolean;
var FirstTime, PageBreak: Boolean);
var PrevCRLoc, CRLoc, StartLoc: PChar;
s2: String;
Pos, Len: Integer;
begin
StartLoc := PChar(s);
PrevCRLoc := StartLoc;
Len := Length(s);
repeat
Pos := RV_CharPos(PrevCRLoc, #10, Len);
if Pos <> 0 then begin
CRLoc := PrevCRLoc+Pos-1;
s2 := Copy(s, PrevCRLoc-StartLoc+1, CRLoc-PrevCRLoc);
dec(Len, Length(s2)+1);
PrevCRLoc := CRLoc+1;
end
else
s2 := Copy(s, PrevCRLoc-StartLoc+1, Length(s));
AddStringFF(s2, ProcessPageBreaks, ConvertToUnicode, AsSingleParagraph, FirstTime, PageBreak);
until Pos=0;
end;
{........................................................}
{$ENDIF}
begin
ANP := FAllowNewPara;
FirstTime := True;
Result := True;
{$IFNDEF RVDONOTUSEUNICODE}
ConvertToUnicode := (GetRVStyle<>nil) and GetRVStyle.TextStyles[StyleNo].Unicode;
CodePage := GetStyleCodePage(StyleNo);
{$ELSE}
ConvertToUnicode := False;
{$ENDIF}
ProcessPageBreaks := SupportsPageBreaks;
PageBreak := False;
try
AssignFile(f, FileName);
Reset(f);
try
while not eof(f) do begin
ReadLn(f,s);
Replace0(s);
{$IFDEF RICHVIEWDEF6}
AddStringFF(s, ProcessPageBreaks, ConvertToUnicode, AsSingleParagraph,
FirstTime, PageBreak);
{$ELSE}
AddUnixString(s, ProcessPageBreaks, ConvertToUnicode, AsSingleParagraph,
FirstTime, PageBreak);
{$ENDIF}
end;
finally
CloseFile(f);
SetAddParagraphMode(ANP);
end;
except
Result := False;
end;
end;
{------------------------------------------------------------------------------}
function TCustomRVData.SaveTextToStream(const Path: String; Stream: TStream;
LineWidth: Integer;
SelectionOnly, TextOnly, Unicode: Boolean):Boolean;
var i, StartItem,EndItem,StartOffs,EndOffs: Integer;
{$IFNDEF RVDONOTUSELISTS}
MarkerItemNo: Integer;
{$ENDIF}
Item: TCustomRVItemInfo;
s: String;
NotUsedPart: TRVMultiDrawItemPart;
{..................................................}
function GetStr(Item:TCustomRVItemInfo; const s: String) : String;
begin
{$IFNDEF RVDONOTUSEUNICODE}
if (Item=nil) or (Item.StyleNo<0) then begin
if Unicode and ((Item=nil) or not Item.GetBoolValue(rvbpCanSaveUnicode)) then
Result := RVU_AnsiToUnicode(GetDefaultCodePage, s)
else
Result := s
end
else if (rvioUnicode in Item.ItemOptions) and not Unicode then
Result := RVU_UnicodeToAnsi(GetDefaultCodePage, s)
else if not (rvioUnicode in Item.ItemOptions) and Unicode then
Result := RVU_AnsiToUnicode(GetStyleCodePage(Item.StyleNo), s)
else
{$ENDIF}
Result := s;
end;
{..................................................}
function GetNonTextStr(Item: TCustomRVItemInfo; ItemNo, StartOffs, EndOffs: Integer): String;
var SaveUnicode: Boolean;
begin
if (TextOnly and not Item.GetBoolValue(rvbpAlwaysInText)) or (StartOffs>=EndOffs) then
Result := ''
else begin
{$IFNDEF RVDONOTUSEUNICODE}
SaveUnicode := Unicode and Item.GetBoolValue(rvbpCanSaveUnicode);
{$ELSE}
SaveUnicode := False;
{$ENDIF}
Result := Item.AsText(LineWidth, Self, Items[ItemNo], Path, TextOnly, SaveUnicode);
end;
end;
{..................................................}
begin
try
Result := True;
RVFGetLimits(GetRVFSaveScope(SelectionOnly),StartItem,EndItem,StartOffs,EndOffs,NotUsedPart,NotUsedPart);
if (StartItem=-1) or (StartItem>EndItem) then
exit;
{$IFNDEF RVDONOTUSELISTS}
if SelectionOnly then begin
MarkerItemNo := GetFirstParaSectionItem(StartItem);
if GetItemStyle(MarkerItemNo)=rvsListMarker then begin
s := GetNonTextStr(GetItem(MarkerItemNo), MarkerItemNo, 0, 1);
RVFWrite(Stream, GetStr(GetItem(MarkerItemNo), s));
end;
end;
{$ENDIF}
if StartItem = EndItem then begin
Item := GetItem(StartItem);
if Item.StyleNo<0 then
s := GetNonTextStr(Item, StartItem, StartOffs, EndOffs)
else
s := RVU_Copy(Items[StartItem], StartOffs, EndOffs-StartOffs, Item.ItemOptions);
RVFWrite(Stream, GetStr(Item, s));
end
else begin
Item := GetItem(StartItem);
if Item.StyleNo < 0 then
s := GetNonTextStr(Item, StartItem, StartOffs, 1)
else
s := RVU_Copy(Items[StartItem], StartOffs, RVU_Length(Items[StartItem], Item.ItemOptions),
Item.ItemOptions);
RVFWrite(Stream, GetStr(Item, s));
for i := StartItem+1 to EndItem-1 do begin
Item := TCustomRVItemInfo(Items.Objects[i]);
if not Item.SameAsPrev then
RVFWrite(Stream, GetStr(nil, crlf));
if Item.StyleNo < 0 then
s := GetNonTextStr(Item, i, 0, 1)
else
s := Items[i];
RVFWrite(Stream, GetStr(Item, s));
end;
Item := GetItem(EndItem);
if not Item.SameAsPrev then
RVFWrite(Stream, GetStr(nil, crlf));
if Item.StyleNo < 0 then
s := GetNonTextStr(Item, EndItem, 0, EndOffs)
else
s := RVU_Copy(Items[EndItem], 1, EndOffs-1, Item.ItemOptions);
RVFWrite(Stream, GetStr(Item, s));
end;
except
Result := False;
end;
end;
{------------------------------------------------------------------------------}
function TCustomRVData.SaveText(const FileName: String; LineWidth: Integer;
Unicode: Boolean): Boolean;
var Stream: TFileStream;
begin
try
Stream := TFileStream.Create(FileName, fmCreate);
try
Result := SaveTextToStream(ExtractFilePath(FileName), Stream, LineWidth,
False, False, Unicode);
finally
Stream.Free;
end;
except
Result := False;
end;
end;
{------------------------------------------------------------------------------}
{$IFNDEF RVDONOTUSEUNICODE}
procedure TCustomRVData.AddTextNLW(const s: String; StyleNo, FirstParaNo, OtherParaNo : Integer;
DefAsSingleParagraph: Boolean);
var
ParaNo: Integer;
startptr,ptr,endptr: PWord;
SkipIfEqual: Word;
ANP: Boolean;
ConvertToAnsi: Boolean;
CodePage: TRVCodePage;
ProcessPageBreaks, PageBreak: Boolean;
{.................................}
procedure AddS;
var str, str2: String;
begin
if PageBreak and (startptr=ptr) then
exit;
if (ParaNo<>-1) or (startptr<>ptr) then begin
str := Copy(s, PChar(startptr)-PChar(s)+1, PChar(ptr)-PChar(startptr));
if ConvertToAnsi then
str2 := RVU_UnicodeToAnsi(CodePage, str)
else
str2 := str;
AddNL(str2, StyleNo, ParaNo);
end;
if FAllowNewPara then
ParaNo := OtherParaNo;
startptr := ptr;
inc(PChar(startptr),2);
if PageBreak then begin
PageBreaksBeforeItems[Items.Count-1] := True;
PageBreak := False;
end;
end;
{.................................}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -