![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как создать вычисляемое поле в run-time? [D7]
DmitryNekl © (2005-02-07 09:51:00)Здравствуйте, мастера! Надеюсь на Вашу помощь.
Код создания формы:
var phones: TClientDataSet;
procedure TForm1.FormCreate(Sender: TObject);
function CreateCalcField(const AFieldName: string; AFieldClass: TFieldClass; ASize: Word): TField;
begin
Result := phones.FindField(AFieldName);
with Result do
begin
FieldName := AFieldName;
if (Result is TStringField) or (Result is TBCDField) or
(Result is TBlobField) or (Result is TBytesField) or
(Result is TVarBytesField) then
begin
Size := ASize;
end;
Calculated := True;
//DataSet := phones; //пробовал расскомментировать
//Name := phones.Name + AFieldName; // тоже пробовал
end;
end;
begin
...
phones.OnCalcFields:=CalcFieldCalc;
if not FileExists(phones.FileName) then
begin
phones.FieldDefs.Clear;
phones.FieldDefs.Add('id', ftInteger);
phones.FieldDefs.Add('vid', ftInteger);
phones.FieldDefs.Add('number', ftString, 20);
phones.FieldDefs.Add('Calcul', ftString, 20);
phones.CreateDataSet;
end;
CreateCalcField('Calcul', TStringField, 20);
phones.Open;
phones.SaveToFile();
Вот в таком виде вываливается на третьей с конца строчке вываливается по Access Violation. Если третью с конца строчку перенести в конец, то вываливается с сообщением "Не могу выполнить операцию на открытом датасете".
Подскажите, пожалуйста, в чем ошибка? И как создать-таки вычисяемое поле в моем случае?
DmitryNekl (2005-02-07 11:01:00) [1]Спасибо огромное, все заработало! :)
Johnmen (2005-02-07 10:09:00) [2]Сначала создаётся поле, потом добавляется в коллекцию.
with TStringField.Create(phones) do begin
FieldName := 'YourField';
FieldKind:= fkCalculated;
DataSet := phones;
Name := Dataset.Name + FieldName;
.......
phones.FieldDefs.Add(Name, ftString, 20, false);
end;