Delphi.cz

Český portál Delphi

Chyba dne

Při jedné konzultaci jsem našel zajímavou chybu v jedné části zákazníkova programu. Myslím, že je to pěkný příklad.

//LEAK !
var
  ads: TADOQuery;
begin
  ads := TADOQuery.Create(nil);
  ads.Connection := ADOConnection1;
  with ads, SQL do
  begin
    try
      Text := 'SELECT * FROM tCRM_Currency';
      Open;
      try
        while not Eof do
        begin
          //………..
          Next;
        end;
      finally
        Close;
      end;
    finally
      Free;
    end;
  end;
end;

Zkuste ji první najít samostatně.

Myslím si, že použití with je pěšina do pekla. Vícenásobné with (nebo vnořené) je pak už dálnicí.

Pokud to není jasné, tak Free je voláno nad SQL, což je TStringList. Mimochodem chyba mohla vzniknout i např. při migraci z jiných komponent, které nemají SQL jako třídu a autor si chtěl ušetřit práci, tj. nemusela to být přímo chyba při originálním vývoji.

Každopádně každé použití with dobře zvažte, nikdy nevíte kdy se něco přidá do with-nuté části a Váš kód bude dělat něco jiného. Lokální proměnná je dost dobré řešení a lepší se s ní pak i pracuje při ladění (dá se např. zobrazit v debuggeru).

Datum: 2016-08-26 23:23:00 Tagy: Object Pascal

Praxe