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;
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top