DELPHI重大BUG(200分)

  • 主题发起人 主题发起人 shijunwu
  • 开始时间 开始时间
S

shijunwu

Unregistered / Unconfirmed
GUEST, unregistred user!
当采用TIBclientDataset使用QREPORT时进行打印,然后退出打印FORM,对该打印FORM进行
Free时,Delphi在quickrep1.free;这一句上进入死循环,无法在释放控件。采用其它数据
库元件如Tibtable,Tibquery则不会出现上述问题。
请高手指教。
 
你在打印Form那里的东东都进行了释放了吗?而且将TIBclientDataset关闭了吗?你再试试看。
 
全都试过了,程序死在CLass模块的destructor TComponent.Destroy上
begin
Destroying;
if FFreeNotifies <> nil then
begin
while Assigned(FFreeNotifies) and (FFreeNotifies.Count > 0) do
TComponent(FFreeNotifies[FFreeNotifies.Count - 1]).Notification(Self, opRemove);
FreeAndNil(FFreeNotifies);
end;
DestroyComponents;
if FOwner <> nil then FOwner.RemoveComponent(Self);
inherited Destroy;
end;
一直在WHILE中循环
 
你再试试看。
 
这是哪个版本的DELPHI啊。。。。。
 
DELPHI6
因为FORM.Free时候会自动释放所有的子控件。
 
已找到问题所在,在VCl/source/DBlocall.pas中存在错误:
修正如下:
procedure TIBClientDataSet.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation)
//add by sjw添加该行
if Operation = opRemove then
if AComponent = FDataset.Database then
begin
FDataSet.DataBase := nil;
SetActive(False);
end
else
if AComponent = FDataSet.Transaction then
begin
FDataSet.Transaction := nil;
SetActive(False);
end;
end;
 
这个问题很多书上提到过是报表控件的bug只要记得用过后释放就行了
问题结束
 
又发现一个BUG,IB的数据控件竞然不能进行多字段关联,如表1和表2的RRMID及COLLADDR
两个相同字段进行Relation的话,打开表1时报RRMID;COLLADDR字段没找到的错误,
最终发现其在VCl/source/DBlocall.pas中还存在错误(注:已经升级Delphi6的升级包):
procedure TIBClientDataSet.SetLocalParams;

procedure CreateParamsFromMasterFields(Create: Boolean);
var
I: Integer;
List: TStrings;
ss:string
//新增加
Len:Integer;//新增加
begin
List := TStringList.Create;
try
if Create then
FLocalParams.Clear;
FDataSet.FKeyFields := MasterFields;
// List.CommaText := MasterFields;原来的程序行 ,这一行在Delphi6中失效了,不知delphi5下会不会?
// 替换的程序段
ss:=MasterFields;
repeat
len:=pos(';',ss);
if len=0 then
len:=length(ss)+1;
list.add(copy(ss,1,len-1));
ss:=copy(ss,len+1,length(ss)-len);
until ss='';
// 增加和程序结束
for I := 0 to List.Count -1 do
begin
if Create then
FLocalParams.CreateParam( ftUnknown, MasterSource.DataSet.FieldByName(List).FieldName,
ptInput);
FLocalParams.AssignField(MasterSource.DataSet.FieldByName(List));
end;
finally
List.Free;
end;
end;
 
多人接受答案了。
 
后退
顶部