A inicialização da unidade Delphi nem sempre é chamada
Eu tenho uma unidade dentro de um .bpl e preciso de uma lista de cadeias para uma nova função que escrevi. Desejo que a lista de strings persista por toda a vida útil do aplicativo, para que cada chamada possa se basear no que a chamada anterior encontrou.
Portanto, é declarado globalmente dentro da unidade e eu o inicializo na seção Inicialização, assim:
var
ProductLookup : TStrings;
...
function foo : boolean;
begin
result := (ProductLookup.IndexOfName('bar') >=0); //blow up here. It's nil. Why?
end;
....
initialization
ProductLookup := TStringList.Create; // This should get run, but doesn't.
finalization
FreeAndNil(ProductLookup);
end.
Quando eu testei a unidade, estava tudo bem. Mas quando ele é executado a partir do aplicativo principal, eu estava explodindo com uma violação de acesso porque a lista de strings era nula. Então agora estou recorrendo à verificação de zero na função foo e criando, se necessário. Mas não entendo por que a inicialização não está funcionando para mim. Eu coloquei uma mensagem de depuração ali na Inicialização, e ela não é executada quando isso carrega como um BPL, mas é executada se eu compilar diretamente no meu dUnit exe. Alguma ideia? Delphi2005.