2020
Типичные вопросы [программирование]
На этой станице помещены ответы на вопросы, которые я сам мучительно (или легко) находил, я не думаю, что ответы исчерпывающие, и если Вы найдёте, что что-нибудь дисанирует с Вашими представлениями, давайте обсудим и найдём лучшие решения... Кроме того, часто ответ может зависеть от версии как OS так и Visual FoxPro, проверить всё на всех версиях и платформах для меня просто непосильно. Изначально этот список был исключительно для VFP 5.0, в то время как сейчас это только VFP 7.0/8.0, я мог где-нибудь и пропустить упоминание о версии, и если Вы найдёте несоответствия, сообщите пожалуйста мне.

 

Вопрос: Почему exe-модуль созданный в Visual FoxPro "не работает" при попытке запустить его на машине, где не установлена полная версия Visual FoxPro, а только RunTime-овская часть его? 

Ответ: Я больше чем уверен, что этот же модуль не будет работать и там, где установлена полная версия, если запустить его не из-под оболочки Visual FoxPro. Попробуйте, и если это действительно так, то причина проста. В этом модуле следует организовать бесконечный цикл для обработки событий, происходящих в нём, и прерываемый по команде завершения работы модуля. Делается это командами Read Events и Clear Events соответственно.

Вопрос: Я экспериментально установил, какой набор файлов следует поместить в каталог вместе с exe-модулем, созданным в Visual FoxPro, чтобы он корректно работал на клиенте без установки RunTime-овской части Visual FoxPro. Правильно ли я сделал, не будет ли у меня проблем в будущем? 

Ответ: Думаю, что у Вас будут проблемы, когда Вы понесёте ещё один, созданный Вами модуль тому же клиенту, а возможно и новую версию прежнего модуля, которая, к примеру, начнёт использовать ODBC-драйвер Visual FoxPro. Поэтому, лучший вариант переноса, - создание дискрибутива, используя Wizard Setup самого Visual FoxPro. Правда иногда он работает с ошибкой, которая заключается в том, что в информационных файлах дискрибутива регистрируются файлы, которые на самом деле не копируются на дискрибутивные диски. Для устранения этой проблемы следует вручную отредактировать эти файлы, приведя их в соответствие с тем, что на самом деле находится на дискрибутивных дисках.

Вопрос: Я создаю приложение VFP 6.0 используя Application Wizard. Почему теперь, когда я открываю созданный таким образом проект приложения из проводника Windows у меня недоступны все Помощники (Wizard) и Построители (Builders)? Tо же самое я имею, если создам иконку приложения на DeskTop Windows (Shortcut) и открою своё приложение через неё. 

Ответ: Откройте файл Config.fpw в каталоге Вашего проекта и на время разработки проекта закомментируйте строки _BROWSER = "", ... , _WIZARD = "". Возможно Вам также потребуется изменить установку RESOURCE = OFF.

Вопрос: Как "убить" Main Visual FoxPro Window? Создаю форму, устанавливаю ShowWindow=2 (As Top-Level Form)... 

Ответ: Поместите SCREEN=OFF в Ваш Config.fpw

Вопрос: Как решать проблему хранения паролей для доступа к программе. Имеется ли простой способ сделать это? Для паролей я имею dbf-файл (пользователь, пароль). Хотел бы быть иметь возможность шифровать/расшифровать поле пароль.  

Ответ: Используйте для хранения/проверки только результат функции SYS(2007, cExpression), самый простой способ, как надеюсь, можете немного "подфонить" (в VFP 6.0 по крайней мере).

Вопрос: Где найти информацию о проблемах 2000 года для FoxPro? 

Ответ: Проблемы K2Y описаны здесь http://www.microsoft.com/technet/year2k/product/product.asp (eng.) http://www.microsoft.com/technet/year2k/product/user_list.asp(eng.) или http://www.microsoft.com/rus/year2000/prodguide/product.asp (rus.) http://www.microsoft.com/rus/year2000/prodguide/user_list.asp (rus.) см. также Y2KFOX на http://www.y2kfox.com (eng.) или DateHound на http://www.digitalcoyote.com (eng.) и http://msdn.microsoft.com/vfoxpro/technical/tutorial/dates.asp (eng.)

Вопрос: Как предотвратить запуск нескольких экземпляров VFP приложения на одном рабочем месте? 

Ответ: Попробуйте что-нибудь подобно следующему:
#DEFINE MY_APP_CAPTION "Application Window"
#DEFINE SW_SHOWNOACTIVATE	4
DECLARE INTEGER SetForegroundWindow IN Win32API ;
    LONG hWnd
DECLARE INTEGER IsIconic IN Win32API;
    LONG hWnd
DECLARE LONG FindWindow IN Win32API ;
    STRING lpClassName;
    ,STRING lpWindowName
DECLARE LONG ShowWindow  IN Win32API ;
     LONG hwnd ;
    ,LONG nCmdShow
LOCAL lhWnd
lhWnd = FindWindow(NULL, MY_APP_CAPTION)
IF lhWnd # 0
	IF IsIconic(lhWnd) # 0
    		ShowWindow(lhWnd, SW_SHOWNOACTIVATE)
	ENDIF
	SetForegroundWindow(lhWnd)
	CLEAR DLLS
	QUIT
ENDIF

Вопрос: Создаю VFP-приложение с одной формой (ShowWindow - 2 as Top-Level Form), делаю для него Setup, устанавливаю на клиенте Windows 95..., по завершению приложения задача виснит. Имеется ли способ избавиться от этого? 

Ответ: Попробуйте установит DCOM на машине клиента. Имейте ввиду, что существуют две версии Dcom95.exe и Dcom98.exe. См. также
Q193472 FIX: Exception Error Exiting Top-Level Form App in Windows 95
Q215362 HOWTO: Detect DCOM Installation Under VFP 6.0
http://fox.wikis.com/wc.dll?Wiki~C0000005ExError~VFP

Вопрос: Как из VFP отследить завершение процесса? 

Ответ: см. ID: Q191584 в MSDN "HOWTO: Determine When a 32-bit Process has Completed"

Вопрос: Нужно из кода переключать раскладку клавиатуры: Rus/Lat. Можно ли это сделать? 

Ответ: Попробуйте что-нибудь подобно следующему:
#DEFINE hklRus			"00000419" 	&& - name from 0x0419 Russian 
#DEFINE hklEng			"00000409" 	&& - name from 0x0409 English (US)
#define KLF_ACTIVATE	1			&& 0x00000001

DECLARE LONG LoadKeyboardLayout IN WIN32API ; 
	STRING pwszKLID, ; && input locale identifier
	INTEGER Flags      && input locale identifier options

LOCAL lnRetCode
lnRetCode = LoadKeyboardLayout(hklRus, KLF_ACTIVATE)
lnRetCode = LoadKeyboardLayout(hklEng, KLF_ACTIVATE)

CLEAR DLLS

Вопрос: Как поместить картинку в VFP main window? 

Ответ: Попробуйте что-нибудь подобно следующему:
WITH _SCREEN
	.AddObject( "MyPic", "Image" )
	.MyPic.Picture = HOME()+"Fox.bmp"
	.MyPic.Top     = 10
	.MyPic.Left    = 10
	.MyPic.Visible = .T.
ENDWITH
*
*... а для удаления:
*
 _screen.RemoveObject("MyPic") 

Вопрос: Есть ли библиотека локализации для VFP6 ? Такая как в пятом vfp5rus.dll. 

Ответ: в SP4 VS6 в файле VS6sp47.cab содержится vfp6rrus.dll (у меня, по крайней мере)...

Вопрос: Возможно ли как-нибудь работать с Си-структурами, получаемыми через Win32Api функций в VFP? 

Ответ: На http://www.universalthread.com/ (регистрация свободна) разделе Files лежит Struct.zip автор Christof Lange, который позволяет это делать.

Вопрос: У меня не закрывается приложение по [x]. Как это побороть? 

Ответ: см. ID: Q172455, Q110970, ON SHUTDOWN в MSDN. Как добавление, если Вы желаете, чтобы Ваше приложение нормально завершалось по закрытию OS [CTRL+ALT+DELETE], добавьте в конец Вашей процедуры MyCleanUp, вызывающейся по событию ON SHUTDOWN, что-нибудь типа:
PROCEDURE MyCleanUp 
ON SHUTDOWN
...
IF VERSION(2) = 0
	QUIT
ENDIF

Вопрос: Использую HOME()+'tools/GenDbc/GenDbc.prg' для генерации dbc-файлов, однако получаю безобразие, подобное:

...
DisplayStatus([Creating table СПРАВОЧНИК_МАРОК_РАЗЪЕДИНИТЕЛЕЙ...])
MakeTable________________________________()
...
можно ли это как-то побороть? 

Ответ: Попробуйте в GenDbc.prg в качестве PROCEDURE FixName(...) написать "жёстко", чего-нибудь типа:
PROCEDURE FixName(lcProcName) 
	lcProcName=ALLTRIM(lcProcName) 
	cbadchars = '/,-=:;!@#$%&*.<>()?[]'+; 
		'+'+CHR(34)+CHR(39)+" " 
	lcProcName = CHRTRANC(lcProcName,cbadchars ,REPL('_',LEN(cbadchars))) 
	RETURN lcProcName 
ENDPROC 

Вопрос: Попытка воспользоваться решением Q194702 "HOWTO: Locate Windows Special Folder Locations" из MSDN ни к чему не привела. Имеется ли альтернативное решение? 

Ответ: Попробуйте использовать вот это:
o = CreateObject('wscript.shell')
for i = 1 to 17
? o.SpecialFolders(i)
next

Вопрос: Имеется ли возможность перехватить события VFP main window (_SCREEN) из своей программы?  

Ответ: Один способ показан в Desktop.zip на стр. примеры, другой в создании своего класса подобно тому как показано ниже:
* ScreenMethods.PRG
*
* Author: Fred Taylor - 4/10/2001
*
* Use the following to modify _SCREEN methods:
*
* For VFP6 & 7:
*
*     _SCREEN.NewObject("oSH","ScreenHook","screenmethods.prg")
*
* For VFP3 & 5:
*
*     SET PROCEDURE TO screenmethods ADDITIVE
*     _SCREEN.AddObject("oSH","ScreenHook")
*
* Any of the main VFP screen methods can be hooked into in this manner.
*
DEFINE CLASS ScreenHook AS CUSTOM
oScr = _SCREEN
PROCEDURE oScr.Resize()
  *
  * Code to handle the main VFP screen being resized
  *
  WAIT WINDOW NOWAIT TRANSFORM(this.Width)+" "+TRANSFORM(this.Height)
ENDPROC
PROCEDURE oScr.RightClick
  *
  * Code to do a "shortcut" menu on main VFP screen RightClick
  *
  DO testmenu.mpr
ENDPROC
*
* Custom methods work, too.
*
PROCEDURE oScr.MyMethod
wait window "my method fired!"
ENDPROC
ENDDEFINE
Обратите внимание, что в последнем случае ряд событий недоступно, в частности QueryUnload()

Вопрос: Как определить високосный год? 

Ответ: !EMPTY(DATE(m.lnYear, 2, 29))

Вопрос: Как создать setup VFP-приложения в версии 7.0 и выше? Не могу найти пункт Tools/Wizards/Setup 

Ответ: Это действительно так: построитель setup перестал входить в среду разработки. Вместо этого, на установачном CD распростроняется InstallShield Express. Обратите внимание, он не устанавливается автоматично при установке VFP среды и требует отдельной/самостоятельной установки на машину разработчика. См. 'Where is the Setup Wizard?' and Other Annoying InstallShield Questions в MSDN.
    - об использовании InstallShield Express см. документацию, а также статьи в MSDN (в поиске по "InstallShield Express")
    - какие именно dll-библиетеки требуется устанавливать клиенту и какие требуют регистрации как COM-компоненты см. на
       http://fox.wikis.com/wc.dll?Wiki~VFP7RuntimeFiles~VFP,
       http://fox.wikis.com/wc.dll?Wiki~VFP8RuntimeFiles~VFP,
       http://fox.wikis.com/wc.dll?Wiki~VFP9RuntimeFiles~VFP
    - см. также в MSDN KB: [Q320151] How to determine dependencies with InstallShield Express
    - см. также вопросы связанные с установкой/запуском приложений на клиенте на http://forum.foxclub.ru/
 
 
Hosted by uCoz