从指针问题中访问值

时间:2011-05-18 15:25:37

标签: delphi pointers

我有一个名为CModelItem

的TObject类

我希望拥有这些对象的列表,并能够修改每个对象的值

所以,我创建了一个类

CQueueList = class(TList)

private

public

end;

我做了

QueueList : CQueueList;

在var

现在,我可以将CModelItem添加到此列表中,如下所示:

QueueList := CQueueList.Create;
for idx := 0 to ndx - 1 do
  begin
    MyItem := CModelItem.Create;
    MyItem.CopyHead(CModelItem(RunList.Objects[idx]));
    MyItem.ReadData;
    MyItem.NumOfIterations := NumRepEdit.Value;
    MyItem.IsInQueue := True;
    MyItem.LogEvents := EventsCheckBox.Checked;
    MyItem.LogMatch := MatchCheckBox.Checked;
    MyItem.LogUpdates := UpdatesCheckBox.Checked; 

    QueueList.Add(MyItem);
  end;

我也可以使用它,所以我可以这样做:

DefForm := TRunDefForm.Create(Self, QueueList.Items[idx]);

使用DefForm接受组件和CModelItem

但是我在尝试修改QueueL中对象的值时遇到了问题

首先,我无法通过

访问类似MyItem.IsInQueue的内容
QueueList.Items[idx].IsInQueue := blah;

因为它告诉我IsInQueue是'未声明的标识符'

我还尝试制作一个新的CModelItem并复制信息,如下所示:

idx := QueueListBox.ItemIndex;
MyItem := QueueList.Items[idx];

并且编译得很好,但在进入该函数时会抛出“访问冲突错误”

我注意到QueueList.Items [idx]是一个指针,但我真的不确定我应该如何访问它

1 个答案:

答案 0 :(得分:3)

编译器抱怨,因为TList.Items返回一个无类型指针。

您可以使用类型转换:

  CModelItem(QueueL.Items[idx]).IsInQueue := blah;

您还可以重新实现Items课程中的CQueueList媒体资源:

private
  function GetItems(Index: Integer): CModelItem;
public
  property Items[Index: Integer]: CModelItem read GetItems; default;
end;

function CQueueList.GetItems(Index: Integer): CModelItem;
begin
  Result := inherited Items[Index];
end;

正如您所见,使用局部变量有效;虽然访问冲突可能是代码中其他地方的错误。