Dziwne oznaczenia w AddItem

0

Korzystając z TListView musiałem dodać element ze skojarzonym z nim obiektem. Skorzystałem więc z metody AddItem, która jako drugigo parametru wymaga obiektu klasy TObject. Wszystko pięknie, ale jak chciałem się odwołać do skojarzonego obiektu... Nie mogłem znaleźć nic, co byłoby typlu TObject. Znalazłem natomiast pole Data typu Pointer. Pomyślałem, że zapewne jest to wskaźnik na mój obiekt. W drodze eksperymentu ustaliłem, że jednak nie jest to wskaźnik na mój obiekt, tylko sam mój obiekt (oczywiście w Delphi obiekty są wskaźnikami, a jednak nazwa sugeruje coś innego). Idąc tym tropem spróbowałem podać jako parametr AddItem nie obiekt, a wskaźnik do zmiennej typu Integer. Kompilator wszystko przepuścił i mogłem bez problemu odczytać zawartość zmiennej z powrotem.
Czy ktoś wie, co kierowało projektantami Delphi za nadaniem typu TObject dla drugiego parametru w AddItem? W TList jest to bardzo ładnie oznaczone, a tutaj taka niekonsekwencja.

0

procedura AddItem jest dość nieefektywna w mojej opinii, a odwołanie do obiektu poprzez wskaźnik jest jak dla mnie bardzo normalne. Od AddItem bardziej polecam taką konstrukcję jak np:

procedure TfrmCustomizeToolbar.BuildAvilableLV;
var
  Li: TListItem;
  I: Integer;
begin
  SortAvilRecs;
  lvAvilable.Clear;
  if AvilRecs.Count<>0 then
    begin
      lvAvilable.Items.BeginUpdate;
      for I:=0 to AvilRecs.Count-1 do
        begin
          Li:=lvAvilable.Items.Add;
          Li.Data:=AvilRecs.Items[I];
          if PTBRec(AvilRecs.Items[I])^.Style=Byte(tbsSeparator) then
            begin
              Li.Caption:='-(Separator)-';
              Li.ImageIndex:=-1;
            end
          else
            begin
              Li.Caption:=StringReplace((Main.alActions.Actions[PTBRec(AvilRecs.Items[I])^.Action] as TCustomAction).Caption, '&','', [rfReplaceAll, rfIgnoreCase]);
              Li.ImageIndex:=(Main.alActions.Actions[PTBRec(AvilRecs.Items[I])^.Action] as TCustomAction).ImageIndex;
            end;
        end;
      lvAvilable.Items.EndUpdate;
    end;
end;

Jak dla mnie jest to po prostu bardziej zrozumiałe(TList z TListView tu jest pokazane, dla obiektów robie podobnie)

0

Nie mówię, że odwołanie przez wskaźnik jest dziwne, ale o samo nazewnictwo, brak konsekwencji. Skoro już użyto Pointer w Data, to i w AddItem powino się użyć Pointer (zwłaszcza, że można bez problemu każdy wskaźnik dać, nie tylko obiekt).
A co do efektywności. Nie wiem czy twój kod jest bardziej efektywny, ale też wcale mi na efektywności w tym momencie nie zależy. Obiekty są jedynie dodatkiem. Z wykody korzystam z AddItem.

0

aaa to ja juz rozumiem, chodzi o to że w additem jest AObject: TObject, a odwołuje się poprzez Data: Pointer, mimo iż powinno być ustawianie w additem Data:pointer, albo odwoływanie się przez AObject: TObject? Jak tak to twoja wypowiedź jest całkowicie słuszna...

1 użytkowników online, w tym zalogowanych: 0, gości: 1