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

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

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);


Наверх

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