Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Пути к таблицам в базе данных.
|
|||
|---|---|---|---|
|
#18+
Привет! Есть база данных, с таблицами находящимися по пути c:\database\ Если я переношу базу на другой компьютер, то для того чтобы база была работоспосбной мне надо будет создать на нем такую же папку на таком же диске, т.е. c:\database\. А можно ли не привязываться к папке, а сделать так чтобы базу, таблицы которой находятся в той же папке где и сам файл .dbc, можно было бы размещать где угодно? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2004, 11:50 |
|
||
|
Пути к таблицам в базе данных.
|
|||
|---|---|---|---|
|
#18+
я делаю так в файле Paths.ini пишу [System] Base=C:\\Data\ Program=C:\MyPrg а в основной программе DataBasePath = ProfileString( "PATHS.INI", "System", "Base", 0) ProgramPath = ProfileString( "PATHS.INI", "System", "Program", 0) SET PATH TO &DataBasePath SET DEFAULT TO &ProgramPath *** Где ProfileString - ф-я чтения из ИНИ файла **** **************** ** ** Functions for reading and writing .INI files. ** ** PUBLIC FUNCTIONS: ** ** =ProfileString( cINIFile, cSection, cKey, cDefault ) ** =ProfileNum( cINIFile, cSection, cKey, nDefault ) ** =ProfileDate( cINIFile, cSection, cKey, dDefault ) ** =SetProfile( cINIFile, cSection, cKey, xValue ) ** ** ProfileString is used to read a string from the specified .INI file. ** ** Eg. cSystemPath = ProfileString( "TEST.INI", "System", "Path", "." ) ** ** ** ProfileNum is used to read a numeric value from the specified .INI file, ** including logical values (stored as 0 or 1). ** ** Eg. nMaxUsers = ProfileNum( "TEST.INI", "System", "MaxUsers", 20 ) ** ** ProfileDate is used to read a date value from the specified .INI file. ** ( SetProfile stores dates in the format YYYYMMDD. ) ** ** Eg. dDownload = ProfileDate( "TEST.INI", "System", "LastDnld", DATE() ) ** ** ** SetProfile is used to store a value of any data type except objects, ** code blocks & arrays in the .INI file. ** ** lSuccess = SetProfile( "TEST.INI", "System", "MaxUsers", 20 ) ** ** ** FSEEK() modes for FoxPro #define FS_SET 0 && Seek from beginning of file #define FS_RELATIVE 1 && Seek from current file position #define FS_END 2 && Seek from end of file ** FOPEN() access modes for FoxPro #define FO_READ 0 && Open for reading buffered (default) #define FO_WRITE 1 && Open for writing buffered #define FO_READWRITE 2 && Open for reading or writing buffered #define FO_UREAD 10 && Open for reading unbuffered #define FO_UWRITE 11 && Open for writing unbuffered #define FO_UREADWRITE 12 && Open for reading or writing unbuffered ** FCREATE() file attribute modes for FoxPro #define FC_NORMAL 0 && Create normal read/write file (default) #define FC_READONLY 1 && Create read-only file #define FC_HIDDEN 2 && Create hidden file #define FC_RO_HIDDEN 3 && Read Only/Hidden #define FC_SYSTEM 4 && Create system file #define FC_SYS_RO 5 && Read Only/System #define FC_SYS_HID 6 && System/Hidden #define FC_SYS_ROH 7 && Read Only/Hidden/System ** define Carriage Return/Linefeed _CRLF #define _CRLF CHR(13) + CHR(10) ****************************** ** FUNCTION ProfileString ** ***************************************************************************** ** ** This function reads a string from the specified .INI file. ** ** Parameters: cFile - The .INI file name to be used ** cSection - The section from which to read ** cKey - The key value for which to search ** cDefault - The default value if not found (optional) ** ** Returns: cString - The string read from the file. ** FUNCTION ProfileString PARAMETERS cFile, cSection, cKey, cDefault ** cString := The string read from the file ** nHandle := File handle for the read ** cBuffer := Buffer for the read ** nFileLen := Length of the file in bytes ** nSecPos := Position in the file of the specified section ** cSecBuf := Section subtring ** nKeyPos := Position in the file of the specified key value ** cChar := Single character read from buffer PRIVATE cString,nHandle,cBuffer,nFileLen,nSecPos,cSecBuf,nKeyPos,cChar IF LEFT( cSection, 1 ) <> "[" cSection = "[" + cSection ENDIF IF RIGHT( cSection, 1 ) <> "]" cSection = cSection + "]" ENDIF IF EMPTY(cDefault) && was = NIL cDefault = "" ENDIF cString = cDefault ** ** If no extension is provided for the file, assume .INI. ** IF RAT( ".", cFile ) = 0 cFile = UPPER( ALLTRIM( cFile )) + ".INI" ENDIF nHandle = FOPEN( cFile, FO_READWRITE ) IF nHandle > 0 nFileLen = FSEEK( nHandle, 0, FS_END ) =FSEEK( nHandle, 0 , FS_SET ) cBuffer = SPACE( nFileLen ) ** ** Read in the entire file (.INI files should be less than 64K!). ** cBuffer = FREAD( nHandle, 64000 ) IF LEN(cBuffer) = nFileLen ** ** Determine the position in the buffer ** of the requested section. ** nSecPos = ATC( cSection, cBuffer ) IF nSecPos > 0 ** ** Extract the section from the buffer. ** cSecBuf = RIGHT( cBuffer, nFileLen - ( nSecPos + LEN( cSection ))) IF !EMPTY( cSecBuf ) ** ** Get the position of the end of the section... ** nSecPos = ATC( "[", cSecBuf ) ** ** ...and extract the section! ** IF nSecPos > 0 cSecBuf = LEFT( cSecBuf, nSecPos - 1 ) ENDIF ** ** Now find the key within the section. ** nKeyPos = ATC( cKey, cSecBuf ) IF nKeyPos > 0 ** ** Load the return string with the value ** until a carriage return is found. ** nKeyPos = nKeyPos + LEN( cKey ) + 1 cString = "" cChar = "" DO WHILE cChar <> CHR(13) cChar = SUBSTR( cSecBuf, nKeyPos, 1 ) IF cChar <> CHR(13) cString = cString + cChar nKeyPos = nKeyPos + 1 ENDIF ENDDO ENDIF ENDIF ENDIF ENDIF =FCLOSE( nHandle ) ENDIF RETURN cString ** ** EOP: ProfileString ** *************************** ** FUNCTION ProfileNum ** ***************************************************************************** ** ** This function reads a number from the specified .INI file. ** ** Parameters: cFile - The .INI file name to be used ** cSection - The section from which to read ** cKey - The key value for which to search ** nDefault - The default value if not found (optional) ** ** Returns: nValue - The numeric value read from the file. ** FUNCTION ProfileNum PARAMETERS cFile, cSection, cKey, nDefault ** cValue := Profile string read from file ** cDefault := Default value converted to string ** nValue := Profile string converted to numeric PRIVATE cValue,cDefault,nValue IF EMPTY(nDefault) && was = NIL nDefault = 0 ENDIF nValue = nDefault cDefault = ALLTRIM( STR( nDefault )) cValue = ProfileString( cFile, cSection, cKey, cDefault ) IF !EMPTY( cValue ) nValue = VAL( cValue ) ENDIF RETURN nValue ** ** EOP: ProfileNum ** **************************** ** FUNCTION ProfileDate ** ***************************************************************************** ** ** This function reads a date from the specified .INI file. ** ** Parameters: cFile - The .INI file name to be used ** cSection - The section from which to read ** cKey - The key value for which to search ** dDefault - The default date if not found (optional) ** ** Returns: dDate - The date value read from the file. ** FUNCTION ProfileDate PARAMETERS cFile, cSection, cKey, dDefault ** cDateFmt := Date format on entry ** cValue := Profile string read from file ** cDefault := Default value converted to string ** dDate := Profile string converted to numeric PRIVATE cDateFmt,cValue,cDefault,dDate IF TYPE( dDefault ) <> "D" dDefault = CTOD( "" ) ENDIF dDate = dDefault cDefault = ALLTRIM( DTOS( dDefault )) cValue = ProfileString( cFile, cSection, cKey, cDefault ) IF !EMPTY( cValue ) ** ** Try just converting the date as is. ** dDate = CTOD( cValue ) IF EMPTY( dDate ) ** ** If that doesn't work, convert ** using a standard date format. ** cDateFmt = SET( "DATE" ) SET DATE AMERICAN dDate = CTOD( SUBSTR( cValue, 5, 2 ) + "/" + RIGHT( cValue, 2 ) + ; "/" + LEFT( cValue, 4 )) SET DATE ( cDateFmt ) ENDIF ENDIF RETURN dDate ** ** EOP: ProfileDate ** *************************** ** FUNCTION SetProfile ** ***************************************************************************** ** ** This function writes a value to the .INI file specified. ** ** Parameters: cFile - The .INI file name to be used ** cSection - The section for which to search ** cKey - The key value for which to search ** xValue - The new value to be written ** ** Returns: .T. if successful, .F. otherwise. ** FUNCTION SetProfile PARAMETERS cFile, cSection, cKey, xValue ** lRetCode := Function's return code ** cType := Data type of the value ** cOldValue := Current value ** cNewValue := New value to be written ** nHandle := File handle for the read ** cBuffer := Buffer for the read ** nFileLen := Length of the file in bytes ** nSecStart := Start position in the file of the section ** nSecEnd := Ending position in the file of the section ** nSecLen := Initial length of the section ** cSecBuf := Section subtring ** nKeyStart := Start position in the file of the key ** nKeyEnd := Ending position in the file of the key ** nKeyLen := Initial length of the key ** lProceed := .T. if proceeding with the change ** cChar := Single character read from file PRIVATE lRetCode,cType,cOldValue,cNewValue,nHandle,cBuffer,nFileLen,; nSecStart,nSecEnd,nSecLen,cSecBuf,nKeyStart,nKeyEnd,nKeyLen,; lProceed,cChar IF LEFT( cSection, 1 ) <> "[" cSection = "[" + cSection ENDIF IF RIGHT( cSection, 1 ) <> "]" cSection = cSection + "]" ENDIF ** ** If no extension is provided for the file, assume .INI. ** IF RAT( ".", cFile ) = 0 cFile = UPPER( ALLTRIM( cFile )) + ".INI" ENDIF lRetcode = .F. lProceed = .F. nSecLen = 0 cType = TYPE( "xValue" ) DO CASE CASE cType = "C" cNewValue = xValue CASE cType = "N" **** changeded by PdF - must check for decimals or fails in FoxPro IF MOD(xValue,1) > 0 ** there are decimals - allow for 5 - extras will disapper in the trim cNewValue = ALLTRIM( STR( xValue,10,5 )) ELSE cNewValue = ALLTRIM( STR( xValue )) ENDIF CASE cType = "L" cNewValue = IIF( xValue, "1", "0" ) CASE cType = "D" cNewValue = DTOS( xValue ) OTHERWISE cNewValue = "" ENDCASE nHandle = FOPEN( cFile, FO_READ ) && FoxPro does not support Exclusive Open IF FERROR() = 2 nHandle = FCREATE( cFile, 0 ) ENDIF IF nHandle > 0 nFileLen = FSEEK( nHandle, 0, FS_END ) =FSEEK( nHandle, 0 , FS_SET ) cBuffer = SPACE( nFileLen ) ** ** Read in the entire file (.INI files should be less than 64K!). ** cBuffer = FREAD( nHandle, 64000 ) IF LEN(cBuffer) = nFileLen ** ** Determine the position in the buffer ** of the requested section. ** nSecStart = ATC( cSection, cBuffer ) IF nSecStart > 0 nSecStart = nSecStart + LEN( cSection ) + 2 && Length of cSection + CR/LF ** ** Extract the section from the buffer. ** cSecBuf = RIGHT( cBuffer, nFileLen - nSecStart + 1 ) IF !EMPTY( cSecBuf ) ** ** Get the position of the end of the section... ** nSecEnd = ATC( "[", cSecBuf ) ** ** ...and extract the section! ** IF nSecEnd > 0 cSecBuf = LEFT( cSecBuf, nSecEnd - 1 ) ENDIF nSecLen = LEN( cSecBuf ) ** ** Now find the key within the section. ** nKeyStart = ATC( cKey, cSecBuf ) IF nKeyStart > 0 ** ** Load the return string with the value ** until a carriage return is found. ** nKeyStart = nKeyStart + LEN( cKey ) + 1 nKeyEnd = nKeyStart cOldValue = "" cChar = "" DO WHILE cChar <> CHR(13) cChar = SUBSTR( cSecBuf, nKeyEnd, 1 ) IF cChar <> CHR(13) cOldValue = cOldValue + cChar nKeyEnd = nKeyEnd + 1 ENDIF ENDDO ** ** Change the old value to the new one. ** nKeyLen = LEN( cOldValue ) cSecBuf = STUFF( cSecBuf, nKeyStart, nKeyLen, cNewValue ) lProceed = .T. ELSE ** ** The key was not found - add it now! ** **cSecBuf = _CRLF + cKey + "=" + cNewValue + _CRLF cSecBuf = cKey + "=" + cNewValue + _CRLF + cSecBuf lProceed = .T. ENDIF ENDIF ELSE ** ** The section was not found - add it now! ** **cSecBuf = _CRLF + cSection + _CRLF + cKey + "=" + ; ** cNewValue + _CRLF cSecBuf = cSection + _CRLF + cKey + "=" + cNewValue + ; _CRLF + _CRLF lProceed = .T. ENDIF ENDIF IF lProceed ** ** Update the buffer with the new section. ** IF nSecStart = 0 nSecStart = LEN( cBuffer ) ENDIF cBuffer = STUFF( cBuffer, nSecStart, nSecLen, cSecBuf ) ** ** Replace the existing .INI file. ** =FCLOSE( nHandle ) nHandle = FCREATE( cFile, 0 ) IF FWRITE( nHandle, cBuffer ) = LEN( cBuffer ) lRetCode = .T. ENDIF ENDIF =FCLOSE( nHandle ) ENDIF RETURN lRetCode ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2004, 12:34 |
|
||
|
Пути к таблицам в базе данных.
|
|||
|---|---|---|---|
|
#18+
а я чиста создаю Config.FPW со строка DEFAULT= & PATH= ну и прочей настройкой :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2004, 12:51 |
|
||
|
Пути к таблицам в базе данных.
|
|||
|---|---|---|---|
|
#18+
А нельзя ли перенести папку "database" в папку с программой? Тогда все проблемы исчезнут. Set path to DATABASE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2004, 09:23 |
|
||
|
Пути к таблицам в базе данных.
|
|||
|---|---|---|---|
|
#18+
От:Igor Korolyov (k1i2v3@km.ru) Тема:Re: Динамический путь к базе данных View: Complete Thread (17 сообщений) Original Format Группы новостей:fido7.ru.visual.foxpro Дата:2003-07-16 16:28:16 PST Hi, Valentin! You wrote on Wed, 16 Jul 2003 05:47:35 +0000 (UTC): VJ> Прошу прощение за столь запоздалое сообщение. Пока я был в VJ> командировке, то в эхе в мае прошло обсуждение, не замеченное мною VJ> во-время. Речь идет о необычном способе указания пути к базе данных, о VJ> котором рассказал Александр Королев. Да вроде ничего необычного в нём нет... сам MS так рекомендует решать проблему с путями прописываемыми в свойствах объектов DE на этапе проектирования. КСТАТИ - если НЕ использовать DE то и проблемы не будет VJ> Я хотел бы спросить о некоторых моментах. VJ> Получается, что использование базы данных (то есть не свободных VJ> таблиц) заставляет использовать Data Environment, чтобы заменить через VJ> процедуру (показанную А.Королевым) путь к базе, записанный в файле .dbf VJ> при проектировании при привязке таблицы к базе, на новый путь, в VJ> котором находится база данных, установленная у конкретного пользователя VJ> на момент запуска программы. Не совсем. Нужно заменять ВСЕ пути - т.е. для объектов из БД (как таблиц, так и представлений!!!) заменять путь к БД (свойство Database), для свободных таблиц заменять путь к таблице (свойство CursorSource). Иначе на этапе выполнения может возникнуть ситуация а) - таблица/вью не может быть найдена в папке по умолчанию (SET DEFAULT) плюс относительный путь из свойств объекта из DE (там на самом деле чаще всего относительный путь и хранится, несмотря на то что в Property Sheet он раскрывается в полный путь) - тогда будет идти поиск в DEFAULT папке и по SET PATH. б) - вышеуказанная комбинация (или например абсолютный путь прописанный в DE - если скажем данные и сам проект были на разных дисках) приведёт нас к неверному местоположению, и к не тем данным, что мы думаем - очень часто в _ненаших_ конфах люди удивляются - чего это моя прога полезла не в реальную базу, а в мою отладочную копию В общем упорядочивать пути нужно! VJ> А обязательное использование Data Environment Это почему оно у тебя обязательное? Можно спокойно жить и без него :) Но уж если назвался груздём - полезай в короб VJ> заставляет использовать обьект приложения goApp (запускаемый в самом VJ> начале программы), Или иной глобально доступный объект (да хоть ты каждый раз открывай таблицу конфигурации и меняй пути - это уж твоё решение). хотя мне нравится считать пуи один раз и потом работать именно со свойствами goApp. VJ> чтобы сразу же иметь Data Environment и открывать VJ> таблицы вне форм. Вот этого я совсем не понял. Зачем тебе открывать DE вне форм ? Чтобы потом поиметь проблему "прицепления" свободно плавающей DE (точнее объекта Session) к запускаемой форме? Не знаю, не пробовал так извращаться... VJ> Hапример, если сразу все таблицы открываются в начале VJ> программы. Ну и что в этом хорошего? Тогда уж проще всё сложить в одну датасессию и мучаться с совместным доступом из разных форм к одним и тем-же курсорам (а проблем будет короб и ещё лукошко :))... VJ> Так ли это? Ну вот например как я заменяю пути к данным в DE форм и отчётов: DEFINE CLASS DEHook AS DataEnvironment Name = "DataEnvironment" __cversion = "0.17 от 18/4/2003 IK" PROCEDURE BeforeOpenTables IF TYPE ("m.goApp.Name") == "C" LOCAL loCursor, lcDBC, lnDSID m.lnDSID = SET ("Datasession") IF m.goApp._DEBeforeOpenTablesHook (This, m.lnDSID) * Не заблокировали в методе объекта приложения FOR EACH loCursor IN This.Objects IF "CURSOR" $ UPPER (m.loCursor.Class) IF EMPTY (m.loCursor.Database) * Свободная таблица IF m.goApp.oFreeTableList.Count > 0 AND ; m.goApp.oFreeTableList.GetKey (UPPER (JUSTSTEM (m.loCursor.CursorSource))) # 0 m.loCursor.CursorSource = m.goApp.oFreeTableList.Item (UPPER (JUSTSTEM (m.loCursor.CursorSource))) ELSE m.loCursor.CursorSource = FULLPATH (JUSTFNAME (m.loCursor.CursorSource)) * Если не зарегистрированна, то будет искаться по SET PATH ENDIF ELSE * Обзор или таблица БД IF m.goApp.oDBCList.Count > 0 AND ; m.goApp.oDBCList.GetKey (UPPER (JUSTSTEM (m.loCursor.Database))) # 0 m.loCursor.Database = m.goApp.oDBCList.Item (UPPER (JUSTSTEM (m.loCursor.Database))) ELSE m.loCursor.Database = FULLPATH (JUSTFNAME (m.loCursor.Database)) * Если не зарегистрированна, то будет искаться по SET PATH ENDIF ENDIF && EMPTY (m.loCursor.Database) ENDIF && "CURSOR" $ UPPER (m.loCursor.Class) ENDFOR ENDIF ENDIF ENDPROC ENDDEFINE Думаю с пониманием того как работает эта конструкция особых проблем не возникнет? m.goApp.oFreeTableList и m.goApp.oDBCList это глобально видимые коллекции, содержащие реальные пути к разным базам и свободным таблицам - для VFP8 коллекция - родной класс, для VFP7 я нарисовал несложный "эмулятор" - на 90% он соответствует VFP8 Collection - мне этого хватает :) Если нужно могу и его код кинуть... Ну кусок с вызовом m.goApp._DEBeforeOpenTablesHook() думаю не нуждается в комментариях - ведь и прикладному программисты наверняка захочется чего-то своего насовать в _каждый_ DE.BeforeOpenTables event... Хотя бы SET TALK OFF SET DELETED ON SET DATE TO ... SET CENTURY ON Ну и т.п. вот ему в классе App и сделан метод-хук :) >> Относительные пути в VFP >> Лучше всего не завязывать настройки путей с расположением exe, (даже >> относительно) >> Вручную прописывать не обязательно, гораздо проще написать процедуру, VJ> которую >> можно вызывать во всех формах в DataEnvironment.BeforeOpenTables (а еще VJ> лучше >> субклассировать DataEnvironment) Вот на субклассировании DE моя схема и работает - и если для VFP8 это документированная возможность, то для VFP6/7 используется обнаруженная Михаилом Дроздовым интересная баго-фича (но она стабильно работает, так что можно не боятся её использовать)... >> Процедура может выглядеть следующим образом (Пусть путь к БД хранится в [Sorry, skipped] >> Если используются несколько путей к разным БД, то код вышеприведенной VJ> функции >> надо будет несколько усложнить, но, надеюсь, идея понятна. Вот у меня и есть усложнённый вариант - можно иметь много разных БД и кроме того - много разных свободных таблиц (о чём не говорил Александр). WBR, Igor ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2004, 15:18 |
|
||
|
Пути к таблицам в базе данных.
|
|||
|---|---|---|---|
|
#18+
Опять придется лекцию прочитать :) Рекомендации по хранению файлов проекта и обращению к ним. Есть старое правило - никогда не хранить рабочие файлы вместе с исполняемыми. Например, документы, создаваемые в Word по умолчанию хранятся в специальной папке "Мои документы", в то время как сама программа Word расположена в одном из каталогов внутри папки "C:\Programm Files". Применительно к FoxPro это означает, что надо создать отдельную папку для хранения собственных проектов. Например: C:\ProjVFP\MyProj Т.е. предполагается, что в папке C:\ProjVFP может находится несколько папок с разными проектами. Тот проект с которым Вы в данный момент работаете находится в подкаталоге MyProj Теперь следует разделить файлы, которые будут созданы в проекте. Ведь Вы создаете самые разные файлы: Таблицы, Формы, Отчеты, классы и т.п. Если их распологать в одной куче (в одной папке), то очень легко запутаться. Стандартым способом разделения файлов является их разделение по типу - таблицы в одну папку, формы в другую, классы в третью и т.п. У этого способа есть существенный недостаток - при большом количестве файлов найти нужный становится очень проблематично. Лично я предпочитаю делить файлы по их логической принадлежности: Главные файлы, Файлы для работы с документами, Справочники и т.п. Хотя данные выделются в отдельную папку. Итого, структура каталога проекта имеет примерно следующий вид: MyProj\ MyProj\Data MyProj\Forms MyProj\Class ... В папке Data расположены файл базы данных и файлы таблиц. А что же расположено в коревом каталоге MyProj? А там распологается во-первых сам файл проекта (MyProj.PJX, MyProj.PJT), а во-вторых очень нужный файл конфигурации Config.FPW. Собственно и все. Прочие файлы распологают в корневом каталоге только в случае особой необходимости Config.fpw - это обычный текстовый файл. Его примерное внутреннее содержание следующее: CODEPAGE=1251 TITLE=Мой новый проект PATH=Data,Forms,Class MODIFY PROJECT MyProj.pjx Если запустить среду FoxPro с этим файлом конфигурации, то в заголовке основного окна появится вместо "Visual FoxPro" тот текст, который идет за ключевым словом TITLE, будут настроены пути доступа и открыт проект MyProj.pjx Чтобы сделать запуск среды FoxPro с этим файлом кофигурации автоматическим создайте специальный ярлык где в сделайте следующие настройки (Это настройки для VFP6) Файл "C:\Program Files\Microsoft Visual Studio\Vfp98\VFP6.EXE" -T -C"C:\ProjVFP\MyProj\config.fpw" Рабочий каталог "C:\ProjVFP\MyProj\" И открывайте свой проект через этот ярлык Для чего в файле конфигурации указаны пути доступа. Все дело в том, что после сборки проекта в один EXE, все файлы включенные внутрь проекта будут распологаться как бы в одной (текущей) папке, а не как они были расположены в проекте (в папках Forms, Class и т.п.). Это значит, что обращения типа DO FORM Forms\MyForm.scx Успешно работающие на этапе отладки перестанут работать в готовом EXE, поскольку там просто не будет папки Forms. Вот для предотвращения подобных недоразумений и следует указывать путь доступа к файлам. Указание пути доступа позволяет писать команды так, как-будто файлы находятся в текущей директории, хотя физически это и не так. FoxPro сам их найдет по указанным путям доступа DO FORM MyForm.scx Впрочем, все это имеет принципиально важное значение не столько для файлов включенных внутрь проекта, сколько для файлов поставляемых вместе с проектом. В первую очередь для таблиц. Здесь логика будет абсолютно та же самая. Например, для открытия таблицы надо будет использовать синтаксис USE MyTable.dbf Хотя физически таблицы на этапе отладки расположены в папке Data, но указывать путь доступа явно нет необходимости. FoxPro сам найдет эту таблицу ориентируясь на пути прописанные в файле конфигурации. Когда вы соберете готовый EXE файл конфигурации для него уже будет другой, ведь у клиента нет исходных файлов, да и самого проекта тоже, есть только готовый EXE и таблицы, т.е. содержиме файла конфигурации, который Вы поставите клиенту примет примерно следующий вид CODEPAGE=1251 PATH=Data Путь доступа нужен на тот случай, если данные распологаются в каком-то другом каталоге, а не в том, где лежит собственно EXE (как оно обычно и бывает). Тогда встречая команды вроде USE MyTable.dbf FoxPro будет искать таблицы по путям указанным в файле конфигурации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2004, 15:20 |
|
||
|
Пути к таблицам в базе данных.
|
|||
|---|---|---|---|
|
#18+
Последнее письмо было написано в этом форуме "ВладимирМ". Я вас умоляю, Муля, заходите иногда в поиск ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2004, 15:22 |
|
||
|
Пути к таблицам в базе данных.
|
|||
|---|---|---|---|
|
#18+
Ну Вы тут и "навернули" круто! Если кто желает, то можно немного и попроще (но с учетом того, что сказал "Васек"): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. Далее открываем базу данных: Код: plaintext И везде в DE без проблем используем то, что надо... После компиляции у клиентов все будет находиться, если только правильно указать все пути и положить config.fpw... но это уже повторение... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2004, 23:30 |
|
||
|
|

start [/forum/topic.php?fid=41&gotonew=1&tid=1597266]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
125ms |
get topic data: |
8ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 437ms |

| 0 / 0 |
