IBX6.07 (Delphi 6) Problems with decimal(18, 5) fields and SQL dialect 3

I have just updated from ver 6.00 to ver 6.07 of IBX and I am having
all sorts of problems.

Error 1:
========
qryXXX: Type mismatch for field 'Field Name', expecting: Float actual
FMTBcdField

DB uses SQL Dialect 3
Field is decimal(18, 5)

numeric(18, 5) fields do not seem to be giving this problem, but
changing the decimal output parameters in the stored procedures to
numeric fields doesn't solve the problem.

Error 2:
========
I presume error 1 was occurring because the DB's Dialect is now
getting picked up correctly, so IBX now knows that the underlying
field is stored as an int64, and not a double precision. I started
changing all the TFloatFields to TFMTBCDFields (not a small job!)

New problems:
a) DisplayFormat no longer functions as it used to (is not picking up
the negative display format)

eg. #,##0.00;(#,##0.00)

Positive displays OK, eg. 5.00
Negative display incorrectly, eg. -5.000(0000000) instead of (5.00)

b) Getting "list index out of bounds(28)" on some grids.
NB. Is ALWAYS 28.

Should I need to be changing TFloatFields to TFMTBCDFields, or should
they actually be compatable?
(even if it is not neccesarily the most efficient way of doing things
;-)

======================================================================Error
2 a) part-solution

Unit: delphi 6\source\vcl\FMTBcd.pas

The following funtion appears to be the problem.
It is not removing the initial "positive" display format, when Section
= sectionNegative or

sectionZero.

function GetFormat(const Format: string; Section: TFormatSection):
string;
const
Separator: Char = ';';
LiteralMarkers = [#39, '"'];
var
InLiteral: Boolean;
P, PThisSection: PChar;
SectionCount: Integer;
begin
if Pos(Separator,Format) = 0 then
Result := Format
else
begin
PThisSection := PChar(Format);
P := PThisSection;
InLiteral := False;
SectionCount := 0;
while P^ <> #0 do
begin
if P^ in LiteralMarkers then
InLiteral := not InLiteral
else
begin
if (P^ = Separator) and (not InLiteral) then
begin
if Integer(Section) = SectionCount then
break //MM P^ now points to the beginning of the desired section
else
begin
Inc(SectionCount);
end;
end;
end;
Inc(P);
end;
// SetString(Result, PThisSection, P-PThisSection);
SetString(Result, P, ???);
//##still need to remove any remaining ;'s that are not in
literals....
end;
end;

function FormatBcd(const Format: string; Bcd: TBcd): string;
begin
if IsBcdNegative(Bcd) then
Result := FormatOneBcd(GetFormat(Format, sectionNegative), Bcd)
else if IsBcdZero(Bcd) then
Result := FormatOneBcd(GetFormat(Format, sectionZero), Bcd)
else
Result := FormatOneBcd(GetFormat(Format, sectionPositive), Bcd);
end;