![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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;
Вторая строка совсем лишняя