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

Вниз

Assigned к объекту своего класса...   Найти похожие ветки 

 
Polkin   (2009-06-16 14:02) [0]

Добрый день.
Почему не работает 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 ... Как бы это устранить?


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

FreeAndNil ?


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

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

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


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

> Polkin

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

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


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

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


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

TZZZ.Destroy лишний


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


> TZZZ.Destroy лишний


почему ?


 
Ega23 ©   (2009-06-16 14:44) [7]


> почему ?


Потому что

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


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

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


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

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


 
Ega23 ©   (2009-06-16 14:47) [10]

А я бы

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;


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

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

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


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


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


Ахахах))

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

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


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


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


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


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

> Polkin   (16.06.09 14:52) [12]

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


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


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

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


 
Ega23 ©   (2009-06-17 10:20) [16]


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


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



Страницы: 1 вся ветка

Текущий архив: 2009.08.16;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
15-1245308606
тимохов
2009-06-18 11:03
2009.08.16
Ограничения VS 2088 Express и MSSQL Server 2008 Express


15-1245213184
@!!ex
2009-06-17 08:33
2009.08.16
прикольная реклама gmail


15-1245405654
Tornado
2009-06-19 14:00
2009.08.16
.htacess запрет доступа


15-1245393982
alien1769
2009-06-19 10:46
2009.08.16
Ведение арматурных карточек


2-1245496909
мимо
2009-06-20 15:21
2009.08.16
работа с файлом через папку.