【问题标题】:Accessing values from pointer problem从指针问题中访问值
【发布时间】:2011-05-18 15:25:36
【问题描述】:

我有一个名为 CModelItem 的 TObject 类型的类

我想要一个这些对象的列表,并且能够修改每个对象的值

所以,我创建了一个类

CQueueList = class(TList)

private

public

end;

我做

QueueList : CQueueList;

在变量中

现在,我可以将 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] 是一个指针,但我真的不确定我应该如何访问它

【问题讨论】:

  • 根据您显示的代码,您正在正确访问您的列表。你的问题在别处。 AV 发生在哪个地址?零,还是别的什么?是读还是写?

标签: delphi pointers


【解决方案1】:

编译器报错是因为TList.Items 返回了一个无类型指针。

您可以使用类型转换:

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

您还可以在 CQueueList 类中重新实现 Items 属性:

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;

如您所见,使用局部变量是可行的;尽管访问冲突可能是您代码中其他地方的错误。

【讨论】:

  • 嗯,我在进行类型转换时遇到了同样的访问冲突错误。我不确定为什么会发生这种情况
  • 访问冲突可能是一个无论如何都会发生的错误。我在您发布的代码中没有看到任何可疑之处。可能是CopyHeadReadData 或其他方法中的一种。
猜你喜欢
  • 2016-02-20
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
相关资源
最近更新 更多