Форум: "Начинающим";
Текущий архив: 2007.12.30;
Скачать: [xml.tar.bz2];
ВнизВопрос про ссылку в классе Найти похожие ветки
← →
LerMax (2007-12-06 11:42) [0]
type
TClass = class(...)
private
FList: TStringList;
published
property List: TStringList read FList write FList;
end;
Я создаю этот класс и передаю в TClass.List ссылку на уже созданный TStringList из вне (в конструкторе самого класса я не создаю FList). Я правильно понимаю, что при уничтожении моего класса (Destroy) все пройдет спокойно?
← →
Думкин © (2007-12-06 11:44) [1]Ну, кричать точно никто не будет. А что надо то?
← →
Desdechado © (2007-12-06 11:46) [2]Если ты эту ссылку больше нигде не сохранишь, то просо будет утечка памяти, т.к. автоматического освобождения нет.
← →
Palladin © (2007-12-06 11:59) [3]Как правило свойство-объект делают доступной только для чтения, есть конечно редкие исключения
← →
Anatoly Podgoretsky © (2007-12-06 13:39) [4]А что Спокойно должно делать?
← →
Юрий Зотов © (2007-12-06 13:50) [5]> LerMax (06.12.07 11:42)
При вашем подходе возможны утечки памяти, глюки Инспектора Объектов и Access Violation. Но если не искать приключений и делать так же, как делают отцы-основатели, то все будет спокойно (причем ВСЕГДА).
А отцы-основатели делают так:
type
TMyClass = class(...)
private
FList: TStringList;
procedure SetList(const Value: TStrings);
public
constructor Create(...); ...
destructor Destroy; override;
published
property List: TStrings read FList write SetList;
end;
procedure TMyClass.SetList(const Value: TStrings);
begin
FList.Assign(Value)
end;
constructor TMyClass.Create(...);
begin
inherited;
FList := TStringList.Create
end;
destructor TMyClass.Destroy;
begin
FList.Free;
inherited
end;
← →
LerMax (2007-12-06 19:06) [6]А зачем создавать каждый раз
FList := TStringList.Create
? Я хотел наоборот избавить себя от лишнего расхода памяти, не создавая в каждом экземпляре класса свой TStringList.
У меня такое применение: есть отдельно созданный и заполненный TStringList, и есть массив состоящий из экземпляров класса, мне нужно каждому экземпляру из массива передать этот один уже созданный TStringList.
В таком случае мне интересны две ситуации:
а) если переданный в экземпляр класса TStringList, как ссылка - не будет меняться внутри, из него будут браться данные.
б) если переданный в экземпляр класса TStringList, как ссылка - будет меняться внутри, из него будут удаляться и добавляться данные. Состояние переменной TStringList должно обновляться в каждом экземпляре класса.var
List: TStringList;
Array: array of TMyClass;
begin
List := TStringList.Create;
List ... //заполнение
SetLength(Array, 200);
for i := Low(Array) to High(Array) do
with Array[i] do
ClassList := List;
Ну вопрос такой же остался, теперь учитывая мои уточнения.
← →
Юрий Зотов © (2007-12-06 19:51) [7]> LerMax (06.12.07 19:06) [6]
Так можно, но тогда:
1. Надо перенести свойство List в public.
2. Ответственность за создание и уничтожение StringList"а несет программист.
3. Надо иметь в виду, что если StringList уничтожен, то экземпляры TMyClass сами по себе об этом не узнают.
4. Ну и уж если экономить память, то можно сэкономить еще по 4 байта на каждом экземпляре TMyClass. Для этого поле FList и свойство List из него выбрасываем, а вместо этого заводим одну глобальную переменную типа TStringList. То есть, если список - один на всех, то пусть и ссылка на него тоже будет одна на всех. Так, ИМХО, логичнее.
← →
LerMax (2007-12-06 20:02) [8]
> 1. Надо перенести свойство List в public.
Ещё один вопрос, навреное не совсем по теме. А почему не через свойство в published?
← →
Юрий Зотов © (2007-12-06 20:16) [9]> LerMax (06.12.07 20:02) [8]
Давайте измением вопрос на обратный: а почему свойство в published?
Как известно, свойства published отличаются от свойств public тем, что:
- сохраняются в DFM и загружаются из него же;
- появляются в Object Inspector.
Разве Вашему StringList"у нужны эти фичи?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.12.30;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c