如果耳目一新会再次给你相同的名单,并以相同的顺序,那就不必发现关于对象的任何东西。只需存储列表控件的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;
在所有这些情况下,你应该认识到该对象在列表中的位置是不实际的对象的属性。相反,它是列表的属性,这就是为什么列表在所有代码中扮演比对象更重要的角色的原因。实际上并没有任何“指针信息”可以从对象中获取,因为对象通常不知道它甚至不在列表中,所以它肯定不会知道它相对于列表中的所有其他项的位置。
确定对象在列表中的位置后,需要将其滚动到视图中。对于TListBox
,一个简单的方法就是设置其属性TopIndex
:
List.TopIndex := ObjectPosition;
最后,如果你不真正关心当前对象所有,但只是要恢复当前滚动位置,那么这更容易:
procedure Refresh;
var
CurrentPosition: Integer;
begin
CurrentPosition := List.TopIndex;
RefreshList;
List.TopIndex := CurrentPosition;
end;
你在找'TListItem.Index'吗?你失去了我的位置:=整数(TObject。“pointerinfo ????”);' – 2011-04-26 12:53:33
什么是“图形列表”和“对象”?您尝试使用哪些课程?你能展示代码示例吗? – Andrew 2011-04-26 13:11:36