databaseerror(sinvalidclone);
provider.dataset := tbdeclientdataset(source).provider.dataset;
dbconnection := tbdeclientdataset(source).dbconnection;
commandtext := tbdeclientdataset(source).commandtext;
inherited clonecursor(source, reset, keepsettings);
end;
procedure tbdeclientdataset.notification(acomponent: tcomponent; operation: toperation);
begin
inherited notification(acomponent, operation);
if operation = opremove then
if acomponent = fdatabase then
begin
fdatabase := nil;
setactive(false);
end;
end;
procedure tbdeclientdataset.setlocalparams;
procedure createparamsfrommasterfields(create: boolean);
var
i: integer;
list: tstrings;
begin
list := tstringlist.create;
try
if create then
flocalparams.clear;
fdataset.fkeyfields := masterfields;
list.commatext := masterfields;
for i := 0 to list.count -1 do
begin
if create then
flocalparams.createparam( ftunknown, mastersource.dataset.fieldbyname(list[i]).fieldname,
ptinput);
flocalparams[i].assignfield(mastersource.dataset.fieldbyname(list[i]));
end;
finally
list.free;
end;
end;
begin
if (masterfields <> '') and assigned(mastersource) and assigned(mastersource.dataset) then
begin
createparamsfrommasterfields(true);
fcurrentcommand := addparamsqlfordetail(flocalparams, commandtext, true, getquotechar);
end;
end;
procedure tbdeclientdataset.setdatasource(value: tdatasource);
begin
inherited mastersource := value;
if assigned(value) then
begin
if packetrecords = -1 then packetrecords := 0;
end else
begin
if packetrecords = 0 then packetrecords := -1;
end;
end;
function tbdeclientdataset.getmastersource: tdatasource;
begin
result := inherited mastersource;
end;
procedure tbdeclientdataset.setdetailsactive(value: boolean);
var
detaillist: tlist;
i: integer;
begin
detaillist := tlist.create;
try
getdetaildatasets(detaillist);
for i := 0 to detaillist.count -1 do
if tdataset(detaillist[i]) is tbdeclientdataset then
tbdeclientdataset(tdataset(detaillist[i])).active := value;
finally
detaillist.free;
end;
end;
procedure tbdeclientdataset.setactive(value: boolean);
begin
if value then
begin
if csloading in componentstate then
begin
fstreamedactive := true;
exit;
end;
if masterfields <> '' then
begin
if not (csloading in componentstate) then
checkmastersourceactive(mastersource);
setlocalparams;
setsql(fcurrentcommand);
params := flocalparams;
fetchparams;
end else
begin
setsql(fcommandtext);
if params.count > 0 then
begin
fdataset.params := params;
fetchparams;
end;
end;
end;
if value and (fdataset.objectview <> objectview) then
fdataset.objectview := objectview;
inherited setactive(value);
setdetailsactive(value);
end;
procedure register;
begin
registercomponents('bde', [tbdeclientdataset]);
end;
end.
//以上经dblocalb.pas改装而成,可存为任意文件名,当然扩展名是pas