Delphi: TImage.Create вызывает нарушение прав доступа - PullRequest
4 голосов
/ 24 июня 2009

Я заранее прошу прощения за вопрос новичка, но почему я получаю ошибку «Нарушение доступа» с кодом ниже (в строке «Создать (SelectorForm);»)? Я пытался использовать основную форму в качестве владельца, но это не имело никакого значения.

var
  SelectorForm: TSelectorForm;
  ArrayOfImages: Array [1..10] of TImage;

implementation

procedure TSelectorForm.FormCreate(Sender: TObject);
var
  Loop: Byte;
begin
  for Loop := 1 to 10 do
  begin
    with ArrayOfImages[Loop] do
    begin
      Create(SelectorForm);
    end;
  end;
end;

Ответы [ 2 ]

17 голосов
/ 24 июня 2009

Проблема в том, что вы эффективно делаете это:

var
  imageVariable: TImage;
begin
  imageVariable.Create (ParentForm);
end;

Что неверно, потому что метод "Create" вызывается для переменной, которая еще не была назначена.

Вы должны сделать это:

var
  imageVariable: TImage;
begin
  imageVariable := TImage.Create (ParentForm);
  try
    //use the object
  finally
    FreeAndNil (imageVariable);
  end;
end;

Или, точнее, в вашем коде:

for Loop := 1 to 10 do
begin
  ArrayOfImages[Loop] := TImage.Create (Self);
end;

Не забудьте освободить объекты

РЕДАКТИРОВАТЬ: Принятие комментария @ andiw и возврат наконечника освобождения объектов. РЕДАКТИРОВАТЬ 2: Принятие комментария @ Джерри и использование Self в качестве владельца.

0 голосов
/ 24 июня 2009

Существует много проблем с приведенным выше кодом. (не используйте для этого «С», не используйте байт для цикла var)

Я предполагаю, что в конечном итоге вы хотите, чтобы массив экземпляров TImage создавался с формой в качестве родителя.

так что исходя из этого предположения ... вы хотите что-то вроде (не проверено)

var
  ArrayOfImages: Array [0..9] of TImage;  
  i : integer;
begin
  for i := 0 to 9 do
  begin
    ArrayOfImages[i] := TImage.Create(theForm);
  end;

end;

Теперь обратите внимание, что вы будете нести ответственность за очистку массива по окончании его использования, вам нужно будет бесплатно вызывать каждый из экземпляров Image.

...