Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов деструктора внутри конструктора 
:(
    Опции темы
CodeMonkey
Дата 4.6.2010, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(PsiMagistr @  4.6.2010,  15:58 Найти цитируемый пост)
Но мусор для меня нежелателен, хочу чтоб все под контролем было .


Так, давайте ещё раз.

Есть два сценария использования любого объекта.

Первый - локально:

Код
var
  MyObject: TMyObject;
begin
  // какой-то код
  MyObject := TMyObject.Create(...);
  try
    // работа с MyObject
  finally
    FreeAndNil(MyObject);
  end;
  // ещё какой-то код
end;


Как видите, ничего страшного в том, что у вас в MyObject видит мусор нет. Потому что если возникнет исключение, вы вообще выйдете из процедуры, и сама переменная даже исчезнет.

Сценарий 2: глобально

Здесь MyObject - глобальная переменная или поле объекта (например, формы)

Код
procedure TSomeClass.SomeInitMethod;
begin
  // какой-то код
  MyObject := TMyObject.Create(...);
  // какой-то код
end;

...

procedure TSomeClass.SomeFinalizeMethod;
begin
  // какой-то код
  FreeAndNil(MyObject);
  // какой-то код
end;


Как видите, и здесь не надо никуда nil присваивать. Хотя вы обращаетесь к переменной после исключения, но там уже не мусор, а nil, потому что поля объекта и глобальные переменные не содержат мусор, а содержат нули.

P.S. Вместо 

Код
If Object<>nil then MyObject.Free;


Лучше делать 

Код
FreeAndNil(MyObject);



--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PsiMagistr
Дата 6.6.2010, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Благодарю сердечно, CodeMonkey.
 


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
PsiMagistr
Дата 8.6.2010, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Скоро буду готов к описанию классов. Возник следующий нюанс:

Все переменные класса (поля), должны сохраняться в файле записей (record). Следовательно объявить их просто полями как:

Код

type

TPersona = class
fName:String[20];
fHeal:Integer;
fLovkost:Integer;
...
...
...

end;


Представляется невозможным, так как, все поля должны сохраняться в одной записи (файла). Можно решить дело так:

Код

type
AllParametres = record //Описываем запись.
fName:String[20];
fHeal:Integer;
fLovkost:Integer;
...
...
...
end;

и дальше включить эту запись в класс:

type 

TPersona = class


fParametres: AllParametres;
...
...
...
end;




Но это представляется мне тоже довольно неудобным. Тем более что класса в программе три (базовый класс Сущность и его наследники Персонаж и Монстр). И все они отличаются количеством полей. 

При работе с файлами есть ли разница используем ли FileStream или стандартные команды: (Write Reset)?



Это сообщение отредактировал(а) PsiMagistr - 8.6.2010, 12:48


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
CodeMonkey
Дата 8.6.2010, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Вообще-то, для классов нет нужды использовать записи. Вы можете сделать поля, которые хотите сохранять, published и сохранять в поток (TStream, в частности - TFileStream) обычными средствами. Класс при этом должен наследоваться от TPersistent.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PsiMagistr
Дата 8.6.2010, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Да? Это интересно. А поподробней, если можно? Как сохранить через объект класса TFileStream запись, представляю. А вот поля класса...

Наткнулся на умную статью:

http://forum.vingrad.ru/topic-94245/view-all.html

Но к сожалению понял мало что...





Это сообщение отредактировал(а) PsiMagistr - 8.6.2010, 14:28


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Rennigth
Дата 8.6.2010, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Цитата(PsiMagistr @  8.6.2010,  14:24 Найти цитируемый пост)
Но к сожалению понял мало что...

А что конкретно не понятно? Вроде там все с примерами...

Это сообщение отредактировал(а) Rennigth - 8.6.2010, 14:43


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
PsiMagistr
Дата 8.6.2010, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Пример хорош, но... Слишком много тонкостей. 

Цитата:

"модуль для сохранения и чтения объектов". 

 (Почему именно объектов, а не данных полей класса? Что значит сохранить объект? Голова кругом от научной терминологии)

Что есть: TWriter, TReader. Как они работают? 

И подробней о теории потоков (TStream).

Кроме того у меня должен быть именно файл записей. И каждая запись в файле - индивидуальный набор параметров. 



Это сообщение отредактировал(а) PsiMagistr - 8.6.2010, 15:41


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
PsiMagistr
Дата 8.6.2010, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Смотрю статью. Ковыряюсь в коде примера. Что интересно: там процедуры записи-чтения объекта (полей) являются внешними. А мне бы их в класс встроить. Попробую завтра эксперимент сделать.

Это сообщение отредактировал(а) PsiMagistr - 8.6.2010, 18:18


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0536 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.