Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TTable в Run-Time [D6, dBase, FoxPro, Paradox]


Lord Vader ©   (2002-03-23 04:59:00) 

Подскажите как в Run-Time менять такие свойства у TTable как FieldKind, и прочие... А также, какое существует свойство чтобы TStrings присвоить значиние всех строк столбца таблицы.
Заранее благодарен!!!


Lusha   (2002-03-26 10:39:00) [1]

Извините за задержку с ответом. Отдыхал знаете ли... :)

Описанное Вами сообщение возникает по причине отсутствия предопределенного перечня полей. В виду его отсутствия он определяется автоматически исходя из структуры таблицы при открытии набора данных, но также автоматически и очищается при закрытии оного. Поэтому обращение вида "AnyDataSet.FieldByName("AnyField")" при закрытом наборе данных приводит к сообщению "Field AnyField not found." (я же предупреждал "о подводных камнях")

Лечится это явным определением перечня полей в Run-Time. Только и всего... :)

Делается это приблизительно так...

AnyDataSet.Close;

// Вот так определяется перечень действительных полей

for I := 0 to AnyDataSet.FieldDefs.Count - 1 do
with AnyDataSet, FieldDefs[I] do
begin
case DataType of
ftString :
begin
Field := TStringField.Create(Self);
Field.Size := Size;
end;
ftInteger: Field := TIntegerField.Create(Self);
ftFloat : Field := TFloatField.Create(Self);
ftDateTime : Field := TDateTimeField.Create(Self);
end;
Field.Name := AnyDataSet.Name + Name;
Field.FieldName := Name;
Field.FieldKind := fkData;
Field.DataSet := AnyDataSet;
end;

// А вот так добавляется определение вычисляемого поля

Field := TIntegerField.Create(Self);
with Field do
begin
FieldName := "F1";
Name := AnyDataSet.Name + FieldName;
FieldKind := fkCalculated;
DataSet := AnyDataSet;
end;

AnyDataSet.Open;

где Field : TField;


За сим, с уважением...


Lord Vader   (2002-03-25 22:30:00) [2]

Ну так всё ж как быть то? Как код такой замутить и чтоб не выскакивала табличка с ненайденным(несуществующем) полем?


Anatoly Podgoretsky   (2002-03-24 11:07:00) [3]

сли структура динамическая, то какая проблема, данное поле является частью этой структуры, динамически.
Закрытый набор - этонабор который не открыт.


Lord Vader   (2002-03-24 10:37:00) [4]

Дело в том, что я имею дело с таблицей в которой заранее не известно сколько будет столбцов в таблице, т.е. таблица с динамической структурой. А мне нужно выполнять для одного из столбцов этой таблицы метод OnCalc...

Так как быть? И то вы подразумеваете, под "закрытым набором данных"? Метод OnClose что ли?


Lusha   (2002-03-23 11:07:00) [5]

1. FieldKind является свойством TField, а не TTable
2. Изменить значение этого свойства можно при закрытом наборе данных банальным присваиванием, например:
Table1.FieldByName("AnyField").FieldKind := fkCalculated;
Правда при этом существует масса "подводных камней". И поскольку я считаю, что Вы "плывете" в неправильном направлении, у меня к Вам один вопросик, ответ на который мне бы хотелось услышать прежде чем мы продолжим беседу на эту тему. Итак:

Зачем Вам нужно менять свойство FieldKind в Run-Time?



Наверх

Титульная страница Поиск, карта сайта Написать письмо