![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамическое создание Fields... [D7, XP]
Alex_C © (2011-12-16 16:10:00)Что за ерунда: хочу динамически создать Field для ADODataSet. Делаю как в хелпе:
procedure CreateFields(CreateDataSet: TADODataSet);
var
i: integer;
function CreateNewField: TField;
begin
Result := nil;
case FieldTagArray[i].DataType of
ftSmallint:
Result := TSmallintField.Create(CreateDataSet);
ftInteger:
Result := TIntegerField.Create(CreateDataSet);
ftDate,ftTime,ftDateTime:
Result := TDateTimeField.Create(CreateDataSet);
ftFloat:
Result := TFloatField.Create(CreateDataSet);
ftBoolean:
Result := TBooleanField.Create(CreateDataSet);
ftString:
Result := TStringField.Create(CreateDataSet);
end;
with Result do
begin
FieldName := FieldTagArray[i].FieldName;
Name := CreateDataSet.Name + FieldName;
Index := CreateDataSet.FieldCount;
Size := FieldTagArray[i].Size;
Tag := FieldTagArray[i].Tag;
DisplayLabel := FieldName;
DataSet := CreateDataSet;
end;
end;
begin
CreateDataSet.Fields.Clear;
for i:= 0 to Length(FieldTagArray) - 1 do
CreateDataSet.Fields.Add(CreateNewField);
end;
и вместо 10 полей создается в 2 раза больше - 20!!! Если убрать строчку
DataSet := CreateDataSet;
то зоздается правильно - 10, но DBGrid ругается что не назначен DataSet. Что не так?
Alex_C (2011-12-17 00:00:00) [1]
> А в дизайнере почему не создать эти поля?
> Неужели для этого необходимо создавать динамические поля?
> :(
Более правильного выхода я не нашел: у меня несколько разных окон с отображением одного и того же лога , но "под разными углами зрения" . Дабы при смене чего бы то ни было не запутаться - для всех окон поля для их датасет создаю динамически - скажем так - из одного места. ))
Smile (2011-12-16 20:26:00) [2]> Поля мне нужны для "правильного" отображения данных: допустим
> один пользователь хочет, что частота была в Мгц, другой
> в кГц.
Неужели для этого необходимо создавать динамические поля? :(
Inovet (2011-12-16 17:43:00) [3]> [3] Alex_C (16.12.11 16:32)
> Это я так, на скорую руку... Кстати а как правильно называть?
Create - это действие. Я вот, увидев CreateDataSet, подусал, что это функция сохдающая DataSet, стал смотреть выше по тексту, что я там пропустил, оказалось - это параметр. Ну так и называй его существительным - DataSet, то что он для Create ему Fields, понятно из имени функции. Когда непонятно уточняй прилагательными, например - NewDataSet, OldDataSet, или надо тебе из одного в другой скопировать - SrcDataSet, DstDataSet (от source, destination).
А в дизайнере почему не создать эти поля?
Alex_C (2011-12-16 16:56:00) [4]
> Используй запросы
Я это для себя уже ОЧЕНЬ хорошо уяснил - в SQL - основное - запросы!
Поля мне нужны для "правильного" отображения данных: допустим один пользователь хочет, что частота была в Мгц, другой в кГц.
Alex_C (2011-12-16 16:54:00) [5]
> сначала наполнить филдефс, затем пройтись по нему и вызвать
> креатефилд для каждого.
Большое спасибо! Все заработало!
Anatoly Podgoretsky (2011-12-16 16:51:00) [6]> Alex_C (16.12.2011 16:10:00) [0]
Используй запросы, а не нафигационные средства.
Медвежонок Пятачок (2011-12-16 16:34:00) [7]сначала наполнить филдефс, затем пройтись по нему и вызвать креатефилд для каждого.
Alex_C (2011-12-16 16:32:00) [8]
> И вообще, так обзывать переменные - моветон.
Это я так, на скорую руку... Кстати а как правильно называть?
> поля надо создавать опосредованно, в коллекции TFieldDefs.
Т.е. сначала создавать FieldDefs, а уже затем CreateNewField: TField;?
Медвежонок Пятачок (2011-12-16 16:28:00) [9]поля надо создавать опосредованно, в коллекции TFieldDefs.
твое же создание неправославно.
Ega23 (2011-12-16 16:26:00) [10]
CreateDataSet.Fields.Clear;
for i:= 0 to Length(FieldTagArray) - 1 do
CreateDataSet.Fields.Add(CreateNewField);
CreateDataSet.CreateDataSet;
А DataSet := CreateDataSet; убери.
И вообще, так обзывать переменные - моветон.