Класс
для работы со структурами WINAPI.
На сегодняшний день, как бы ни ругали FoxPro,сколько
бы не говорили о его кончине, он тем не менее развивается и совершенствуется.
У него существует еще много приверженцев и поклонников, появляются новые. FoxPro
по-прежнему остается одним из лучших для работы с базами данных. Тем более,
что на сегодняшний день с помощью вызова функций API Windows, мы можем придать
своим приложениям ту или иную стандартную функциональность. Единственная проблема
в том, что при вызове той или иной функции API, в качестве параметров, нужен
указатель на структуру, а сам FoxPro, не может полноценно работать со структурами,
как это сделано в VB, VC, Delphi, поэтому приходиться идти на всякие ухищрения
или делать так, как рекомендуется файле помощи.
Вот как показан пример работы со структурами
в файле помощи.
Системная функция Windows GetSystemTime(
) требует в качестве параметра указатель на структуру, состоящую из восьми слов
(WORD), указывающих год, месяц, день, и так далее.
Структура определена таким образом:
typedef struct _SYSTEMTIME {
WORD wYear ;
WORD wMonth ;
WORD wDayOfWeek ;
WORD wDay ;
WORD wHour ;
WORD wMinute ;
WORD wSecond ;
WORD wMilliseconds ;
} SYSTEMTIME
Вот так будет выглядет код на FoxPro:
**************************************************************
DECLARE INTEGER GetSystemTime IN win32api
STRING @
cBuff=SPACE(16)
=GetSystemTime(@cBuff)
tYear = ALLTRIM(STR(ASC(SUBSTR(cBuff,2))
* ;
256 + ASC(SUBSTR(cBuff,1))))
tMonth = ALLTRIM(STR(ASC(SUBSTR(cBuff,4))
* ;
256 + ASC(SUBSTR(cBuff,3))))
tDOW = ALLTRIM(STR(ASC(SUBSTR(cBuff,6))
* ;
256 + ASC(SUBSTR(cBuff,5))))
*************************************************************
Т.е. мы создаем переменную cBuff , а так
как наша структуры занимает 8 слов (WORD) или 16 байт (BYTE), мы ее заполняем
столькими же пробелами. Затем вызываем функцию GetSystemTime(), обратите внимание,
на знак @ перед cBuff, это значит, что мы передаем переменную по ссылке, т.е.
в ней и возвратиться результат, а затем разбираем строку.
Вот этот самый момент, формирование или разбор
строки, и является самым не удобным при работе со структурами из FoxPro. Столкнувшись
с этой проблемой я написал простенький класс, который не претендует на оригинальность,
но может помочь в этом деле, а кого-то и подтолкнуть на написание действительно
оригинального и полнофункционального класса, хотя я почему то уверен, что в
версии 7.0 Microsoft сделает более развитой работу со структурами.
Класс называется STRUCTURE и находится в
библиотеке MSTSTRUC.PRG.
Он имеет один public-метод SizeOf(), который
возвращает длину структуры. Этот метод полезен в тех функциях, где нужен необходимо
передать размер структуры в качестве параметра или в составе структуры.
Так же есть public-свойство StructureString.
При обращении к этому свойству формируется строка со структурой, а при присвоении
ему какого-либо значения произойдет разбор строки и свойства структуры заполняться
данными.
Вот как будет выглядеть вышеприведенной код
при использовании моего класса:
-------------------------------------
#DEFINE _SYSTEMTIME "WORD wYear;"+;
"WORD wMonth;"+;
"WORD wDayOfWeek;"+;
"WORD wDay;"+;
"WORD wHour;"+;
"WORD wMinute;"+;
"WORD wSecond;"+;
"WORD wMillisecond;"
DECLARE INTEGER GetSystemTime IN win32api
STRING @
oTimeStruc=newobject("STRUCTURE","MSTSTRUC.PRG","",_SYSTEMTIME)
cBuff=oTimeStruc.StructureString
=GetSystemTime(@cBuff)
oTimeStruc.StructureString=cBuff
tYear =oTimeStruc.wYear
tMonth =oTimeStruc.wMonth
tDow =oTimeStruc.wDayOfWeek
----------------------------------
В настоящий момент возможна работа со следующими
типами: BYTE, WORD,DWORD,CHAR, STRING. Но не будет сложным задать и другие типы.
Вот еще один пример
#DEFINE _MEMORYSTATUS ;
"DWORD dwLength;"+;
"DWORD dwMemoryLoad;"+; &&
// percent of memory in use
"DWORD dwTotalPhys;"+; &&
// bytes of physical memory
"DWORD dwAvailPhys;"+; &&
// free physical memory bytes
"DWORD dwTotalPageFile;"+; &&
// bytes of paging file
"DWORD dwAvailPageFile;"+; &&
// free bytes of paging file
"DWORD dwTotalVirtual;"+; &&
// user bytes of address space
"DWORD dwAvailVirtual;" &&
// free user bytes
DECLARE INTEGER GlobalMemoryStatus
IN WIN32API STRING @lpBuffer
oMemoryStatus=NEWOBJECT("STRUCTURE","MSTSTRUC.PRG","",_MEMORYSTATUS)
oMemoryStatus.dwLength=oMemoryStatus.SizeOf()
oMemory=omemoryStatus.StructureString
lnRet=GlobalMemoryStatus(@oMemory)
oMemoryStatus.StructureString=oMemory
clear
? "Информация о памяти"
? "---------------------------------------------------"
? "Всего физической памяти "+str(oMemoryStatus.dwTotalPhys/1024/1024)+"MB"
? " Свободно "+str(oMemoryStatus.dwAvailPhys/1024/1024)+"MB"
? " Использовано "+str(omemoryStatus.dwMemoryLoad)+"%"
? "---------------------------------------------------"
? " Всего виртуальной памяти "+str(oMemoryStatus.dwTotalVirtual/1024/1024)+"MB"
? "Использовано виртуфльной памяти
"+str(oMemoryStatus.dwAvailVirtual/1024/1024)+"MB"
?
Я надеюсь, что это поможет вам болле полно
работать с функциями API. Буду рад услышать ваши отзывы, не обязательно только
хорошие.
------------------------------------------------------------
SpyFox
|