Delphi: TImage.Create provoca violação de acesso
-
10-07-2019 - |
Pergunta
Peço desculpas antecipadamente por uma questão novato, mas por que eu recebo erro "Acesso violação" com o código abaixo (em "Criar (SelectorForm);" line)? Eu tentei usar a principal forma como o proprietário, mas não faz qualquer diferença.
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;
Solução
O problema é que você está efetivamente fazendo isso:
var
imageVariable: TImage;
begin
imageVariable.Create (ParentForm);
end;
O que é errado, porque "Criar" método está sendo chamado na variável que não tenha sido atribuído ainda.
Você deve fazer isso:
var
imageVariable: TImage;
begin
imageVariable := TImage.Create (ParentForm);
try
//use the object
finally
FreeAndNil (imageVariable);
end;
end;
Ou mais especificamente em seu código:
for Loop := 1 to 10 do
begin
ArrayOfImages[Loop] := TImage.Create (Self);
end;
Não se esqueça de liberar os objetos
EDIT: Aceitar @ de andiw comentário e tomar de volta a ponta de libertar objetos. EDIT2:. Aceitando @ comentário de Gerry e usando Eu como proprietário
Outras dicas
Há uma série de problemas com o código acima. (Não use o "With" como que para um começo, não use um Byte para o seu circuito var)
A minha suposição é que você quer finalmente uma matriz de instâncias de TImage do criado com um formulário como o pai.
assim com base no que assumtion ... você quer algo como (não testado)
var
ArrayOfImages: Array [0..9] of TImage;
i : integer;
begin
for i := 0 to 9 do
begin
ArrayOfImages[i] := TImage.Create(theForm);
end;
end;
Agora nota, você será responsável pela limpeza da matriz quando terminar de usá-lo, você vai precisar ligar para livre em cada uma das instâncias de imagem.