Delphi: TImage.Create вызывает нарушение прав доступа
Я заранее прошу прощения за вопрос новичка, но почему я получаю сообщение об ошибке "Access access" с кодом ниже (в строке "Create(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 ответа
Проблема в том, что вы эффективно делаете это:
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 в качестве владельца.
Существует много проблем с приведенным выше кодом. (не используйте "С" для начала, не используйте байт для цикла 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.