Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.034 c
15-1196353568
manevil
2007-11-29 19:26
2007.12.30
Дифф. уравнение в excel


15-1196155673
Cyrax
2007-11-27 12:27
2007.12.30
Дилерский договор, платёжные реквизиты: чей ИНН/КПП указывать ?


2-1196942339
Алекс
2007-12-06 14:58
2007.12.30
библиотеки с классами других приложений


15-1195599977
begin_end
2007-11-21 02:06
2007.12.30
тут идея родилась такая


15-1196551729
KilkennyCat
2007-12-02 02:28
2007.12.30
А бомжи голосовать имеют право?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский