![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
размер 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));