⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crvdata.pas

📁 richview1.7 full.source
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    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 + -