«Постоянные поля», созданные во время выполнения, не имеют смысла. Создание постоянных полей в IDE позволяет записывать их в .dfm для формы / модуля данных, а затем автоматически создавать, когда этот .dfm загружается из исполняемого файла, и к нему можно обращаться по имени в коде, который использует этот модуль данных.
Если вы хотите не использовать FieldByName
во время выполнения, вы можете просто сделать что-то вроде этого:
TMyDataModule=class(TDataModule)
// Usual IDE created stuff, etc.
public
NameFld: TStringField;
LimitFld: TFloatField;
end;
procedure TMyDataModule.DataModuleCreate(Sender: TObject);
begin
NameFld := MyDataSet.FieldByName('CompanyName') as TStringField;
NameFld.Required := True;
LimitFld := MyDataSet.FieldByName('CreditLimit') as TFloatField;
LimitFld.Currency := True;
// Set other properties as needed.
end;
Теперь у вас есть эквивалент постоянных полей во время выполнения. Доступ к ним, как обычно, возможен из другого кода, который использует ваш модуль данных.
procedure TMyDataModule.DoSomethingWithData(CompanyName: string; CreditLimit: Currency);
begin
MyDataSet.Edit;
NameFld.AsString := CompanyName;
LimitFld.AsCurrency := CreditLimit;
MyDataSet.Post;
end;
РЕДАКТИРОВАТЬ: Просто подумал о двух исключениях из моего утверждения "не имеет смысла" - это будут вычисляемые поля или поля поиска. Для полей поиска проще всего добавить их в SQL через JOIN
и позволить серверу сделать это; для вычисляемых полей вы можете использовать DataSet.FieldDefs.Add
и установить соответствующие свойства для именования поля, установить FieldType
для вновь созданного поля на ftCalculated
и назначить обработчик события OnCalcFields
для обработки вычисления.