Доступ к значениям из проблемы с указателем - PullRequest
1 голос
/ 18 мая 2011

У меня есть класс типа TObject с именем CModelItem

Я хочу иметь список этих объектов и иметь возможность изменять значения каждого из них

Итак, я создал класс

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 Ответ

3 голосов
/ 18 мая 2011

Компилятор жалуется, потому что 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;

Как вы уже видели, работает локальная переменная;хотя нарушение доступа является ошибкой, вероятно, где-то еще в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...