![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 ?