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

Ну, если делать по правильному, то прямого доступа к внутреннему TStringList быть не должно, т.к.
1. Объект должен контролировать свои аттрибуты. Например, ты сохранил ссылку на StringList какого-то объекта у себя. Потом этот объект был удален. В лучшем случае при обращении по этой ссылке ты получишь AccessViolation, в худшем - будешь работать с неизвестно какими данными.
2. Та же ситуация, но в обратную сторону, ты взял ссылку на список в нескольких местах. Теперь если ты меняешь содержимое списка в одном месте, то оно меняеться во всех местах. Это тоже дает неожиданные сторонние эффекты.
И таких моментов может быть много.
Поэтому подобные поля прячут, а выставляют специальные свойства и методы, типа:
Код:
type
  TMyClass = class
  private
    FItems : TStringList;
    function GetCount : Integer;
    function GetItem(Index : Integer) : String;
    procedure SetItem(Index : Integer; Value : String);
    ...
  public
    constructor Create; virtual;
    destructor Destroy; override;

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

...

constructor TMyClass.Create;
begin
  inherited;
  FItems := TStringList.Create;
end;

destructor TMyClass.Destroy;
begin
  inherited;
  FItems.Free;
end;

function TMyClass.GetCount : Integer;
begin
  Result := FItems.Count;
end;

function TMyClass.GetItem(Index : Integer) : String;
begin
  Result := FItems[Index];
end;

procedure TMyClass.SetItem(Index : Integer; Value : String);
begin
  FItems[Index] := Value;
end;

// А вот тут создаем КОПИЮ и ее возвращаем
function TMyClass.GetItemsAsList : TSringList;
begin
  Result := TStringList.Create;
  Result.Assign(FItems);
end;

Ну там еще нужны функции типа Add, Delete, Remove, etc для работы с этим списком.
Ответить с цитированием