Estou com dificuldade para entender se realmente há diferença entre as duas afirmações:
Image->Picture->Bitmap = bitmap; // bitmap is a TBitmap object
Image->Picture->Assign(bitmap);
A ajuda do VCL diz claramente sobre a tarefa via =
:
Observação: Ao atribuir a propriedade Bitmap, TPicture atribui as propriedades de outro objeto TBitmap. Ele não assume a propriedade do valor especificado.
Isso significa que a primeira instrução NÃO copia o bitmap, masImage->Picture->Bitmap
apenas o endereço do bitmap
é assumido por Image->Picture->Bitmap
.
Image->Picture->Bitmap
Por que a imagem na tela está sendo exibida corretamente mesmo depois de eu ter excluído o objeto bitmap ?
As duas declarações são funcionalmente equivalentes.
Nesta declaração:
O que a documentação não diz, mas o que realmente acontece, é que o
TPicture::Bitmap
setter de propriedades chamaAssign()
oTBitmap
retornado peloTPicture::Bitmap
getter de propriedades. Ou seja, é idêntico a chamar isto:Onde
TPersistent::Assign()
copia dados de um objeto para outro objeto compatível. Neste caso,TBitmap
substituiAssign()
para copiar os dados de pixel de outro objetoTBitmap
.O
TPicture::Bitmap
getter de propriedade garante que oTPicture
mantenha seu próprioTBitmap
, criando um novo se ainda não tiver um e liberando qualquer gráfico anterior que não seja bitmap .Isso é aproximadamente equivalente a fazer isto:
Nesta declaração:
TPicture
substitui oAssign()
método para criar um novoTBitmap
que seja uma cópia do passadobitmap
e então assume a propriedade dele, liberando qualquer gráfico anterior.Isso é aproximadamente equivalente a fazer isto:
Então, em ambos os casos, o que copiou os dados do passado
TPicture
acaba se mantendo .TBitmap
bitmap
Isso não está correto e é contrário à documentação que você citou. Tomar apenas o endereço seria assumir a propriedade, e é exatamente isso que a documentação diz explicitamente que não acontece.
Porque o
TPicture
fez sua própria cópia dos dados de pixel. O que você fizer com o originalbitmap
depois não o afetaTPicture
em nada.