Главная
Трудоустройство
Ваши объявления
Наши новости
Информация







Расширение возможностей VFP за счет WINAPI


Владимир Журавлев


Много чего может ФОКС, но встечаются досадные случаи , когда другой продукт что-то может, а у ФОКСА небольшие проблемы. Большая часть таких досадных случаев может быть залатана использование WINAPI функций.









Вот первый пример.

Список драйвов


В Visual Basic есть компонент -список драйвов. Сделаем его для ФОКСА. Возьмем combobox и в его событие init положим следующий код. И вот у нас есть класс-список драйверов
DECLARE SHORT GetDriveType in kernel32.dll STRING @lpR
lp=0
lp1=0
lp2=0
lp3=0
d=0x1
=SetErrorMode(d)
for i=65 to 90
dr=chr(i)+:\
if GetDriveType(@dr)!=1 and GetDriveType(@dr)!=0
this.additem(dr)
endif
=SetErrorMode(0)
endfor
this.value=sys(5)+\

Вставлена ли дискета?


Другой пример.
Нужно записать чего нибудь на дискету , а не известно, вставлена она или нет.
Лобовой способ решения этой проблемы в ФОКСЕ - обработка нужного номера ошибки.
Но можно поступить и более интелегентно. Взять и создать пользовательский класс с
методом testdrive и положить в него следующий код.
Теперь его можно вызывать перед записью чего либо на дискету. А если он вернет .F., сообщать пользователю о проблеме.
lparameter dr
declare integer GetDiskFreeSpace in kernel32.dll ; string @ lpRootPathName, ;
integer @ lpSectorsPerCluster, ;
integer @ lpBytesPerSector, ;
integer @ lpNumberOfFreeClusters, ;
integer @ lpTotalNumberOfClusters
declare integer GetLastError in kernel32.dll Declare integer SetErrorMode in kernel32.dll integer d
lp=0
lp1=0
lp2=0
lp3=0
d=0x1
=SetErrorMode(d)
if GetDiskFreeSpace(@dr,@lp,@lp1,@lp2,lp3)=1
=SetErrorMode(0)
return .t.
else
=SetErrorMode(0)
return .f.
endif

Cуществование директории


Иногда и на старуху бывает проруха. Я имею в виду программиста. Один раз я напрочь забыл , как проверить существование директории Фоксовым способом.
А нужные строчки help все не находились. Тогда я написал в пользовательском классе метод- testdir со следующим кодом
lparameter dr
local cdd, rt
Declare short SetCurrentDirectory in kernel32.dll string d
declare integer GetLastError in kernel32.dll
Declare integer SetErrorMode in kernel32.dll integer d
d=0x1
=SetErrorMode(d)
cdd=sys(5)+sys(2003)
rt=SetCurrentDirectory(dr)
cd (cdd)
if rt=0
return .f.
else
return .t.
endif

Метод печати форм


Кто не мечтал сделать в ФОКСЕ метод печати форм, который есть и у Delphi и у кого только нет. А у нас нет. Меня это всегда приводило в тихое бешенство. Сейчас в FoxTalk уже опубликовано несколько способов решения этой проблемы, но все кривоваты. Мне удалось подсмотреть, что делает Дельфи внутри себя в методе-print , когда посылает форму на печать и переписать это для ФОКСА. Вот что мы можем изобразить с помощью winipi .
Сделаем только два разных метода, чтобы прихватить так называемый handle печатающего устройства. Его можно взять , положив на форму компонент -common dialog ( activeX)- в тексте он имеет имя olecontrol1 или взять то же самое через winipi. Эти две ветки кода привожу в коментариях. Тому, кому не понравится commondilaog Выкинньте его код и уберите коментарии.
dimension ss(19)
ss(1) = 66
ss(2) = null
ss(3) = null
ss(4) = null
ss(5) = null
ss(6) = null
ss(7) = 1
ss(8)= 1
ss(9)= null
ss(10) = null
ss(11)= 1
ss(12)= null
ss(13) = null
ss(14)= NULL
ss(15) = NULL
ss(16) = null
ss(17) = null
ss(18) = null
ss(19) = null
* Ниже функция , которая может быть использована вместо commondialog чтобы
*прихватить handle печатающего устройства

declare INTEGER PrintDlg in comdlg32.dll INTEGER @ss[19]
* The code before is dedicated , if common dialog activex is not available on your computer
dimension sz(5)
sz(1)=20
sz(2)=0
sz(3)=0
sz(4)=0
sz(5)=0
declare INTEGER GetForegroundWindow in user32.dll
declare INTEGER GetActiveWindow in user32.dll
declare INTEGER GetWindowDC in user32.dll INTEGER HDC
declare INTEGER DeleteDC in gdi32.dll INTEGER HDC
declare INTEGER GetDC in user32.dll INTEGER HDC
declare INTEGER ReleaseDC in user32.dll INTEGER HDC,INTEGER HWD
declare INTEGER StartDoc in gdi32.dll integer hdcPrint, integer @sz[5], ;
integer fn, integer ou , integer dt, integer fw
declare integer StartPage in gdi32.dll integer hdcprint
declare integer EndPage in gdi32.dll integer hdcprint
declare integer EndDoc in gdi32.dll integer hdcprint
declare integer GetDeviceCaps in gdi32.dll integer i, integer ii
declare SHORT BitBlt in gdi32.dll INTEGER HDC, ;
INTEGER nXDest, ;
INTEGER nYDest, ;
INTEGER nWidth, ;
INTEGER nHeight,;
INTEGER hdcSrc, ;
INTEGER nXSrc, ;
INTEGER nYSrc, ;
INTEGER dwRop
hd=GetForegroundWindow()
* Берем handle фоксового окна
hwd=GetDC(hd)
hd1=GetACTIVEWindow()
hwd1=GetWindowDC(hd1)
* Ниже код с использованием commondialog/ * положенного на форму
thisform.olecontrol1.flags=256
* some printers require thisform.olecontrol1.flags=512
* check out hdc0

thisform.olecontrol1.flags=256
thisform.olecontrol1.showprinter()
thisform.olecontrol1.flags=256
phd=thisform.olecontrol1.hdc
*********************************************** * in case common dialog is not available on your computer
* use the following code instead of the calling common dialog before

ss(1) = 66
ss(2) = hd
ss(3) = 0
ss(4) = 0
ss(5) = 0
ss(6) = 0x100
ss(7) = 1
ss(8)= 1
ss(9)= 0
ss(10) = 0
ss(11)= 1
ss(12)= 0
ss(13) = 0
ss(14)= NULL
ss(15) = NULL
ss(16) = null
ss(17) = null
ss(18) = 0
ss(19) = 0
=PrintDlg(@ss)
phd=ss[5]
*************************************************
if phd



www.sdteam.com
Базы данных 28-01-2007
Oracle разработала архитектуру Oracle Application Integration Architecture for Communications 24-11-2007 Базы данных
Подразделение Oracle Communications разработало архитектуру Oracle Application Integration Architecture for Communications и выпустило три первых пакета Process Integration Pack, предлагающих коммуникационным компаниям готовые средства интеграции процессов для приложений Oracle Siebel CRM, Oracle Communications Billing and Revenue Management и Oracle Financials. Также разработано решение Oracle Communications Unified Inventory Management. Oracle ...


Oracle ставит перед BEA ультиматум 24-10-2007 Базы данных
Корпорация Oracle сообщила, что ее предложение о покупке компании BEA Systems действительно до предстоящего воскресенья, в противном случае Oracle просто купит несколько более мелких компаний, которые уже дали свое соглашение на поглощение.Напомним, что две недели назад BEA Systems распространила официальный ответ на предложение Oracle о покупке. В BEA сочли предложенные 6,66 млрд долларов недостаточными, а премию в 25% - слишком скромной. Ре...


Ларри Эллисон: Oracle будет активно поглощать компании 27-06-2007 Базы данных
По словам основателя и главного исполнительного директора Oracle Ларри Эллисона, для того, чтобы выполнить стратегический план по продажам программных продуктов, компании предстоит проводить по одному поглощению в месяц на протяжении предстоящих двух с половиной лет.Выступая перед 6 000 менеджерами по продажам Oracle, Эллисон заявил, что компания намерена стать крупнейшим корпоративным покупателем в мире. Однако в результате столь агрессивной пол...

Copyright © 2005
"service-centers.com.ua"


Rambler's Top100   Рейтинг@Mail.ru

Работа
Карта сайта
О сайте
Реклама
все объявления
поиск резюме
поиск вакансий
добавить резюме
добавить вакансию

Все объявления
Компьютеры, оргтехника
Автомобили
Продукты питания
Аудио, Фото, Видео
Связь
Отдых, путешествия
Мебель
Разное
Добавить объявление
 Автомобили
 Ремонтно-строительные услуги
 Пресс-релизы
 Железо
 Soft
 Мобильная планета
 Для милых дам
 Родительский клуб
 Недвижимость
 Домашний очаг, усадьба
 Строительство
 Обустройство и безопасность дома
 Сантехника