FoxPro Club Главная

Конференция Решения Фотоальбом Сайт М.Дроздова Статьи Файловый архив Книга Visual FoxPro 9.0 Русский Help для Visual FoxPro
Пользователей: 9233
Вход
Класс для работы со структурами WINAPI

На сегодняшний день, как бы ни ругали FoxPro,сколько бы не говорили о его кончине, он тем не менее развивается и совершенствуется. У него существует еще много приверженцев и поклонников, появляются новые. FoxPro по-прежнему остается одним из лучших для работы с базами данных.


 
Прислал: SpyFox   Категория: Разное


Класс для работы со структурами 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


 
Сделайте оценку этого решения Плохо Удовлетворительно Так себе Хорошо Отлично Текущая оценка: (4.856) Вложение [2.79]kb
Дополнения пользователей
Класс для работы со структурами WINAPI
[+][?]
Zahhar
11.07.01 16:01:12

Ув. SpyFox!
Не понял, как работает Ваш класс с данными типа STRING - у Вас под них выделяется 1 ячейка типа C,
а строка у меня переменной длинны. Пробовал заменить на 255 и дополнять пробелами - нарушается
структура, т.е. получить ещё назад обычным дедушкиным способом не удаётся... В чём я крив?
[Дополнить]



© 2000-2017 Fox Club 
При размещении любых материалов с сайта на других ресурсах- прямая ссылка на www.foxclub.ru обязательна
Яндекс.Метрика