Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Pointer as Class - в чем проблема [D7, WinXP]


shart ©   (2006-05-31 01:59:00) 

У меня есть 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;


Shart   (2006-06-01 17:51:00) [1]

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

;)


Ega23   (2006-06-01 17:09:00) [2]


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



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

 myObj. ..... ;
end;



:о)


Shart   (2006-06-01 17:03:00) [3]

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

СПАСИБО!


Ega23   (2006-06-01 09:32:00) [4]


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


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


AlexWlad   (2006-05-31 20:13:00) [5]

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


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

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


Ega23   (2006-05-31 16:06:00) [7]


> 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:04:00) [8]

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


atruhin   (2006-05-31 05:36:00) [9]

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


shart   (2006-05-31 02:41:00) [10]

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


Rial   (2006-05-31 02:34:00) [11]

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо