Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2010, 22:46   #1
dr.Chas
***
Участник клуба
 
Аватар для dr.Chas
 
Регистрация: 30.07.2007
Сообщений: 1,162
По умолчанию ListView и привязанный к нему объект

Всем доброй ночи. И так появилось несоколько вопросов. По этому опишу ситуацию как можно полнее.
Пример:
Код:
type
  TClient = class 
    NameClient: string;  
    public
      constructor create(n: string);
      destructor Free;
end;

var
  Form1: TForm1;
  client_: TClient;

implementation

constructor TCompClient.create(n: string);
begin
  with form1 do
  begin
    ListView1.AddItem(n, self);
    NameClient:=n;
  end;
end;

destructor TCompClient.Free;
begin
  //with form1 do
  //ListView1.Items.Delete(); 
{delete уничтожает по индексу, мне перебор айтемов делать? (я просто думаю, может быть способ проще есть)}
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  client_:=TCompClient.create('name1');
  client_:=TCompClient.create('name2');  
  //так правильно?
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  client_:=ListView1.Items.Item[1].Data;
  client_.Free;
end;
Через айтем listview мы можем обратится к нужному объекту, а вот когда уничтожаю объект в деструкторе нужно уничтожить и айтем, как?

Потом допустим я создам несколько объектов, но процедурой Button1Click уничтожу, не все. Что будет с остальными, нужно их уничтожать?
dr.Chas вне форума Ответить с цитированием
Старый 15.02.2010, 00:54   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

А где "деструктор" ?
Free не есть деструктор.
Ставьте курсор на Free и жмите F1 - там много мудрого по этому поводу...
На эту фразу
Цитата:
Destroys an object and frees its associated memory
даже не смотрите... враки это все...
mihali4 вне форума Ответить с цитированием
Старый 15.02.2010, 02:01   #3
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

Цитата:
даже не смотрите... враки это все...
Не вводите народ в заблуждение . Да, метод Free, это не деструктор. Но он всё же уничтожает объект.
Цитата:
Use System::TObject::Free to destroy an object. System::TObject::Free automatically calls the destructor if the object reference is not nil. Unlike System::TObject::Destroy, System::TObject::Free is successful even if the object is nil; so if the object was never initialized, System::TObject::Free won't result in an error.
По поводу вопроса ТС:
Для начала "destructor Free" действительно нужно заменить на "destructor Destroy".
Чтобы удалить ассоциированный элемент ListView, список в любом случае придётся перебирать. Другой вопрос, как это сделать - можно вручную, а можно другом способом, например, сохранить ссылку на созданный элемент ListItem в объекте класса TClient, а при уничтожении объекта вызывать ListItem.Delete;
maxionans вне форума Ответить с цитированием
Старый 15.02.2010, 07:51   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Free не есть деструктор.
Это как это так?
Вот же написано:
Цитата:
destructor Free;
Это самый настоящий destructor
Цитата:
Для начала "destructor Free" действительно нужно заменить на "destructor Destroy".
Это еще зачем? Деструктору по барабану как называться.
Цитата:
client_:=ListView1.Items.Item[1].Data;
А проверить на содержимое опять дядя Пушкин должен?
А вдруг .Data совсем не то содержит что нужно?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.02.2010, 07:58   #5
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

Цитата:
Это еще зачем? Деструктору по барабану как называться.
И вас совсем не смущает, что в базовом классе уже имеется метод (обратите внимание - метод, а не деструктор) с названием "Free"?
maxionans вне форума Ответить с цитированием
Старый 15.02.2010, 08:06   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Абсолютно не смущает. Че это должно меня смущать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.02.2010, 08:34   #7
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

Даже объяснять не хочу. Почитайте про поведение метода Free и сделайте логические выводы.
maxionans вне форума Ответить с цитированием
Старый 15.02.2010, 08:43   #8
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Формально все правильно, но я бы так не делал. Я привык уничтожать через Free, а не через Destroy, потому что Free перед уничтожением проверяет существование объекта. В данном случае этого не произойдет.
И еще как бы я не делал - класс и его объекты для меня вещь в себе, поэтому я бы не использовал никаких прямых вызовов чужих компонентов, таких как ListView1.AddItem(n, self); (который принадлежит форме).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 15.02.2010 в 08:46.
Utkin вне форума Ответить с цитированием
Старый 15.02.2010, 09:22   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Даже объяснять не хочу
Твое право.
Ну почитал.
Цитата:
Use Free to destroy an object. Free automatically calls the destructor if the object reference is not nil. Any object instantiated at runtime that does not have an owner should be destroyed by a call to Free so that it can be properly disposed of and its memory released. Unlike Destroy, Free is successful even if the object is nil; so if the object was never initialized, Free won’t result in an error.
Че дальше? Мнение не поменялось.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.02.2010, 09:48   #10
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

Ничего. Твоё право писать код сомнительного качества.
maxionans вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как перетащить элемент ListView в другой ListView? Paul Hindenburg Компоненты Delphi 5 26.01.2013 11:35
TCoolBar и стыковка к нему компонентов... chandrasecar Общие вопросы Delphi 3 26.12.2009 22:40
Конструктор двумерного массива и обращение к нему из main() Lazio Помощь студентам 1 26.10.2009 17:25
COMODO и антивирус к нему Next Безопасность, Шифрование 5 30.07.2009 13:16
Узнать IP, с которого к нему Hallo Работа с сетью в Delphi 2 08.06.2007 08:50