Вот сразу проблемы.
Код:
var
FDQuery : TQuery;
FDataSource : TDataSource;
В этом случае начальное значение будет неопределено, и поэтому IfAssigned может выдать истину, даже если туда ничего не присвоили. Поэтому надо делать начальную инициализацию
Код:
var
FDQuery : TQuery:=nil;
FDataSource : TDataSource=nil;
, или сделать эти переменные приватными полям формы, тогда они будут гарантировано обнулены.
Далее.
Код:
if Assigned(FDQuery) Then FreeAndNil(FDQuery);
if Assigned(FDataSource) Then FreeAndNil(FDataSource);
Внутри FreeAndNil делается проверка переданного параметра на nil, поэтому внешняя проверка не нужна.
Код:
FreeAndNil(FDQuery);
FreeAndNil(FDataSource);
А так же
Жизнь и смерть в режиме run-time