Pergunta

Alguém sabe o que há de diferente no manuseio de "com" de Delphi 2009?

Corrigi um problema ontem apenas desconstruindo "com" em referências completas, como em "com datamodule, conjunto de dados, mainform". Delphi 2006 e aplicou anteriormente "Fechar" ao conjunto de dados. Delphi 2009 aplicou "fechar" à forma principal e saiu do aplicativo!

Foi útil?

Solução

Nada mudou. Sua observação anterior estava errada. Os objetos mencionados em um with a declaração é considerada "direita para a esquerda", então no seu exemplo, MainForm seria pesquisado primeiro, então Dataset, e depois Datamodule. É assim que sempre foi. É o mesmo que se você tivesse escrito isso:

with Datamodule do
  with Dataset do
    with MainForm do begin
      Close;
    end;

Vá em frente e verifique a documentação Delphi 2006; Deve haver uma seção chamada Declarações e declarações, sob o qual você encontrará Declarações estruturadas, incluindo a seção em Com declarações.

Faça um favor a si mesmo e não use with. Não causa problemas durante a depuração e durante a manutenção, onde a manutenção pode ser realizada pela pessoa que escreveu o código exatamente no dia anterior.

Outras dicas

With é mau. Não sei quantas vezes preciso dizer isso, mas aparentemente ainda não estamos lá.

Com pode apenas "com segurança" ser usado com objetos que nunca vão mudar. Se você aplicá -lo aos objetos que você definir em seu próprio projeto, todas as apostas estão desligadas e eu ouso dizer que você preferiria usar "se aleatório (50) <25" peças para executar seu código, ele será pelo menos documentado para executado de maneira estranha.

O problema é que, depois de começar a mexer com um objeto, introduzir novos métodos ou propriedades ou renomear os antigos, todos existentes with-Stações que usam esses métodos têm o potencial de mudar o significado. E também não no "Aviso: Chamada para Método Ambíguo". O código fará algo diferente de antes. Sem falar sobre isso.

Por exemplo, vamos supor que você tenha isso:

with connection, file do
begin
    Close;
end;

Então o que você espera que aconteça? Bem, é natural fechar um arquivo, então eu esperaria que o arquivo fosse fechado. Vamos supor ainda que essa variável de arquivo contém um objeto do tipo TomeODDFILE que não define um método próximo, mas um método de fechamento. O acima com a declaração fechará a conexão.

Tudo bem, está documentado, ninguém escreveu esse código pensando que o arquivo seria fechado, afinal, o método é nomeado CloseFile para esse objeto, é apenas minha suposição que está errada e não trabalho no projeto. Ainda.

E então alguém conserta isso, renomeando o CloseFile para fechar. O código acima começará silenciosamente fechando o arquivo em vez da conexão. Sem aviso, sem erro, compila tão bem quanto antes de você alterar o nome do método. Corre tão bem^h^h, não espera, não vai.

Então sim, with irá morder você no a **.

Usando with A,B,C,D é uma prática ruim, pois as mudanças em outras unidades podem repentinamente fazer com que seu código pare de funcionar conforme o esperado. Ver aqui Para mais informações, ou aqui (procurar por "with keyword").

O compilador geralmente é bastante sólido, então eu não assumiria um bug ou mudança antes de você realmente excluir todo o resto. Algumas coisas em que posso pensar rapidamente:

1) Veja se você usa funções ou operadores sobrecarregados. Como a definição de string (e vários outros tipos) mudou, uma variante diferente pode ser escolhida, porque a assinatura muda efetivamente.

2) Também pode ser que algumas unidades incluídas agora definem um identificador que já é usado e tendo precedência sobre a exposta em uma unidade diferente.

Caso contrário, comece a isolar o código em um exemplo mínimo, usando o mínimo de unidades possível. Faça isso passo a passo, já que o truque é o que a última mudança foi quando o comportamento mudou.

Publique isso (ou um URL) aqui, é sempre interessante ver.

Com..do deve ser usado com cuidado. Caso contrário, é uma fonte infinita de dores de cabeça ... Eu concordo com Rob Kennedy e outros.

Como Craig Stuntz (em outro post sobre ...) e LSE V. Karlsen dito acima, com..do pode criar muitas armadilhas.

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