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

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

размер numeric поля в dbf [D5, dBase, FoxPro]


td ©   (2003-10-09 18:06:00) 

Как программно определить размер нумерик поля в таблице FoxPro?

Например, реально размер 15.2
А Table1.Fields[0].Size показывает 0
А Table1.Fields[0].DataSize показывает 8

а мне нужно именно целую и дробную часть


td   (2003-10-10 00:16:00) [1]

а на это у меня показываются нули

ShowMessage(IntToStr(PFLDDesc(integer(fd) + fidx*sizeof(FLDDesc)).iUnits2));

Это же десятичная часть должна показываться? Или воообще что?
(поле при этом 15.2)


sniknik   (2003-10-09 23:35:00) [2]

> а почему тогда на ShowMessage(IntToStr(cf.iUnits2)); у меня уже ошибки?
ну наверное потому что там есть ошибка,

просто этот же код можно представить без переменной (что и было сделано)
...
cf := PFLDDesc(integer(fd) + fidx*sizeof(FLDDesc));
ShowMessage(IntToStr(cf.iUnits2));

меняется на
ShowMessage(IntToStr(PFLDDesc(integer(fd) + fidx*sizeof(FLDDesc)).iUnits2));

используй ее (пременную) непосредственно, ну примерно так
cf := PFLDDesc(integer(fd) + fidx*sizeof(FLDDesc));

if cf.iUnits2 > 100 then ShowMessage("Большое значение : "+IntToStr(cf.iUnits2))
else ShowMessage("Маленькое значение : "+IntToStr(cf.iUnits2));

и теперь посмотри будет 3ю строчку отладчик проскакивать (ошибка скорее всего переместится на условие).


td   (2003-10-09 23:07:00) [3]

а почему тогда на ShowMessage(IntToStr(cf.iUnits2)); у меня уже ошибки?


sniknik   (2003-10-09 21:18:00) [4]

> смотрю пошагово, почему-то 3-я строчка перескакивается.
она у тебя выкинутая оптимизатором, т.к. переменная нигде не используется. или используй или оптимизатор отключи.


td   (2003-10-09 20:39:00) [5]


> Brahman


я вставил

fd := AllocMem(fc*sizeof(FLDDesc));
Check(DBIGetFieldDescs(Table1.Handle,fd));
cf := PFLDDesc(integer(fd) + fidx*sizeof(FLDDesc));

смотрю пошагово, почему-то 3-я строчка перескакивается.
Тут что-то надо дописать еще?


Sandman25   (2003-10-09 18:47:00) [6]

Precision?


Brahman   (2003-10-09 18:16:00) [7]

Если через BDE то так можно

uses DBIProcs;
..
var
fc: word;
fd,cf: PFLDDesc;
fidx: integer; // индекс поля, c 0
..
fd := AllocMem(fc*sizeof(FLDDesc));
Check(DBIGetFieldDescs(Table1.Handle,fd));
cf := PFLDDesc(integer(fd) + fidx*sizeof(FLDDesc));

ShowMessage(IntToStr(cf.iUnits2)); // число дес.зн после запятой

if fd <> nil then FreeMem(fd,fc*sizeof(FLDDesc));


Наверх

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