Конференция "Компоненты" » САБЖ. Свойство TStringList
 
  • zorik © (04.02.08 15:51) [0]
    Создаю компонент типа "журнал":

    TZLog = class
    private
     ...
     procedure GetFormatedList: TStringList;
     ...
    public
     ...
     property FormatedList: TStringList read GetFormatedList;
     ...
    end;

    procedure TZlog.GetFormatedList: TStringList;
    begin
     Result := TStringList.Create;
     ...
    end;



    Интересует такое. Когда я использую свойство FormatedList срабатывает процедура GetFormatedList, в которой создается объект типа TStringList (Result := TStringList.Create). Прихожу к выводу: раз сам создаю, значит самому надо уничтожать. Но где и как?
  • zorik © (04.02.08 15:53) [1]
    опечатка procedure GetFormatedList  =  function GetFormatedList
  • {RASkov} © (04.02.08 16:00) [2]
    > [0] zorik ©   (04.02.08 15:51)

    В корне не верно... у тебя каждый раз при обращении к этому свойству будет создаваться TStringList
    правильнее вот так:

    TZLog = class
    private
    ...
    FFormatedList: TStringList;
    procedure GetFormatedList: TStringList;
    ...
    public
    ...
    destructor Destroy; override;
    property FormatedList: TStringList read GetFormatedList;
    ...
    end;
    //////////////
    procedure TZlog.GetFormatedList: TStringList;
    begin
     if not Assigned(FFormatedList) then FFormatedList := TStringList.Create;
     Result:=FFormatedList;
    ...
    end;

    procedure TZlog.Destroy;
    begin
    ...
     if Assigned(FFormatedList) then FFormatedList.Free;
    ...
     inherited;
    end;

  • {RASkov} © (04.02.08 16:01) [3]
    > [1] zorik ©   (04.02.08 15:53)

    ну и свою опечатку исправь - я скопипастил твой код и не обратил внимания на "ошибку" :)
  • DimaBr © (04.02.08 16:14) [4]

    > if Assigned(FFormatedList) then FFormatedList.Free;

    Можно упростить до FFormatedList.Free;

    А вообще принято создавать в конструкторе
  • zorik © (04.02.08 16:16) [5]
    Спасибо. Понял. Хотел поизвращатся без внутренней переменной.
  • {RASkov} © (04.02.08 16:24) [6]
    > [5] zorik ©   (04.02.08 16:16)
    > Хотел поизвращатся без внутренней переменной.

    И где бы хранил данные???
    В памяти, да? :) Так вот - "внутренняя переменная" это всего лишь указатель на эту память.
    Так что в самом деле - извращенец:)
  • zorik © (04.02.08 16:24) [7]

    TZLog = class
    private
    ...
     FFormatedList: TstringList;
     function GetFormatedList: TStringList;
    ...
    public
    ...
    property FormatedList: TStringList read GetFormatedList;
    ...
    end;

    constructor TZlog.Create;
    begin
     inherited Create;
     FFormatedList := TStringList.Create;
     ...
    end;

    destructor TZlog.Destroy;
    begin
     ...
     FFormatedList.Free;
     inherited Destroy;
    end;

    function TZlog.GetFormatedList: TStringList;
    begin
     with FFormatedList do
     begin
       ...
     end;
     Result := FFormatedList;
    end;

  • {RASkov} © (04.02.08 16:26) [8]
    > [7] zorik ©   (04.02.08 16:24)
    > function TZlog.GetFormatedList: TStringList;
    > begin
    > with FFormatedList do
    > begin
    >   ...
    > end;
    > Result := FFormatedList;
    > end;

    Странный какой-то :)
  • zorik © (04.02.08 16:36) [9]
    Попробую объяснить :)
    Компонент - журнал. Состоит из списка событий (Items[i]). Каждый Item это клас со свойствами: время, сообщение, код ошибки и т.д. FormatedList создает из событий форматированый список в читабельно-писательном виде, т.е. что-то такое:
     [10:20] ошибка №1, код 25
       - не могу прочитать данные
       - ошибка записи
     [10:25] файл загружен успешно
    В самом приложении используется как memoLog.Assign(ZLog.FormatedString);
  • zorik © (04.02.08 16:38) [10]
    и еще используется в процедуре класса для сохранения в файл
  • ketmar © (04.02.08 16:40) [11]
    а вот фигу. ну нет в Delphi сборщика мусора. и не будет ещё лет сто, судя по скорости добавления нужных фич. так что или memory leaks, или переменные и не забываем try/finally.

    нет, ещё, конечно, можно использовать интерфейсы, но это, имо, жестоко.
  • {RASkov} © (04.02.08 16:46) [12]
    > [9] zorik ©   (04.02.08 16:36)

    А как ты думаешь, что будет если два раза, и более, подряд обратится к твоему такому свойству?
    Тут тебе наверняка поможет метод, типа такого:
    procedure TZlog.GetFormatedData(ALst: TStrings);



    ну и в приложении нечто так:
    ZLog.GetFormatedData(memoLog.Lines);


    Хотя я не уверен..... нужно лучше подумать...
  • zorik © (04.02.08 16:50) [13]
    Если подумать чисто логически-теоретически, то нету смысла это хранить. ведь это производное от основной информации. А вот для реализации выходит что приходится. Сначала этого не было. Информация форматировано сохранялась при сохранении в файл., но потом возникла необходимость смотреть журнал из приложения. И вот чтоб 2 раза не повторять код такое наваял.
  • zorik © (04.02.08 16:56) [14]

    > А как ты думаешь, что будет если два раза, и более, подряд
    > обратится к твоему такому свойству?

    все нормально будет проверял. я локальную FFormatedList очищаю в функции


    > procedure TZlog.GetFormatedData(ALst: TStrings);

    тогда с сохранением надо:
    var
     TempList: TStringList;
    begin
     TempList := TStringlist.Create;
     GetFormatedData(TempList);
     TempList.SaveToFile();
     TempList.Free;
    end;

    Думаю можно и так и так :)
  • DimaBr © (05.02.08 08:46) [15]

    > zorik ©   (04.02.08 16:36) [9]

    В вашем случае разумнее использовать TCollection и TCollectionItem.


    TCollectionEvent = class(TCollectionItem)
     published
         property Time: TDateTime read fTime write fTime;
         property Message: string read fMessage write fMessage;
         property ........
    end;

    TListCollection = class(TCollection)
       function GetItem(Index: integer): TCollectionEvent;
       procedure SetItem(Index: integer; const Value: TCollectionEvent);
     public
       function Add: TCollectionEvent;
       property Items[Index: integer]: TCollectionEvent read GetItem write SetItem; default;
    end;

  • zorik © (05.02.08 09:10) [16]

    > DimaBr ©

    спасибо. правда я с ними еще не работал
  • DimaBr © (05.02.08 09:31) [17]
    Глубокоуважаемый Юрий Зотов написал великолепную статью, советую почитать
    http://www.delphikingdom.com/asp/viewitem.asp?catalogid=215
  • хам (06.02.08 08:44) [18]
    > САБЖ. Свойство TStringList

    Спасибо, мы знаем, что такое сабж.
 
Конференция "Компоненты" » САБЖ. Свойство TStringList
Есть новые Нет новых   [134464   +62][b:0][p:0.001]