📄 mmmrklst.pas
字号:
{========================================================================}
{= (c) 1995-98 SwiftSoft Ronald Dittrich =}
{========================================================================}
{= All Rights Reserved =}
{========================================================================}
{= D 01099 Dresden = Fax.: +49 (0)351-8037944 =}
{= Loewenstr.7a = info@swiftsoft.de =}
{========================================================================}
{= Actual versions on http://www.swiftsoft.de/mmtools.html =}
{========================================================================}
{= This code is for reference purposes only and may not be copied or =}
{= distributed in any format electronic or otherwise except one copy =}
{= for backup purposes. =}
{= =}
{= No Delphi Component Kit or Component individually or in a collection=}
{= subclassed or otherwise from the code in this unit, or associated =}
{= .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed =}
{= without express permission from SwiftSoft. =}
{= =}
{= For more licence informations please refer to the associated =}
{= HelpFile. =}
{========================================================================}
{= $Date: 01.07.98 - 16:42:02 $ =}
{========================================================================}
unit MMMrkLst;
{$I COMPILER.INC}
interface
uses
{$IFDEF WIN32}
Windows,
{$ELSE}
WinProcs,
WinTypes,
{$ENDIF}
SysUtils,
Classes,
MMObj,
MMMuldiv,
MMUtils;
type
PMMMarker = ^TMMMarker;
TMMMarker = packed record
ID : Longint;
NextID : Longint;
Offset : Longint;
Name : string[80];
Comment: string[255];
Fixed : Boolean;
Visible: Boolean;
Color : Longint;
User : Longint;
Flags : Longint;
end;
const
{ Maximum List size }
{$IFDEF WIN32}
MaxMrkListSize = Maxint div (sizeOf(TMMMarker));
{$ELSE}
MaxMrkListSize = 65520 div sizeOf(TMMMarker);
{$ENDIF}
type
PMMMarkerArray = ^TMMMarkerArray;
TMMMarkerArray = array[0..MaxMrkListSize-1] of TMMMarker;
TMMMarkerList = class(TMMObject)
private
FList : PMMMarkerArray;
FCount : Integer;
FCapacity : Integer;
protected
procedure Error; virtual;
procedure Grow; virtual;
function Add(Marker: TMMMarker): Integer;
function Get(Index: Integer): PMMMarker;
procedure Put(Index: Integer; Marker: PMMMarker);
procedure SetCapacity(NewCapacity: Integer);
procedure SetCount(NewCount: Integer);
public
constructor Create; virtual;
destructor Destroy; override;
procedure Clear; virtual;
procedure Assign(Source: TPersistent); override;
procedure AddMarker(Marker: TMMMarker);
procedure Insert(Index: Integer; Marker: TMMMarker);
procedure Exchange(Index1, Index2: Integer);
procedure Move(CurIndex, NewIndex: Integer);
function Remove(Marker: PMMMarker): Integer;
procedure Delete(Index: Integer);
function IndexOf(Marker: PMMMarker): Integer;
function FindFreeID: Longint;
function LocateMarker(Offset: Longint): integer;
function FindMarker(Offset: Longint): integer;
function FindConnectedMarker(Index: integer): integer;
function QueryMarker(Offset: Longint): Boolean;
procedure Sort;
function First: PMMMarker;
function Last: PMMMarker;
function Expand: TMMMarkerList;
procedure SetOffset(Index: integer; Offset: Longint);
procedure SetColor(Index: integer; Color: Longint);
property OnChange;
property OnChanging;
property Capacity: Integer read FCapacity write SetCapacity;
property Count: Integer read FCount write SetCount;
property Markers[Index: Integer]: PMMMarker read Get write Put; default;
property List: PMMMarkerArray read FList;
end;
function CompareMarkers(Marker1,Marker2: PMMMarker): Boolean;
implementation
uses
Consts
{$IFDEF DELPHI6}
,RTLConsts
{$ENDIF}
;
{------------------------------------------------------------------------}
function CompareMarkers(Marker1,Marker2: PMMMarker): Boolean;
begin
Result := (Marker1^.Offset = Marker2^.Offset);
end;
{------------------------------------------------------------------------}
{$IFDEF DELPHI3}
procedure ListError(const Ident: string);
begin
raise EListError.Create(Ident);
end;
{$ELSE}
procedure ListError(Ident: Word);
begin
raise EListError.CreateRes(Ident);
end;
{$ENDIF}
{------------------------------------------------------------------------}
procedure ListIndexError;
begin
ListError(SListIndexError);
end;
{== TMMMarkerList ========================================================}
constructor TMMMarkerList.Create;
begin
inherited Create;
FList := nil;
end;
{-- TMMMarkerList --------------------------------------------------------}
destructor TMMMarkerList.Destroy;
begin
OnChange := nil;
OnChanging := nil;
Clear;
inherited Destroy;
end;
{-- TMMMarkerList --------------------------------------------------------}
procedure TMMMarkerList.Error;
begin
ListIndexError;
end;
{-- TMMMarkerList --------------------------------------------------------}
function TMMMarkerList.Add(Marker: TMMMarker): Integer;
begin
Changing;
Result := FCount;
if Result = FCapacity then Grow;
FList^[Result] := Marker;
Inc(FCount);
Changed;
end;
{-- TMMMarkerList --------------------------------------------------------}
{ AddMarker f黦t einen Punkt in die Liste ein }
procedure TMMMarkerList.AddMarker(Marker: TMMMarker);
var
i: integer;
begin
i := LocateMarker(Marker.Offset);
if (i < 0) or (i >= Count) then
Add(Marker)
else
Insert(i, Marker);
end;
{-- TMMMarkerList --------------------------------------------------------}
procedure TMMMarkerList.Clear;
begin
Changing;
SetCount(0);
SetCapacity(0);
Changed;
end;
{-- TMMMarkerList --------------------------------------------------------}
procedure TMMMarkerList.Delete(Index: Integer);
begin
if (Index < 0) or (Index >= FCount) then Error;
Changing;
Dec(FCount);
if Index < FCount then
System.Move(FList^[Index + 1], FList^[Index],
(FCount - Index) * SizeOf(TMMMarker));
Changed;
end;
{-- TMMMarkerList --------------------------------------------------------}
procedure TMMMarkerList.Exchange(Index1, Index2: Integer);
var
Marker: TMMMarker;
begin
if (Index1 < 0) or (Index1 >= FCount) then Error;
if (Index2 < 0) or (Index2 >= FCount) then Error;
Changing;
Marker := FList^[Index1];
FList^[Index1] := FList^[Index2];
FList^[Index2] := Marker;
Changed;
end;
{-- TMMMarkerList --------------------------------------------------------}
function TMMMarkerList.Expand: TMMMarkerList;
begin
if FCount = FCapacity then Grow;
Result := Self;
end;
{-- TMMMarkerList --------------------------------------------------------}
function TMMMarkerList.First: PMMMarker;
begin
Result := Get(0);
end;
{-- TMMMarkerList --------------------------------------------------------}
function TMMMarkerList.Get(Index: Integer): PMMMarker;
begin
if (Index < 0) or (Index >= FCount) then Error;
Result := @FList^[Index];
end;
{-- TMMMarkerList --------------------------------------------------------}
procedure TMMMarkerList.Grow;
var
Delta: Integer;
begin
if FCapacity > 8 then
Delta := 16
else if FCapacity > 4 then
Delta := 8
else
Delta := 4;
SetCapacity(FCapacity + Delta);
end;
{-- TMMMarkerList --------------------------------------------------------}
function TMMMarkerList.IndexOf(Marker: PMMMarker): Integer;
begin
Result := 0;
while (Result < FCount) and not CompareMarkers(@FList^[Result],Marker) do Inc(Result);
if Result = FCount then Result := -1;
end;
{-- TMMMarkerList --------------------------------------------------------}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -