Форум: "Начинающим";
Текущий архив: 2012.04.08;
Скачать: [xml.tar.bz2];
ВнизДинамическое создание Fields... Найти похожие ветки
← →
Alex_C (2011-12-16 16:10) [0]Что за ерунда: хочу динамически создать 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. Что не так?
← →
Ega23 © (2011-12-16 16:26) [1]
CreateDataSet.Fields.Clear;
for i:= 0 to Length(FieldTagArray) - 1 do
CreateDataSet.Fields.Add(CreateNewField);
CreateDataSet.CreateDataSet;
А DataSet := CreateDataSet; убери.
И вообще, так обзывать переменные - моветон.
← →
Медвежонок Пятачок © (2011-12-16 16:28) [2]поля надо создавать опосредованно, в коллекции TFieldDefs.
твое же создание неправославно.
← →
Alex_C (2011-12-16 16:32) [3]
> И вообще, так обзывать переменные - моветон.
Это я так, на скорую руку... Кстати а как правильно называть?
> поля надо создавать опосредованно, в коллекции TFieldDefs.
Т.е. сначала создавать FieldDefs, а уже затем CreateNewField: TField;?
← →
Медвежонок Пятачок © (2011-12-16 16:34) [4]сначала наполнить филдефс, затем пройтись по нему и вызвать креатефилд для каждого.
← →
Anatoly Podgoretsky © (2011-12-16 16:51) [5]> Alex_C (16.12.2011 16:10:00) [0]
Используй запросы, а не нафигационные средства.
← →
Alex_C (2011-12-16 16:54) [6]
> сначала наполнить филдефс, затем пройтись по нему и вызвать
> креатефилд для каждого.
Большое спасибо! Все заработало!
← →
Alex_C (2011-12-16 16:56) [7]
> Используй запросы
Я это для себя уже ОЧЕНЬ хорошо уяснил - в SQL - основное - запросы!
Поля мне нужны для "правильного" отображения данных: допустим один пользователь хочет, что частота была в Мгц, другой в кГц.
← →
Inovet © (2011-12-16 17:43) [8]> [3] Alex_C (16.12.11 16:32)
> Это я так, на скорую руку... Кстати а как правильно называть?
Create - это действие. Я вот, увидев CreateDataSet, подусал, что это функция сохдающая DataSet, стал смотреть выше по тексту, что я там пропустил, оказалось - это параметр. Ну так и называй его существительным - DataSet, то что он для Create ему Fields, понятно из имени функции. Когда непонятно уточняй прилагательными, например - NewDataSet, OldDataSet, или надо тебе из одного в другой скопировать - SrcDataSet, DstDataSet (от source, destination).
А в дизайнере почему не создать эти поля?
← →
Smile (2011-12-16 20:26) [9]> Поля мне нужны для "правильного" отображения данных: допустим
> один пользователь хочет, что частота была в Мгц, другой
> в кГц.
Неужели для этого необходимо создавать динамические поля? :(
← →
Alex_C (2011-12-17 00:00) [10]
> А в дизайнере почему не создать эти поля?
> Неужели для этого необходимо создавать динамические поля?
> :(
Более правильного выхода я не нашел: у меня несколько разных окон с отображением одного и того же лога , но "под разными углами зрения" . Дабы при смене чего бы то ни было не запутаться - для всех окон поля для их датасет создаю динамически - скажем так - из одного места. ))
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.04.08;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c