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

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

Assigned к объекту своего класса... [D7, 2003]


Polkin ©   (2009-06-16 14:02:00) 

Добрый день.
Почему не работает Assigned сделать так?

Например, по нажатию кнопки если объект есть, то он уничтожается, а если нет - создается.

TZZZ = class
 private
   L : TLabel;
 public
   constructor Create (Parent : TWinControl);
   destructor Destroy; override;
end;

.....

var
 S : TZZZ;
....

constructor TZZZ.Create;
begin
 L := TLabel.Create (Parent);
 L.Parent := Parent;
 L.Caption := 'Бобёр';
 ...
end;

destructor TZZZ.Destroy;
begin
 L.Free;
 inherited;
end;

......

procedure TForm1.Button1Click (Sender : TObject);
begin
 If Assigned (S) then begin
   S.Free;  
 end else begin
   S := TZZZ.Create (Self);
 end;
end;


Первый раз Assigned (S)возвращает false. А потом всегда true ... Как бы это устранить?


Ega23   (2009-06-17 10:20:00) [1]


> Как удалится тогда L : TLabel ?? Просто из инетереса спрашиваю
> )))


А как у вас удаляются все компоненты на форме, когда вы форму закрываете?


int64   (2009-06-16 15:19:00) [2]


> если в разработке руководстоваться вопросами вкуса, то это
> будет не разработка, а кухня

Так и есть.
А если в кухне повар будет добалять лишние ингридиенты, да еще не понимая зачем, получится разработка.


Юрий Зотов   (2009-06-16 15:18:00) [3]

> Polkin   (16.06.09 14:52) [12]

Если Label должна удаляться вместе с объектом TZZZ, то его деструктор - не лишний. Если же Label должна удаляться вместе со своим Parent'ом - то лишний, потому что она и так удалится.


Игорь Шевченко   (2009-06-16 14:56:00) [4]


> Вопрос вкуса.


если в разработке руководстоваться вопросами вкуса, то это будет не разработка, а кухня


Polkin   (2009-06-16 14:52:00) [5]


> Юрий Зотов ©   (16.06.09 14:44) [8]
> Если класс TZZZ делает только то, что показано в сабже,
> то лишний - весь этот класс.


Ахахах))

Да я просто сейчас от балды класс набросал. Дабы в маленькой стапени показать настоящий).

Но!! Если взять действительно такой класс, как написан в сабже, то почему в таком классе описанный деструктор лишний? Как удалится тогда L : TLabel ?? Просто из инетереса спрашиваю )))


int64   (2009-06-16 14:49:00) [6]

Игорь Шевченко ©   (16.06.09 14:20) [6]

Вопрос вкуса.


Ega23   (2009-06-16 14:47:00) [7]

А я бы

procedure TForm1.Button1Click (Sender : TObject);
begin
If Assigned (S) then begin
  S.Free;  
end else begin
  S := TZZZ.Create (Self);
end;
end;


в отдельную функцию синглтон-объекта вынес. типа

function GetTZZZObject(...) : TZZZ;

implementation

var
 aTZZZObj : TZZZ;

function GetTZZZObject(....) : TZZZ;
begin
 if not Assigned(aTZZZObj) then
   aTZZZObj := TZZZ.Create(....)
 Result := aTZZZObj;
end;


Юрий Зотов   (2009-06-16 14:46:00) [8]

Но если класс TZZZ делает НЕ только то, что показано в сабже, то его деструктор - не лишний.


Ega23   (2009-06-16 14:44:00) [9]


> почему ?


Потому что

L := TLabel.Create (Parent);
L.Parent := Parent;


Юрий Зотов   (2009-06-16 14:44:00) [10]

Если класс TZZZ делает только то, что показано в сабже, то лишний - весь этот класс.


Игорь Шевченко   (2009-06-16 14:20:00) [11]


> TZZZ.Destroy лишний


почему ?


int64   (2009-06-16 14:17:00) [12]

TZZZ.Destroy лишний


Polkin   (2009-06-16 14:11:00) [13]

Угу, буду знать. Спасибо )


Юрий Зотов   (2009-06-16 14:08:00) [14]

> Polkin

Assigned(S) просто проверяет S=nil. Первый раз это так и есть, а потом уже нет, потому что S.Free разрушает объект, но не меняет (и не может изменить) саму переменную S. Вот она и остается не nil.

Вывод - обнулять переменную S надо ручками, через FreeAndNil, либо явным присваиванием.


Polkin   (2009-06-16 14:07:00) [15]

АААХАХАХХАХА *со смехом сумашедшего ученого потирает ручки* )))))

Спасиииибо...Заработало.... Почему то всегда скептически относился к FreeAndNil. Но теперь поставлю ему памятник )))


Игорь Шевченко   (2009-06-16 14:04:00) [16]

FreeAndNil ?


Наверх

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