-
Создаю компонент типа "журнал":
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). Прихожу к выводу: раз сам создаю, значит самому надо уничтожать. Но где и как?
-
опечатка procedure GetFormatedList = function GetFormatedList
-
> [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;
-
> [1] zorik © (04.02.08 15:53)
ну и свою опечатку исправь - я скопипастил твой код и не обратил внимания на "ошибку" :)
-
> if Assigned(FFormatedList) then FFormatedList.Free;
Можно упростить до FFormatedList.Free;
А вообще принято создавать в конструкторе
-
Спасибо. Понял. Хотел поизвращатся без внутренней переменной.
-
> [5] zorik © (04.02.08 16:16) > Хотел поизвращатся без внутренней переменной.
И где бы хранил данные??? В памяти, да? :) Так вот - "внутренняя переменная" это всего лишь указатель на эту память. Так что в самом деле - извращенец:)
-
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;
-
> [7] zorik © (04.02.08 16:24) > function TZlog.GetFormatedList: TStringList; > begin > with FFormatedList do > begin > ... > end; > Result := FFormatedList; > end;
Странный какой-то :)
-
Попробую объяснить :) Компонент - журнал. Состоит из списка событий (Items[i]). Каждый Item это клас со свойствами: время, сообщение, код ошибки и т.д. FormatedList создает из событий форматированый список в читабельно-писательном виде, т.е. что-то такое: [10:20] ошибка №1, код 25 - не могу прочитать данные - ошибка записи [10:25] файл загружен успешно В самом приложении используется как memoLog.Assign(ZLog.FormatedString);
-
и еще используется в процедуре класса для сохранения в файл
-
а вот фигу. ну нет в Delphi сборщика мусора. и не будет ещё лет сто, судя по скорости добавления нужных фич. так что или memory leaks, или переменные и не забываем try/finally.
нет, ещё, конечно, можно использовать интерфейсы, но это, имо, жестоко.
-
> [9] zorik © (04.02.08 16:36)
А как ты думаешь, что будет если два раза, и более, подряд обратится к твоему такому свойству? Тут тебе наверняка поможет метод, типа такого: procedure TZlog.GetFormatedData(ALst: TStrings); ну и в приложении нечто так: ZLog.GetFormatedData(memoLog.Lines); Хотя я не уверен..... нужно лучше подумать...
-
Если подумать чисто логически-теоретически, то нету смысла это хранить. ведь это производное от основной информации. А вот для реализации выходит что приходится. Сначала этого не было. Информация форматировано сохранялась при сохранении в файл., но потом возникла необходимость смотреть журнал из приложения. И вот чтоб 2 раза не повторять код такое наваял.
-
> А как ты думаешь, что будет если два раза, и более, подряд > обратится к твоему такому свойству?
все нормально будет проверял. я локальную FFormatedList очищаю в функции
> procedure TZlog.GetFormatedData(ALst: TStrings);
тогда с сохранением надо: var TempList: TStringList; begin TempList := TStringlist.Create; GetFormatedData(TempList); TempList.SaveToFile(); TempList.Free; end;
Думаю можно и так и так :)
-
> 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;
-
> DimaBr ©
спасибо. правда я с ними еще не работал
-
-
> САБЖ. Свойство TStringList
Спасибо, мы знаем, что такое сабж.
|