Форум: "Начинающим";
Текущий архив: 2007.05.27;
Скачать: [xml.tar.bz2];
ВнизAccess Violation при работе с динамически созданными полями Найти похожие ветки
← →
Itonix © (2007-05-04 10:37) [0]работаю с Interbase.
//не спрашивайте пчему все именно так :) уже как есть :)
есть компонент ibQuery. в режиме дизайна создано вручную поле, например, COUNT1 типа флоат.
в он OnCalcFields этого компонента стоит , напрмер,
...
ibQueryCOUNT1.asFloat:=a+b+c//например;
,,,
в процессе работы программы все поля которые находять с ibQuery очищяються с помощью
ibQuery.Fields.Clear;ibQuery.FieldDefs.Clear;
потом это же поле (Count1) создаеться заново в програме таким способом
ibQuery.FieldDefs.Add("COUNT1", ftFloat);
fFieldDef :=ibQuery.FieldDefs.Find("COUNT1");
fField := fFieldDef.CreateField(ibQuery);
fField.FieldName :="COUNT1";
fField.FieldKind:= fkCakcukated;
fField.Name :="COUNT1";
...
после этого когжа запустиьт запрос и Квери, то выпадает АВ. но еслив ОнКалькФилдс писать
не
ibQueryCOUNT1.asFloat:=a+b+c ,а
ibQuery.filedbyname("OUNT1").asFloat:=a+b+c;
то АВ не вылазит
где я что-то не то делаю? целый день вчера мучался,а понять не могу.
← →
ЮЮ © (2007-05-04 10:45) [1]> в процессе работы программы все поля которые находять с
> ibQuery очищяються с помощью
> ibQuery.Fields.Clear;ibQuery.FieldDefs.Clear;
Так очисти их в дизайне и не будет соблазна использовать ibQueryCOUNT1 - поля класса формы созданные IDE и проинициализированные при создании формы. Однако объекты, куда они указывали, ты убил и создал новые.
Или делай ссылки валидными:
ibQueryCOUNT1 := fFieldDef.CreateField(ibQuery);
← →
Itonix © (2007-05-04 10:52) [2]ibQueryCOUNT1 := fFieldDef.CreateField(ibQuery); ругаеться. говорит что не совпадение типов Интеджер и ТФиелд
← →
ЮЮ © (2007-05-04 11:04) [3]1) ibQueryCOUNT1 не может быть Интеджер, если ты его локально не объявил ещё раз, ибо ibQueryCOUNT1.asFloat у тебя работает.
2) всё-таки лучше выбрать первый вариант и удалить все поля в редакторе полей, коль в runtime ты все равно их не используешь
← →
Itonix © (2007-05-04 11:15) [4]1)про интеджер это я ошибся. там Флоат. так как правильно записать?
2) если использовать ibQuery.filedbyname, то расчет будет идти дольше, так как сам по себе медленный. //вот из-за этого все и началось. надо убрать из всего ОнКалькФилдс filedbyname (там на самом деле большой расчет и много таких полей. а для примера я одно поле взял)
← →
ЮЮ © (2007-05-04 11:29) [5]если ругается на несоответствие типов TFloatField и TField, то сделать приведение типов:
ibQueryCOUNT1 := TFloatField(fFieldDef.CreateField(ibQuery));
или какой там тип у ibQueryCOUNT1 стоит.
← →
Itonix © (2007-05-04 11:40) [6]создаю его вот так, и все равно АВ
ibPrice.FieldDefs.Add("COUNT1", ftFloat);
fFieldDef :=ibPrice.FieldDefs.Find("COUNT1");
ibPriceCOUNT1 := TFloatField(fFieldDef.CreateField(ibPrice));
fField.FieldName :="COUNT1";
fField.FieldKind:= fkCalculated;
fField.Name :="COUNT1";
////
ibPrice - ibQuery
← →
Itonix © (2007-05-04 12:59) [7]никто не знает? :(((((
← →
Itonix © (2007-05-04 13:07) [8]народ помогите. срочно надо
← →
Правильный Вася (2007-05-04 13:15) [9]> ibPrice.FieldDefs.Add("COUNT1", ftFloat);
> fFieldDef :=ibPrice.FieldDefs.Find("COUNT1");
> ibPriceCOUNT1 := TFloatField(fFieldDef.CreateField(ibPrice));
Чем кричать, думай хоть иногда.
Зачем ты дважды создаешь одно поле разными способами?
← →
Itonix © (2007-05-04 13:24) [10]//что-то я совсем запутался :(
// хочу сказать что по ходу работы проги еще несколько полей создаються , ///но их нету в дизайн-тайме
если оставить только
ibPriceCOUNT1 := TFloatField(fFieldDef.CreateField(ibPrice));
то вылазит ошибка что поле которое я создал предыдущим повторяеться.
объясню. я создаю поле одно поле (которого нету в ДТ)
ibQuery.FieldDefs.Add("pole1", ftFloat);
fFieldDef :=ibQuery.FieldDefs.Find("pole1");
fField := fFieldDef.CreateField(ibQuery);
fField.FieldName :="pole1";
fField.FieldKind:= fkData;
fField.Name :="ole1";
...и так еще несколько полей.
потом пишу
ibPriceCOUNT1 := TFloatField(fFieldDef.CreateField(ibPrice));
и вылазит ошибка что "pole1" (которое мы раньше создали) дублируеться
← →
Itonix © (2007-05-04 13:55) [11]что-то я совсем ничего не понимаю. пробовал смотреть сколько поелй было до создания это и сколько стало после создания. после стало на 1 больше. но пишет что созданное поле не найденно
← →
ЮЮ © (2007-05-07 02:37) [12]> ibPriceCOUNT1 := TFloatField(fFieldDef.CreateField(ibPrice)
> );
>
> fField.FieldName :="COUNT1";
> fField.FieldKind:= fkCalculated;
> fField.Name :="COUNT1";
Издеваешься?
fField везде следует заменить на ibPriceCOUNT1.
Или везде оставить как было fField, добавив после создания поля обновление ссылки: ibPriceCOUNT1 := TFloatField(fField);
> создаю его вот так, и все равно АВ
Если не возникнет здесь ibPriceCOUNT1.FieldName :="COUNT1", то почему долдно возникнуть в OnCalculate? Только если обработчик вызвался между моментами, когда старый объект уже убит, а новый не создан. В этом случае следует писать более безопасный код:ibQuery.OnCalcFields := nil;
try
ibQuery.Fields.Clear;ibQuery.FieldDefs.Clear;
...
finally
ibQuery.OnCalcFields := ibQueryCalcFields;
end;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.05.27;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.042 c