Поскольку CommandTimeout введен в классе TCustomADODataset, вы можете выполнить итерацию для каждого модуля / модуля данных, найти TCustomADODataset и его потомков (ADODataset, ADOTable, ADOQuery), а затем установить свойство.
procedure SetADOCommandTimeOut(aTimeOut: integer);
var
i, j: integer;
begin
for i:= 0 to Screen.FormCount-1 do
begin
for j:= 0 to Forms[i].ComponentCount-1 do
if Forms[i].Components[j] is TCustomADODataset then
TCustomADODataset1(Forms[i].Components[j]).CommandTimeOut:= aTimeOut;
end;
for i:= 0 to Screen.DataModuleCount-1 do
begin
for j:= 0 to Datamodules[i].ComponentCount-1 do
if Datamodules[i].Components[j] is TCustomADODataset then
TCustomADODataset1(Datamodules[i].Components[j]).CommandTimeOut:= aTimeOut;
end;
end;
Примечание. TCustomADODataset1 - это точно TCustomADODataset, только у него есть опубликованное свойство CommandTimeOut:
TCustomADODataset1 = class(TCustomADODataset)
published
property CommandTimeOut;
end;
Но это применимо только к формам / модулям данных, которые уже созданы. Если вы создаете свои формы / модули данных динамически, то вы должны применять их всякий раз, когда создается новый модуль / модуль данных.
Один из способов сделать это - переопределить Уведомление в вашей главной форме, проверить наличие нового создания формы / модуля данных, но это немного сложно, так как на момент создания все компоненты еще не созданы. Вы обманываете это, откладывая на некоторое время, используя таймер (я не знаю более элегантного способа - просто чтобы показать идею)
Procedure TMainForm.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited;
if (Operation = opInsert) and (
((AComponent is TForm) and not (aComponent is TMainForm)) // exclude MainForm
or (AComponent is TDataModule)
) then
begin
Timer1.Interval:= 2000; // 2 seconds ?
Timer1.Enabled:= True;
end;
end;
Procedure TMainForm.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:= False;
SetADOCommandTimeOut(MyTimeOut);
end;