Форум: "Начинающим";
Текущий архив: 2009.08.16;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c