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

📄 dlines.pas

📁 richview1.7 full.source
💻 PAS
字号:
{=========================} unit DLines; {==============================}
{ unit DLines: internal data type for RichView                          }
{ components:                                                           }
{   none (YOU MUST NOT INSTALL THIS FILE IN DELPHI2 AND CB1)            }
{-----------------------------------------------------------------------}
{ Copyright (C) S.Tkachenko                                             }
{=======================================================================}

interface
{$I RV_Defs.inc}
uses Classes;
type
{-----------------------------------------------------------------------}
  TRVDrawLineInfo = class
    public
    {$IFNDEF DONOTUSEJUSTIFY}
     SpaceBefore: Integer;
    {$ELSE}
    {$IFNDEF RVDONOTUSELISTS}
     SpaceBefore: Integer;    
    {$ENDIF}
    {$ENDIF}
     Left, Top, Width, Height: Integer;
     ItemNo, Offs, Length: Integer;
     ExtraSpaceBelow: Integer;
     FromNewLine: ByteBool;
     constructor CreateEx(ALeft, ATop, AWidth, AHeight, AItemNo: Integer;
                          AFromNewLine: ByteBool);
     procedure SetData(ALeft, ATop, AItemNo: Integer;
                       AFromNewLine: ByteBool); virtual;
     procedure SetSize(AWidth, AHeight: Integer);virtual;
     function InitSplit: Boolean; dynamic;
     function CanSplitFirst(Y: Integer): Boolean; dynamic;
     function SplitAt(Y: Integer): Boolean; dynamic;
  end;
  TRVDrawLineInfoClass = class of TRVDrawLineInfo;
{-----------------------------------------------------------------------}
  TRVDrawLines = class (TList)
    private
      FStartDeletedIndex, FDeletedCount: Integer;
      function Get(Index: Integer): TRVDrawLineInfo;
      procedure Put(Index: Integer; const Value: TRVDrawLineInfo);
    public
      constructor Create;
      procedure DeleteRange(Index1, Index2: Integer);
      procedure MarkForDelete(Index1, Index2: Integer);
      procedure DeleteMarked;
      procedure Insert(Index: Integer; Item: Pointer);
      function GetString(Index: Integer;Lines: TStringList): String;
      function GetSubString(Index: Integer;Lines: TStringList; AStartIndex, ALength: Integer): String;
      function GetRightString(Index: Integer;Lines: TStringList; AStartIndex: Integer): String;
      property Items[Index: Integer]: TRVDrawLineInfo read Get write Put; default;
  end;

implementation
uses RVUni, RVItem;
{=============================== TRVDrawLineInfo ==============================}
constructor TRVDrawLineInfo.CreateEx(ALeft, ATop, AWidth, AHeight,
  AItemNo: Integer; AFromNewLine: ByteBool);
begin
  inherited Create;
  SetData(ALeft, ATop, AItemNo, AFromNewLine);
  SetSize(AWidth, AHeight); 
end;
{------------------------------------------------------------------------------}
procedure TRVDrawLineInfo.SetData(ALeft, ATop, AItemNo: Integer; AFromNewLine: ByteBool);
begin
  Left   := ALeft;
  Top    := ATop;
  ItemNo := AItemNo;
  FromNewLine := AFromNewLine;
end;
{------------------------------------------------------------------------------}
procedure TRVDrawLineInfo.SetSize(AWidth, AHeight: Integer);
begin
  Width  := AWidth;
  Height := AHeight;
end;
{================================ TRVDrawLines ================================}
constructor TRVDrawLines.Create;
begin
  inherited Create;
  FStartDeletedIndex := -1;
  FDeletedCount      := 0;
end;
{-----------------------------------------------------------------------}
procedure TRVDrawLines.MarkForDelete(Index1, Index2: Integer);
var i: Integer;
begin
  FStartDeletedIndex := Index1;
  FDeletedCount      := Index2-Index1+1;
  for i := Index1 to Index2 do
    TObject(Items[i]).Free;
end;
{-----------------------------------------------------------------------}
procedure TRVDrawLines.DeleteMarked;
begin
  if FDeletedCount<>0 then begin
    DeleteRange(FStartDeletedIndex, FStartDeletedIndex+FDeletedCount-1);
    FDeletedCount := 0;
  end;
end;
{-----------------------------------------------------------------------}
procedure TRVDrawLines.Insert(Index: Integer; Item: Pointer);
begin
  if FDeletedCount=0 then
    inherited Insert(Index, Item)
  else begin
    //Assert(Index=FStartDeletedIndex);
    inc(FStartDeletedIndex);
    dec(FDeletedCount);
    Items[Index] := Item;
  end;
end;
{-----------------------------------------------------------------------}
procedure TRVDrawLines.DeleteRange(Index1, Index2: Integer);
begin
  if Index2 < Count-1 then
    System.Move(List^[Index2 + 1], List^[Index1],
      (Count - Index2 -1) * SizeOf(Pointer));
  Count := Count - (Index2-Index1+1);
end;
{-----------------------------------------------------------------------}
function TRVDrawLines.Get(Index: Integer): TRVDrawLineInfo;
begin
  Result := TRVDrawLineInfo(inherited Get(Index));
end;
{-----------------------------------------------------------------------}
function TRVDrawLines.GetRightString(Index: Integer; Lines: TStringList;
  AStartIndex: Integer): String;
begin
  {$IFDEF RVDONOTUSEUNICODE}
  with Items[Index] do
    Result := Copy(Lines[ItemNo], Offs+AStartIndex-1, Length-AStartIndex+1);
  {$ELSE}
  with Items[Index] do
    Result := RVU_Copy(Lines[ItemNo], Offs+AStartIndex-1, Length-AStartIndex+1,
                      TCustomRVItemInfo(Lines.Objects[ItemNo]).ItemOptions);
  {$ENDIF}
end;
{-----------------------------------------------------------------------}
function TRVDrawLines.GetString(Index: Integer; Lines: TStringList): String;
begin
 {$IFDEF RVDONOTUSEUNICODE}
  with Items[Index] do
    Result := Copy(Lines[ItemNo], Offs, Length);
  {$ELSE}
  with Items[Index] do
    Result := RVU_Copy(Lines[ItemNo], Offs, Length,
                      TCustomRVItemInfo(Lines.Objects[ItemNo]).ItemOptions);
  {$ENDIF}
end;
{-----------------------------------------------------------------------}
function TRVDrawLines.GetSubString(Index: Integer; Lines: TStringList;
  AStartIndex, ALength: Integer): String;
begin
  with Items[Index] do begin
    if AStartIndex+ALength>Length+1 then
      ALength := Length-AStartIndex+1;
    {$IFDEF RVDONOTUSEUNICODE}
    Result := Copy(Lines[ItemNo], Offs+AStartIndex-1, ALength);
    {$ELSE}
    Result := RVU_Copy(Lines[ItemNo], Offs+AStartIndex-1, ALength,
              TCustomRVItemInfo(Lines.Objects[ItemNo]).ItemOptions);
    {$ENDIF}
  end;
end;
{-----------------------------------------------------------------------}
procedure TRVDrawLines.Put(Index: Integer; const Value: TRVDrawLineInfo);
begin
  inherited Put(Index, Value);
end;
{-----------------------------------------------------------------------}
function TRVDrawLineInfo.InitSplit: Boolean;
begin
  Result := False;
end;
{-----------------------------------------------------------------------}
function TRVDrawLineInfo.CanSplitFirst(Y: Integer): Boolean;
begin
  Result := False;
end;
{-----------------------------------------------------------------------}
function TRVDrawLineInfo.SplitAt(Y: Integer): Boolean;
begin
  Result := False;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -