собствнно, непонятно почему нельзя использовать модуль 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.