更新すると同じリストが同じ順序で表示される場合は、オブジェクトについて何も気にしないでください。ItemIndex
現在選択されているアイテムを示すリストコントロールのプロパティを保存するだけです。
更新すると別のリストが表示される場合は、必要なオブジェクトが後で同じ位置にない可能性があるため、覚えておくだけItemIndex
では不十分です。その場合、オブジェクトの新しい位置を見つける必要があります。これを行う方法は、リストコントロールの機能と、各位置に関連付けられたオブジェクトをどのように公開するかによって異なります。TListBox
たとえば、がある場合、プロパティItems
はオブジェクトであり、必要なオブジェクトが見つかるまで配列TStrings
の各値を調べることができます。Objects
オブジェクト参照の値を格納してから、それを検索します。このようなもの:
procedure Refresh;
var
CurrentSelection: TObject;
ObjectPosition: Integer;
i: Integer;
begin
if List.ItemIndex >= 0 then
CurrentSelection := List.Strings.Objects[List.ItemIndex]
else
CurrentSelection = nil;
RefreshList;
ObjectPosition := -1;
if Assigned(CurrentSelection) then begin
for i := 0 to Pred(List.Count) do begin
if List.Strings.Objects[i] = CurrentSelection then begin
ObjectPosition := i;
break;
end;
end;
end;
if ObjectPosition = -1 then
// Object isn't in refreshed list
else
// It is.
end;
最後の可能性は、更新しても実際には同じオブジェクトがまったく保持されないことです。以前のオブジェクトはすべて破棄され、オブジェクトの新しいリストが生成されます。その場合、同じものを表す新しいオブジェクトを見つけることができるように、元のオブジェクトの特定の識別特性を覚えておく必要があります。このようなもの:
var
CurrentObject, Person: TPerson;
CurrentName: string;
i, ObjectPosition: Integer;
begin
if List.ItemIndex >= 0 then begin
CurrentObject := List.Strings.Objects[List.ItemIndex] as TPerson;
CurrentName := CurrentObject.Name;
end else
CurrentName = '';
RefreshList;
ObjectPosition := -1;
if CurrentName <> '' then begin
for i := 0 to Pred(List.Count) do begin
Person := List.Strings.Objects[i] as TPerson;
if Person.Name = CurrentName then begin
ObjectPosition := i;
break;
end;
end;
end;
if ObjectPosition = -1 then
// Object isn't in refreshed list
else
// It is.
end;
これらすべての場合において、リスト内のオブジェクトの位置は実際にはオブジェクトのプロパティではないことを理解する必要があります。むしろ、それはリストのプロパティであるため、リストはそのすべてのコードのオブジェクトよりも大きな役割を果たします。オブジェクトは、一般に、リスト内にあることを認識していないため、オブジェクトから取得する「pointerinfo」は実際にはありません。したがって、リスト内の他のすべてのアイテムに対する相対的な位置は確かにわかりません。
リスト内のオブジェクトの位置を決定したら、それをスクロールして表示する必要があります。の場合TListBox
、簡単な方法はそのTopIndex
プロパティを設定することです。
List.TopIndex := ObjectPosition;
そして最後に、現在のオブジェクトを実際にはまったく気にせず、現在のスクロール位置を復元したいだけの場合は、さらに簡単です。
procedure Refresh;
var
CurrentPosition: Integer;
begin
CurrentPosition := List.TopIndex;
RefreshList;
List.TopIndex := CurrentPosition;
end;