Код для создания компонентов постоянного поля, связанных с TDataSet - PullRequest
2 голосов
/ 30 июня 2011

Ищите пример кода, иллюстрирующего, как создать во время выполнения TField Компоненты, связанные с набором данных.

В IDE, если вы щелкнете вниз по компоненту набора данных, щелчок правой кнопкой мыши вызовет редактор полей, который предоставляет эту функциональность во время разработки.Не удалось найти код, показывающий, как это сделать во время выполнения.

TIA

Ответы [ 2 ]

1 голос
/ 30 июня 2011

«Постоянные поля», созданные во время выполнения, не имеют смысла. Создание постоянных полей в 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 для обработки вычисления.

1 голос
/ 30 июня 2011

Каждый тип поля имеет функцию Create, в которую вы передаете DataSet, которая создает поле этого типа и добавляет его в поля.Из справки для DB.TStringField.Create.

var
  T: TStringField;
begin
  SQLDataSet1.Close;
  T := TStringField.Create(SQLDataSet1);
  T.FieldName := 'LastName';
  T.Name := SQLDataSet1.Name + T.FieldName;
  T.Index := SQLDataSet1.FieldCount;
  T.DataSet := SQLDataSet1;
  SQLDataSet1.FieldDefs.UpDate;
  SQLDataSet1.Open;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...