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

📄 mmmrklst.pas

📁 一套及时通讯的原码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
{========================================================================}
{=                (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 + -