DelphiX: Сортировка TCollection
От: Tolstaya Tigra  
Дата: 19.07.03 10:42
Оценка:
Возникло желание в проекте перейти с 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'

Где ошибка и как правильно сделать обмен местами двух элементов коллекции?
Re: DelphiX: Сортировка TCollection - ошибка assign
От: Tolstaya Tigra  
Дата: 19.07.03 10:51
Оценка:
О-о-пс, ошибся в TGood.Assign, справлено так:
procedure TGood.Assign(Source: TPersistent);

begin
  Self.Collection := TGood(Source).Collection;
  Self.DisplayName := TGood(Source).DisplayName;
  Self.Text := TGood(Source).Text;
end;

Результат тот же.
Re[2]: DelphiX: Сортировка TCollection - ошибка assign
От: Hacker_Delphi Россия  
Дата: 19.07.03 23:03
Оценка:
Здравствуйте, Tolstaya Tigra, Вы писали:

TCollectionItem.Index — вот то, что нужно..
... << RSDN@Home 1.1 alpha 1 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[3]: DelphiX: Сортировка TCollection - ошибка assign
От: Tolstaya Tigra  
Дата: 21.07.03 06:24
Оценка:
H_D>TCollectionItem.Index — вот то, что нужно..

Ну да, это вариант, но слабый,
на самом деле подразумевает собой что в коллекции будет создан лишний временный элемент,
который не должен будет поадать в сортировку.
Хочется элегантнее — через указатели.
Re[4]: DelphiX: Сортировка TCollection - ошибка assign
От: Hacker_Delphi Россия  
Дата: 22.07.03 00:32
Оценка:
Здравствуйте, 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 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.