Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Стиль: саморазрушение


Страницы:   1 2 3

Igorek ©   (2002-10-30 20:22:00) 

Сегодня был такой случай: уничтожается обьект, метод которого в стеке вызовов процедур. Естественно, если после уничтожения мы в этом методе обратились бы к каким-либо полям данного (уже уничтоженного) обьекта - получили бы AccessViolation. К счастью мы этого не сделали и все нормально работает. Но не является ли такой подход признаком плохого стиля?


Бурундук   (2002-11-05 11:47:00) [1]

2Sectey © (05.11.02 11:16)
Зачем такие сложности?
Можно и так:

const
i: integer = 10;
begin
i := 40;
// типизированная константа - она совсем никакая
// не константа (без {$WRITEABLECONST OFF}или{$J-}),
// а самая что ни на есть переменная.
end;


Sectey   (2002-11-05 11:16:00) [2]

Совершенно согласин с evgeg.

вот пример

Const
i = 10;
Var
p : ^integer;
begin
p := @i;
-> здель компилятор ругается благим матом 37. riable required
p^ := 40;
end;


а тут все ок

Const
i : integer = 10;
Var
p : ^integer;
begin
p := @i;
p^ := 40;
end;

в результате i = 40

Такойже фокус проходит и с

TTr = class
private
FCount : integer;
...
public
property Count: integer read FCount;
...
end;

Var
tr : TTr;
p : ^integer;
begin
p := @tr.Count;
p^ := 40;
end;

в результате tr.Count = 40


Igorek   (2002-11-05 11:00:00) [3]


> Получается, что типизированные константы являются статическими
> переменными. Нетипизированные константы являются настоящими
> константами.

Спасибо за разъяснение. Ошибаться может каждый - я был неправ. К счастью Паскаль не мой родной язык.


evgeg   (2002-11-04 19:05:00) [4]

> Не нравиться мне Ваш преподавательский тон.

А мне не нравится, что вы утверждаете ерунду, не разобравшись в вопросе.

> Но тогда получаются константы не настоящие, если их можно "взломать" фишкой компилятора.

Получается, что типизированные константы являются статическими переменными. Нетипизированные константы являются настоящими константами.


Igorek   (2002-11-04 17:03:00) [5]


> down (04.11.02 16:30)
> в опциях проекта поставить галочку напротив "Assignable
> typed constants"

Спасибо. Но тогда получаются константы не настоящие, если их можно "взломать" фишкой компилятора.


Bis   (2002-11-04 16:49:00) [6]

может я упустил смысл темы, но есть замечательный метод
FreeAndNil
и вызывать можно вроде где угодно и не ругаться на Паскаль


down   (2002-11-04 16:30:00) [7]

в опциях проекта поставить галочку напротив "Assignable typed constants"


Igorek   (2002-11-04 16:28:00) [8]

procedure f;
const
I: Integer = 0;
begin
Inc(I);
end;


Как сделать, что-бы компилировалось и выполнялось?


Бурундук   (2002-11-04 13:43:00) [9]

AlexKniga прав - есть такая недокументированная
фича паскаля:
локальные типизированные константы сохраняют значение между
вызовами.

>Не допускается переприсваевание. :-(
Тут Вам не здесь. :)))
В паскале разрешается присваивание
типизированным константам.
(Есть, правда, опция компилятора, запрещающая это,
но по умолчанию она выключена)


Igorek   (2002-11-04 12:42:00) [10]


> evgeg © (01.11.02 18:52)
> Это называется локальной переменной. Учите терминологию!

Не нравиться мне Ваш преподавательский тон. Ну да ладно.
Локальная статическая переменная - видимая в пределах метода, выделяется память и инициализируется при загрузке программы, сохраняет свое значение между вызовами метода, допускает переприсваивание.

2 AlexKniga
Не допускается переприсваевание. :-(


Мышь   (2002-11-01 20:03:00) [11]

Есть такой метод - Notification, вызываемый разрушающимся объектом, для того, чтобы уведомить другой объект, содержащий ссылку на разрушающийся. Вот в нем, как раз, и удобно обNILлить ссылку.


evgeg   (2002-11-01 18:52:00) [12]

> Статические переменные я имел ввиду видимые в пределах метода

Это называется локальной переменной. Учите терминологию!


AlexKniga   (2002-11-01 18:45:00) [13]

2 Igorek
Procedure MyProc;
Const МояСтатическаяПеременная: TМояСтатическаяПеременная;
Begin
End;


Igorek   (2002-11-01 17:06:00) [14]


> evgeg © (31.10.02 22:53)
> > Igorek © (31.10.02 10:55)
>
> Сейчас закидаем.
...

Не буду спорить, но неубедительно.;-)
Статические переменные я имел ввиду видимые в пределах метода.
Область видимости в Паскале одна в пределах модуля.
Простите, если задел за живое.


evgeg   (2002-10-31 22:55:00) [15]

> само обращение к его методу выдаст Access V...(никак не запомню как пишется :)

Только обращение к вирт. методу или к полю. Вызов стат. метода не приведет к Access Violation.


evgeg   (2002-10-31 22:53:00) [16]

> Igorek © (31.10.02 10:55)

Сейчас закидаем.

Пример статической переменной:

var s: double;

Область видимости: в модулях interface и implemetation, в классах published, public, protected, private.

Учите матчасть и не говорите полной ерунды.

Насчет вызова деструктора из метода объекта. В VCL это используется в методе Free. В нем сначала проверяется, равен ли Self nil и если нет, вызывается деструктор.
Для корректной работы Free и нужно выставление объекта в nil.
Используется это в конструкторах и деструкторах.

type
TMyObj = class
FSomeObject: TSomeObject;
end;

constructor TMyObj.CReate;
begin
...
FSomeObject := TSomeObject.Create;
...
end;

destructor TMyObj.Destroy;
begin
...
FSomeObject.Free;
end;


Если в конструкторе произойдет исключение, вызовется деструктор Destroy, в котором будут освобождены только проинициализированные поля-объекты, т. к. при выделении памяти (перед вызовом конструктора) поля объекта обнуляются.


Tano   (2002-10-31 22:35:00) [17]


> Zemal © (31.10.02 13:35)

IMHO, Вы в последнем сообщении погорячились - после выполнения деструктора объекта не станет и само обращение к его методу выдаст Access V...(никак не запомню как пишется :). То есть "OK" проверять негде будет.


Zemal   (2002-10-31 13:35:00) [18]

>>KSergey
Аха, с тобой согласен, нужно писать менеджер объектов, в котором отображать состояние объектов и действия с ними... вот только это "мартышкин труд", да и нафига такое делать? Легче в деструкторе объекта к примеру прописать такое: "OK := False;", а в методе: "if not OK then Abort;". И все проблемы :).


Anatoly Podgoretsky   (2002-10-31 12:41:00) [19]

Толик © (31.10.02 10:40)
Создать можно, но переменные для этой формы и дата модуля могут иметь право на существование, остальные лишнее, нормально и спокойно жить без них.


Юрий Зотов   (2002-10-31 12:40:00) [20]

> Song © (31.10.02 11:32)

Какая разница? GetMessage устроит?
Мы о словах говорим, или о принципах?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо