Показать сообщение отдельно
  #11  
Старый 27.08.2010, 22:21
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,020
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

собствнно, непонятно почему нельзя использовать модуль Classes. Он ничего такого тяжелого в себе не содержит. Это раз.
Два. Реализовать свой список строк можно и на динамическом массиве. Там только проблема, что динамический массив нельзя менять внутри процедуры (может в версиях после 7 это и поправили). но с другой стороны легко написать свою обертку над ним в виде класса.

Код:
unit MyStrings;

interface

uses
  Windows, SysUtils;

type
  TMyStrings = class
  private
    FItems : Array Of String;
    function GetCount : Integer;
    function GetItem(Index : Integer) : String;
    procedure SetItem(Index : Integer; Value : String);
  public
    constructor Create; virtual;
    destructor Destroy; override;

    procedure Clear;
    function Add(AStr : String) : Integer;
    function IndexOf(AStr : String) : Integer; overload;
    function IndexOf(AStr : String; ACaseSensitive : Boolean) : Integer; overload;
    procedure Delete(AIndex : Integer);
    procedure Remove(AStr : String);

    property Count : Integer read GetCount;
    property Items[Index : Integer] : String read GetItem write SetItem;
  end;

implementation

function TMyStrings.GetCount : Integer;
begin
  Result := Length(FItems);
end;

function TMyStrings.GetItem(Index : Integer) : String;
begin
  If (Index < Low(FItems)) Or (Index > High(FItems))
    Then Raise Exception.CreateFmt('Index out of bounds (%d).',[Index]);
  Result := FItems[Index];
end;

procedure TMyStrings.SetItem(Index : Integer; Value : String);
begin
  If (Index < Low(FItems)) Or (Index > High(FItems))
    Then Raise Exception.CreateFmt('Index out of bounds (%d).',[Index]);
  FItems[Index] := Value;
end;

constructor TMyStrings.Create;
begin
  inherited;
  SetLength(FItems,0);
end;

destructor TMyStrings.Destroy;
begin
  SetLength(FItems,0);
  inherited;
end;


procedure TMyStrings.Clear;
begin
  SetLength(FItems,0);
end;

function TMyStrings.Add(AStr : String) : Integer;
begin
  SetLength(FItems,Length(FItems)+1);
  Result := High(FItems);
  FItems[Result] := AStr;
end;

function TMyStrings.IndexOf(AStr : String) : Integer;
begin
  Result := IndexOf(AStr,True);
end;

function TMyStrings.IndexOf(AStr : String; ACaseSensitive : Boolean) : Integer;
var
  I : Integer;
  cResult : Integer;
begin
  Result := -1;
  For I := Low(FItems) To High(Fitems) Do
    Begin
      If ACaseSensitive
        Then cResult := AnsiCompareStr(FItems[i],AStr)
        Else cResult := AnsiCompareText(FItems[i],AStr);
      If cResult = 0 Then
        Begin
          Result := I;
          Break;
        End;
    End;
end;

procedure TMyStrings.Delete(AIndex : Integer);
var
  I : Integer;
begin
  If (AIndex < Low(FItems)) Or (AIndex > High(FItems))
    Then Raise Exception.CreateFmt('Index out of bounds (%d).',[AIndex]);
  For I := AIndex To High(FItems) - 1  Do
    FItems[i] := FItems[I+1];
  SetLength(FItems,Length(FItems)-1);
end;

procedure TMyStrings.Remove(AStr : String);
var
  AIndex : Integer;
begin
  AIndex := IndexOf(AStr);
  If AIndex = -1
    Then Raise Exception.CreateFmt('Item ''%s'' not found.',[AStr]);
  Delete(AIndex);
end;

end.
Ответить с цитированием