Форум: "Потрепаться";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
ВнизГлюк - не глюк, но что то не то в TComponent Найти похожие ветки
← →
jack128 © (2004-04-21 22:50) [0]Итак код:
type
TTextComponent = class(TComponent)
published
Test: TComponent;
Comp: TComponent;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
t: TTextComponent;
begin
t := TTextComponent.Create(nil);
try
t.Comp := TComponent.Create(t);
t.Comp.Name := "Test";
t.Test := TComponent.Create(t);
t.Comp.Free;
if Assigned(t.Test) then
t.Test.Free
else
Caption := "уже nil !!!!"; // как ни странно Test - уже nil ;-)
finally
t.Free;
end;
end;
Вобщем то источник этого поведения найти легко
procedure TComponent.SetReference(Enable: Boolean);
var
Field: ^TComponent;
begin
if FOwner <> nil then
begin
Field := FOwner.FieldAddress(FName);
if Field <> nil then
if Enable then Field^ := Self else Field^ := nil;
end;
end;
Думаю это сделано для об"nil"инья паблишед полей у форм и датамодулей, которые асациированны с компонентами брошеннымми в дизин тайм на эти формы/модули, но как то это кривовато - не находите??
← →
jack128 © (2004-04-21 22:50) [0]Итак код:
type
TTextComponent = class(TComponent)
published
Test: TComponent;
Comp: TComponent;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
t: TTextComponent;
begin
t := TTextComponent.Create(nil);
try
t.Comp := TComponent.Create(t);
t.Comp.Name := "Test";
t.Test := TComponent.Create(t);
t.Comp.Free;
if Assigned(t.Test) then
t.Test.Free
else
Caption := "уже nil !!!!"; // как ни странно Test - уже nil ;-)
finally
t.Free;
end;
end;
Вобщем то источник этого поведения найти легко
procedure TComponent.SetReference(Enable: Boolean);
var
Field: ^TComponent;
begin
if FOwner <> nil then
begin
Field := FOwner.FieldAddress(FName);
if Field <> nil then
if Enable then Field^ := Self else Field^ := nil;
end;
end;
Думаю это сделано для об"nil"инья паблишед полей у форм и датамодулей, которые асациированны с компонентами брошеннымми в дизин тайм на эти формы/модули, но как то это кривовато - не находите??
← →
Игорь Шевченко © (2004-04-21 22:56) [1]
> но как то это кривовато - не находите??
Не находим
← →
Игорь Шевченко © (2004-04-21 22:56) [1]
> но как то это кривовато - не находите??
Не находим
← →
Anatoly Podgoretsky © (2004-04-21 23:18) [2]t.Comp.Free;
if Assigned(t.Test) then
t.Test.Free
Грубо и опасно, обращение к разрушенному объекту
← →
Anatoly Podgoretsky © (2004-04-21 23:18) [2]t.Comp.Free;
if Assigned(t.Test) then
t.Test.Free
Грубо и опасно, обращение к разрушенному объекту
← →
Jack128 © (2004-04-21 23:20) [3]
> Грубо и опасно, обращение к разрушенному объекту
Это где я обратился к уже разрушенному объекту???
← →
Jack128 © (2004-04-21 23:20) [3]
> Грубо и опасно, обращение к разрушенному объекту
Это где я обратился к уже разрушенному объекту???
← →
Anatoly Podgoretsky © (2004-04-21 23:37) [4]Ошибся прочитал как t.Free;
← →
Anatoly Podgoretsky © (2004-04-21 23:37) [4]Ошибся прочитал как t.Free;
← →
Fantasist © (2004-04-22 02:16) [5]
> Не находим
Исчерпывающе.
← →
Fantasist © (2004-04-22 02:16) [5]
> Не находим
Исчерпывающе.
← →
Юрий Зотов © (2004-04-22 06:50) [6]Некая кривизна, пожалуй, и правда есть. Откуда и почему она взялась - понятно. Способ в нее не влететь тоже ясен - просто не надо давать никаких имен динамически созданным компонентам. Тем более, что они им совершенно не нужны.
← →
Юрий Зотов © (2004-04-22 06:50) [6]Некая кривизна, пожалуй, и правда есть. Откуда и почему она взялась - понятно. Способ в нее не влететь тоже ясен - просто не надо давать никаких имен динамически созданным компонентам. Тем более, что они им совершенно не нужны.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.03 c