簡體   English   中英

獲取對象在Delphi中的列表中的位置?

[英]Get position of object in a list in Delphi?

我想知道如何在創建的列表中獲得某個對象的位置。 可以說它就像一個圖形列表,您可以在其中單擊對象。 可以說您右鍵單擊一個對象,然后單擊“刷新”,我如何獲得該對象的位置,以便在刷新整個列表后(由於某種原因刷新了透明列表),我又回到了列表中的相同位置? 如果列表的長度為1000個對象,則刷新后嘗試向下滾動到相同位置會很麻煩。

該代碼使用Tobject,但我可以做諸如position:= integer(TObject。“ pointerinfo ???”);的操作嗎? 之后,當程序刷新時,將視圖的位置設置為指針,例如currentview(pointer)或類似的東西?

實際上,它不必是相同的對象,但是列表的相同“視圖”會更好。

提前致謝

如果刷新將再次為您提供相同的列表,並且以相同的順序進行,則不必費心去發現有關該對象的任何信息。 只需存儲列表控件的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;

因此,我認為在我的幫助下,我回答了自己的問題。 我所做的就是寫一些占據listview的x和y位置的內容,然后在用clearlist刷新后,我使用了滾動功能回到了相同的功能。 我的程序看起來像這樣。

procedure Refresh(Sender: TObject);
var
  horzpos:integer;
  vertpos:integer;
begin
    horzpos:=ListView1.ViewOrigin.X;
    vertpos:=ListView1.ViewOrigin.Y;
    RefreshListView(ListView1); //A function that refreshes the list and clears it
    ListView1.Scroll(horzpos, vertpos);
 end;

也許我應該早些時候說過,這是一個列表視圖類型,我想在“清除列表”之后再次回到相同的位置。

感謝您提供的所有幫助,這個社區真是令人難以置信!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM