Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1245161138
@!!ex
2009-06-16 18:05
2009.08.16
Консолька роняет прилоэение на выходе.


15-1245060523
desc
2009-06-15 14:08
2009.08.16
PostgreSQL 8.3


11-1205403546
DJ_UZer
2008-03-13 13:19
2009.08.16
Перевод из инт в стр


1-1211988241
lazanor
2008-05-28 19:24
2009.08.16
подключение Mathcad или Mathematica к Delphi


3-1226010464
DOjD
2008-11-07 01:27
2009.08.16
Как определить происходит ли выборка данных запросом или нет?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский