Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.043 c
2-1178759137
Просто_новичок
2007-05-10 05:05
2007.05.27
запись в файл


15-1177705119
lookin
2007-04-28 00:18
2007.05.27
Имена файлов


8-1158306298
megasecure
2006-09-15 11:44
2007.05.27
Графика в Delphi


2-1178260623
Itonix
2007-05-04 10:37
2007.05.27
Access Violation при работе с динамически созданными полями


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский