![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Access Violation при работе с динамически созданными полями
Itonix © (2007-05-04 10:37:00)работаю с 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-07 02:37:00) [1]> 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;
Itonix (2007-05-04 13:55:00) [2]что-то я совсем ничего не понимаю. пробовал смотреть сколько поелй было до создания это и сколько стало после создания. после стало на 1 больше. но пишет что созданное поле не найденно
Itonix (2007-05-04 13:24:00) [3]//что-то я совсем запутался :(
// хочу сказать что по ходу работы проги еще несколько полей создаються , ///но их нету в дизайн-тайме
если оставить только
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' (которое мы раньше создали) дублируеться
Правильный Вася (2007-05-04 13:15:00) [4]> ibPrice.FieldDefs.Add('COUNT1', ftFloat);
> fFieldDef :=ibPrice.FieldDefs.Find('COUNT1');
> ibPriceCOUNT1 := TFloatField(fFieldDef.CreateField(ibPrice));
Чем кричать, думай хоть иногда.
Зачем ты дважды создаешь одно поле разными способами?
Itonix (2007-05-04 13:07:00) [5]народ помогите. срочно надо
Itonix (2007-05-04 12:59:00) [6]никто не знает? :(((((
Itonix (2007-05-04 11:40:00) [7]создаю его вот так, и все равно АВ
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
ЮЮ (2007-05-04 11:29:00) [8]если ругается на несоответствие типов TFloatField и TField, то сделать приведение типов:
ibQueryCOUNT1 := TFloatField(fFieldDef.CreateField(ibQuery));
или какой там тип у ibQueryCOUNT1 стоит.
Itonix (2007-05-04 11:15:00) [9]1)про интеджер это я ошибся. там Флоат. так как правильно записать?
2) если использовать ibQuery.filedbyname, то расчет будет идти дольше, так как сам по себе медленный. //вот из-за этого все и началось. надо убрать из всего ОнКалькФилдс filedbyname (там на самом деле большой расчет и много таких полей. а для примера я одно поле взял)
ЮЮ (2007-05-04 11:04:00) [10]1) ibQueryCOUNT1 не может быть Интеджер, если ты его локально не объявил ещё раз, ибо ibQueryCOUNT1.asFloat у тебя работает.
2) всё-таки лучше выбрать первый вариант и удалить все поля в редакторе полей, коль в runtime ты все равно их не используешь
Itonix (2007-05-04 10:52:00) [11]ibQueryCOUNT1 := fFieldDef.CreateField(ibQuery); ругаеться. говорит что не совпадение типов Интеджер и ТФиелд
ЮЮ (2007-05-04 10:45:00) [12]> в процессе работы программы все поля которые находять с
> ibQuery очищяються с помощью
> ibQuery.Fields.Clear;ibQuery.FieldDefs.Clear;
Так очисти их в дизайне и не будет соблазна использовать ibQueryCOUNT1 - поля класса формы созданные IDE и проинициализированные при создании формы. Однако объекты, куда они указывали, ты убил и создал новые.
Или делай ссылки валидными:
ibQueryCOUNT1 := fFieldDef.CreateField(ibQuery);