Возникло желание в проекте перейти с TObjectList на TColection.
Одна проблема — TCollection не поддерживает сортировку.
При написании метода сортировку столкнулся с тем, что никак не могу
поменять местами два TColletionItem.
пробовал так:
TGood = class(TCollectionItem)
public
Text: string;
procedure Assign(Source: TPersistent); override;
end;
procedure TGood.Assign(Source: TPersistent);
begin
Self.Collection := TGood(Source).Collection;
Self.DisplayName := TGood(Source).DisplayName;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Collection: TCollection;
Item: TGood;
p: Pointer;
begin
Collection := TCollection.Create(TGood);
Item := TGood(Collection.Add);
Item.Text := '1';
Item := TGood(Collection.Add);
Item.Text := '2';
p := Collection.Items[0];
TGood(Collection.Items[0]).Assign(Collection.Items[1]);
TGood(Collection.Items[0]).Assign(TGood(p));
end;
В итоге, получаю, что в первом, что во втором CollectionItem.Text равен '2'
Где ошибка и как правильно сделать обмен местами двух элементов коллекции?
О-о-пс, ошибся в TGood.Assign, справлено так:
procedure TGood.Assign(Source: TPersistent);
begin
Self.Collection := TGood(Source).Collection;
Self.DisplayName := TGood(Source).DisplayName;
Self.Text := TGood(Source).Text;
end;
Результат тот же.
Здравствуйте, Tolstaya Tigra, Вы писали:
TCollectionItem.Index — вот то, что нужно..

... << RSDN@Home 1.1 alpha 1 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
H_D>TCollectionItem.Index — вот то, что нужно..
Ну да, это вариант, но слабый,
на самом деле подразумевает собой что в коллекции будет создан лишний временный элемент,
который не должен будет поадать в сортировку.
Хочется элегантнее — через указатели.
Здравствуйте, Tolstaya Tigra, Вы писали:
H_D>>TCollectionItem.Index — вот то, что нужно..
TT>Ну да, это вариант, но слабый,
TT>на самом деле подразумевает собой что в коллекции будет создан лишний временный элемент,
Зачем??? Присвоения значения свойству Index переносит его в новую позицию...
TT>который не должен будет поадать в сортировку.
TT>Хочется элегантнее — через указатели.
Вот тебе исходник,Ю если намека не хватило
procedure ExchangeCollectionItems(Item1, Item2: TCollectionItem); overload;
var
idx1: integer;
begin
if Item1.Collection <> Item2.Collection then
raise Exception.Create('Нельзя менять местами элемент ы разных коллекций!');
idx1 := Item1.Index;
Item1.Index := Item2.Index;
Item2.Index := idx1;
end;
procedure ExchangeCollectionItems(Collection: TCollection; idx1, idx2: integer); overload;
begin
ExchangeCollectionItems(Collection[idx1], Collection[idx2]);
end;
Вот и все...и никаких временных элементов

... << RSDN@Home 1.1 alpha 1 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))