![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FreeAndNil
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 я ее не использую.