📄 dlines.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 + -