Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.27;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.031 c
3-1173596390
Ulugbek
2007-03-11 09:59
2007.05.27
Помогите с задачкой RFT файлом


15-1177595223
SkySpeed
2007-04-26 17:47
2007.05.27
Подскажите как разрешить проблему с публичным IP


1-1175194336
dreamse
2007-03-29 22:52
2007.05.27
Как запустить ярлык созданый с сетевого подключения ?


2-1178715396
Вася
2007-05-09 16:56
2007.05.27
Обмен данными между приложениями.


15-1177681245
Kolan
2007-04-27 17:40
2007.05.27
Unified Process, кто использует?