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

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

TObjectList [D5, Win2k]


vladnt ©   (2002-12-19 14:53:00) 

Всем добрый день. В проге использую(вернее пытаюсь) TObjectList и что-то я ,наверное, не так понимаю.Подскажите,please, в чем моя ошибка.
Приблезительно это выглядит так:
type
TMyClass=class
public z:short;
end;
var MyList:TObjectList;

procedure AddMyList (tz:short);
var
TempMyClass:TMyClass;
begin
TempMyClass:=TMyClass.Create;
TempMyClass.z:=tz;
MyList.Add(TempMyList);
TempMyClass.free;
end;

procedure Main;
var
i:short;
TempMyClass:TMyClass;
begin
MyList:=TObjectList.Create(true);
for i:=0 to 10 do AddMyList(i);
.....
TempMyClass:=TMyClass.Create;
for i:=0 to MyList.Count-1 do
begin
TempMyClass:=MyList.Items[i];
.....
end;
TempMyClass.Free;
MyList.Free;
end;


vladnt   (2002-12-19 16:35:00) [1]

han_malign
Здорово!Все работает! Спасибо! Да еще, я думаю,что все-таки Рэндел Шварц был не прав, особенно по поводу лени.


han_malign   (2002-12-19 16:00:00) [2]

function MyClassCompare(Item1, Item2: Pointer): Integer;
begin
Result:=TMyClass(Item1).z-TMyClass(Item2).z;
end;
............
MyList.Sort(MyClassCompare);


vladnt   (2002-12-19 15:39:00) [3]

han_malign
Косяк не мой,этим не балуюсь (предпочитаю спиртное):))
За помощь большое спасибо. До кучи еще вопросик можно: нужно отсортировать по z. TObjectList.Sort() с этим справиться?


han_malign   (2002-12-19 15:22:00) [4]

Это не твой-ли косяк я вчера в Потрепаться обмусоливал ("Почему всегда 10 выдает")?

У меня минут пять ушло на то, чтобы понять почему на падает, но зато потом до вечера в восторге был - просто классический пример для изучения соглашений компилятора при предаче параметров в методах класса.


han_malign   (2002-12-19 15:16:00) [5]

З.З.Ы. AddMyList - делается проще
TMyClass = class
.............
public
constructor Create(aZ: integer);
.............
end;

constructor TMyClass.Create(aZ: integer);
begin
z:=aZ;
end;
................
for i:=0 to 10 do MyList.Add(TObject(TMyClass.Create(i)));


han_malign   (2002-12-19 15:11:00) [6]

нужно прямое приведение типа, плюс у тебя косяки

procedure AddMyList (tz:short);
var
TempMyClass:TMyClass;
begin
TempMyClass:=TMyClass.Create;
TempMyClass.z:=tz;
MyList.Add( TObject(TempMy Class{List}));
//TempMyClass.free; убиваешь хранимый в List-е объект
end;

procedure Main;
var
i:short;
TempMyClass:TMyClass;
begin
MyList:=TObjectList.Create(true);
for i:=0 to 10 do AddMyList(i);
.....
//TempMyClass:=TMyClass.Create; зачем тебе 12-тый экземпляр, указатель на который ты теряешь ниже
for i:=0 to MyList.Count-1 do
begin
TObject(TempMyClass):=MyList.Items[i];
.....
end;
//TempMyClass.Free; все экземпляры убиваются List-ом, не зря же ты TObjectList.Create( true) делал
MyList.Free;
end;

З.Ы. TempMyClass:TMyClass - это указатель на экземпляр, в список помещается именно указатель, так как список не может знать принцип копирования дынных из объекта в объект(про TPersistent грузить не буду - здесь это не надо).


vladnt   (2002-12-19 15:03:00) [7]

выдает ошибку на строке TempMyClass:=MyList.Items[i] :

Incompatible types: "TMyClass" and "TObject"


Юрий Федоров   (2002-12-19 14:55:00) [8]

MyList.Add(TempMyList);
TempMyClass.free;

Вторая строка совсем лишняя


Наверх

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