Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос про ссылку в классе [D7, 2003]


LerMax ©   (2007-12-06 11:42:00) 

type
 TClass = class(...)
 private
   FList: TStringList;
 published
  property List: TStringList read FList write FList;
 end;

Я создаю этот класс и передаю в TClass.List ссылку на уже созданный TStringList из вне (в конструкторе самого класса я не создаю FList). Я правильно понимаю, что при уничтожении моего класса (Destroy) все пройдет спокойно?


Юрий Зотов   (2007-12-06 20:16:00) [1]

> LerMax   (06.12.07 20:02) [8]

Давайте измением вопрос на обратный: а почему свойство в published?

Как известно, свойства published отличаются от свойств public тем, что:
- сохраняются в DFM и загружаются из него же;
- появляются в Object Inspector.

Разве Вашему StringList'у нужны эти фичи?


LerMax   (2007-12-06 20:02:00) [2]


> 1. Надо перенести свойство List в public.

Ещё один вопрос, навреное не совсем по теме. А почему не через свойство в published?


Юрий Зотов   (2007-12-06 19:51:00) [3]

> 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 19:06:00) [4]

А зачем создавать каждый раз 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 13:50:00) [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;


Anatoly Podgoretsky   (2007-12-06 13:39:00) [6]

А что Спокойно должно делать?


Palladin   (2007-12-06 11:59:00) [7]

Как правило свойство-объект делают доступной только для чтения, есть конечно редкие исключения


Desdechado   (2007-12-06 11:46:00) [8]

Если ты эту ссылку больше нигде не сохранишь, то просо будет утечка памяти, т.к. автоматического освобождения нет.


Думкин   (2007-12-06 11:44:00) [9]

Ну, кричать точно никто не будет. А что надо то?


Наверх

Титульная страница Поиск, карта сайта Написать письмо