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

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

FreeAndNil


Страницы:   1 2 3 4 5 6 7

mike_zav ©   (2007-09-21 17:37:00) 

В каких случаях применяют FreeAndNil? А в каких просто .Free?
Зачем это нужно? Если можно с примером.


oxffff   (2007-09-22 16:29:00) [61]


> Anatoly Podgoretsky ©   (22.09.07 16:18) [60]
> > oxffff  (22.09.2007 15:59:59)  [59]
>
> Pointer и pPointer разные вещи, вторая уже строгая типизация


А почему язык со строгой типазацией закрывает глаза на первую?
И причину такого поведения не подскажите?

Почему бы не сделать свой выбор в пользу неявного приведения для ссылочных типов с простой семантикой копирования.
А именно для типов Tobject, нетипизированного указателя и указателей на типы с простой семантикой копирования? А как же для ссылок на эти типы.


Anatoly Podgoretsky   (2007-09-22 16:18:00) [62]

> oxffff  (22.09.2007 15:59:59)  [59]

Pointer и pPointer разные вещи, вторая уже строгая типизация


oxffff   (2007-09-22 15:59:00) [63]


>  И если для Паскаля постулируется сильная типизация, то
> компилятор, при передаче по ссылке, будет требовать, чтобы
> передаваемая ссылка была на объект требуемого типа.


Сильная типизация?
А как насчет в совместимости pointer и Tobject?
Далее как насчет дочерних типов?

>P.S. "Я дерусь... потому что я... дерусь!" (С) ?

Я хочу сделать свою жизнь проще. :)


Ping   (2007-09-22 15:52:00) [64]

В частном случае, для FreeAndNil(), когда производится только обниление переменной - такое решение, возможно, и подошло бы.

Но

При передаче параметров по ссылке (var), при предлагаемом тобой подходе, можно вернуть все, что душе угодно (в пределах наследования). Компилятор  - он не телепат. Есть формальная логика. И если для Паскаля постулируется сильная типизация, то компилятор, при передаче по ссылке, будет требовать, чтобы передаваемая ссылка была на объект требуемого типа. Не нравится - пиши на С.

P.S. "Я дерусь... потому что я... дерусь!" (С) ?


Leonid Troyanovsky   (2007-09-22 15:46:00) [65]


> oxffff ©   (22.09.07 15:22) [52]

> Но тем не менее проблем будет имхо не больше, чем когда
> вы пишите так

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

--
Regards, LVT.


oxffff   (2007-09-22 15:41:00) [66]


> Как это относится к FreeAndNil()?


oxffff ©   (22.09.07 14:44) [41]


Ping   (2007-09-22 15:37:00) [67]

Захочешь ограничить. Сделаешь так

Как это относится к FreeAndNil()?


oxffff   (2007-09-22 15:34:00) [68]


> Вот поэтому...


Но Imho это решаемо.
Захочешь ограничить. Сделаешь так

procedure Test(var Obj: TControl);
begin
Obj := TBitmap.Create;
end;


Ping   (2007-09-22 15:28:00) [69]

Почему бы не пропускать данный вызов. Ведь Tobject является подмножеством tControl и поэтому совместим.

procedure Test(var Obj: TObject);
begin
 Obj := TBitmap.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Obj: TWinControl;
begin
 Test(Obj);
end;


Вот поэтому...


oxffff   (2007-09-22 15:22:00) [70]


> Leonid Troyanovsky ©   (22.09.07 15:16) [50]
>
> > oxffff ©   (22.09.07 15:07) [48]
>
> > В чем проблема в вашем примере?
>
> В моем их нет, но в подобных - отсутствие возможности контролировать
> типы, т.е. та самая совместимость TObject - pointer.


Но тем не менее проблем будет имхо не больше, чем когда вы пишите так

procedure TForm1.Button1Click(Sender: TObject);
var a:pointer;
begin
a:=self;
end;


oxffff   (2007-09-22 15:19:00) [71]


> Types of actual and formal var parameters must be identical
> (E2033)



> exact type


Да но к каким потенциальным граблям могут, если мы попросим их расширить эту функциональность. Вопрос в этом.

Вернемся к простому примеру с Tconrol и Tobject.

procedure abc(var a:Tobject);
begin
end;

procedure TForm1.Button1Click(Sender: TObject);
var a:tControl;
begin
abc(a);
end;

Почему бы не пропускать данный вызов. Ведь Tobject является подмножеством tControl и поэтому совместим.

Почему авторы ограничили именно до  exact type?


Leonid Troyanovsky   (2007-09-22 15:16:00) [72]


> oxffff ©   (22.09.07 15:07) [48]

> В чем проблема в вашем примере?

В моем их нет, но в подобных - отсутствие возможности контролировать типы, т.е. та самая совместимость TObject - pointer.

--
Regards, LVT.


Leonid Troyanovsky   (2007-09-22 15:13:00) [73]


> oxffff ©   (22.09.07 15:02) [47]

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

Ограничение относится только к var параметрам,
Types of actual and formal var parameters must be identical (E2033)

For a variable parameter, the actual argument must be of the exact type of the formal parameter.

Почитай статью.

Не пойму в чем смущение ума :)

--
Regards, LVT.


oxffff   (2007-09-22 15:07:00) [74]


> Только, подобная "гибкость" только плодит проблемы.


В чем проблема в вашем примере?


oxffff   (2007-09-22 15:02:00) [75]

Если следовать логике компилятора.

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

procedure abc(p:pointer);
begin
end;

procedure TForm1.Button1Click(Sender: TObject);
var a:Tobject;
begin
abc(a);
end;


oxffff   (2007-09-22 15:00:00) [76]


> Anatoly Podgoretsky ©   (22.09.07 14:57) [44]
> > oxffff  (22.09.2007 14:54:43)  [43]
>
> Ну так и говорит - типы не совместимые.


Ну а почему вы можете присвоить Tobject к pointer. И наоборот.

Почему?


Leonid Troyanovsky   (2007-09-22 15:00:00) [77]


> oxffff ©   (22.09.07 14:54) [43]

> Еще из этого разряда. Почему компилятор не пропускает

Конечно, достаточно уйти от var и никаких ограничений,
за исключением необходимости добавлять @.

type
 PObject = ^TObject;
 TMyObject = class
   x: TObject;
 end;

procedure abc(a: PObject);
begin
 ShowMessage(a^.ClassName);
 a^ := nil;
end;

procedure TForm1.Button1Click(Sender: TObject);
var a:tMyobject;
begin
a:= TMyobject.Create;
a.x := TObject.Create;
abc(@a.x);
Caption :=  Format('%p', [Pointer(a.x)]);
end;


Только, подобная "гибкость" только плодит проблемы.

--
Regards, LVT.


Anatoly Podgoretsky   (2007-09-22 14:57:00) [78]

> oxffff  (22.09.2007 14:54:43)  [43]

Ну так и говорит - типы не совместимые.


oxffff   (2007-09-22 14:54:00) [79]

Еще из этого разряда. Почему компилятор не пропускает

procedure abc(p:ppointer);
begin
end;

procedure TForm1.Button1Click(Sender: TObject);
var a:^Tobject;
begin
abc(a);
end;

Incompatible types: 'TObject' and 'Pointer'

IMHO.
Компилятор слегка подстроить для нормальной обработки этой ситуации.
А именно, если типы совместимы, то и ссылки и указатели на них должны совместимы
IMHO.


Anatoly Podgoretsky   (2007-09-22 14:50:00) [80]

> oxffff  (22.09.2007 14:44:41)  [41]

Мне как то все равно до FreeAndNil я ее не использую.


Страницы:   1 2 3 4 5 6 7

Наверх

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