WINAPI көмегімен VFP мүмкіндіктерін кеңейту

Новости мира

Толтырғышты қайдан сатып алуға болады? Ұсыныс: ұялы телефондарды өшіру, 70% жеңілдік! FOX көп нәрсені жасай алады, бірақ басқа өнім бірдеңе жасай алатын тітіркендіргіш жағдайлар бар, ал FOX-та аз проблемалар бар. Бұл тітіркендіргіш жағдайлардың көпшілігі WINAPI функцияларын пайдаланып түзетілуі мүмкін.
Міне, бірінші мысал.
драйв тізімі
Visual Basic-те диск тізімінің құрамдас бөлігі бар. Оны FOX үшін жасайық. Құрама жәшікті алып, оның init оқиғасына келесі кодты қоямыз. Міне, бізде жүргізушілердің тізімі бар
kernel32.dll STRING @lpR ішінде ҚЫСҚА GetDriveType ЖАРИЯЛАУ

lp=0
lp1=0
lp2=0
lp3=0
d=0x1
=Қате режимін орнату(d)
i=65 пен 90 үшін
dr=chr(i)+’:’
GetDriveType(@dr)!=1 және GetDriveType(@dr)!=0 болса
this.additem(dr)
эндиф
=Қате режимін орнату(0)
endfor
this.value=sys(5)+»
Иілгіш диск салынған ба?
Тағы бір мысал.
Иілгіш дискіге бірдеңе жазу керек, бірақ оның салынғаны немесе салынғаны белгісіз.
FOX-та бұл мәселені шешудің алдыңғы жолы — қажетті қате нөмірін өңдеу.
Бірақ сіз мұны ақылдырақ жасай аласыз. көмегімен пайдаланушы класын алыңыз және жасаңыз
testdrive әдісін таңдап, оған келесі кодты қойыңыз.
Енді оны иілгіш дискіге бірдеңе жазбас бұрын шақыруға болады. Ал егер ол .F қайтарса, пайдаланушыға мәселе туралы хабарлаңыз.
lпараметр dr
kernel32.dll ішіндегі GetDiskFreeSpace бүтін санын жариялау; жол @ lpRootPathName, ;
integer @ lpSectorsPerCluster, ;
бүтін @ lpBytesPerSector, ;
integer @ lpNumberOfFreeClusters, ;
integer @ lpTotalNumberOfClusters
kernel32.dll ішіндегі бүтін санды жариялау GetLastError бүтін санды kernel32.dll ішінде SetErrorMode деп жариялау d бүтін санды
lp=0
lp1=0
lp2=0
lp3=0
d=0x1
=Қате режимін орнату(d)
егер GetDiskFreeSpace(@dr,@lp,@lp1,@lp2,lp3)=1
=Қате режимін орнату(0)
қайтару .t.
басқа
=Қате режимін орнату(0)
қайтару .f.
эндиф
Каталогтың болуы
Кейде тіпті кемпірге де тесік болады. Бағдарламашы дегенім. Бірде мен Fox әдісімен каталогтың бар-жоғын қалай тексеру керектігін мүлдем ұмытып кеттім.
Ал барлық қажетті көмек желілері табылмады. Содан кейін мен келесі кодпен пайдаланушы сыныбында testdir әдісін жаздым
lпараметр dr
жергілікті cdd, rt
kernel32.dll жолында қысқа SetCurrentDirectory жариялау d
kernel32.dll ішіндегі GetLastError бүтін санын жариялаңыз
kernel32.dll бүтін санында SetErrorMode бүтін санын жариялау d
d=0x1
=Қате режимін орнату(d)
cdd=sys(5)+sys(2003)
rt=SetCurrentDirectory(dr)
CD (CDD)
rt=0 болса
қайтару .f.
басқа
қайтару .t.
эндиф
Пішінді басып шығару әдісі

FOX-та формаларды басып шығару әдісін жасауды кім армандаған емес, Delphi де бар, ал кімде жоқ. Бірақ бізде жоқ. Бұл мені әрқашан тыныш ашуға итермеледі. Қазір FoxTalk бұл мәселені шешудің бірнеше әдісін жариялады, бірақ бәрі қисық. Мен Delphi пішінді басып шығаруға және оны FOX үшін қайта жазуға жіберген кезде басып шығару әдісінде не істейтінін байқадым. Міне, winipi көмегімен нені салуға болады.
Басып шығару құрылғысының тұтқасын ұстаудың екі түрлі әдісін ғана жасайық. Оны формаға -common dialog (activeX) компонентін қою арқылы алуға болады — мәтінде оның olecontrol1 атауы бар немесе оны winipi арқылы алуға болады. Мен түсініктемелерде осы екі код тармағын келтіремін. Ұнамайтындар үшін commondilaog Оның кодын тастап, пікірлерді алып тастаңыз.
өлшемі ss(19)
ss(1) = 66
ss(2) = нөл
ss(3) = нөл
ss(4) = нөл
ss(5) = нөл
ss(6) = нөл
ss(7) = 1
ss(8)= 1
ss(9)= нөл
ss(10) = нөл
ss(11)= 1
ss(12)= нөл
ss(13) = нөл
ss(14)= NULL
ss(15) = NULL
ss(16) = нөл
ss(17) = нөл
ss(18) = нөл
ss(19) = нөл
* Төменде ортақ диалогтың орнына пайдалануға болатын функция берілген
*принтердің тұтқасынан ұстаңыз

comdlg32.dll ішінде INTEGER PrintDlg жариялау INTEGER @ss[19]
* Егер компьютерде жалпы диалогтық activex қол жетімді болмаса, алдыңғы код арналған
өлшемі sz(5)
sz(1)=20
sz(2)=0
sz(3)=0
sz(4)=0
sz(5)=0
user32.dll ішінде INTEGER GetForegroundWindow деп жариялаңыз
user32.dll ішінде INTEGER GetActiveWindow деп жариялаңыз
user32.dll INTEGER HDC ішінде INTEGER GetWindowDC жариялау
gdi32.dll INTEGER HDC ішінде INTEGER DeleteDC деп жариялаңыз
user32.dll INTEGER HDC ішінде INTEGER GetDC жариялау
user32.dll ішінде INTEGER ReleaseDC жариялау INTEGER HDC,INTEGER HWD
gdi32.dll бүтін hdcPrint, integer @sz ішінде INTEGER StartDoc жариялау[5];
integer fn, integer ou , integer dt, integer fw
gdi32.dll бүтін hdcprint ішіндегі StartPage бүтін санын жариялаңыз
gdi32.dll бүтін hdcprint ішіндегі EndPage бүтін санын жариялаңыз
gdi32.dll бүтін hdcprint ішіндегі EndDoc бүтін санын жариялаңыз
gdi32.dll ішіндегі бүтін GetDeviceCaps санын жариялау бүтін i, бүтін ii
gdi32.dll INTEGER HDC ішінде ҚЫСҚА BitBlt жариялау, ;
INTEGER nXDest, ;
INTEGER nYDest, ;
INTEGER nWidth, ;
INTEGER nHeight,;
INTEGER hdcSrc, ;
INTEGER nXSrc, ;
INTEGER nYSrc, ;
INTEGER dwRop
hd=GetForegroundWindow()
* Біз Fox терезесінің тұтқасын аламыз
hwd=GetDC(hd)
hd1=GetACTIVEWindow()
hwd1=GetWindowDC(hd1)
* Төменде commondialog/ * пішіміне қою арқылы код
thisform.olecontrol1.flags=256
* кейбір принтерлерге thisform.olecontrol1.flags=512 қажет
* hdc0 тексеріңіз
thisform.olecontrol1.flags=256
thisform.olecontrol1.showprinter()
thisform.olecontrol1.flags=256
phd=thisform.olecontrol1.hdc
*********************************************** * егер жалпы диалогтық терезе компьютерде қолжетімді емес
* бұрын шақырылатын жалпы диалогтың орнына келесі кодты пайдаланыңыз
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) = нөл
ss(17) = нөл
ss(18) = 0
ss(19) = 0
=PrintDlg(@ss)
Phd=ss[5]
****************************************************
егер PhD күту терезесі «Принтер дайын емес немесе таңдалмаған»
эндиф
*!* егер getdevicecaps(phd,0x2)!=2
*!* * технология параметрін win32api.txt файлынан қараңыз
*!* күту терезесі ‘Принтер растрлық көшіруді қолдамайды’
*!* қайтару
*!* endif’
* Төмендегі түсініктеме берілген код қалаушыларға арналған тапсырма
* істі соңына дейін жеткізу және жоғары сапалы басып шығару
*!* егер (2*int(getdevicecaps(phd,38)/2)-getdevicecaps(phd,38))=0
*!* * win32api.txt файлында мүмкіндік параметрін қараңыз
*!* күту терезесі «Сіздің принтеріңіз BITS тасымалдау операциясын қолдамайды»
*!* қайтару
*!* endif
егер StartDoc(phd,@sz) күту терезесі «Принтерге қатысты кейбір мәселелер»
қайтару
эндиф
=startPage(phd)
thisform.text1.value=BitBlt(phd,10,10,5 ,thisform.width,5,thisform.height,hwd,thisform.left,thisform.top,0xCC0020)
* сәттілікке ие болғандар үшін ол принтердегі пішіннің жақсы көшірмесін жасайды, басып шығару экранынан әлдеқайда жақсы
=ReleaseDc(hd,hwd)
=ReleaseDc(hd1,hwd1)
=Соңғы бет(phd)
=EndDoc(phd)
=DeleteDC(phd)
Егер мұның бәрі бейнеленген болса, онда пішіннің көшірмесі басып шығарылады. Бірақ ол кішкентай болады. Оны пропорционалды түрде көбейту нашар сапаны береді. Сонымен қатар, түстің түстен ақ-қараға ауысу мәселесі шешілген жоқ.
Түсініктеме берілген кодтың бір бөлігі және кодта жарияланған функциялар бұл мәселені оңай шешеді. Істі соңына дейін жеткізгісі келетіндерге ұсынамын.
Сервер түрін анықтау

FOX мысалдарында Windows тізіліміне кіруге мүмкіндік беретін қызықты сынып кітапханасы бар. Менде Oracle-де немесе InterBase MS SQL рубероидтарында белгісіз серверде дерексіз код жазу керек болған кезде бірнеше рет тапсырмалар болды және әлі де бар.
Әрине, әр сервердің өзіндік ерекшеліктері бар және сіз бәрін бірдей жаза алмайсыз. Бірақ бәрібір мен мұны шынымен жасағым келеді.
Мысалдарда келтірілген winipi кодын пайдаланып, ODBS атауымен анықтауға болады — бұл Oracle немесе жоқ.
LPARAMETERS dsname
ӨЛШЕМ aODBCData[1]
this.getodbcinfo(.f.,@aODBCData)
ЖЕРГІЛІКТІ i
FOR i =1 — alen(aODBCData,1)
ЕГЕР(жоғарғы(барлықтрим(aODBCData[i,1])))=жоғарғы(alltrim(dsname)) ;
және ‘ORACLE’$жоғарғы(aODBCData[i,2])
aODBCData шығарыңыз
RETURN .t.
ENDIF
АЯҚТАУ
aODBCData шығарыңыз
RETURN .f.
* Төменде registry.vcx коды берілген, ол жоғарыда getodbcinfo деп аталады
PARAMETER lODBCType,aODBCData
#ҚАТЕЛІК_ТАБЫСТЫ АНЫҚТАҢЫЗ 0
#DEFINE C_EXTNOFOUND_LOC «Таңдалған қолданба үшін ақпарат жоқ.»
#DEFINE C_NOREGFILE_LOC «Осы үлгіге қажет REGISTRY.PRG файлы SamplesClasses ішінде табылмады.»
ЖЕРГІЛІКТІ oReg,regfile,nErrNum,lDrivers
*!* Қоғамдық aODBCData
lDrivers = .F.
IF PARAMETERS()=1 ЖӘНЕ TYPE(«m.lODBCType»)=»L» ЖӘНЕ m.lODBCType
m.lDrivers = .T.
ENDIF
regfile = «registry.prg»
IF !FILE(m.regfile)
MESSAGEBOX(C_NOREGFILE_LOC )
ҚАЙТАРУ
ENDIF
ПРОЦЕДУРАНЫ (m.regfile) АДДИТИВКЕ ОРНАТУ
oReg = CreateObject («ODBCReg»)
*!* ӨЛШЕМ aODBCData[1]
IF m.lDrivers
m.nErrNum = oReg.GetODBCDrvrs(@aODBCData)
ELSE m.nErrNum = oReg.GetODBCDrvrs(@aODBCData,.T.)
ENDIF
Біз әрқашан қажетті мемлекеттік тілде жұмыс істейміз.

Міне, жеткілікті типтік жағдай. Пайдаланушы бағдарламаны іске қосады және парольді тереді А регистрі орысша. Әрине, ол жойылады. Және ол әрқашан мәселенің не екенін тез түсінбейді. Содан кейін ол парольді теріп, әйгілі, экранға қарамай, тере бастады. Жақсы сауда компанияларындағы жақсы операторлардың көпшілігі де солай етеді. Ақшасы бар клиент күтпейді Ал регистр ағылшынша. Міне, сіз бәрін қайтадан біріктіруіңіз керек. Міне, winipi арқылы қалаған тілді қалай орнатуға болады, кодты енгізу пішімдеріне қай жерде қою керек — бұл талғам мәселесі. Бұл мүмкін және таймер нысанында.

user32.dll STRING @lpR ІШІНДЕ ҚЫСҚА GetKeyboardLayoutName ЖАРИЯЛАУ
lpr=»
=GetKeyboardLayoutName(@lpr)
ҚЫСҚА ЖАРИЯЛАУ ActivateKeyboardLayout IN user32.dll INTEGER HKL , INTEGER жалаушалары
егер болмаса ‘419’ $lpr
=Пернетақта орналасуын белсендіру(1,0)
эндиф