Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.14;
Скачать: CL | DM;

Вниз

Хочу поменять 2 эл-та коллекции между собой с помощью указателей.   Найти похожие ветки 

 
MaximatorVeter ©   (2002-10-04 23:48) [0]

Необходимо для эффективной сортировки элементов коллекции.
Вот код:

type

TTree = class(TCollectionItem)
public
CI : byte;
procedure SetAddress(p: Ttree);
end;

TTreesCollection = class(TCollection)
private
function GetTrees(Index: Integer): TTree;
procedure SetTrees(Index: Integer; Value: TTree);
public
function Add: TTree;
property Items[Index: Integer]: TTree read GetTrees write SetTrees; default;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TTree.SetAddress(p: TTree);
begin
Self:=p;
end;

function TTreesCollection.Add: TTree;
begin
Result := TTree(inherited Add);
end;

function TTreesCollection.GetTrees(Index: Integer): TTree;
begin
Result := TTree(inherited Items[Index]);
end;

procedure TTreesCollection.SetTrees(Index: Integer; Value: TTree);
begin
Items[Index].Assign(Value);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
Tr:TTreesCollection;
P:TTree;
begin
Tr:=TTreesCollection.Create(TTree);
Tr.Add;
Tr[0].CI:=1;
Tr.Add;
Tr[1].CI:=2;
P:=Tr[0];
Tr[1]:=Tr[0]; // здесь вызывается метод Assign
Tr[0]:=P;
Tr.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
Tr:TTreesCollection;
P:TTree;
begin
Tr:=TTreesCollection.Create(TTree);
Tr.Add;
Tr[0].CI:=1;
Tr.Add;
Tr[1].CI:=2;
P:=Tr[0];
Tr[1].SetAddress(Tr[0]);
Tr[0].SetAddress(P);
Tr.Free;
end;

end.


Для первой кнопки вызывается метод Assign, что не приемлимо для эффективной сортировки. Для второй компилятор игнорирует функцию SetAddress (оптимизация). В чем я не прав?


 
Юрий Зотов ©   (2002-10-05 00:10) [1]

> В чем я не прав?

В принципе.

Self - это параметр, передаваемый по значению, поэтому Self:=p ничего не дает (меняется не сам указатель, а его копия в регистре).

Меняйте местами Index"ы элементов, вот и все. Никакие Assign не нужны, а по поводу эффективности - см. TCollectionItem.SetIndex и TList.Move.


 
MaximatorVeter ©   (2002-10-05 18:23) [2]

Спасибо.
Заметив вчера вечером на форуме, от Вас кстати и ждал ответа (читал вашу статью по коллекциям).



Страницы: 1 вся ветка

Текущий архив: 2002.10.14;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.012 c
6-45489
Ksion
2002-08-11 05:00
2002.10.14
NMHTTP. Где достать картинку которую он скачал.


3-45175
Осирис
2002-09-20 13:58
2002.10.14
ADOConnection


4-45633
madcap
2002-08-09 23:31
2002.10.14
Скопировать текст из чужого окна?


4-45614
Константин
2002-08-28 10:33
2002.10.14
Поиск заданного процесса


1-45451
Dell3r
2002-10-03 20:19
2002.10.14
Как сделать чтобы окно не сворачивалось?