Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.25;
Скачать: CL | DM;

Вниз

Ошибка при приведении объекта к типу предка   Найти похожие ветки 

 
AkaSaint ©   (2004-02-11 18:30) [0]

Здравствуйте. Есть такая система классов:

type

A = class(SomeClass)
public
Field1: Integer;
...
end;

B = class(A)
public
...
end;

BArray = array of B;

C = class(SomeClass)
public
BArr: BArray;
...
end;

Где-то в программе:

var
AObj: A;
begin
...
for i := 0 to Length(C.BArr) do
begin
//Здесь отладчик показывает: C.BArr[0].Field1=5
AObj := C.BArr;
//Здесь отладчик показывает: C.BArr[0].Field1=5
//AObj.Field1 = 0
...
end;
...
end;

Причем, если поставить в отладчике тип C.BArr[0] и AObj как
указатель, то адреса их совпадают.
В чем может быть дело? Заранее спасибо.


 
Тимохов ©   (2004-02-11 18:32) [1]


> AObj := C.BArr;

Это что?


 
Тимохов ©   (2004-02-11 18:33) [2]


> for i := 0 to Length(C.BArr) do

баг


 
Тимохов ©   (2004-02-11 18:33) [3]

и вообще, где ошибка?


 
Vlad ©   (2004-02-11 18:40) [4]


> AkaSaint © (11.02.04 18:30)


> C = class(SomeClass)
>public
>BArr: BArray;

.....

> for i := 0 to Length( C.BArr) do


Это как ? :-)


 
icWasya ©   (2004-02-11 19:04) [5]

???
1)
for i := 0 to Length(C.BArr) -1 do

2)
в предыдущей строке С это тип или что?


 
Тимохов ©   (2004-02-11 19:06) [6]

Я знаю это была проверка отывчивости участников форума.
Автор куда-то делся - наверное домой пошел.


 
AkaSaint ©   (2004-02-12 15:10) [7]

Нет, это не проверка, конечно, просто потом у меня не было времени. Прошу меня извинить.
В программе я неверно написал "C", под этим имелся в виду объект класса С. Перепишу заново, надеюсь, на этот раз все учел.


type

A = class(SomeClass)
public
Field1: Integer;
...
end;

B = class(A)
public
...
end;

BArray = array of B;

C = class(SomeClass)
public
BArr: BArray;
...
end;

Где-то в программе:

var
AObj: A;
CObj: C;
begin
...
CObj := C.Create;
...
for i := 0 to Length(CObj.BArr)-1 do
begin
//Здесь отладчик показывает: CObj.BArr[0].Field1=5
AObj := CObj.BArr;
//Здесь отладчик показывает: CObj.BArr[0].Field1=5
//AObj.Field1 = 0
...
end;
...
end;


Смысл ошибки в том, что поля AObj содержат не те значения, что содержит CObj.BArr[0], хотя первый является предком последнего.


 
Тимохов ©   (2004-02-12 15:12) [8]

Все-таки не очень ясно, что такое AObj := CObj.BArr;
У тебя это вообще компилится?


 
MBo ©   (2004-02-12 15:13) [9]

А так?
AObj := CObj.BArr[0];


 
Тимохов ©   (2004-02-12 15:17) [10]


> MBo © (12.02.04 15:13) [9]

Да вообще говоря у него это (AObj := CObj.BArr) компилиться просто не должно. имхо


 
Chieftain   (2004-02-12 15:34) [11]

Собственно, оно и не компилится ;) Incompatible types


 
Тимохов ©   (2004-02-12 15:35) [12]

Тогда что вообще на код, который не компилиться?
Эй, автор - проясни ситуацию.


 
Семен Сорокин ©   (2004-02-12 15:48) [13]

2AkaSaint
наследуюй от TPersistent, где перекрывай Assign.
Посмотри как это сделано в том же TFont.


 
AkaSaint ©   (2004-02-12 19:40) [14]

Опять не все учел! Должно быть AObj := CObj.BArr[0]. Насчет TPersistent: SomeClass есть потомок TPersistent, и Assign там перекрыт. Я пробовал так:

AObj := A.Create;
AObj.Assign(CObj.BArr[0]);

Я посмотрел на TFont.Assign, я делаю аналогично. Но уже на первой строчке A.Assign Source=nil, хотя CObj.BArr[0] <> nil!


 
Тимохов ©   (2004-02-12 19:46) [15]

Как говорится на местном формуме - ошибка в 17 строке. В приседенном в 7 коде с учетом 14 ошибки нет.


 
Defunct   (2004-02-13 01:33) [16]

В программе AObj это указатель на экземпляр класса A
[14]
AObj := A.Create;
AObj.Assign(CObj.BArr[0]);

Создается новый экзнемпляр, ему назначается читаем Delphi Help
The Assign method copies all properties from a Series component to another. Все свойства из CObj.BArr[0], но Field один это не Property!! отсюда и получается 0 в отладчике.

Нужно просто присвоить:
AObj := CObj.BArr[0];
Тогда AObj будет ссылкой на экземпляр CObj.BArr[0];

Или описать Field1 как Property


 
Тимохов ©   (2004-02-13 09:56) [17]


> Defunct (13.02.04 01:33) [16]

Немножко не в ту степь.

"The Assign method copies all properties from a Series component to another"
Это будет не автоматически, а если самому описать копирование.

"Или описать Field1 как Property" - это вообще к чему. Что это решит проблему?

В исходном коде ошибки нет. Все дожно работать не зависимо от property это или нет.


 
Defunct   (2004-02-13 10:41) [18]

Вызывается ведь Assign из (SomeClass), вот поля SomeClass и копируются


 
Тимохов ©   (2004-02-13 10:42) [19]


> Defunct (13.02.04 10:41) [18]

Само ничего не копируется - надо явно описать алгоритм копирования.


 
AkaSaint ©   (2004-02-13 16:35) [20]

Ладно, придется пока оставить этот вопрос. Спасибо всем.



Страницы: 1 вся ветка

Текущий архив: 2004.02.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.026 c
1-79884
8ung
2004-02-09 20:54
2004.02.25
Слишком медленная работа с файлами.


9-79523
Unknown user
2003-08-05 18:29
2004.02.25
В каких программах проще всего создавать 3Д модели?


8-80047
Ich Hasse
2003-10-24 15:09
2004.02.25
Какой компонент испоьлзовать дя GIF фалов


14-80214
zSerg
2004-01-30 14:29
2004.02.25
Построение минимального прямоугольниа


3-79599
Dimich1978
2004-02-02 08:14
2004.02.25
Как программно подключится к mdb через ADOTable