Главная страница
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.04 c
15-1148479982
Мурзилка
2006-05-24 18:13
2006.06.18
проблеммы с usb


3-1145597273
Alexey V.
2006-04-21 09:27
2006.06.18
Выявление дублированных записей


4-1142933233
StudentVNN
2006-03-21 12:27
2006.06.18
Неработает завершение сеанса ExitWindowsEx(EWX_LOGOFF, 0)


1-1147265777
tytus
2006-05-10 16:56
2006.06.18
ListBox


2-1149012569
Галинка
2006-05-30 22:09
2006.06.18
Что такое хэш-таблица. Как ее реализовать на Дельфи?