Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.30;
Скачать: CL | DM;

Вниз

Вопрос про ссылку в классе   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
2-1196706403
BD
2007-12-03 21:26
2007.12.30
Поиск в базе данных (MS Access)


15-1196459406
homm_
2007-12-01 00:50
2007.12.30
Диафильмы


2-1196930572
LerMax
2007-12-06 11:42
2007.12.30
Вопрос про ссылку в классе


2-1196692582
..::KraN::..
2007-12-03 17:36
2007.12.30
TImage на рабочий стол


2-1196768252
abhtr
2007-12-04 14:37
2007.12.30
Запрос для набора данных DBGrid-a.