|
unit WideStrings;
interface
uses classes,SysUtils;
type
TWString = record WString: WideString; end;
TWideStrings = class private FWideStringList: TList; function Get(Index: Integer): WideString; procedure Put(Index: Integer; const S: WideString); public constructor Create; destructor Destroy; override; function Count: Integer; procedure Clear; function Add(const S: WideString): Integer; function IndexOf(const S: WideString): Integer; function IndexOfIgnoreCase(const S: WideString): Integer; procedure Insert(Index: Integer; const S: WideString); property Strings[Index: Integer]: WideString read Get write Put; default; end;
const SWideStringOutOfBounds = 'WideString index out of bounds';
implementation
{ TWideStrings implementation } constructor TWideStrings.Create; begin FWideStringList := TList.Create; end;
destructor TWideStrings.Destroy; var Index: Integer; PWStr: ^TWString; begin for Index := 0 to FWideStringList.Count-1 do begin PWStr := FWideStringList.Items[Index]; if PWStr <> nil then Dispose(PWStr); end; FWideStringList.Free; inherited Destroy; end;
function TWideStrings.Get(Index: Integer): WideString; var PWStr: ^TWString; begin Result := ''; if ( (Index >= 0) and (Index < FWideStringList.Count) ) then begin PWStr := FWideStringList.Items[Index]; if PWStr <> nil then Result := PWStr^.WString; end; end;
procedure TWideStrings.Put(Index: Integer; const S: WideString); begin Insert(Index,S); end;
function TWideStrings.Add(const S: WideString): Integer; var PWStr: ^TWString; begin New(PWStr); PWStr^.WString := S; Result := FWideStringList.Add(PWStr); end;
function TWideStrings.IndexOfIgnoreCase(const S: WideString): Integer; var Index: Integer; PWStr: ^TWString; begin Result := -1; for Index := 0 to FWideStringList.Count -1 do begin PWStr := FWideStringList.Items[Index]; if PWStr <> nil then begin if SameText(S, PWStr^.WString) then begin Result := Index; break; end; end; end; end;
function TWideStrings.IndexOf(const S: WideString): Integer; var Index: Integer; PWStr: ^TWString; begin Result := -1; for Index := 0 to FWideStringList.Count -1 do begin PWStr := FWideStringList.Items[Index]; if PWStr <> nil then begin if S = PWStr^.WString then begin Result := Index; break; end; end; end; end;
function TWideStrings.Count: Integer; begin Result := FWideStringList.Count; end;
procedure TWideStrings.Clear; var Index: Integer; PWStr: ^TWString; begin for Index := 0 to FWideStringList.Count-1 do begin PWStr := FWideStringList.Items[Index]; if PWStr <> nil then Dispose(PWStr); end; FWideStringList.Clear; end;
procedure TWideStrings.Insert(Index: Integer; const S: WideString); var PWStr: ^TWString; begin if((Index < 0) or (Index > FWideStringList.Count)) then raise Exception.Create(SWideStringOutofBounds); if Index < FWideStringList.Count then begin PWStr := FWideStringList.Items[Index]; if PWStr <> nil then PWStr.WString := S; end else Add(S); end;
end. |