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

Вниз

Pointer as Class - в чем проблема   Найти похожие ветки 

 
shart ©   (2006-05-31 01:59) [0]

У меня есть TList с указателями на класс TMyObj
TMyObj= class
 private
   ...
 public
  Z:Integer;
  ...
end;


Ещё функция сравнения:
function Compare(Item1, Item2: Pointer): Integer;
begin
 Result:=(Item1 as TMyObj).Y-(Item2 as TMyObj).Y; // Здесь ошибка
end;

Потом делаю Sort(@Compare); и возникает ошибка "Operator not applicable to this operand type"

Где у меня ошибка?

P.S. Написал же как и в хелпе:
function CompareNames(Item1, Item2: Pointer): Integer;
begin
 Result := CompareText((Item1 as TComponent).Name, (Item2 as TComponent).Name);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 List1.Sort(@CompareText);
end;


 
Rial ©   (2006-05-31 02:34) [1]

function Compare(Item1, Item2: Pointer): Integer;
begin
Result:=TMyObj(Item1).Y-TMyObj(Item2).Y;
end;

Это если, конечно, TMyObj - класс, или другая структура того же размера.


 
shart ©   (2006-05-31 02:41) [2]

Спасибо...
"Operator not applicable to this operand type" уже нет, зато есть Memory Access Violation :(


 
atruhin ©   (2006-05-31 05:36) [3]

Приведи код создания элементов TList. Похоже что в него попадают не действительные указатели.


 
Shart ©   (2006-05-31 16:04) [4]

var
Objs:array[0..50] of TMyObj;
...
...
for i:=0 to 50 do
begin
    Objs[i]:=TMyObj.Create;
    ObjsList.Add(Objs[i]);
end;


 
Ega23 ©   (2006-05-31 16:06) [5]


> var
> Objs:array[0..50] of TMyObj;
> ...
> ...
> for i:=0 to 50 do
> begin
>     Objs[i]:=TMyObj.Create;
>     ObjsList.Add(Objs[i]);
> end;
>


А зачем так через задницу?

var
obj:TMyObj;
i:Integer;
begin
for i:=0 to 50 do
 begin
   obj:=TMyObj.Create;
   ObjList.Add(obj);
 end;
end;


 
Shart ©   (2006-05-31 16:09) [6]

Мне просто надо иметь и массив объектов ;)


 
AlexWlad ©   (2006-05-31 20:13) [7]

У тебя массив Objs объявлен как локальный в процедуре? Тогда по выходе из процедуры он будет убит.


 
Ega23 ©   (2006-06-01 09:32) [8]


> Мне просто надо иметь и массив объектов ;)


Тогда вообще заведи TObjectList и добавляй в него так:
var
i:Integer;
begin
for i:=0 to 50 do ObjList.add(TMyObj.Create)
end;


 
Shart ©   (2006-06-01 17:03) [9]

Странно, когда я не использую массив, а добавляю в TList как в [5], то всё работает :) Наверное так и оставлю, правда трудно обращатся к массиву объектов TMyObj(ObjList.Items[Index]), но хоть как-то ;)

СПАСИБО!


 
Ega23 ©   (2006-06-01 17:09) [10]


> правда трудно обращатся к массиву объектов TMyObj(ObjList.
> Items[Index]), но хоть как-то ;)



var
myObj:TMyObj;
begin
 myObj:=TMyObj(ObjList.Items[Index]);

 myObj. ..... ;
end;



:о)


 
Shart ©   (2006-06-01 17:51) [11]

можно и так:
function Objects(Index : Integer) : TMyObj;
begin
    Result:=TMyObj(ObjList.Items[Index]);
end;

;)



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

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

Наверх




Память: 0.49 MB
Время: 0.042 c
2-1148631959
eclipse
2006-05-26 12:25
2006.06.18
не сохраняются данные при закрытии в таблице


2-1149170626
Alex7
2006-06-01 18:03
2006.06.18
Удаление ненужных модулей


2-1149085977
Тимофеич
2006-05-31 18:32
2006.06.18
web


2-1149175295
Asail
2006-06-01 19:21
2006.06.18
Как скопировать контрол в другой parent?


6-1139826721
BBCHa
2006-02-13 13:32
2006.06.18
Подмена IP и MAC адресов