eu tenho servidores desenvolvidos em pascal e nunca tive problema com memoria não liberada.
qdo falei do Owner não disse q ele era “um”, mt menos disse q era “uma” hierarquia. disse q ele pode ser usado qdo conveniente.
dei o exemplo do formCheioDeControles q vc não tem q destruir cada controle. o Form seria o Owner deles, mas não de td o projeto.
do jeito q alguns falam parece impossível desenvolver sem GC. Realmente é impossível desenvolver se vc trabalhar no pascal como se tivesse trabalhando com java.
negocio é a pratica.
vamos pensar uma situação real q se tornaria mt dificil sem o GC.
os Objetos q precisam de outros pra se fazer algo, basta colocar na lista “para serem avisados”.
não herda de TComponent? o q seria? q tal usar uma cópia então? seria custoso?
q tal um q implementa uma especie de Share?
sobre a tal Hierarquia q seria criado pelo Owner, ou eu não entendi ou é isso?
o q um TDataSet tem a ver com TForm? e no entanto ele pode ser apropriado por ele.
vejo sempre alguem dizer: se vc destruir um Datamodule enquanto um form tiver usando ele?
pq vc iria destruir esse maldito? pra criar “quizumba”?
eu destruo DataModules. mas com certeza não vai ter nem um form usando ele.
como eu sei? pq não tem nenhuma variavel global recebendo a instancia dele pra um programador avacalhar a coisa.
OO no pascal funciona bem. se vc começar bem.
duas regras importantes:
Regra nº 1: Retornar uma nova instancia só se for construtor ou o metodo tiver um nome do tipo Criar, Novo, Etc.;
Regra nº 2: não esqueça a regra nº 1;
um exemplo da violação dessas regras: (quem diria, a VCL?)
forms.pas linha 5570;
function TCustomForm.GetFormImage: TBitmap;
..
begin
Result := TBitmap.Create;
...
ai um infeliz acha q ta no java e faz assim:
MeuForm.GetFormImage.SaveToFile(xxxx);
ou
Printer.Canvas.Draw(0, 0, MeuForm.GetFormImage);
a instania retornada por TBitmap.Create; ficou sobrando mais q jiló na janta.
como deveria ser então?
assim:
procedure TCustomForm.GetFormImage(Result : TBitmap);
..
begin
Result.Width := ClientWidth;
Result.Height := ClientHeight;
Result.Canvas.Brush := Brush;
Result.Canvas.FillRect(ClientRect);
Result.Canvas.Lock;
try
if GetWindowLong(Handle, GWL_STYLE) and WS_BORDER <> 0 then
Ofs := -1 // Don't draw form border
else
Ofs := 0; // There is no border
PaintTo(Result.Canvas.Handle, Ofs, Ofs);
finally
Result.Canvas.Unlock;
end;
...
pq ai o cara percebia logo q não tava no eclipse.