<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:yandex="http://news.yandex.ru" xmlns:media="http://search.yahoo.com/mrss/" xmlns:turbo="http://turbo.yandex.ru">
	<channel>
		<title>Visual FoxPro Club</title>
		<link>https://foxclub.ru</link>
		<description>Visual FoxPro Club</description>
		<language>ru</language>
		<turbo:cms_plugin>7391CC2B1408947EFD5084459F5BD0CA</turbo:cms_plugin>
																	<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/thor-rasshirenie-vozmozhnostej-ide-fox/</link>
					<title><![CDATA[Thor – расширение возможностей IDE Fox]]></title>
                    					    <author><![CDATA[Михаил Леменёв]]></author>
                    										    <pubDate>Mon, 09 Dec 2024 06:53:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Thor – расширение возможностей IDE Fox</h1>
													</header>
													<p>Thor – это инструмент для управления дополнительными инструментами в IDE Fox, управления меню и назначениями горячих клавиш для инструментов IDE Fox.</p>
<p>Скачать программу Thor можно здесь:<br />
<a href="https://github.com/VFPX/Thor">https://github.com/VFPX/Thor</a></p>
<p>Скачать дополнительные инструменты для Thor можно здесь:<br />
<a href="https://github.com/VFPX/ThorRepository">https://github.com/VFPX/ThorRepository</a></p>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5175">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 недели</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5175">Михаил Леменёв</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Михаил Леменёв" href="https://foxclub.ru/account/?user=5175">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/5175-70x70.jpg?ver=1705144579' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/5175-150x150.jpg?ver=1705144579 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 9<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-10-2022        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/thor-rasshirenie-vozmozhnostej-ide-fox/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/biblioteka-programm-vfp2c32/</link>
					<title><![CDATA[Библиотека программ VFP2C32]]></title>
                    					    <author><![CDATA[Михаил Леменёв]]></author>
                    										    <pubDate>Mon, 25 Nov 2024 10:19:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Библиотека программ VFP2C32</h1>
													</header>
													<p>VFP2C32 (аббревиатура от "VFP to C 32 bit") — это мост между Visual Foxpro и языком программирования C.<br />
Кроме того, он содержит оболочки вокруг многих функций Windows API.<br />
С помощью этой библиотеки вы можете создавать любые типы данных C — структуры, объединения, массивы — из VFP.<br />
Создание классов-оболочек для типов структур или объединений C объясняется в теме VFP2C32Front.<br />
Оболочки Windows API позволяют использовать широкий спектр встроенных в Windows функций.</p>
<p>Обзор функций по категориям.</p>
<p>• Функции, работающие с собственными массивами VFP.<br />
• Функции для преобразования курсоров и массивов VFP в массивы в стиле C и наоборот.<br />
• Эмуляция функции обратного вызова C и асинхронные события.<br />
• Функции манипулирования памятью для эмуляции структур C.<br />
• Функции, связанные с COM/OLE.<br />
• Некоторые общие диалоги.<br />
• Различные функции преобразования.<br />
• Функции, предоставляющие информацию о часовых поясах, преобразуют значения даты и времени в распространенные типы C и обратно.<br />
• Извлекайте информацию или манипулируйте файлами и каталогами.<br />
• Общие библиотечные функции.<br />
• Расширенные функции низкоуровневой обработки файлов.<br />
• Распределение памяти.<br />
• Различные полезные функции.<br />
• Все, что передается по сети.<br />
• Расширенные функции ODBC.<br />
• Предоставляет информацию о принтерах.<br />
• Предоставляет информацию о процессах, запущенных в системе.<br />
• Управление подключениями RAS (удалённого доступа).<br />
• API для управления реестром.<br />
• Извлечение информации о ресурсах в модулях (dll и исполняемых файлах).<br />
• Получение информации и управление службами Windows.<br />
• Обертки вокруг нескольких функций оболочки Windows.<br />
• Получение информации о системе.<br />
• Получение информации о томах.<br />
• Получение информации об окнах.</p>
<p>Скачать исходные тексты и примеры можно здесь: https://github.com/ChristianEhlscheid/vfp2c32</p>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5175">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 недели</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5175">Михаил Леменёв</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Михаил Леменёв" href="https://foxclub.ru/account/?user=5175">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/5175-70x70.jpg?ver=1705144579' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/5175-150x150.jpg?ver=1705144579 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 9<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-10-2022        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/biblioteka-programm-vfp2c32/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/poluchenie-i-obnovlenie-dannyh-s-pomoshhyu-cursoradapters/</link>
					<title><![CDATA[Получение и обновление данных с помощью CursorAdapters]]></title>
                    					    <author><![CDATA[Михаил Леменёв]]></author>
                    										    <pubDate>Tue, 06 Aug 2024 06:36:46 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Получение и обновление данных с помощью CursorAdapters</h1>
													</header>
													<p>Дуг Хенниг</p>
<blockquote>
<p>Новый базовый класс CursorAdapter, добавленный в VFP 8, обеспечивает простой в использовании и согласованный интерфейс для данных. В статье этого месяца показано, как использовать CursorAdapter для доступа к локальным и удаленным данным через ODBC, ADO и XML, а также обсуждаются конкретные требования и «подводные камни» для каждого из них.</p>
</blockquote>
<p>Как я уже говорил в статье <a href="/knowledgebase/adaptirujte-svoi-kursory-k-cursoradapters/">«Адаптируйте свои курсоры к CursorAdapters»,</a>  одной из самых важных и интересных новых возможностей VFP 8 является новый базовый класс CursorAdapter. В прошлом месяце мы рассмотрели свойства, события и методы CursorAdapter и обсудили его преимущества по сравнению с использованием удаленных представлений, сквозной передачи SQL (SPT), ADO и XML.</p>
<p>Прежде чем вы начнете использовать CursorAdapter, вы должны знать об особых требованиях класса, когда вы используете его для доступа к собственным данным или удаленным данным через ODBC, ADO и XML. В статье этого месяца приводятся подробные сведения о каждом типе источника данных.</p>
<h3>Использование собственных данных</h3>
<p>Хотя ясно, что CursorAdapter предназначен для стандартизации и упрощения доступа к данным, не относящимся к VFP, вы можете использовать его вместо Cursor, установив для свойства DataSourceType значение «Native». Зачем тебе это? В основном, как взгляд в будущее, когда ваше приложение может быть увеличено; просто изменив DataSourceType на один из других вариантов (и, вероятно, изменив несколько других свойств, таких как настройка информации о соединении), вы можете легко переключиться на другое ядро базы данных, такое как SQL Server.</p>
<p>Когда для DataSourceType установлено значение «Native», VFP игнорирует свойство DataSource. SelectCmd должен быть оператором SQL SELECT, а не командой или выражением USE, поэтому это означает, что вы всегда работаете с эквивалентом локального представления, а не непосредственно с таблицей. Вы несете ответственность за то, чтобы VFP мог найти любые таблицы, на которые ссылается оператор SELECT, поэтому, если таблицы не находятся в текущем каталоге, вам нужно либо указать путь, либо открыть базу данных, к которой принадлежат таблицы. Как обычно, если вы хотите, чтобы курсор был обновляемым, обязательно установите свойства обновления (KeyFieldList, Tables, UpdatableFieldList и UpdateNameList).<br />В следующем примере (NativeExample.prg, включенном в загрузку для подписчиков в этом месяце) создается обновляемый курсор из таблицы Customer в образце базы данных TestData VFP:</p>
<pre><pre class='bbcode'>  local loCursor as CursorAdapter, ;  
  	laErrors[1]  
  open database (_samples + 'data\testdata')  
  loCursor = createobject('CursorAdapter')  
  with loCursor  
  	.Alias = 'customercursor'  
  	.DataSourceType = 'Native'  
  	.SelectCmd = ;  
  		"select CUST_ID, COMPANY, CONTACT from CUSTOMER " + ;  
  		"where COUNTRY = 'Brazil'"  
  	.KeyFieldList = 'CUST_ID'  
  	.Tables = 'CUSTOMER'  
  	.UpdatableFieldList = 'CUST_ID, COMPANY, CONTACT'  
  	.UpdateNameList = 'CUST_ID CUSTOMER.CUST_ID, ' + ;  
  		'COMPANY CUSTOMER.COMPANY, CONTACT CUSTOMER.CONTACT'  
  	if .CursorFill()  
  		browse  
  		tableupdate(1)  
  	else  
  		aerror(laErrors)  
  		messagebox(laErrors[2])  
  	endif .CursorFill()  
  endwith  
  close databases all  
</pre></pre>
<h3>Использование ODBC</h3>
<p>ODBC на самом деле является самой простой из четырех настроек DataSourceType. Вы устанавливаете DataSource в открытый дескриптор соединения ODBC, устанавливаете обычные свойства и вызываете CursorFill для извлечения данных. Если вы заполните KeyFieldList, Tables, UpdatableFieldList и UpdateNameList, VFP автоматически сгенерирует соответствующие операторы UPDATE, INSERT и DELETE для обновления серверной части с учетом любых изменений. Если вместо этого вы хотите использовать хранимую процедуру, установите свойства *Cmd, *CmdDataSource и *CmdDataSourceType соответствующим образом (замените «*» на «Delete», «Insert» и «Update»).</p>
<p>Вот пример, взятый из ODBCExample.prg, который вызывает хранимую процедуру CustOrderHist в базе данных Northwind, поставляемой с SQL Server, для получения общего количества проданных единиц продукта для конкретного клиента:</p>
<pre><pre class='bbcode'>  local lcConnString, ;  
  	loCursor as CursorAdapter, ;  
  	laErrors[1]  
  lcConnString = 'driver=SQL Server;server=(local); ' + ;  
  	'database=Northwind;uid=sa;pwd=;trusted_connection=no'  
 * измените пароль на соответствующее значение для вашей базы данных  
  loCursor = createobject('CursorAdapter')  
  with loCursor  
  	.Alias = 'CustomerHistory'  
  	.DataSourceType = 'ODBC'  
  	.DataSource = sqlstringconnect(lcConnString)  
  	.SelectCmd = "exec CustOrderHist 'ALFKI'"  
  	if .CursorFill()  
  		browse  
  	else  
  		aerror(laErrors)  
  		messagebox(laErrors[2])  
  	endif .CursorFill()  
  endwith  
</pre></pre>
<h3>Использование ADO</h3>
<p>Использование ADO в качестве механизма доступа к данным с CursorAdapter имеет несколько больше проблем, чем использование ODBC:</p>
<ul>
<li>DataSource должен быть установлен в ADO RecordSet, в котором свойство ActiveConnection установлено на открытый объект ADO Connection.</li>
<li>Если вы хотите использовать параметризованный запрос (что, скорее всего, является обычным случаем, а не получением всех записей), вы должны передать объект ADO Command, свойство ActiveConnection которого установлено на открытый объект ADO Connection в качестве четвертого параметра CursorFill. VFP позаботится о заполнении коллекции Parameters объекта Command (он анализирует SelectCmd, чтобы найти параметры) для вас, но, конечно, переменные, содержащие значения параметров, должны быть в области видимости.</li>
<li>Использовать один CursorAdapter с ADO в DataEnvironment очень просто: вы можете установить для UseDEDataSource значение .T., при желании установите свойства DataSource и DataSourceType для DataEnvironment, как если бы вы использовали CursorAdapter. Однако это не работает, если в DataEnvironment имеется более одного CursorAdapter. Причина в том, что набор записей ADO, на который ссылается DataEnvironment.DataSource, может содержать только данные одного CursorAdapter; когда вы вызываете CursorFill для второго CursorAdapter, вы получаете ошибку «RecordSet уже открыт». Таким образом, если в вашем DataEnvironment имеется более одного CursorAdapter, вы должны установить для UseDEDataSource значение .F и самостоятельно управлять свойствами DataSource и DataSourceType каждого CursorAdapter (или, возможно, использовать подкласс DataEnvironment, который управляет этим за вас).</li>
</ul>
<p>В приведенном ниже примере кода, взятом из ADOExample.prg, показано, как получить данные с помощью параметризованного запроса с помощью объекта ADO Command. В этом примере также показано использование новых структурированных функций обработки ошибок в VFP 8; вызов метода ADO Connection Open заключен в оператор TRY ... CATCH ... ENDTRY для перехвата ошибки COM, которую метод выдаст в случае сбоя.</p>
<pre><pre class='bbcode'>  local loConn as ADODB.Connection, ;  
  	loCommand as ADODB.Command, ;  
  	loException as Exception, ;  
  	loCursor as CursorAdapter, ;  
  	lcCountry, ;  
  	laErrors[1]  
  loConn = createobject('ADODB.Connection')  
  with loConn  
  	.ConnectionString = ;  
  		'provider=SQLOLEDB.1;data source=(local);' + ;  
  		'initial catalog=Northwind;uid=sa;pwd=;' + ;  
  		'trusted_connection=no'  
 	* изменить пароль на соответствующее значение для вашей базы данных  
  	try  
  		.Open()  
  	catch to loException  
  		messagebox(loException.Message)  
  		cancel  
  	endtry  
  endwith  
  loCommand = createobject('ADODB.Command')  
  loCursor = createobject('CursorAdapter')  
  with loCursor  
  	.Alias = 'Customers'  
  	.DataSourceType = 'ADO'  
  	.DataSource = createobject('ADODB.RecordSet')  
  	.SelectCmd = ;  
  		'select * from customers where country=?lcCountry'  
  	lcCountry = 'Brazil'  
  	.DataSource.ActiveConnection = loConn  
  	loCommand.ActiveConnection = loConn  
  	if .CursorFill(.F., .F., 0, loCommand)  
  		browse  
  	else  
  		aerror(laErrors)  
  		messagebox(laErrors[2])  
  	endif .CursorFill(.F., .F., 0, loCommand)  
  endwith  
    
</pre></pre>
<h3>Использование XML</h3>
<p>Использование XML с CursorAdapters требует некоторых дополнительных вещей. Вот проблемы:</p>
<ul>
<li>Свойство DataSource игнорируется.</li>
<li>Свойство CursorSchema должно быть заполнено, даже если вы передаете .F. в качестве первого параметра метода CursorFill, иначе вы получите сообщение об ошибке.</li>
<li>Для свойства SelectCmd должно быть задано выражение, такое как определяемая пользователем функция (UDF) или имя метода объекта, которое возвращает XML для курсора.</li>
<li>Изменения, внесенные в курсор, преобразуются в DiffGram, который представляет собой XML, содержащий значения до и после измененных полей и записей, и помещаются в свойство DiffGram, когда требуется обновление.</li>
<li>Чтобы записать изменения обратно в источник данных, для параметра UpdateCmdDataSourceType должно быть установлено значение «XML», а для параметра UpdateCmd должно быть задано выражение (опять же, вероятно, UDF или метод объекта), которое обрабатывает обновление. Вы, вероятно, захотите передать «This.DiffGram» в UDF, чтобы он мог отправить изменения в источник данных.</li>
</ul>
<p>Источник XML для курсора может поступать из разных мест. Например, вы можете вызвать UDF, который преобразует курсор VFP в XML с помощью CURSORTOXML() и возвращает результаты:</p>
<pre>use CUSTOMERS
cursortoxml('customers', 'lcXML', 1, 8, 0, '1')
return lcXML</pre>
<p>Пользовательская функция может вызывать веб-службу, которая возвращает набор результатов в виде XML. Вот пример, который IntelliSense сгенерировал для меня из веб-службы, которую я создал и зарегистрировал в своей собственной системе (детали не важны, это просто пример веб-службы).</p>
<pre><pre class='bbcode'>    
  loWS = newobject('Wsclient', ;  
  	home() + 'ffc\_webservices.vcx')  
  loWS.cWSName = 'dataserver web service'  
  loWS = loWS.SetupClient('http://localhost/' + ;  
  	'SQDataServer/dataserver.WSDL', 'dataserver', ;  
  	'dataserverSoapPort')  
  lcXML = loWS.GetCustomers()  
  return lcXML  
    
</pre></pre>
<p>Он может использовать SQLXML 3.0 для выполнения запроса SQL Server 2000, хранящегося в файле шаблона на веб-сервере (для получения дополнительной информации о SQLXML перейдите на <a href="http://msdn.microsoft.com/">http://msdn.microsoft.com </a>и выполните поиск SQLXML). В следующем коде объект MSXML2.XMLHTTP используется для получения всех записей из таблицы клиентов Northwind через HTTP; это будет объяснено более подробно позже.</p>
<pre><pre class='bbcode'>    
  local loXML as MSXML2.XMLHTTP  
  loXML = createobject('MSXML2.XMLHTTP')  
  loXML.open('POST', 'http://localhost/northwind/ ' + ;  
        'template/getallcustomers.xml, .F.)'  
  loXML.setRequestHeader('Content-type', 'text/xml')  
  loXML.send()  
  return loXML.responseText  
    
</pre></pre>
<p>Обработка обновлений более сложная. Источник данных должен либо быть способен принимать и использовать DiffGram (как в случае с SQL Server 2000), либо вам придется самостоятельно выяснять изменения и выполнять ряд операторов SQL (UPDATE, INSERT и DELETE), чтобы выполнить обновления.</p>
<p>Вот пример (XMLExample.prg), в котором CursorAdapter используется с источником данных XML. Обратите внимание, что и SelectCmd, и UpdateCmd вызывают пользовательские функции. В случае SelectCmd извлекаемый идентификатор клиента передается пользовательской функции GetNWCustomers, которую мы рассмотрим чуть позже. Для UpdateCmd VFP передал свойство DiffGram в SendNWXML, которое мы также рассмотрим позже.</p>
<pre><pre class='bbcode'>  local loCustomers as CursorAdapter, ;  
  	laErrors[1]  
  loCustomers = createobject('CursorAdapter')  
  with loCustomers  
  	.Alias = 'Customers'  
  	.CursorSchema = ;  
  		'CUSTOMERID C(5), COMPANYNAME C(40), ' + ;  
  		'CONTACTNAME C(30), CONTACTTITLE C(30), ' + ;  
  		'ADDRESS C(60), CITY C(15), REGION C(15), ' + ;  
  		'POSTALCODE C(10), COUNTRY C(15), ' + ;  
  		'PHONE C(24), FAX C(24)'  
  	.DataSourceType = 'XML'  
  	.KeyFieldList = 'CUSTOMERID'  
  	.SelectCmd = 'GetNWCustomers([ALFKI])'  
  	.Tables = 'CUSTOMERS'  
  	.UpdatableFieldList = ;  
  		'CUSTOMERID, COMPANYNAME, CONTACTNAME, ' + ;  
  		'CONTACTTITLE, ADDRESS, CITY, REGION, ' + ;  
  		'POSTALCODE, COUNTRY, PHONE, FAX'  
  	.UpdateCmdDataSourceType = 'XML'  
  	.UpdateCmd = 'SendNWXML(This.DiffGram)'  
  	.UpdateNameList = ;  
  		'CUSTOMERID CUSTOMERS.CUSTOMERID, ' + ;  
  		'COMPANYNAME CUSTOMERS.COMPANYNAME, ' + ;  
  		'CONTACTNAME CUSTOMERS.CONTACTNAME, ' + ;  
  		'CONTACTTITLE CUSTOMERS.CONTACTTITLE, ' + ;  
  		'ADDRESS CUSTOMERS.ADDRESS, ' + ;  
  		'CITY CUSTOMERS.CITY, ' + ;  
  		'REGION CUSTOMERS.REGION, ' + ;  
  		'POSTALCODE CUSTOMERS.POSTALCODE, ' + ;  
  		'COUNTRY CUSTOMERS.COUNTRY, ' + ;  
  		'PHONE CUSTOMERS.PHONE, ' + ;  
  		'FAX CUSTOMERS.FAX'  
  	if .CursorFill(.T.)  
  		browse  
  	else  
  		aerror(laErrors)  
  		messagebox(laErrors[2])  
  	endif .CursorFill(.T.)  
  endwith  
    
</pre></pre>
<p>Вот код для GetNWCustomers. Он использует объект MSXML2.XMLHTTP для доступа к XML-шаблону SQL Server 2000 с именем CustomersByID.xml на веб-сервере и возвращает результаты. Идентификатор клиента, который необходимо получить, передается в качестве параметра этому коду.</p>
</p>


<pre class="wp-block-preformatted"><pre class='bbcode'>  lparameters tcCustID  
  local loXML as MSXML2.XMLHTTP  
  loXML = createobject('MSXML2.XMLHTTP')  
  loXML.open('POST', 'http://localhost/northwind/' + ;  
  	'template/customersbyid.xml?customerid=' + tcCustID, ;  
  	.F.)  
  loXML.setRequestHeader('Content-type', 'text/xml')  
  loXML.send()  
  return loXML.responseText  
</pre>
</pre>



<p>Обработка обновлений более сложная. Источник данных должен либо быть способен принимать и использовать DiffGram (как в случае с SQL Server 2000), либо вам придется самостоятельно выяснять изменения и выполнять ряд операторов SQL (UPDATE, INSERT и DELETE), чтобы выполнить обновления.</p>
<p>Вот пример (XMLExample.prg), в котором CursorAdapter используется с источником данных XML. Обратите внимание, что и SelectCmd, и UpdateCmd вызывают пользовательские функции. В случае SelectCmd извлекаемый идентификатор клиента передается пользовательской функции GetNWCustomers, которую мы рассмотрим чуть позже. Для UpdateCmd VFP передал свойство DiffGram в SendNWXML, которое мы также рассмотрим позже.<br><br></p>



<pre class="wp-block-code"><code>local loCustomers as CursorAdapter, ;
	laErrors&#091;1]
loCustomers = createobject('CursorAdapter')
with loCustomers
	.Alias = 'Customers'
	.CursorSchema = ;
		'CUSTOMERID C(5), COMPANYNAME C(40), ' + ;
		'CONTACTNAME C(30), CONTACTTITLE C(30), ' + ;
		'ADDRESS C(60), CITY C(15), REGION C(15), ' + ;
		'POSTALCODE C(10), COUNTRY C(15), ' + ;
		'PHONE C(24), FAX C(24)'
	.DataSourceType = 'XML'
	.KeyFieldList = 'CUSTOMERID'
	.SelectCmd = 'GetNWCustomers(&#091;ALFKI])'
	.Tables = 'CUSTOMERS'
	.UpdatableFieldList = ;
		'CUSTOMERID, COMPANYNAME, CONTACTNAME, ' + ;
		'CONTACTTITLE, ADDRESS, CITY, REGION, ' + ;
		'POSTALCODE, COUNTRY, PHONE, FAX'
	.UpdateCmdDataSourceType = 'XML'
	.UpdateCmd = 'SendNWXML(This.DiffGram)'
	.UpdateNameList = ;
		'CUSTOMERID CUSTOMERS.CUSTOMERID, ' + ;
		'COMPANYNAME CUSTOMERS.COMPANYNAME, ' + ;
		'CONTACTNAME CUSTOMERS.CONTACTNAME, ' + ;
		'CONTACTTITLE CUSTOMERS.CONTACTTITLE, ' + ;
		'ADDRESS CUSTOMERS.ADDRESS, ' + ;
		'CITY CUSTOMERS.CITY, ' + ;
		'REGION CUSTOMERS.REGION, ' + ;
		'POSTALCODE CUSTOMERS.POSTALCODE, ' + ;
		'COUNTRY CUSTOMERS.COUNTRY, ' + ;
		'PHONE CUSTOMERS.PHONE, ' + ;
		'FAX CUSTOMERS.FAX'
	if .CursorFill(.T.)
		browse
	else
		aerror(laErrors)
		messagebox(laErrors&#091;2])
	endif .CursorFill(.T.)
endwith

</code></pre>



<p>Вот код для GetNWCustomers. Он использует объект MSXML2.XMLHTTP для доступа к XML-шаблону SQL Server 2000 с именем CustomersByID.xml на веб-сервере и возвращает результаты. Идентификатор клиента, который необходимо получить, передается в качестве параметра этому коду.<br /><br /></p>



<pre class="wp-block-code"><code>lparameters tcCustID
local loXML as MSXML2.XMLHTTP
loXML = createobject('MSXML2.XMLHTTP')
loXML.open('POST', 'http://localhost/northwind/' + ;
	'template/customersbyid.xml?customerid=' + tcCustID, ;
	.F.)
loXML.setRequestHeader('Content-type', 'text/xml')
loXML.send()
return loXML.responseText
</code></pre>



<pre class="wp-block-preformatted"></pre>



<p>Шаблон XML, на который ссылается этот код, CustomersByID.XML, выглядит следующим образом:</p>



<pre class="wp-block-preformatted">&lt;root xmlns:sql="urn:schemas-microsoft-com:xml-sql"&gt;
	&lt;sql:header&gt;
		&lt;sql:param name="customerid"&gt;
		&lt;/sql:param&gt;
	&lt;/sql:header&gt;
	&lt;sql:query client-side-xml="0"&gt;
		SELECT *
		FROM Customers
		WHERE CustomerID = @customerid
		FOR XML AUTO
	&lt;/sql:query&gt;
&lt;/root&gt;
</pre>



<p>Поместите этот файл в виртуальный каталог базы данных Northwind (см. врезку «Настройка SQL Server 2000 XML Access» для получения подробной информации о настройке IIS для работы с SQL Server, а также конкретных сведений, необходимых для этой статьи).</p>



<p>SendNWXML похож на GetNWCustomers, за исключением того, что он ожидает передачи DiffGram, загружает DiffGram в объект MSXML2.DOMDocument и передает этот объект веб-серверу, который, в свою очередь, передает его через SQLXML в SQL Server 2000 для обработки.</p>



<pre class="wp-block-preformatted">lparameters tcDiffGram
local loDOM as MSXML2.DOMDocument, ;
	loXML as MSXML2.XMLHTTP
loDOM = createobject('MSXML2.DOMDocument')
loDOM.async = .F.
loDOM.loadXML(tcDiffGram)
loXML = createobject('MSXML2.XMLHTTP')
loXML.open('POST', 'http://localhost/northwind/', .F.)
loXML.setRequestHeader('Content-type', 'text/xml')
loXML.send(loDOM)
</pre>



<p>Чтобы увидеть, как это работает, запустите XMLExample.prg. Вы должны увидеть одну запись (клиент ALFKI) в окне просмотра. Измените значение в каком-либо поле, затем закройте окно и снова запустите PRG. Вы должны увидеть, что ваше изменение было записано в бэкэнд.</p>



<p><a>Резюме</a></p>



<p>Хотя базовый класс CursorAdapter обеспечивает согласованный интерфейс для удаленных данных независимо от того, используете ли вы ODBC, ADO или XML, существуют некоторые различия в настройке CursorAdapter в зависимости от выбранного механизма доступа к данным. Эти различия обусловлены требованиями самих механизмов доступа к данным.</p>



<p>В следующем месяце мы завершим изучение CursorAdapter, создав несколько повторно используемых классов данных и обсудив, как использовать CursorAdapter в отчетах.</p>



<p><em>Дуг Хенниг является партнером </em><em>Stonefield </em><em>Systems </em><em>Group </em><em>Inc. Он является автором отмеченных наградами инструментов </em><em>Stonefield </em><em>Database </em><em>Toolkit (</em><em>SDT) и </em><em>Stonefield </em><em>Query, соавтором книг «Что нового в </em><em>Visual </em><em>FoxPro 7.0» и «Руководства хакера по </em><em>Visual </em><em>FoxPro». 7.0», как от </em><em>Hentzenwerke </em><em>Publishing, так и от автора «Словаря данных </em><em>Visual </em><em>FoxPro» в серии </em><em>Pros </em><em>Talk </em><em>Visual </em><em>FoxPro от </em><em>Pinnacle </em><em>Publishing. </em><em>Он был техническим редактором «Руководства хакера по </em><em>Visual</em><em> </em><em>FoxPro</em><em> 6.0» и «Основы» издательства </em><em>Hentzenwerke</em><em> </em><em>Publishing</em><em>. Дуг выступал на каждой конференции разработчиков </em><em>Microsoft</em><em> </em><em>FoxPro</em><em> (</em><em>DevCon</em><em>) с 1997 года, а также на пользовательских группах и конференциях разработчиков по всей Северной Америке. </em><em>Он является Microsoft Most Valuable Professional (MVP) и Certified Professional (MCP). </em><em>Интернет: <a href="http://www.stonefield.com">www.stonefield.com </a></em><em>и <a href="http://www.stonefieldquery.com">www.stonefieldquery.com </a></em><em>Электронная почта: <a href="mailto:dhennig@stonefield.com">dhennig@stonefield.com</a></em><em></em></p>



<p><a>Настройка </a>XML-доступа к SQL Server 2000</p>



<p>Чтобы получить доступ к SQL Server 2000 с помощью URL-адреса в браузере или другом HTTP-клиенте, вам нужно сделать несколько вещей. Во-первых, вам необходимо загрузить и установить SQLXML 3.0 с веб-сайта MSDN <a href="http://msdn.microsoft.com/">(http://msdn.microsoft.com; </a>выполните поиск «SQLXML», а затем выберите ссылку для загрузки).</p>



<p>Далее вам нужно настроить виртуальный каталог IIS. Для этого выберите ярлык «Настроить поддержку IIS» в папке SQLXML 3.0 в разделе «Пуск», «Программы» на панели задач Windows. Разверните узел своего сервера, выберите веб-узел для работы, затем щелкните правой кнопкой мыши и выберите «Создать», «Виртуальный каталог». На вкладке Общие в появившемся диалоговом окне введите имя виртуального каталога и его физический путь. В этой статье используйте «Борей» в качестве имени виртуального каталога и «NorthwindTemplates» в качестве физического каталога. С помощью проводника Windows создайте физический каталог где-нибудь в вашей системе и создайте в нем подкаталог под названием «Шаблон» (мы будем использовать этот подкаталог чуть позже). Скопируйте два файла шаблонов GetAllCustomers.xml и CustomersByID.xml, включенные в загрузку для подписчиков в этом месяце, в подкаталог Template.</p>



<p>На вкладке «Безопасность» введите соответствующую информацию для доступа к SQL Server, например имя пользователя и пароль или конкретный механизм проверки подлинности, который вы хотите использовать. На вкладке Источник данных выберите SQL Server и, при желании, базу данных для использования. В качестве примера для этой статьи выберите базу данных Northwind. На вкладке «Настройки» выберите нужные параметры, но как минимум включите «Разрешить запросы шаблонов» и «Разрешить POST».</p>



<p>На вкладке «Виртуальные имена» выберите «шаблон» в поле со списком «Тип» и введите виртуальное имя (в этой статье используйте «шаблон») и физический путь (который должен быть подкаталогом виртуального каталога; в этой статье используйте «Шаблон ») для использования в шаблонах. Нажмите «ОК».</p>



<p>Чтобы убедиться, что все настроено правильно, мы получим доступ к SQL Server, используя файл шаблона GetAllCustomers.xml, который вы скопировали в подкаталог Template. Он имеет следующее содержание:</p>



<pre class="wp-block-code"><code>&lt;root xmlns:sql="urn:schemas-microsoft-com:xml-sql"&gt;
	&lt;sql:query client-side-xml="0"&gt;
		SELECT *
		FROM Customers
		FOR XML AUTO
	&lt;/sql:query&gt;
&lt;/root&gt;
</code></pre>



<p>Чтобы проверить это, откройте браузер и введите следующий URL-адрес: <a href="http://localhost/northwind/template/getallcustomers.xml">http://localhost/northwind/template/getallcustomers.xml. </a>Вы должны увидеть содержимое таблицы клиентов Northwind в виде XML в своем браузере. Вот первая часть того, что вы должны увидеть:</p>



<pre class="wp-block-code"><code>&lt;root xmlns:sql="urn:schemas-microsoft-com:xml-sql"&gt;
&lt;Customers CustomerID="ALFKI" CompanyName="Alfreds 
Futterkiste" ContactName="Maria Anders"
ContactTitle="Sales Representative"
Address="Obere Str. 57" City="Berlin" PostalCode="12209"
Country="Germany" Phone="030-0074321"
Fax="999-999-9999" /&gt;
</code></pre>



<p>Теперь вы готовы запустить примеры SQLXML из этой статьи.</p>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5175">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 недели</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5175">Михаил Леменёв</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Михаил Леменёв" href="https://foxclub.ru/account/?user=5175">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/5175-70x70.jpg?ver=1705144579' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/5175-150x150.jpg?ver=1705144579 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 9<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-10-2022        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/poluchenie-i-obnovlenie-dannyh-s-pomoshhyu-cursoradapters/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Статьи]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/novaya-funkcziya-foxydialog-zamenyaet-funkczii-messagebox-i-inputbox/</link>
					<title><![CDATA[Новая функция FoxyDialog() заменяет функции MESSAGEBOX() и INPUTBOX()]]></title>
                    					    <author><![CDATA[Михаил Леменёв]]></author>
                    										    <pubDate>Tue, 30 Jul 2024 04:41:53 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Новая функция FoxyDialog() заменяет функции MESSAGEBOX() и INPUTBOX()</h1>
													</header>
													<p>Новая функция FoxyDialog() заменяет функции MESSAGEBOX() и INPUTBOX().</p>
<p>Её возможности:</p>
<p>- разрешено до 6 кнопок<br />
- можно использовать значки Windows по умолчанию, хранящиеся в "Imageres.dll" и в "Shell32.dll", используемые Windows везде, а также любые файлы ICO или bitmap<br />
- более широкое диалоговое окно, которое растягивается, чтобы вместить весь ваш текст<br />
- можно красить сообщение в разные цввета<br />
- помимо WindowTitle и Contents, у вас есть параметр Main Instruction<br />
- введено свойство timeout<br />
- позволяет использовать Unicode для некоторых интересных символов и многоязычных сообщений<br />
- значки в кнопках, использующие некоторые стандартные изображения Windows<br />
- новые типы входных данных, такие как тексты, числа, даты, дата и время, диапазоны дат</p>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5175">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 недели</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5175">Михаил Леменёв</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Михаил Леменёв" href="https://foxclub.ru/account/?user=5175">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/5175-70x70.jpg?ver=1705144579' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/5175-150x150.jpg?ver=1705144579 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 9<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-10-2022        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/novaya-funkcziya-foxydialog-zamenyaet-funkczii-messagebox-i-inputbox/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/chto-novogo-v-devyatke-poslednie-hity-visual-foxpro-tamar-e-granor-dag-hennig-rik-shummer-toni-feltman-dzhim-slejter-2005-g-perevod-mihail-lemenyov-2024-g/</link>
					<title><![CDATA[Что нового в Девятке: последние хиты Visual FoxPro. Тамар Э. Гранор, Даг Хенниг, Рик Шуммер, Тони Фелтман, Джим Слейтер 2005 г.(перевод Михаил Леменёв 2024 г.)]]></title>
                    					    <author><![CDATA[Михаил Леменёв]]></author>
                    										    <pubDate>Mon, 27 May 2024 05:32:03 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
															<figure>
									<img width="629" height="842" src="https://foxclub.ru/wp-content/uploads/2024/05/chto-novogo-v-devyatke.pdf-foxit-reader_240527082926.png" class="attachment-large size-large wp-post-image" alt="" decoding="async" loading="lazy" />								</figure>
														<h1>Что нового в Девятке: последние хиты Visual FoxPro. Тамар Э. Гранор, Даг Хенниг, Рик Шуммер, Тони Фелтман, Джим Слейтер 2005 г.(перевод Михаил Леменёв 2024 г.)</h1>
													</header>
													
<p>Содержание</p>



<p>Глава 1. Улучшения Диспетчера проектов<br>Глава 2. Управление окном свойств<br>Глава 3. Написание кода<br>Глава 4. Лучшие инструменты<br>Глава 5. Улучшения в системе отчетов<br>Глава 6. Расширение системы отчетов во время разработки<br>Глава 7. Расширение системы отчетов во время выполнения<br>Глава 8. Изменения SQL<br>Глава 9. Новые типы данных и индексов<br>Глава 10. Управление XML<br>Глава 11. Работа с удаленными данными<br>Глава 12. Другие изменения данных<br>Глава 13. Формы и элементы управления<br>Глава 14. Улучшения языка<br>Глава 15. Настройка и развертывание</p>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5175">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 недели</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5175">Михаил Леменёв</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Михаил Леменёв" href="https://foxclub.ru/account/?user=5175">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/5175-70x70.jpg?ver=1705144579' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/5175-150x150.jpg?ver=1705144579 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 9<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-10-2022        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/chto-novogo-v-devyatke-poslednie-hity-visual-foxpro-tamar-e-granor-dag-hennig-rik-shummer-toni-feltman-dzhim-slejter-2005-g-perevod-mihail-lemenyov-2024-g/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Книги]]></category><enclosure url="https://foxclub.ru/wp-content/uploads/2024/05/chto-novogo-v-devyatke.pdf-foxit-reader_240527082926.png" type="image/png" />				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/avtomatizacziya-microsoft-office-s-visual-foxpro/</link>
					<title><![CDATA[Автоматизация Microsoft Office с Visual FoxPro (Тамар Э. Гранор и Делла Мартин) 2000 г]]></title>
                    					    <author><![CDATA[Михаил Леменёв]]></author>
                    										    <pubDate>Mon, 08 Apr 2024 11:54:44 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Автоматизация Microsoft Office с Visual FoxPro (Тамар Э. Гранор и Делла Мартин) 2000 г</h1>
													</header>
													<pre><strong>Оглавление</strong>
      Введение
Глава 1. Знакомство с Автоматизацией
  1.1 Если все, что у вас есть, — это молоток, значит, все становится гвоздем?
  1.2 Краткая история Автоматизации
  1.3 OLE, ActiveX, COM или что?
  1.4 Использование Автоматизации на практике.
  1.5 Куда идти дальше?
Глава 2. Офисные серверы
  2.1 Изучение серверов Office
      Прочтите подробное руководство (RTFM)
      Пусть сервер напишет код
      Рассмотрим обозреватель объектов
      По вашей команде
      Интернет-ресурсы и печатные ресурсы
  2.2 Собираем коллекцию
      Изменение коллекции
  2.3 Самоссылающиеся объектные модели
  2.4 Двигаемся дальше
Глава 3. Visual FoxPro как клиент Автоматизации
  3.1 Управление серверами
      Отображение серверов Office
      Мы уже на месте?
  3.2 Работа с серверами
      SET OLEOBJECT
      Используйте WITH … ENDWITH
      Используйте переменные для ссылок на объекты
      Цикл с FOR EACH
  3.3 Отладка
      Работа в командном окне
      Коллекции и объекты
      Это работает, но это не так
      Проблемы с параметрами
      Бесполезные сообщения об ошибках
      Используйте базу знаний
      Поспрашивать
  3.4 Время для кода
Глава 4. Основы Word
  4.1 Объектная модель Word
  4.2 Переходим к Word
  4.3 Управляющие документы
  4.4 Доступ к частям документа
      Манипулирование текстом
      Перемещение в диапазоне или выделенном фрагменте
      Закладки
  4.5 Форматирование
      Настройка страниц
      Настройка шрифтов
      Форматирование абзацев
      Работа со стилями
      Границы и штриховка
      Верхние и нижние колонтитулы
      Нумерация страниц
      Организация текста со списками
  4.6 Вывод данных
      Печать
      Предварительный просмотр печати
  4.7 Собираем все вместе
Глава 5. Промежуточный Word
  5.1 Шаблоны документов
      Что входит в шаблон?
      Поиск шаблонов
      Использование шаблонов
      Создание шаблонов
      Использование шаблонов в работе
  5.2 Таблицы
      Нестандартные таблицы
  5.3 Создание документов с несколькими колонками
  5.4 Сноски и концевые сноски
  5.5 Добавление графики в документы
      Два лица графики
  5.6 Работа с существующими документами.
      Поиск и замена
      Изучение структуры документа
      Обход документа с коллекциями
  5.7 Автоматизация макросов
  5.8 Собираем все вместе
Глава 6. Продвинутый Word
  6.1 Организация документа с помощью стилей
      Работа со структурой
      Создание оглавления
  6.2 Создание указателей
      Решение о том, что индексировать
      Маркировка элементов для индекса
      Генерация индекса
      Форматирование индексов
  6.3 Объединение документов с данными
      Структура слияния почты Word
      Замена данных с помощью функции «Найти и заменить»
      Отступите на 10 ярдов и нанесите удар.
  6.4 Собираем все вместе
Глава 7. Основы Excel
  7.1 Объектная модель
  7.2 Дежавю
  7.3 Получение информации о приложении
  7.4 Управление рабочими книгами и рабочими листами
      Открытие новой книги
      Открытие существующей книги
      Сохранение книги
      Работа с рабочими листами
      Строки, столбцы, ячейки и диапазоны
  7.5 Обработка значений и формул
      Добавление, копирование и перемещение данных (включая формулы)
      Наполни ее
  7.6 Форматирование
      Ширина и выравнивание столбцов
      Шрифты
      Форматирование значений
      Границы
      Затенение
      Стили
  7.7 Вывод данных
      Настройка страницы
      Предварительный просмотр печати
      Печать
      Сохранение данных в разных форматах
  7.8 Собираем все вместе
Глава 8. Расширенные функции Excel
  8.1 Сводные таблицы
      Данные сводной таблицы
      Создание сводной таблицы.
  8.2 Анализ «что если» с использованием таблиц данных
  8.3 Поиск цели
  8.4 Защита
      Защита клетки
      Защита листа
      Защита книги
  8.5 Шаблоны
      Что входит в шаблон?
      Поиск шаблонов
      Использование шаблонов
      Создание шаблонов
  8.6 Автоматизация макросов
  8.7 Добавление фигур
  8.8 Добавление изображений
  8.9 Собираем все вместе
Глава 9. Графический механизм Excel
  9.1 Объектная модель
      Это диаграмма или лист?
  9.2 Настройка данных
      Имена диапазонов — ваши друзья
  9.3 Создание диаграммы
      Свойство ActiveChart
      Выходим к мастеру
  9.4 Анатомия диаграммы
  9.5 Форматирование компонентов
  9.6 Объект Chart
      Типы диаграмм
      Свойства объекта Chart доступные только для трехмерных диаграмм
      Область диаграммы
      Объект Border
      Объект Interior
      Объект Font
      Объект PlotArea
      Ряд данных
      Объект легенды
      Оси координат
      Заголовки
  9.7 Собираем все вместе
Глава 10. Основы PowerPoint
  10.1 Объектная модель PowerPoint
  10.3 Как разобраться с приложением
  10.4 Управление презентациями и слайдами
      Представление: объект Presentation
      Открытие существующей презентации
      Добавление слайдов
      Сохранение презентации
      Закрытие презентации
      Закрытие объекта приложения
      Сделать так, чтобы это выглядело хорошо для пользователей
  10.5 Работа с содержимым слайдов.
      Использование макетов слайдов
      Добавление и форматирование текста
  10.6 Делаем это презентабельно
      Запуск режима слайд-шоу
      Печать
  10.7 Собираем все вместе
Глава 11. Расширенные функции PowerPoint
  11.1 Достижение согласованности с мастер-слайдами
      Фон
      Стандартизация внешнего вида текста
      Стандартизация цветов с помощью ColorSchemes
      Подробнее о формах SlideMaster
  11.2 Необычные функции
      Анимации
      Переходы
      Выполнение действий
  11.3 Мультимедиа.
      Отключение звука
      Движение
  11.4 Добавление примечаний
  11.5 Собираем все вместе
Глава 12. Автоматизация Outlook
  12.1 Объектная модель Outlook
  12.2 Знакомство с Outlook
  12.3 Доступ к содержимому Outlook
  12.4 Отправка электронной почты.
      Получатели и контакты
      Прикрепление файлов
  12.5 Управление папкой Contacts.
  12.6 Добавление встреч и задач
  12.7 Собираем все вместе
Глава 13. Межофисная связь
  13.1 Взаимодействие между приложениями Office
      Копирование и вставка между приложениями
      PasteSpecial
      Использование AddOLEObject
  13.2 Информирование о мероприятиях с помощью VFPCOM
      Получение VFPCOM.DLL
      Использование VFPCOM.DLL
  13.3 Последнее слово
Глава 14. Обработка ошибок Автоматизации
  14.1 Ошибки, связанные с Автоматизацией
  14.2 Война 1426-1429
      Тонкие различия
      Некоторые интересные наблюдения за ошибками
  14.3 Стратегии обработки ошибок
      ON ERROR и метод Error
      Предотвращение ошибок
  14.4 Подведем итоги
Глава 15. Подведение итогов работы с серверами
  15.1 Зачем обертывать серверы?
  15.2 Структурирование классов-оболочек
  15.3 Фундаментальные операции
      Разговор с пользователем
      Создание экземпляра сервера
      Закрытие сервера
      Открытие документа
      Сохранение документа
      Другие основные операции
  15.4 Создание подклассов
      Закрытие серверов
      Открытие документа, часть 2
      Закрытие документа
      Создание новых документов
      Проверка сервера
      Проверка открытых документов
      Отслеживание активного документа
      Отображение сервера
  15.5 Использование основных операций
  15.6 Добавление операций, специфичных для сервера
      Обёртка Word - от таблицы к таблице
      Обёртка Excel - от таблицы к графику
      Обёртка PowerPoint - стандартизация текста
  15.7 Подводя итоги
      Приложение A. Интернет-сообщества пользователей
      A1. Ресурсы FoxPro
      A2. Ресурсы Office
      A3. Онлайн-этикет
      Приложение B. Значения ChartWizard
</pre>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5175">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 недели</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5175">Михаил Леменёв</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Михаил Леменёв" href="https://foxclub.ru/account/?user=5175">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/5175-70x70.jpg?ver=1705144579' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/5175-150x150.jpg?ver=1705144579 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 9<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-10-2022        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/avtomatizacziya-microsoft-office-s-visual-foxpro/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Книги]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-sekundomer/</link>
					<title><![CDATA[Класс &#8211; секундомер]]></title>
                    					    <author><![CDATA[Михаил Леменёв]]></author>
                    										    <pubDate>Mon, 22 Jan 2024 16:51:48 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс &#8211; секундомер</h1>
													</header>
													<p>Класс "секундомер", способный отслеживать промежутки времени и выводить их на экран.<a href="https://foxclub.ru/wp-content/uploads/2024/01/sekundomer.jpg"><img width="226" height="204" src="https://foxclub.ru/wp-content/uploads/2024/01/sekundomer.jpg" class="attachment-large alignleft" alt="" srcset=" " decoding="async" loading="lazy" /></a></p>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5175">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 недели</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5175">Михаил Леменёв</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Михаил Леменёв" href="https://foxclub.ru/account/?user=5175">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/5175-70x70.jpg?ver=1705144579' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/5175-150x150.jpg?ver=1705144579 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 9<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-10-2022        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-sekundomer/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/xlsx-workbook-class/</link>
					<title><![CDATA[XLSX Workbook Class]]></title>
                    					    <author><![CDATA[ssa]]></author>
                    										    <pubDate>Sun, 24 Nov 2024 01:17:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>XLSX Workbook Class</h1>
													</header>
													
Класс VFP для создания рабочей книги XLSX без Excel Automation или установленного Excel<br />https://github.com/s-s-a/XLSX-Workbook-Class<br />
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4817">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4817">ssa</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="ssa" href="https://foxclub.ru/account/?user=4817">
				<img alt='' src='https://secure.gravatar.com/avatar/8dba79d76870a5b80e8dee02ceaca90a?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/8dba79d76870a5b80e8dee02ceaca90a?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 23-03-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/xlsx-workbook-class/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category><category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ole-automation/</link>
					<title><![CDATA[OLE Automation]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 27 Oct 2023 14:11:14 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>OLE Automation</h1>
													</header>
													
<p align="justify">файл справки на русском языке описывает свойства и методы объектов Windows Script Host, а также некоторых других объектов OLE Automation, доступных в административных скриптах Windows и приложениях, способных выступить в роли OLE-клиента. Кроме объектов Windows Script Host, в частности, описана работа с регулярными выражениями в VBScript, включая подробное описание метасимволов, а также свойства и методы объектов "Shell.Application" и "Scripting.Dictionary". Многочисленные примеры приведены на языке VBScript. Также прилагается справка по встроенным константам и функциям языка VBScript. В файле справки имеется хорошо структурированное оглавление и полнотекстовый поиск.</p>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ole-automation/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Файлы]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/polnyj-nabor-fajlov-dlya-raboty-foxpro-2-6-pod-dos/</link>
					<title><![CDATA[Полный набор файлов для работы Foxpro 2.6 под dos]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Sun, 11 Dec 2022 11:18:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Полный набор файлов для работы Foxpro 2.6 под dos</h1>
													</header>
													<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/polnyj-nabor-fajlov-dlya-raboty-foxpro-2-6-pod-dos/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Файлы]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/vfp-7-runtime-files-vfp-8-runtime-files-vfp-9-runtime-files/</link>
					<title><![CDATA[VFP 7 Runtime Files VFP 8 Runtime Files VFP 9 Runtime Files]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Sun, 30 Oct 2022 16:58:10 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>VFP 7 Runtime Files VFP 8 Runtime Files VFP 9 Runtime Files</h1>
													</header>
													<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/vfp-7-runtime-files-vfp-8-runtime-files-vfp-9-runtime-files/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Файлы]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/adaptirujte-svoi-kursory-k-cursoradapters/</link>
					<title><![CDATA[Адаптируйте свои курсоры к CursorAdapters]]></title>
                    					    <author><![CDATA[Михаил Леменёв]]></author>
                    										    <pubDate>Fri, 04 Nov 2022 13:31:57 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Адаптируйте свои курсоры к CursorAdapters</h1>
													</header>
													<p><strong><em>Дуг Хенниг</em></strong></p>
<blockquote>
<p>Класс CursorAdapter — одна из самых важных новых функций в VFP 8, поскольку он обеспечивает простой в использовании и согласованный интерфейс для удаленных данных. В статье этого месяца Дуг исследует CursorAdapters и то, как они работают. В следующем месяце мы рассмотрим некоторые дополнительные способы их использования.</p>
</blockquote>
<div style="text-align: justify;">Все больше и больше разработчиков VFP хранят свои данные не в таблицах VFP, а в SQL Server или Oracle. Этому есть множество причин, в том числе хрупкость таблиц VFP (как предполагаемых, так и реальных), безопасность, размер базы данных и корпоративные стандарты. Microsoft упрощала доступ к данным, не относящимся к VFP, с каждым выпуском и даже поощряла это, включив MSDE (Microsoft Data Engine, бесплатную урезанную версию SQL Server) на компакт-диске VFP 7.</div>
<div style="text-align: justify;">Однако доступ к серверной базе данных никогда не был таким простым, как использование таблиц VFP. Кроме того, для этого можно использовать различные механизмы:</div>
<div style="text-align: justify;">
<ul>
<li>Удаленные представления, основанные на соединениях ODBC.</li>
<li>Функции транзита SQL (SPT), такие как SQLCONNECT(), SQLEXEC() и SQLDISCONNECT(), которые также основаны на соединениях ODBC.</li>
<li>Объекты данных ActiveX или ADO, которые предоставляют объектно-ориентированный интерфейс для поставщиков OLE DB для механизмов баз данных.</li>
<li>XML, который представляет собой облегченный, независимый от платформы механизм передачи данных.</li>
</ul>
</div>
<div style="text-align: justify;">Если вы когда-нибудь работали с этими механизмами, вы, вероятно, заметили, что каждый из них полностью отличается от других. Это означает, что у вас есть новая кривая обучения с каждым из них, и преобразование существующего приложения с одного механизма на другой — нетривиальная задача.</div>
<div style="text-align: justify;">VFP 8 делает доступ к удаленным данным намного проще, чем в более ранних версиях, благодаря новому базовому классу: CursorAdapter. На мой взгляд, CursorAdapter — одна из самых больших новых функций в VFP 8. Причины, по которым я думаю, что это так круто:</div>
<div style="text-align: justify;">
<ul>
<li>Это упрощает использование ODBC, ADO или XML, даже если вы не очень хорошо знакомы с этими технологиями.</li>
<li>Он обеспечивает согласованный интерфейс для удаленных данных независимо от выбранного вами механизма.</li>
<li>Это позволяет легко переключаться с одного механизма на другой.</li>
</ul>
</div>
<div style="text-align: justify;">Вот пример последнего пункта. Предположим, у вас есть приложение, которое использует ODBC с CursorAdapters для доступа к данным SQL Server, и по какой-то причине вы хотите перейти на использование ADO.</div>
<div style="text-align: justify;">Все, что вам нужно сделать, это изменить свойство DataSourceType CursorAdapters и изменить подключение к серверной базе данных, и все готово. Остальные компоненты приложения об этом не знают и не заботятся; они по-прежнему видят один и тот же курсор независимо от механизма, используемого для доступа к данным.</div>
<div style="text-align: justify;"><strong>PEM</strong></div>
<div style="text-align: justify;">Давайте начнем изучение CursorAdapter с рассмотрения его свойств, событий и методов (PEM). Мы не будем обсуждать здесь все PEM, а только наиболее важные. Полный список см. в документации VFP 8.</p>
</div>
<div style="text-align: justify;"><strong>DataSourceType - Тип источника данных</strong></div>
<div style="text-align: justify;">Это важное свойство: оно определяет поведение класса и типы значений, которые следует вводить в некоторые другие свойства. Допустимые варианты: «Native», что означает, что вы используете собственные таблицы, или «ODBC», «ADO» или «XML», что означает, что вы используете соответствующий механизм для доступа к данным.</p>
</div>
<div style="text-align: justify;"><strong>DataSource - Источник данных</strong></div>
<div style="text-align: justify;">Это средство доступа к данным. VFP игнорирует это свойство, если для DataSourceType задано значение «Native» или «XML». Для ODBC установите для DataSource допустимый дескриптор соединения ODBC (это означает, что вы должны сами управлять соединением). В случае ADO DataSource должен быть набором записей ADO, в котором объект ActiveConnection установлен на открытый объект соединения ADO (опять же, вы должны управлять этим самостоятельно).</p>
</div>
<div style="text-align: justify;"><strong>UseDEDataSource - использовать источник данных из DataEnvironment</strong></div>
<div style="text-align: justify;">Если для этого свойства задано значение .T. (по умолчанию .F.), вы можете оставить свойства DataSourceType и DataSource в покое, так как вместо этого CursorAdapter будет использовать свойства DataEnvironment (VFP 8 также добавляет DataSourceType и DataSource в класс DataEnvironment). Пример, когда вы установили бы это в .T. это когда вы хотите, чтобы все CursorAdapters в DataEnvironment использовали одно и то же соединение ODBC.</p>
</div>
<div style="text-align: justify;"><strong>SelectCmd - команда выборки</strong></div>
<div style="text-align: justify;">Во всех случаях, кроме XML, это команда SQL SELECT, используемая для извлечения данных. В случае XML это может быть допустимая строка XML, которую можно преобразовать в курсор (с помощью внутреннего вызова XMLTOCURSOR()), или выражение (такое как UDF), возвращающее допустимую строку XML.</p>
</div>
<div style="text-align: justify;"><strong>CursorSchema - схема курсора</strong></div>
<div style="text-align: justify;">Это свойство содержит структуру курсора в том же формате, который вы использовали бы в команде CREATE CURSOR (все, что заключено в круглые скобки в такой команде). Вот пример: CUST_ID C(6), COMPANY C(30), CONTACT C(30), CITY C(25). Хотя можно оставить это поле пустым и указать CursorAdapter’у определить структуру при создании курсора, он работает лучше, если вы заполните CursorSchema. Во-первых, если CursorSchema пуста или неверна, вы либо получите ошибки при открытии DataEnvironment формы, иначе вы не сможете перетаскивать поля из CursorAdapter в форму для создания элементов управления. К счастью, CursorAdapter Builder, поставляемый с VFP, может автоматически заполнить это за вас.</p>
</div>
<div style="text-align: justify;"><strong>AllowDelete, AllowInsert, AllowUpdate и SendUpdates - разрешить удаление, вставку, обновление и послать обновления</strong></div>
<div style="text-align: justify;">Эти свойства, которые по умолчанию имеют значение .T., определяют, могут ли выполняться операции удаления, вставки и обновления, а также отправляются ли изменения в источник данных.</p>
</div>
<div style="text-align: justify;"><strong>KeyFieldList, Tables, UpdatableFieldList и UpdateNameList - список ключевых полей, таблицы, список обновляемых полей и список обновляемых имен</strong></div>
<div style="text-align: justify;">Эти свойства, которые служат той же цели, что и одноименные свойства CURSORSETPROP() для представлений, необходимы, если вы хотите, чтобы VFP автоматически обновлял источник данных изменениями, внесенными в курсор. KeyFieldList — это разделенный запятыми список полей (без псевдонимов), которые составляют первичный ключ для курсора. Tables — список таблиц, разделенных запятыми. UpdatableFieldList — это разделенный запятыми список полей (без псевдонимов), которые можно обновить. UpdateNameList — это список с разделителями-запятыми, в котором имена полей в курсоре сопоставляются с именами полей в таблице. Формат UpdateNameList следующий: CURSORFIELDNAME1 TABLE.FIELDNAME1, CURSORFIELDNAME2 TABLE.FIELDNAME2, ... Обратите внимание, что даже если UpdatableFieldList не содержит имя первичного ключа таблицы (поскольку вы не хотите, чтобы это поле обновлялось) , он все еще должен существовать в UpdateNameList, иначе обновления не будут работать.</p>
</div>
<div style="text-align: justify;"><strong>*Cmd, *CmdDataSource, *CmdDataSourceType</strong></div>
<div style="text-align: justify;">Если вы хотите конкретно управлять тем, как VFP удаляет, вставляет или обновляет записи в источнике данных, вы можете назначить соответствующие значения этим наборам свойств (замените * выше на Delete, Insert и Update).</p>
</div>
<div style="text-align: justify;"><strong>CursorFill(UseCursorSchema, NoData, Options, Source) - заполнить курсор данными</strong></div>
<div style="text-align: justify;">Этот метод создает курсор и заполняет его данными из источника данных (хотя вы можете передать .T. для параметра NoData, чтобы создать пустой курсор). Пройти .Т. чтобы первый параметр использовал схему, определенную в CursorSchema или .F. создать соответствующую структуру из источника данных (на мой взгляд, это обратное поведение). MULTILOCKS должен быть включен, иначе этот метод не сработает. Если CursorFill по какой-либо причине не работает, он возвращает .F. а не выдаёт ошибку; используйте AERROR(), чтобы определить, что пошло не так (хотя будьте готовы к некоторому копанию, поскольку сообщения об ошибках, которые вы часто получаете, недостаточно конкретны, чтобы точно сказать вам, в чем проблема).</p>
</div>
<div style="text-align: justify;"><strong>CursorRefresh() - обновить курсор</strong></div>
<div style="text-align: justify;">Этот метод похож на функцию REQUERY(): он обновляет содержимое курсора.</p>
</div>
<div style="text-align: justify;"><strong>Before*() и After*()</strong></div>
<div style="text-align: justify;">Почти у каждого метода и события есть до и после событий-перехватчиков, которые позволяют настроить поведение CursorAdapter. Например, в AfterCursorFill вы можете создавать индексы для курсора, чтобы они всегда были доступны. В случае событий «До» вы можете вернуть .F. чтобы предотвратить действие, которое его запускает (это похоже на события базы данных).</p>
</div>
<div style="text-align: justify;"><strong>Пример</strong></div>
<p>Вот пример (CursorAdapterExample.prg, включенный в загружаемые материалы для подписчиков этого месяца), который извлекает определенные поля для бразильских клиентов из таблицы Customers в базе данных Northwind, поставляемой с SQL Server. Курсор можно обновлять, поэтому, если вы внесете изменения в курсор, закроете его, а затем снова запустите программу, вы увидите, что ваши изменения были сохранены в бэкэнде.</p>
<p><pre class='bbcode'>  </p>  
  <pre>local lcConnString, ;  
         loCursor as CursorAdapter, ;  
         laErrors[1]  
  lcConnString = 'driver=SQL Server;server=(local);' + ;  
         'database=Northwind;uid=sa;pwd=;trusted_connection=no'  
 * change password to appropriate value for your database  
  loCursor = createobject('CursorAdapter')  
  with loCursor  
         .Alias = 'Customers'  
         .DataSourceType = 'ODBC'  
         .DataSource = sqlstringconnect(lcConnString)  
         .SelectCmd = "select CUSTOMERID, " + ;  
               "COMPANYNAME, CONTACTNAME from CUSTOMERS " + ;  
               "where COUNTRY = 'Brazil'"  
         .KeyFieldList = 'CUSTOMERID'  
         .Tables = 'CUSTOMERS'  
         .UpdatableFieldList = 'CUSTOMERID, COMPANYNAME, ' + ;  
               'CONTACTNAME'  
         .UpdateNameList = ;  
               'CUSTOMERID CUSTOMERS.CUSTOMERID, ' + ;  
               'COMPANYNAME CUSTOMERS.COMPANYNAME, ' + ;  
               'CONTACTNAME CUSTOMERS.CONTACTNAME'  
         if .CursorFill()  
               browse  
         else  
               aerror(laErrors)  
               messagebox(laErrors[2])  
         endif .CursorFill()  
  endwith</pre>  
  <p>  
</pre> <strong>DataEnvironment и изменения формы</strong></p>
<p>Для поддержки нового класса CursorAdapter в классы DataEnvironment и Form и их конструкторы внесено несколько изменений.</p>
<p>Во-первых, как я упоминал ранее, класс DataEnvironment теперь имеет свойства DataSource и DataSourceType. Он не использует эти свойства сам по себе, но они используются любым членом CursorAdapter, для которого UseDEDataSource установлено в .T. Во-вторых, теперь вы можете визуально создавать подклассы DataEnvironment с помощью конструктора классов (ух ты!).</p>
<p>Что касается форм, теперь вы можете указать подкласс DataEnvironment для использования, установив новые свойства DEClass и DEClassLibrary. Если вы сделаете это, все, что вы сделали с существующей средой DataEnvironment (курсоры, код и т. д.), будет потеряно, но, по крайней мере, вас сначала предупредят. Интересная новая функция форм, которая в чем-то связана, — это свойство BindControls; установив это на .F. в окне свойств означает, что VFP не будет пытаться привязать данные к элементам управления во время инициализации, только если вы установите для BindControls значение .T. Для чего это нужно? Ну, сколько раз вы проклинали, что параметры передаются в Init, который срабатывает после того, как все элементы управления были инициализированы и привязаны к своим источникам управления? Что делать, если вы хотите передать параметр в форму, которая сообщает ей, какую таблицу открывать, или другие вещи, влияющие на ControlSource? Это новое свойство делает эту проблему проще простого.</p>
<p><strong>Преимущества</strong></p>
<p>Есть много веских причин использовать CursorAdapters вместо удаленных представлений, SPT, ADO или XML.</p>
<ul>
<li>Каждый механизм имеет свой интерфейс. С удаленными представлениями вы открываете их с помощью команды USE. В SPT вы используете SQLCONNECT() и SQLEXEC() для создания курсора. С помощью ADO вы создаете объекты ADO Connection и RecordSet (и, возможно, объект Command, в зависимости от того, как вы извлекаете данные) и вызываете их методы Open. При использовании XML вы сначала откуда-то получаете строку XML (например, из компонента COM в многоуровневом приложении или из SQL Server через SQLXML), а затем используете XMLTOCURSOR() для преобразования ее в курсор VFP. Запись обновлений на серверную часть также отличается для каждого механизма. Таким образом, при переходе от одного механизма к другому у вас появляются новые методы для изучения, плюс вам, возможно, придется переписать большую часть существующего кода.</li>
</ul>
<p>CursorAdapter’ы имеют согласованный интерфейс независимо от того, какой механизм вы используете для извлечения данных. Вы устанавливаете различные свойства объекта и вызываете метод CursorFill для извлечения данных, работаете с курсором, как с любым другим курсором VFP, а затем вызываете TABLEUPDATE() (или позволяете VFP обрабатывать его автоматически), чтобы записать изменения обратно.</p>
<ul>
<li>В среде разработки часто требуется открыть курсор из командного окна, чтобы просмотреть его содержимое. Это легко для удаленных представлений (просто USE представление), но гораздо больше работы для SPT, ADO и XML.</li>
</ul>
<p>В зависимости от того, как он настроен (например, если он полностью автономен), открытие курсора из подкласса CursorAdapter может быть почти таким же простым, как открытие удаленного представления: вы просто создаете экземпляр подкласса и вызываете метод CursorFill. Вы даже можете вызвать это из Init, чтобы сделать это одноэтапной операцией.</p>
<ul>
<li>Увеличение существующего приложения может быть относительно простым с удаленными представлениями: вы заменяете существующие объекты Cursor, которые указывают на локальные таблицы или представления в DataEnvironment, на те, которые вместо этого ссылаются на удаленные представления. При использовании SPT, ADO и XML вам придется полностью переоснастить свои схемы доступа к данным.</li>
</ul>
<p>Увеличить размер существующего приложения для использования CursorAdapters так же просто, как и с удаленными представлениями; вместо этого вы просто заменяете объекты Cursor объектами CursorAdapter.</p>
<ul>
<li>С удаленными представлениями легко работать в дизайнерах форм и отчетов. Вы можете добавить его в DataEnvironment, а затем воспользоваться преимуществами визуальной поддержки, предоставляемой DataEnvironment: перетаскиванием полей для автоматического создания элементов управления, простой привязкой элемента управления к полю путем выбора его из поля со списком в окне свойств и т.д. SPT, ADO и XML не имеют такой визуальной поддержки.</li>
</ul>
<p>CursorAdapters имеют ту же поддержку в DataEnvironment, что и удаленные представления.</p>
<ul>
<li>Удаленные представления легко создавать с помощью дизайнера представлений. Хотя в прошлом у него были серьезные ограничения, особенно при работе с представлениями, объединяющими более двух таблиц, VFP 8 устраняет большинство этих проблем и добавляет гораздо больше возможностей, таких как двустороннее редактирование: вы можете изменить код в окне SQL и увидеть эти изменения, отраженные в визуальной части дизайнера представлений. С SPT, ADO и XML это требует больше работы, так как вам нужно кодировать все: создание и закрытие соединения, выполнение операторов SQL SELECT и так далее.</li>
</ul>
<p>VFP 8 включает в себя CursorAdapter Builder, который быстро устанавливает свойства, необходимые для извлечения и обновления данных. Он даже включает построитель SelectCmd, который, хотя и не так нагляден, как View Designer, позволяет вам выбирать, какие поля следует извлекать из удаленных таблиц, используя элемент управления «перемещение». <sup>•</sup></p>
<ul>
<li>Базу данных бэкэнда легко обновлять с помощью изменений, сделанных в удаленных представлениях и наборах записей ADO. Предполагая, что свойства представления настроены правильно, вы просто вызываете TABLEUPDATE(). В случае ADO вы вызываете RecordSet.Update() или UpdateBatch(). С SPT и XML у вас есть куча ручной работы, чтобы передать обновления обратно.</li>
</ul>
<p>Как мы видели ранее, выполнение обновлений с помощью CursorAdapter может быть таким же простым, как установка нескольких свойств, чтобы VFP выполнял всю работу, или вы можете иметь большую гибкость, указав, как обрабатываются удаления, вставки и обновления.</p>
<ul>
<li>Поскольку результирующий набор, созданный удаленными представлениями и SPT, представляет собой курсоры VFP, их можно использовать где угодно в VFP: в GRID, отчете, обработке в цикле SCAN и т. д. ADO и XML, с другой стороны, должны быть преобразованы в курсоры, прежде чем их можно будет использовать таким образом, что усложняет и увеличивает время обработки вашего приложения.</li>
</ul>
<p>Результирующий набор CursorAdapter представляет собой курсор VFP, поэтому он имеет те же преимущества, что и удаленные представления и SPT. Более того, вы получаете курсор VFP, даже если источником данных являются ADO и XML, потому что CursorAdapter автоматически позаботится о преобразовании в курсор и из него.</p>
<ul>
<li>Поскольку оператор SQL SELECT удаленного представления определен заранее, вы не можете изменить его на лету. Хотя это нормально для обычной формы ввода данных, это может быть проблемой для запросов и отчетов. Возможно, вам придется создать несколько представлений из одного и того же набора данных, каждое из которых отличается выбранными полями, структурой предложения WHERE и т. д. Это не проблема с SPT, ADO или XML.</li>
</ul>
<p>CursorAdapters не страдают от этой проблемы: вы можете легко изменить свойство SelectCmd, чтобы изменить, какие данные извлекаются и как.</p>
<ul>
<li>Вы не можете вызвать хранимую процедуру из удаленного представления, поэтому удаленному представлению необходим прямой доступ к базовым таблицам. Это может быть проблема с администраторами базы данных вашего приложения; некоторые администраторы баз данных считают, что доступ к данным должен осуществляться только через хранимые процедуры из соображений безопасности и по другим причинам. Кроме того, поскольку они предварительно скомпилированы на сервере, хранимые процедуры часто выполняются значительно быстрее, чем операторы SQL SELECT. С помощью SPT, ADO и XML вы можете при необходимости вызывать хранимые процедуры.</li>
</ul>
<p>CursorAdapters также может использовать хранимые процедуры, просто установив SelectCmd по мере необходимости.</p>
<ul>
<li>Удаленные представления живут в контейнере базы данных, так что это еще один набор файлов, которые вам нужно поддерживать и устанавливать в системе клиента. Кроме того, когда вы открываете представление, VFP пытается заблокировать записи представления в DBC, даже если это ненадолго. Это может вызвать конкуренцию в загруженных приложениях, когда несколько пользователей могут одновременно пытаться открыть форму. Несмотря на то, что существуют обходные пути (копирование DBC на локальную рабочую станцию и использование ее, или, в VFP 7 и более поздних версиях, использование SET REPROCESS SYSTEM для увеличения времени ожидания блокировки), это то, что вам нужно запланировать. Еще одна проблема: если вы используете представление SELECT * для извлечения всех полей из определенной таблицы, а структура этой таблицы на сервере изменяется, представление недействительно и должно быть создано заново. Поскольку они не имеют ничего общего с DBC, ни одна из них не является проблемой для SPT, ADO и XML.</li>
</ul>
<p>Поскольку они не живут в DBC, CursorAdapters также не имеют этих проблем.</p>
<ul>
<li>Поскольку они работают только с ODBC, удаленные представления и SPT застряли в модели прямого подключения данных «клиент-сервер». ADO и XML — предпочтительные механизмы для передачи данных между уровнями в многоуровневом приложении.</li>
</ul>
<p>Поскольку CursorAdapters может создавать курсоры VFP из ADO или XML, они идеально подходят для использования на уровне пользовательского интерфейса многоуровневого приложения.</p>
<p><strong>Резюме</strong></p>
<p>Я думаю, что CursorAdapter — одно из самых больших и захватывающих улучшений в VFP 8, потому что он обеспечивает согласованный и простой в использовании интерфейс для удаленных данных, а также, как мы увидим в следующих статьях, он позволяет нам создавать повторно используемые классы данных.  В следующем месяце мы рассмотрим особенности доступа к исходным или удаленным данным с помощью ODBC, ADO и XML. В следующем месяце мы рассмотрим создание повторно используемых классов данных и обсудим, как использовать CursorAdapters в отчетах.</p>
<p>&nbsp;</p>
<p><em>Дуг Хенниг является партнером Stonefield Systems Group Inc. Он является автором отмеченных наградами инструментов Stonefield Database Toolkit (SDT) и Stonefield Query, соавтором книг «Что нового в Visual FoxPro 7.0» и «Руководства хакера по Visual FoxPro». 7.0», как от Hentzenwerke Publishing, так и от автора «Словаря данных Visual FoxPro» в серии Pros Talk Visual FoxPro от Pinnacle Publishing. Он был техническим редактором «Руководства хакера по Visual FoxPro 6.0» и «Основы» издательства Hentzenwerke Publishing. Дуг выступал на каждой конференции разработчиков Microsoft FoxPro (DevCon) с 1997 года, а также на пользовательских группах и конференциях разработчиков по всей Северной Америке. Он является Microsoft Most Valuable Professional (MVP) и Certified Professional (MCP). Интернет: <a style="color: #808080;" href="http://www.stonefield.com/">www.stonefield.com </a>и <a style="color: #808080;" href="http://www.stonefieldquery.com/">www.stonefieldquery.com </a>Электронная почта: <a style="color: #808080;" href="mailto:dhennig@stonefield.com">dhennig@stonefield.com</a></p>
<p></em>(Автор перевода Михаил Леменев)<em><br />
</em></p>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5175">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 недели</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5175">Михаил Леменёв</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Михаил Леменёв" href="https://foxclub.ru/account/?user=5175">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/5175-70x70.jpg?ver=1705144579' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/5175-150x150.jpg?ver=1705144579 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 9<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-10-2022        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/adaptirujte-svoi-kursory-k-cursoradapters/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Статьи]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/win7tlib-master/</link>
					<title><![CDATA[Новые функции панели задач Windows]]></title>
                    					    <author><![CDATA[Михаил Леменёв]]></author>
                    										    <pubDate>Thu, 01 Aug 2024 10:59:38 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Новые функции панели задач Windows</h1>
													</header>
													<p>Новые функции панели задач Windows 7 и более поздних версий. Использование индикаторов выполнения на панели задач, наложенных значков, пользовательских эскизов и изображений для предварительного просмотра в реальном времени, панелей инструментов на панели задач и списков переходов в ваших приложениях. Много примеров применения здесь: <a href="https://github.com/VFPX/Win7TLib">https://github.com/VFPX/Win7TLib</a><br />
Стив Элленофф</p>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5175">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 недели</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5175">Михаил Леменёв</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Михаил Леменёв" href="https://foxclub.ru/account/?user=5175">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/5175-70x70.jpg?ver=1705144579' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/5175-150x150.jpg?ver=1705144579 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 9<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-10-2022        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/win7tlib-master/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/gurvicz-g-a-razrabotka-realnogo-prilozheniya-s-ispolzovaniem-visual-foxpro-9/</link>
					<title><![CDATA[Гурвиц Г.А. Разработка реального приложения с использованием Visual FoxPro 9]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Sun, 03 Jul 2022 11:24:48 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
															<figure>
									<img width="700" height="965" src="https://foxclub.ru/wp-content/uploads/2022/07/bg1-743x1024.png" class="attachment-large size-large wp-post-image" alt="" decoding="async" loading="lazy" />								</figure>
														<h1>Гурвиц Г.А. Разработка реального приложения с использованием Visual FoxPro 9</h1>
													</header>
													<p><img loading="lazy" decoding="async" src="https://foxclub.ru/wp-content/uploads/2022/07/bg1-218x300.png" alt="" width="218" height="300" class="size-medium wp-image-9026 alignleft" srcset="https://foxclub.ru/wp-content/uploads/2022/07/bg1-218x300.png 218w, https://foxclub.ru/wp-content/uploads/2022/07/bg1-743x1024.png 743w, https://foxclub.ru/wp-content/uploads/2022/07/bg1-768x1058.png 768w, https://foxclub.ru/wp-content/uploads/2022/07/bg1.png 948w" sizes="(max-width: 218px) 100vw, 218px" />Хабаровск: ДВГУПС, 2007. - 198 с. - ISBN 5-262-00297-8</p>
<div class="bb-sep"></div>
<p>На примере сравнительно небольшой, но реальной базы данных «Real Estate» показан процесс создания профессионального Visual FoxPro-приложения. По количеству авторских находок это приложение значительно превосходит знаменитую, но довольно старую «Tastrade», уступая ей по числу используемых таблиц, форм, отчетов и т.д., почему-то потерявшую интерфейсную оболочку в версии 7 и, похоже - навсегда.<br />
Книги других авторов тоже претендуют на то, что в них приведены настоящие примеры. Но в этой Вы найдете полное руководство разработчика от постановки задачи до создания файла-справки к приложению. Некоторые тексты подробно не поясняются, приходится внимательно смотреть на комментарии в коде, благо их предостаточно.<br />
Главный акцент сделан на поэтапное – шаг за шагом – освоение нового, встречающегося на пути конкретной реальной разработки, и ни одного, даже самого маленького, шага в сторону. Книга написана как учебное пособие к выполнению курсового проекта, содержит большое количество вариантов заданий на проектирование и предназначена для студентов и преподавателей высших учебных заведений.<br />
Немногие разработчики рискнут сегодня начать свою программистскую карьеру с Visual FoxPro. Похоже, что слухи о его кончине, как о средстве разработки современных серьезных приложений, не сильно преувеличены. Sedna (очередная версия Visual FoxPro), по мнению большинства неFox-разработчиков, – это событие «Destroy» в, увы не бесконечной, хотя и очень длинной череде событий из жизни этого замечательного продукта.<br />
Но не все так печально! В университетских курсах по управлению данными мы, несомненно, будем видеть ЕГО еще долгие годы. Действительно, сейчас невозможно найти систему, которая сможет составить конкуренцию Visual FoxPro на ниве управления данными с его отточенной и многогранной навигацией по записям, рядом с которой блекнут DAO, ADO и ADO.NET. Ведь не исчез же старый добрый Paskal из университетских дисциплин по основам программирования?</p>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/gurvicz-g-a-razrabotka-realnogo-prilozheniya-s-ispolzovaniem-visual-foxpro-9/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Книги]]></category><enclosure url="https://foxclub.ru/wp-content/uploads/2022/07/bg1-743x1024.png" type="image/png" />				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/poisk-fajla-s-unicode-simvolami/</link>
					<title><![CDATA[Поиск файла с Unicode-символами]]></title>
                    					    <author><![CDATA[technik]]></author>
                    										    <pubDate>Fri, 27 May 2022 08:04:57 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Поиск файла с Unicode-символами</h1>
													</header>
													<p>В привиденном ниже примере файл находиться в 4х из шести методов. Т.е. ADIR() и sys(2000) по короткому пути и FSO.FileExists() как по короткому так и по полному. Если COMPROP() убрать, то только по короткому</p>
<div class="foxcode">
<pre class="bbcode">CLEAR all     
  show_dir(GETDIR())      
  RETURN    
            
  FUNCTION show_dir(cFolder)      
  	oFSO=CreateObject("Scripting.FileSystemObject")      
  	loDir=oFSO.GetFolder(cFolder)      
  	COMPROP(oFSO, "UTF8", 1)  
        
    	FOR EACH loFolder IN loDir.SubFolders       
     	LOCAL ARRAY aFile[1,5]  
  		FOR EACH oFile IN loDir.Files          
  			COMPROP(oFile, "UTF8", 1)  
  			? "---------------------------------"  
  			?(oFile.Path) + CHR(9);  
  				+ iif(File(oFile.Path),"-НАЙДЕН!", "-не найден...")       
  			?(oFile.ShortPath) + CHR(9);  
  				+ iif(!EMPTY(SYS(2000,oFile.ShortPath)),"-НАЙДЕН!", "-не найден...")  
  			?(oFile.ShortPath) + CHR(9);  
  				+ iif(adir(aFile,oFile.ShortPath, "SH")&gt;0,"-НАЙДЕН!", "-не найден...")      
  			?(oFile.Path) + CHR(9);  
  				+ iif(adir(aFile,oFile.Path, "SH")&gt;0,"-НАЙДЕН!", "-не найден...")       
  			?(oFile.ShortPath) + CHR(9);  
  				+ iif(oFSO.FileExists(oFile.ShortPath),"-НАЙДЕН!", "-не найден...")      
  			?(oFile.Path) + CHR(9);  
  				+ iif(oFSO.FileExists(oFile.Path),"-НАЙДЕН!", "-не найден...")       
  		ENDFOR      
  	ENDFOR    
  RETURN</pre>
</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4599">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 19 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4599">technik</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="technik" href="https://foxclub.ru/account/?user=4599">
				<img alt='' src='https://secure.gravatar.com/avatar/dba9cb32ad3c0f881354bb416feb210a?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/dba9cb32ad3c0f881354bb416feb210a?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 15-11-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/poisk-fajla-s-unicode-simvolami/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Система]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/magazin-bytovaya-himiya-demonstraczionnaya-programma-i-proekt/</link>
					<title><![CDATA[Магазин &#8220;Бытовая химия&#8221;, демонстрационная программа и проект]]></title>
                    					    <author><![CDATA[of63]]></author>
                    										    <pubDate>Fri, 13 May 2022 15:53:48 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Магазин &#8220;Бытовая химия&#8221;, демонстрационная программа и проект</h1>
													</header>
													<p>Макет БД закупок и продаж магазина "Бытовая химия".</p>
<p>Сделан как курсовая работа по теме "Разработка системы автоматизации для малого коммерческого предприятия".</p>
<p>Обеспечивает, согласно заданию:<br />
- многопользовательская БД (БД должна содержать &gt;10 таблиц)<br />
- разделение доступа по пользователям<br />
- наличие запросов к БД (SELECT, UPDATE...)<br />
- наличие "диаграмм" и отчетов, отображающих результаты запросов<br />
- наличие триггеров в таблицах БД<br />
- привести примеры кода программы</p>
<p>Выполнена под VFP9sp2, и вряд-ли будет правильно работать под меньшими версиями.<br />
Требует наличия MS-Office на выполняемой машине (используется Excel для изображения "диаграмм")<br />
Программа не использует Active-X обьекты, и подобные, поэтому инсталляции на машине не требует<br />
Требуется только наличие установленных RunTime библиотек VFP9sp2, или эти библиотеки можно положить рядом с запускаемым файлом BC.exe<br />
При запросе логина/пароля - выбрать логин "Админов А.А.", пароль - пустой.</p>
<p>Содержимое проекта.<br />
Проект сделан не с "нуля", а на основе моего типового проекта, поэтому содержит классы и подпрограммы, не используемые в данном проекте,<br />
хотя они достаточно универсальны... Неуниверсальные детали из библиотек в проекте, вроде, убрал...<br />
Файлы из этого "типового" проекта помечены (в Description) как "Библиотека" или "Типовой модуль".<br />
(В проекте Вместе с файлами .BMP - изображения на кнопках, прицепились также какие-то файлы .MSK, не знаю откуда они появились в моем VFP9sp2, на соседней машине, с таким же VFP, таких файлов нет..., и убрать их из проекта - не получилось...)</p>
<p>Для обеспечения многопользовательности применена форма из визарда построителя форм VFP9 (класс-форма "FormWizStd" сделана на основе этой формы визарда). Многопользование обеспечивают методы визарда в кнопках, которые, оказываются по разному работают (и довольно нетривиально), в зависимости от наличия/отсутствия DataEnvironment (DE) при форме, вида буферизации таблиц в DE, обеспечивают транзакции... Сама форма работы с записью таблицы - содержит DE, курсор-адаптеры в нем, вид буферизации в курсорах специально не устанавливал. В общем, все многопользование БД свалено на коды визарда.</p>
<p>Разделение пользователей по уровню доступа сделано запросом имени/пароля пользователя при входе в программу (см. таблицу Сотрудники).</p>
<p>Для визуального выбора строки из таблицы-справочника применен ComboBox-класс ("ComboBoxAll"), который умеет изображать массивы, алиасы, функции от них, упроядочивать записи, фильтровать/запрещать записи... Удобно с ним получилось...</p>
<p>Если возникнет желание использовать части этого проекта - то можно, без вопросов.</p>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4822">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 18 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4822">of63</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="of63" href="https://foxclub.ru/account/?user=4822">
				<img alt='' src='https://secure.gravatar.com/avatar/dcaecc0d182efd60e6a7d1f06739c2cd?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/dcaecc0d182efd60e6a7d1f06739c2cd?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 13-02-2008        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/magazin-bytovaya-himiya-demonstraczionnaya-programma-i-proekt/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/russifikacziya-menyu-visual-foxpro-9-0-sp1/</link>
					<title><![CDATA[Руссификация меню Visual FoxPro 9.0 SP2]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 04 Nov 2022 07:49:51 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Руссификация меню Visual FoxPro 9.0 SP2</h1>
													</header>
													<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/russifikacziya-menyu-visual-foxpro-9-0-sp1/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Файлы]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ustanovka-kodovoj-straniczy-dlya-baz-ekranov/</link>
					<title><![CDATA[Установка кодовой страницы для баз, экранов]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Wed, 18 Aug 2021 12:46:08 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Установка кодовой страницы для баз, экранов</h1>
													</header>
													<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ustanovka-kodovoj-straniczy-dlya-baz-ekranov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Файлы]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/konstanty-ot-excel-i-word/</link>
					<title><![CDATA[константы от Excel и Word]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Sat, 14 Jan 2023 18:23:23 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>константы от Excel и Word</h1>
													</header>
													<div id="sol_opis">Для управления Excel и Word из FoxPro полезными будут подключения через #INCLUDE excel.h и #INCLUDE word.h полных списов констант</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: виталий бень</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/konstanty-ot-excel-i-word/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/panel-zadach-sprava/</link>
					<title><![CDATA[Панель задач справа]]></title>
                    					    <author><![CDATA[shumik73]]></author>
                    										    <pubDate>Wed, 31 Mar 2021 13:48:23 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Панель задач справа</h1>
													</header>
													<pre class="bbcode"> PUBLIC oPanel  
  oPanel=CREATEOBJECT("form1")  
  oPanel.Show(0)  
    
  DEFINE CLASS form1 AS form  
    
    
  	Top = 0  
  	Left = 0  
  	Height = 638  
  	Width = 200  
  	DoCreate = .T.  
  	Caption = "Form1"  
  	TitleBar = 0  
  	AlwaysOnTop = .T.  
  	Name = "form1"  
    
  	ADD OBJECT check1 AS checkbox WITH 	Top = 12, Left = 9, Height = 36, Width = 180, Alignment = 0, Caption = "Свернуть", Style = 1, TabIndex = 1, BackColor = RGB(255,200,200), Name = "Check1"  
  	ADD OBJECT timer2 AS timer WITH Top = 48, Left = 72, Height = 23, Width = 23, Interval = 1000,	Name = "Timer2"   
  	ADD OBJECT command1 AS commandbutton WITH Top = 72, Left = 12, Height = 72, Width = 172,   Caption = "Открыть форму", Name = "Command1"  
  	ADD OBJECT command2 AS commandbutton WITH Top = 408, Left = 12, Height = 36, Width = 168, Caption = "Выход", TabStop = .F., Name = "Command2"  
    
  	PROCEDURE do_panel_taimer  
  		LPARAMETERS lcType_Panel,oCheck_Panel  
 		*+--------------------------------------------------+  
 		*|	Обоаботчик событий для панельного таймера		|  
 		*|	lcType_Panel - тип панели R или L				|  
 		*|	oCheck_Panel - ссылка на флаг Check в панели	|  
 		*+--------------------------------------------------+  
    
  		LOCAL lnStep_Panel,lnStep_Max  
  		lnStep_Panel=1	&amp;&amp;Отступ для зоны реагирования  
  		lnStep_Max=5	&amp;&amp;Кол-во циклов ожиадания, до того как развернуть панель  
    
  		IF BETWEEN(MCOL(_screen.Name),lnStep_Panel,WCOLS(_screen.Name)-lnStep_Panel)  
    
 			*+----------------------------------+  
 			*|	Если мышка летает внутри окна	|  
 			*+----------------------------------+  
 			*_screen.Caption= STR(MCOL(_screen.Name),7,3)+" из "+STR(WCOLS(_screen.Name),7,3)  
  			This.AddProperty("Wait_Panel",0)	&amp;&amp;Сбросим счетчи ожиадания   
    
  		ELSE  
 			*+---------------------------------+  
 			*|	Счетчик	присутствия на границе |  
 			*+---------------------------------+	   
  			IF TYPE("This.Wait_Panel")#"N"  
  				This.AddProperty("Wait_Panel",0)  
  			ENDIF  
  			This.Wait_Panel=This.Wait_Panel+1  
    
  			&amp;&amp;Если долго ждал  
  			IF THIS.Wait_Panel&gt;lnStep_Max THEN  
    
 				*+----------------------------------------------+  
 				*| Если мышка приблизилась к левому краю		|   
 				*| правая панель спрятана - то ее развернуть	|  
 				*+----------------------------------------------+  
  				IF lcType_Panel="L" AND MCOL(_screen.Name)&lt;=lnStep_Panel  
  					MESSAGEBOX("Окно слево")  
  				ENDIF  
    
    
 				*+----------------------------------------------+  
 				*|	Если мышка зашкалила за правый край, 		|  
 				*| левая панель спрятана - то ее развернуть		|  
 				*+----------------------------------------------+  
  				IF lcType_Panel="R" AND MCOL(_screen.Name)&gt;=WCOLS(_screen.Name)-lnStep_Panel AND !EMPTY(oCheck_Panel.Value)  
  					oCheck_Panel.Value=0  
  					oCheck_Panel.InteractiveChange()  
  				ENDIF  
    
    
  			ENDIF  
    
  		ENDIF  
    
  		_screen.Caption=STR(THIS.Wait_Panel)   
  	ENDPROC  
    
    
  	PROCEDURE do_panel_move  
  		LPARAMETERS lcType_Panel,oCheck_Panel,oTimer_Panel,oThisform  
 		*+--------------------------------------------------+  
 		*|	Обоаботчик событий для панельного таймера		|  
 		*|	lcType_Panel - тип панели R или L				|  
 		*|	oCheck_Panel - ссылка на флаг Check в панели	|  
 		*+--------------------------------------------------+  
    
  		LOCAL lnStep_Panel,lnStep_Max  
  		lnStep_Panel=INT(oThisform.Width/5)	&amp;&amp;Отступ для зоны реагирования  
    
    
  		DO CASE  
  		CASE lcType_Panel="R" AND !EMPTY(oCheck_Panel.Value)  
 			*+--------------------------+  
 			*|	Спрятать правую панель	|  
 			*+--------------------------+  
  			Value_Min=_screen.Width-Thisform.Width  
  			Value_Max=_screen.Width+lnStep_Panel  
  			FOR Value_Now=Value_Min TO Value_Max STEP lnStep_Panel  
  				oThisform.Move(Value_Now)  
  				INKEY(0.1)  
  			ENDFOR  
  			oTimer_Panel.Interval=100    
    
    
  		CASE lcType_Panel="R" AND EMPTY(oCheck_Panel.Value)  
 			*+--------------------------+  
 			*|	Показать правую панель	|  
 			*+--------------------------+  
  			Value_Min=_screen.Width+lnStep_Panel  
  			Value_Max=_screen.Width-Thisform.Width-lnStep_Panel  
  			FOR Value_Now=Value_Min TO Value_Max STEP -lnStep_Panel  
    
  				IF Value_Now&lt;_screen.Width-oThisform.Width  
  				   Value_Now=_screen.Width-oThisform.Width  
  				ENDIF  
    
  				oThisform.Move(Value_Now)  
  				INKEY(0.1)  
    
  				IF Value_Now=_screen.Width-oThisform.Width  
  					EXIT  
  				ENDIF  
    
  			ENDFOR  
  			oTimer_Panel.Interval=0    
    
    
  		CASE lcType_Panel="L" AND !EMPTY(oCheck_Panel.Value)  
 			*+--------------------------+  
 			*|	Спрятать левую панель	|  
 			*+--------------------------+  
    
    
  		CASE lcType_Panel="L" AND EMPTY(oCheck_Panel.Value)  
 			*+--------------------------+  
 			*|	Показать левую панель	|  
 			*+--------------------------+  
    
    
  		ENDCASE  
  	ENDPROC  
    
    
    
  	PROCEDURE check1.Init  
  		Thisform.Top=0  
  		Thisform.Left=_screen.Width-Thisform.Width  
  		Thisform.Height=_screen.Height  
  	ENDPROC  </pre>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4683">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4683">shumik73</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="shumik73" href="https://foxclub.ru/account/?user=4683">
				<img alt='' src='https://secure.gravatar.com/avatar/c9c1d684e3e64ada527aa78b992af82c?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c9c1d684e3e64ada527aa78b992af82c?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-05-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/panel-zadach-sprava/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kniga-150-voprosov-po-visual-foxpro-9/</link>
					<title><![CDATA[Книга &#8220;150 вопросов по Visual FoxPro 9&#8221;]]></title>
                    					    <author><![CDATA[Dmitry Shaporev]]></author>
                    										    <pubDate>Sat, 05 Sep 2020 11:05:49 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Книга &#8220;150 вопросов по Visual FoxPro 9&#8221;</h1>
													</header>
													<blockquote>
<p><em>Книга предназначена для тех, кто любит задавать вопросы и получать ответы. То, что вопросы обязательно возникнут, или уже возникли, сомневаться не приходится – знаю по своему опыту. И вот для того, чтобы сохранить Ваше время, потраченное на мучительные поиски того или иного решения, я её и написал. При создании я исходил как из своих личных наработок, так и пользовался материалами, опубликованными в Интернет. В Интернет можно найти ответ на все случаи жизни, но я сделал попытку как-то систематизировать наиболее часто возникающие у пользователей проблемы и соответственно, попытаться дать способы их решения. Ну что, готовы? Тогда вперед!<br />
</em></p>
<div style="text-align: right;">Дмитрий Шапорев</div>
</blockquote>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="789">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 13 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=789">Dmitry Shaporev</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Dmitry Shaporev" href="https://foxclub.ru/account/?user=789">
				<img alt='' src='https://secure.gravatar.com/avatar/89cab6f4e575e036e91616ec0f5c6f72?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/89cab6f4e575e036e91616ec0f5c6f72?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 16-05-2013        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kniga-150-voprosov-po-visual-foxpro-9/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Книги]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/russkij-help-dlya-microsoft-visual-foxpro-v9-0/</link>
					<title><![CDATA[Русский Help для Microsoft Visual FoxPro v9.0]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 04 Sep 2020 14:13:01 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Русский Help для Microsoft Visual FoxPro v9.0</h1>
													</header>
													<p>Год выпуска: <strong>2008</strong><br />
Разработчик: Перевод выполнен силами FoxClub<br />
Адрес официального сайта: <a href="http://www.foxclub.ru">http://www.foxclub.ru</a><br />
Описание: Русский файл справки для Microsoft Visual FoxPro 9.0 SP1. Перевод выполнен силами энтузиастов с согласия компании Microsoft. Руководитель проекта Юрий Шутенко<br />
Дополнительно: <a href="http://foxclub.ru/rhproject/project/">Онлайн версия справки.</a></p>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/russkij-help-dlya-microsoft-visual-foxpro-v9-0/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Файлы]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/visual-foxpro-9-0/</link>
					<title><![CDATA[Visual FoxPro 9.0: Наиболее полное руководство в подлиннике. Клепинин В.Б., Агафонова Т.П. (+CD)]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Mon, 04 Jul 2022 07:00:08 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Visual FoxPro 9.0: Наиболее полное руководство в подлиннике. Клепинин В.Б., Агафонова Т.П. (+CD)</h1>
													</header>
													<p><img loading="lazy" decoding="async" class="wp-image-4904 alignleft" src="https://foxclub.ru/wp-content/uploads/2020/08/book_large-204x300.jpg" alt="" width="258" height="379" srcset="https://foxclub.ru/wp-content/uploads/2020/08/book_large-204x300.jpg 204w, https://foxclub.ru/wp-content/uploads/2020/08/book_large.jpg 610w" sizes="(max-width: 258px) 100vw, 258px" /><em style="font-weight: 400;">Visual FoxPro ― это мощное средство для создания настольных и распределённых приложений, работающих с базами данных. Его основные достоинства ― удобный интерфейс разработчика, простота базового языка, мощный диалект SQL для эффективной работы с локальными и удалёнными данными, поддержка технологии COM и возможностей, предоставляемых Windows API.<br />
Вы можете создавать на Visual FoxPro приложения, не только ни в чём не уступающие приложениям, созданным с помощью Visual Basic или Delphi, но и превосходящие их по удобству и скорости работы с данными.</em></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Трудно написать книгу о программировании, которая была бы понятна начинающим и интересна профессионалам. Поэтому вы найдете здесь достаточно разноплановый материал.</p>
<p>Первая часть книги, написанная Татьяной Агафоновой (кроме одиннадцатой главы), содержит базовое описание Visual FoxPro. В ней рассматриваются основы языка, особенности среды разработки, поддержка баз данных и вопросы, связанные с разработкой интерфейса пользователя. Материал первой части рассчитан в основном на тех, кто делает первые шаги в изучении Visual FoxPro. В то же время, некоторые разделы будут интересны и более подготовленным программистам.</p>
<p>Вторая часть, написанная Вячеславом Клепининым, адресована тем, кому уже стало тесно в рамках базовых возможностях Visual FoxPro. В ней вы познакомитесь с основами технологии COM, научитесь формировать отчеты в Microsoft Excel и Microsoft Word. Большое внимание уделено применению в ваших приложениях функций Windows API для поддержки графики и мультимедиа.</p>
<p>В третьей части рассматриваются вопросы создания справочной системы и распространения приложений. Эти сведения, безусловно, будут полезны всем разработчикам программного обеспечения на Visual FoxPro. Все главы этой части, кроме главы 27, написаны Татьяной Агафоновой.</p>
<table id="table2" border="0" width="100%" cellspacing="3" cellpadding="3">

<tr>
<td width="121"><img loading="lazy" decoding="async" src="http://foxclub.ru/vfpbook/wk.jpg" width="121" height="181" border="0" /></td>
<td valign="top"><strong>КЛЕПИНИН ВЯЧЕСЛАВ БОРИСОВИЧ</strong><br />
Специалист с более чем 25-летним стажем по разработке и внедрению программных продуктов. Программированием на Visual FoxPro увлёкся в 1997 году и с тех пор является его стойким поклонником.</td>
<td width="115"><img loading="lazy" decoding="async" src="http://foxclub.ru/vfpbook/tata.jpg" width="115" height="170" border="0" /></td>
<td valign="top" width="195"><strong>АГАФОНОВА ТАТЬЯНА ПЕТРОВНА</strong><br />
Профессиональный программист. Занимается программированием на FoxPro (Visual FoxPro) более пятнадцати лет.</td>
</tr>

</table>
<p align="center">Авторы (активно практикующие программисты) заранее приносят свои извинения за допущенные неточности, опечатки и методические погрешности, которые вы, возможно, обнаружите в этой книге. Мы готовы выслушать все ваши замечания и пожелания.</p>
<p align="center">Авторы так же выражают огромную признательность и благодарность нашим общепризнанным гуру и завсегдатаям foxclub.ru за активное участие в обсуждении материалов и доброжелательную критику.</p>
<p><b>Часть 1. Базовое программирование в Visual FoxPro</b></p>
<table border="0" width="100%" cellspacing="0" cellpadding="2">

<tr>
<td><a><img decoding="async" id="1_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 1. Введение в Visual FoxPro</b></td>
</tr>
<tr>
<td>
<table id="1_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Элементы языка<br />
</b>    Команды<br />
Литералы и константы<br />
Переменные и массивы<br />
Процедуры и функции<br />
Математические, числовые, статистические и битовые функции<br />
Символьные функции<br />
Выражения и операторы<br />
Управляющие конструкции<br />
<b>Таблицы, курсоры и базы данных</b><br />
Типы табличных данных<br />
Ключевые поля и индексация таблиц<br />
Индексация по сложным выражениям и использование хранимых процедур<br />
Отношения (связи) между таблицами<br />
Целостность данных при модификации связанных таблиц<br />
Триггеры и хранимые процедуры<br />
<b>Классы и объекты</b><br />
Объектно-ориентированное программирование<br />
Типы объектов<br />
Свойства объектов<br />
События и методы<br />
Введение в классы Visual FoxPro<br />
Базовые классы<br />
<b>Характеристики ООП</b><br />
Инкапсуляция<br />
Наследование и подклассы<br />
Полиморфизм<br />
Стандартные диалоги Visual FoxPro</td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="2_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 2. Интерактивная среда разработки приложений (IDE)</b></td>
</tr>
<tr>
<td>
<table id="2_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Главное окно Visual FoxPro</b><br />
Главное окно и его заголовок<br />
Главное меню<br />
Панель инструментов Standard<br />
Окна Command, Properties и Document View<br />
Менеджер проекта<br />
<b>Мастера, конструкторы и построители</b><br />
Мастера: назначение и области применения<br />
Конструкторы как основной инструмент разработчика<br />
Построители<br />
<b>IntelliSense Manager</b><br />
Применение IntelliSense Manager<br />
Настройка параметров<br />
<b>Task Pane<br />
Toolbox</b><br />
<b>Debugger</b><br />
Вкладка Debug<br />
<b>Настройка среды<br />
</b>Настройка среды разработки<br />
Настройка среды выполнения. Файл Config.fpw<br />
<b>Использование справочной документации</b></td>
</tr>

</table>
</td>
</tr>
<tr>
<td height="27"><a><img decoding="async" id="3_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 3. Проектирование приложений</b></td>
</tr>
<tr>
<td>
<table id="3_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Менеджер проекта и определение структуры приложения</b><br />
Вкладка Projects — проекты<br />
Компоненты приложения (типы файлов), их размещение<br />
Узлы Менеджера проектов<br />
Узел Data<br />
Узел Documents<br />
Узел Class Libraries<br />
Узел Code<br />
Создание компонентов проекта в Менеджере проектов<br />
Главный (стартовый) файл приложения<br />
Главная процедура приложения и процедурные файлы<br />
Ресурсы<br />
Узел Other<br />
Исполняемые файлы<br />
Создание простого исполняемого модуля</td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="4_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 4. Формы</b></td>
</tr>
<tr>
<td>
<table id="4_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Форма как основной компонент приложения</b><br />
<b>Модальные и немодальные формы. Форма верхнего уровня</b><br />
Модальность<br />
Типы интерфейса. SDI или MDI?<br />
Диалоги<br />
Свойства, события и методы экранных форм<br />
Создание экранной формы. Конструктор форм<br />
Панели инструментов Конструктора форм<br />
Панель инструментов Form Designer<br />
Панель инструментов Form Controls<br />
Панель инструментов Layout<br />
Пункты меню Form и Format<br />
Размещение на форме элементов управления<br />
Использование окна свойств для работы с элементами управления<br />
Добавление в форму пользовательских свойств и методов<br />
<b>Добавление и редактирование методов</b><br />
Сохранение формы<br />
Управление формами</td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="5_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 5. Элементы управления</b></td>
</tr>
<tr>
<td>
<table id="5_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Порядок размещения элементов управления на форме</b><br />
Создание элементов управления с помощью Form Controls Toolbar<br />
Создание элементов управления через библиотеки классов<br />
Создание элементов управления через DataEnvironment<br />
<b>Венгерская нотация</b><br />
<b>Список элементов управления</b><br />
CheckBox (Флажок)<br />
ComboBox (Комбинированный список)<br />
Command Button (Кнопка)<br />
Command Group (Группа кнопок)<br />
Container (Контейнер)<br />
Control<br />
Custom<br />
EditBox (Редактируемое поле)<br />
Grid<br />
HyperLink (Ссылка)<br />
Image (Графический объект)<br />
Label (Этикетка)<br />
Line (Линия)<br />
List Box (Список)<br />
OLEBound Control<br />
OLE Control<br />
Option Group (Группа переключателей)<br />
PageFrame (Набор страниц)<br />
Shape (Контур)<br />
Spinner (Счетчик)<br />
TextBox (Текстовое поле)<br />
Timer (Таймер)<br />
Toolbar</td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="6_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 6. Проектирование баз данных</b></td>
</tr>
<tr>
<td>
<table id="6_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Свободные таблицы</b><br />
<b>Контейнер базы данных</b><br />
<b>Кодовые страницы</b><br />
<b>Нормализация данных</b><br />
Отношение "один-к-одному"<br />
Отношение "один-ко-многим"<br />
Отношение "много-к-одному"<br />
Отношение "много-ко-многим"<br />
Ключевое поле<br />
<b>Проектирование нормализованных баз данных</b><br />
Первая нормальная форма<br />
Вторая нормальная форма<br />
Третья нормальная форма<br />
<b>Создание и модификация свободных таблиц</b><br />
Создание таблиц с помощью Конструктора таблиц<br />
Индексация<br />
Регулярные и уникальные индексы<br />
Индексация по сложным выражениям и использование хранимых процедур<br />
Поиск в индексированной таблице<br />
Выбор активного индекса в процессе выполнения<br />
Отношения (связи) между таблицами<br />
Создание таблицы программным способом<br />
<b>Создание и модификация баз данных</b><br />
Создание базы данных с помощью конструктора<br />
Диаграмма отношений между таблицами<br />
Определение свойств полей<br />
Определение свойств таблицы<br />
Триггеры<br />
Хранимые процедуры<br />
Дополнительные возможности контроля данных и их целостности<br />
<b>Курсоры<br />
Локальные и удаленные представления (назначение)</b></td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="7_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 7. Работа с данными</b></td>
</tr>
<tr>
<td>
<table id="7_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Управление данными</b><br />
Открытие баз данных и таблиц<br />
<b>Навигационные команды</b><br />
<b>Добавление данных в поля типа Blob, Memo и General</b><br />
<b>Фильтры<br />
Реляционные команды</b><br />
<b>Использование транзакций<br />
События базы данных</b><br />
<b>Локальное представление данных</b><br />
Создание представления (View) с помощью конструктора представлений<br />
<b>Что такое <i>Rushmore</i>?</b></td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="8_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 8. Работа с удалёнными данными</b></td>
</tr>
<tr>
<td>
<table id="8_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Введение в технологию "клиент-сервер"</b><br />
Установка соединения с удаленными данными<br />
Установка источника данных ODBC<br />
Именованное соединение<br />
Удаленные представления (Remote Views)<br />
Сквозной запрос (SQL pass-through)<br />
<b>MS SQL Server</b><br />
Способы соединения с сервером<br />
Использование команд T-SQL<br />
Краткий справочник по Transact-SQL<br />
Организация взаимодействия с удаленным источником данных<br />
Вызов хранимых процедур<br />
ActiveX Data Objects (ADO)<br />
Применение CursorAdapter<br />
Работа с полем, имеющим свойство IDENTITY<br />
Особенности работы с полями типа Blob<br />
<b>Поддержка XML</b><br />
Парсеры (Анализаторы)</td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="9_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 9. Отображение табличных данных на форме</b></td>
</tr>
<tr>
<td>
<table id="9_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>DataEnvironment (Среда данных)</b><br />
Конструктор Data Environment<br />
Свойства, события и методы объекта DataEnvironment<br />
<b>Сессии данных<br />
Табличное представление данных<br />
</b>    Grid (Сетка)<br />
Объектная модель Grid<br />
Визуальные эффекты Grid<br />
<b>OLE-объекты в таблицах</b><br />
<b>Отображение данных в Grid</b><br />
<b>Навигация данных</b></td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="10_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 10. Использование внешних компонентов</b></td>
</tr>
<tr>
<td>
<table id="10_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Общие сведения об ActiveX управляющих элементах</b><br />
Описание и настройка отдельных компонентов ActiveX<br />
Календарь<br />
TreeView<br />
Управляющий элемент ActiveX Bound Control</td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="11_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 11. Создание пользовательских классов</b></td>
</tr>
<tr>
<td>
<table id="11_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Конструктор классов</b><br />
Классы и библиотеки классов<br />
Создание классов в Конструкторе классов<br />
<b>Обозреватель классов</b><br />
<b>Программное создание классов</b><br />
Определение класса<br />
Класс Custom<br />
<b>Управление временем жизни объектов</b><br />
<b>Класс Collection</b><br />
Создание<br />
Свойства<br />
Методы<br />
Применение<br />
<b>Класс Empty</b><br />
<b>Функции для работы с классами и объектами</b><br />
Функции ADDPROPERTY() и REMOVEPROPERTY()<br />
Функция ACLASS()<br />
Функция AMEMBERS()<br />
Функция GETPEM()<br />
Функция PEMSTATUS()</td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="12_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 12. Создание меню</b></td>
</tr>
<tr>
<td>
<table id="12_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Создание меню в Конструкторе меню</b><br />
Меню, заменяющее главное окно Visual FoxPro<br />
Меню формы верхнего уровня<br />
Раскрывающееся (контекстное) меню<br />
<b>Команды создания меню</b><br />
Меню в SDI- и MDI-формах<br />
<b>Вызов меню</b><br />
Вызов из меню методов формы<br />
<b>Свойства меню</b><br />
<b>Восстановление главного меню Visual FoxPro</b></td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="13_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 13. Отчёты</b></td>
</tr>
<tr>
<td>
<table id="13_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Введение в систему отчетов</b><br />
<b>Непосредственный вывод на принтер</b><br />
<b>Стандартный отчет (Quick Report)</b><br />
<b>Мастер отчетов</b><br />
<b>Конструктор отчетов</b><br />
Среда окружения отчета<br />
Панель инструментов Конструктора отчетов<br />
Выполнение надписей в отчете<br />
Размещение табличных полей в отчете<br />
Группировка данных отчета<br />
Переменные в отчете<br />
Разметка страницы<br />
<b>OLE-объекты в отчете</b><br />
<b>Просмотр и печать отчета</b><br />
<b>Многоколоночный отчет</b><br />
<b>Создание этикеток</b><br />
<b>Особенности многополосных отчетов</b><br />
<b>Управление отчетами — объект ReportListener</b><br />
Свойства, методы и события объекта ReportListener</td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="14_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 14. Обработка ошибок</b></td>
</tr>
<tr>
<td>
<table id="14_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td>Синтаксические ошибки<br />
Ошибки в логике программы<br />
Ошибки времени выполнения (Run-Time Error)<br />
Инструменты для определения ошибок<br />
Обработка ошибочных ситуаций<br />
Стандартный обработчик ошибок<br />
Команда ON ERROR<br />
Конструкция TRY... CATCH... FINALLY<br />
Coverage Profile</td>
</tr>

</table>
</td>
</tr>

</table>
<p><b>Часть 2. Расширенное программирование в Visual FoxPro</b></p>
<table border="0" width="100%" cellspacing="0" cellpadding="2">

<tr>
<td><a><img decoding="async" id="15_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 15. Операции с файлами</b></td>
</tr>
<tr>
<td>
<table id="15_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Импорт данных</b><br />
Диалог Import<br />
Мастер импорта данных<br />
Команда Import From<br />
Команда Append From<br />
Экспорт данных<br />
Диалоговое окно Export<br />
Команда Export To<br />
Команда Copy To<br />
<b>Копирование и удаление файлов</b><br />
<b>Использование функции ALINES()</b><br />
<b>Низкоуровневый доступ к файлам</b><br />
Открытие и закрытие файлов<br />
Работа с файлами последовательного доступа<br />
Работа с двоичными файлами<br />
Обработка ошибок<br />
Изменение размера файла<br />
<b>Проверка наличия файла и даты изменения</b><br />
<b>Структура таблиц формата DBF</b><br />
Заголовок таблицы<br />
Блоки записей таблицы<br />
Изменение кодовой страницы<br />
<b>Редактор файлов HexEdit</b><br />
<b>Специальные таблицы Visual FoxPro</b></td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="16_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 16. Технология COM</b></td>
</tr>
<tr>
<td>
<table id="16_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Введение в технологию COM</b><br />
Процессы и потоки<br />
Идентификаторы<br />
Информация о COM-объектах в реестре Windows<br />
Интерфейсы<br />
Раннее и позднее связывание в COM<br />
Среда Visual FoxPro и поддержка COM<br />
<b>Программное создание COM-сервера</b><br />
Информация о классе в Object Browser<br />
Тестирование COM-сервера vfpserver<br />
Особенности объявления COM-класса в Visual FoxPro<br />
Выбор базового класса для создания COM-класса<br />
Работа с массивами<br />
Обработка ошибок<br />
Региональные настройки<br />
<b>Создание COM-класса в Конструкторе классов</b><br />
Тестирование: клиент на Visual FoxPro<br />
Тестирование: клиент — Microsoft Excel<br />
Окончательная доработка приложения VfpTextEdit<br />
Сокрытие "лишних" методов и свойств<br />
<b>Распределенные приложения</b><br />
Распределенные COM (DCOM)<br />
Приложения COM+<br />
<b>Регистрация COM-серверов</b></td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="17_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 17. Автоматизация MS Office</b></td>
</tr>
<tr>
<td>
<table id="17_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Введение в Microsoft Office</b><br />
Объекты<br />
Использование раннего связывания<br />
Объекты-коллекции<br />
Макросы<br />
Определение значений констант<br />
Константы Microsoft Office<br />
<b>Автоматизация Microsoft Excel</b><br />
Объектная модель Microsoft Excel<br />
Оформление отчетов<br />
Формирование отчетов<br />
Уменьшение времени формирования отчета<br />
Печать<br />
Уничтожение объекта Microsoft Excel<br />
<b>Автоматизация Microsoft Word</b><br />
Объектная модель Microsoft Word</td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="18_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 18. Компоненты ActiveX</b></td>
</tr>
<tr>
<td>
<table id="18_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Общие сведения об использовании компонентов</b><br />
Выбор и размещение компонента на форме<br />
Лицензирование<br />
Интерактивная установка свойств компонента<br />
<b>Компонент ProgressBar</b><br />
<b>Компонент Slider</b><br />
<b>Компонент RichText</b><br />
Свойства<br />
Свойства типа SelXXX<br />
Методы<br />
Контекстное меню RichText<br />
Работа с буфером обмена<br />
Форматирование RTF-документа<br />
<b>Компонент Web Browser</b><br />
Метод Navigate2<br />
Окно справки, использующее Web Browser<br />
Интерактивные отчеты в Web Browser<br />
Другие методы компонента Web Browser<br />
<b>Функция SYS(2333)</b></td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="19_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 19. Windows API</b></td>
</tr>
<tr>
<td>
<table id="19_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Введение в Windows API</b><br />
Объявление функций Windows API в Visual FoxPro<br />
Базовые типы данных в С++<br />
Типы данных Windows<br />
Указатели<br />
Структуры<br />
Прототипы функций<br />
MSDN как источник информации о прототипах функций<br />
Формирование структур в Visual FoxPro<br />
Передача массивов в функцию Windows API<br />
Форматы символьных данных ANSI и Unicode<br />
Многократное объявление функций Windows API<br />
Удаление зарегистрированных функций<br />
<b>Распределение памяти для структур с указателями</b><br />
Распределение памяти Windows<br />
Распределение памяти внутри процесса<br />
Работа с указателями в Visual FoxPro<br />
Освобождение распределенной памяти<br />
<b>Применение функций Windows API</b></td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="20_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 20. Работа с Реестром Windows</b></td>
</tr>
<tr>
<td>
<table id="20_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Структура реестра</b><br />
<b>Использование функций Windows API</b><br />
Открытие ключа реестра<br />
Чтение значений ключа<br />
Закрытие ключа и сохранение реестра<br />
Пример чтения информации из реестра<br />
Создание ключа<br />
Запись и удаление значений ключа<br />
Другие API-функции для работы с реестром Windows<br />
<b>Использование Windows Scripting Host</b><br />
Создание разделов и запись значений ключей реестра<br />
Чтение информации из реестра<br />
Удаление информации из реестра<br />
Изменение значения ключа<br />
<b>Дополнительные возможности объекта WshShell</b><br />
Запуск приложения<br />
Имитация нажатия клавиш клавиатуры<br />
Просмотр значений переменных окружения Windows</td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="21_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 21. Применение GDI+</b></td>
</tr>
<tr>
<td>
<table id="21_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Введение в GDIPlus</b><br />
Векторная и растровая графика<br />
Форматы графических файлов<br />
Инициализация и завершение GDIPlus<br />
Объектная модель GDIPlus<br />
Поддержка формата Unicode<br />
Обработка ошибок<br />
Класс VFPGdiplus<br />
<b>Загрузка, сохранение и удаление изображений</b><br />
Загрузка изображения из файла.<br />
Сохранение изображения в файле<br />
Загрузка изображения из поля таблицы или переменной<br />
Сохранение изображения в переменной (в поле таблицы)<br />
Использование буфера обмена Windows<br />
<b>Информация об изображении</b><br />
Определение размеров растра<br />
Определение разрешения растра<br />
Определение графического формата изображения<br />
<b>Операции над изображениями</b><br />
Поворот и отражение изображения<br />
Отсекание прямоугольного фрагмента изображения<br />
<b>Создание растра</b><br />
Форматы пикселов<br />
Объект Graphics, связанный с растром<br />
Изменение размеров изображения<br />
<b>Обзор функций для копирования изображений</b></td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="22_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 22. Рисование в GDI+</b></td>
</tr>
<tr>
<td>
<table id="22_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Цвета, единицы измерения и координаты</b><br />
Концепция цвета и прозрачности. Метод ARGB<br />
Использование различных единиц измерения<br />
Система координат<br />
<b>Инструментарий</b><br />
Перья<br />
Кисти<br />
<b>Графические примитивы</b><br />
Антиалиасинг<br />
Прямые и ломаные линии<br />
Сплайны<br />
Прямоугольники<br />
Многоугольники<br />
Окружности и эллипсы<br />
Сектора и дуги<br />
<b>Рисование текстовых строк</b><br />
Объекты FontFamily и Font<br />
Управление качеством отображения символов<br />
Определение длины текстовой строки<br />
Форматирование текста<br />
<b>Рисование изображений</b></td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="23_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 23. Графический вывод в GDI+</b></td>
</tr>
<tr>
<td>
<table id="23_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Печать на принтере</b><br />
Создание графического контекста принтера<br />
Создание связанного с принтером объекта Graphics<br />
Определение размера листа принтера<br />
Документ принтера<br />
Класс для печати на принтере<br />
<b>Рисование в окне формы</b><br />
Определение "правильного" HWnd<br />
Перехват оконных сообщений<br />
Создание связанного с окном объекта Graphics<br />
Форма для рисования<br />
Класс для рисования в окне формы<br />
<b>Динамическое отображение диаграмм</b><br />
<b>Применение GDIPlus в отчетах</b><br />
События, методы и свойства объекта ReportListener<br />
Создание отчета<br />
Процедура запуска отчета<br />
<b>Координатные преобразования</b><br />
<b>Манипуляции с цветом</b><br />
Объект ImageAttributes<br />
Пример корректировки цветовой гаммы изображения<br />
<b>Еще несколько функций GDIPlus...</b><br />
Перо, рисующее кистью<br />
Изменение вида начала или конца линии<br />
Изменение и установка цвета пикселов<br />
<b>Обзор классов</b><br />
Класс GdipImages<br />
Класс GdipPrinter<br />
Класс GdipWindow</td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="24_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 24. Мультимедиа</b></td>
</tr>
<tr>
<td>
<table id="24_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Запись и воспроизведение WAV-файлов</b><br />
Запись звукового файла<br />
Воспроизведение звукового файла<br />
Воспроизведение стандартных звуков Windows<br />
<b>Интерфейс управления мультимедиа (MCI)</b><br />
Команды MCI<br />
Особенности вывода видео на форме<br />
Класс для управления MCI<br />
Проигрыватель звуковых файлов<br />
Проигрыватель видеофайлов<br />
<b>Microsoft Agent</b><br />
Объектная модель Microsoft Agent<br />
Коллекция персонажей Characters<br />
Объект Character (персонаж)<br />
Управление анимацией. Объект Request<br />
Управление воспроизведением речи<br />
Объект Balloon<br />
Объект AudioOutput<br />
ActiveX-компонент Microsoft Agent<br />
Использование Ассистентов Microsoft Office 2003<br />
Обработка ошибок Microsoft Agent</td>
</tr>

</table>
</td>
</tr>

</table>
<p><b>Часть 3. Распространение приложений</b></p>
<table border="0" width="100%" cellspacing="0" cellpadding="2">

<tr>
<td><a><img decoding="async" id="25_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 25. Описание демо-проекта (делопроизводство)</b></td>
</tr>
<tr>
<td>
<table id="25_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td>Постановка задачи<br />
Определение языка программирования, создание структур для хранения данных<br />
Определение состава проекта<br />
Разработка главного модуля приложения<br />
Разработка меню<br />
Разработка форм<br />
Файл помощи</td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="26_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 26. Разработка справочной документации</b></td>
</tr>
<tr>
<td>
<table id="26_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Строка состояния</b><br />
<b>Справка в формате "What's This?" ("Что это?")</b><br />
<b>Диалоговые окна</b><br />
<b>Описание работы с HTML Help Workshop</b><br />
Создание тем справочной системы<br />
Содержание<br />
Предметный указатель<br />
Определение ссылок на фрагменты справки в свойствах HelpID объектов<br />
Определение псевдонимов тем<br />
Определение параметров проекта справочной системы<br />
Компиляция и тестирование справочной системы<br />
Команды Visual FoxPro для управления справочной системой<br />
Формирование файла проекта справочной системы</td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="27_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 27. Распространение приложений</b></td>
</tr>
<tr>
<td>
<table id="27_content" class="cat" border="0" width="95%" cellspacing="0" cellpadding="2">

<tr>
<td><b>Введение в InstallShield Express</b><br />
<b>Установка InstallShield Express</b><br />
<b>Запуск InstallShield Express</b><br />
<b>Создание дистрибутива приложения</b><br />
Общие установки<br />
Спецификация данных приложения<br />
Вставка пункта в меню Пуск и иконки приложения<br />
Определения набора диалогов Мастера установки<br />
Определение требований к среде выполнения<br />
Сборка дистрибутива<br />
<b>Редактирование дистрибутива приложения</b></td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="28_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Глава 28. Полезные советы</b></td>
</tr>
<tr>
<td>
<table id="28_content" class="cat" border="0" width="100%" cellspacing="0" cellpadding="2">

<tr>
<td>1. Как изменить кодовую страницу таблицы?<br />
2. Как прочитать список файлов, расположенных в одном каталоге?<br />
3. Вы хотите закрыть свой проект от взлома, хотя бы от не очень компетентных людей<br />
4. Вы хотите ввести пароль и зашифровать его<br />
5. Вы хотите, чтобы Ваше приложение запускалось только один раз на каждом компьютере<br />
6. Как вычислить определенные даты<br />
7. Как сделать всплывающую подсказку.<br />
8. Как работать с INI-файлами?<br />
9. Как сделать ссылку?<br />
10. Как &lt;прикрепить&gt; созданную вами иконку к проекту?<br />
11. Как организовать ProgressBar? ("градусник","термометр")<br />
12. Обновление версий<br />
13. Преобразовать "Сидоров Василий Иванович" в "Сидоров" "Василий" "Иванович"<br />
14. Анимированная иконка<br />
15. Как создать задание на SQL-Server?<br />
16. Как запустить архиватор arj из VFP, чтобы он при запуске не мелькал на экране?<br />
17. Как определить серийный номер жесткого диска?<br />
18. Отображение текста на форме в виде бегущей строки<br />
19. Создание каталога для отчетов и создание ссылки на него на рабочем столе пользователя<br />
20. Определение информации о дисках компьютера<br />
21. Создание &lt;на лету&gt; группы кнопок или переключателей (из таблицы)<br />
22. При нажатии клавиши Enter первая колонка Grid скрывается за границу Grid<br />
23. Контекстный поиск в Grid<br />
24. Информирование пользователя о выполнении какого-либо процесса<br />
25. Как вернуть название месяца по его номеру<br />
26. Как выгрузить неактивную программу у пользователей<br />
27. Как разместить на форме часы<br />
28. Как заставить цифровую клавиатуру отображать точку при любой раскладке (Ru/En)<br />
29. Как заменить сообщение "Invalid Date" при вводе некорректной даты<br />
30. Как получить программный код создания структуры базы данных<br />
31. Как перенести данные из текстового файла в таблицу<br />
32. Получение данных об установленных программных продуктах<br />
33. Из какой папки запущена программа (EXE-файл)<br />
34. VFP + Internet Explorer<br />
35. Связь VFP и Lotus Notes</td>
</tr>

</table>
</td>
</tr>
<tr>
<td><a><img decoding="async" id="29_link" src="http://foxclub.ru/vfpbook/contents/minus.png" align="absmiddle" border="0" /></a> <b>Приложения</b></td>
</tr>
<tr>
<td>
<table id="29_content" class="cat" border="0" width="100%" cellspacing="0" cellpadding="2">

<tr>
<td>1. Установка и настройка Visual FoxPro<br />
2. Перечень команд типа SET<br />
3. Справочник по встроенным функциям Visual FoxPro<br />
4. Свойства и методы объектов Visual FoxPro<br />
5. Содержание компакт-диска</td>
</tr>

</table>
</td>
</tr>

</table>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/visual-foxpro-9-0/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Книги]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/zip-arhivator-na-osnove-zlib/</link>
					<title><![CDATA[ZIP-архиватор на основе Zlib]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>ZIP-архиватор на основе Zlib</h1>
													</header>
													<pre class="bbcode">*== Тестовый пример производит архивирование каталога %WinDir%system32 в файл C:TestZip.zip  
 *  
 * Пути можете подправить по собственному усмотрению.  
 * Библиотека в приложении  
    
  oTest = CREATEOBJECT("clsTest")  
  oTest.SHOW(1)  
    
    
 *===== Тестовый класс =====:  
  DEFINE CLASS clsTest AS FORM  
  CAPTION = "Тест архивирования"  
    
  ADD OBJECT btnOk AS CommandButton WITH ;  
  LEFT = 10, ;  
  TOP = 10, ;  
  WIDTH = 50, ;  
  HEIGHT = 25, ;  
  CAPTION = "Start"  
    
    
 *===== Тестовое архивирование =====:  
  PROC btnOk.CLICK  
  LOCAL lcWinDir  
    
  lcWinDir = ADDBS(GETENV("windir")) + "System32"  
  IF !PEMSTATUS(THISFORM, "test", 5)  
  THISFORM.AddObject("test", "clsZip", 5, THISFORM.HEIGHT-25, THISFORM.WIDTH-10, 20)  
  ENDIF  
  THISFORM.test.Zip(lcWinDir + "*.*", "C:TestZip", "r")  
  ENDPROC &amp;&amp; btnOk.CLICK  
    
  ENDDEFINE &amp;&amp; clsTest  
    
    
 **************************************************************  
 * СОЗДАНИЕ ZIP-АРХИВА  
 *  
 * (c) Copyright 2004 by Dmitry Aglyamov  
 *  
 * РЕСУРСЫ:  
 * Библиотека ZLib.dll  
 * MS ProgressBar  
 *  
 * ИСПОЛЬЗОВАНИЕ:  
 * 1. Создаем в форме контрол на основе класса clsZip  
 * 2. Вызываем метод Zip(tcSourceFiles, tcZipFile, tcOptions)  
 * При архивировании каталога обязательно указывать шаблон  
 * архивируемых файлов, как при вызове ADIR()  
 *  
 **************************************************************  
  DEFINE CLASS clsZip AS Control  
  SPECIALEFFECT = 0  
  BORDERWIDTH = 0  
    
  ADD OBJECT oleProcess AS OleControl WITH ;  
  OLECLASS = 'MSComctlLib.ProgCtrl.2'  
    
    
 *===== Инициализация =====:  
  PROC INIT (tnLt, tnTp, tnWt, tnHt)  
  THIS.LEFT = tnLt  
  THIS.TOP = tnTp  
  THIS.WIDTH = tnWt  
  THIS.HEIGHT = tnHt  
  THIS.oleProcess.SCROLLING = 1  
  THIS.VISIBLE = .T.  
  ENDPROC &amp;&amp; INIT  
    
    
 *===== СОЗДАНИЕ ZIP-АРХИВА ===== :  
  PROC Zip (tcFiles, tcZip, tcStat)  
 * tcFiles - Путь архивируемого каталога / файла  
 * tcZip - Файл ZIP-архива  
 * tcStat - r включать подкаталоги  
    
  LOCAL lHndlZip, ;  
  lcAtr,lcPathSave  
    
  tcStat = IIF(VARTYPE(tcStat) = "C", tcStat, "")  
  tcFiles = ALLTRIM(tcFiles)  
  lcAtr = "ASHR" + IIF("r" $ tcStat, "D", "")  
  tcZip = ALLTRIM(tcZip)  
  IF UPPER(RIGHT(tcZip, 4)) # ".ZIP"  
  tcZip = tcZip + ".ZIP"  
  ENDIF  
  THIS.oleProcess.VALUE = 0  
    
 *=== Чтобы не писать полные пути в архиве переходим в нужный каталог :  
  lcPathSave = SYS(5)+SYS(2003)  
  IF OCCURS("", tcFiles) &gt; 1  
  SET DEFAULT TO LEFT(tcFiles, RAT("", tcFiles))  
  tcFiles = LEFT(tcFiles, AT("", tcFiles)-1) + "*.*"  
  ENDIF  
    
 *=== Определяем размер архивируемых файлов (для скроллера) :  
  THIS.oleProcess.MAX = THIS.GetSizeDir(tcFiles, lcAtr)  
    
 *=== Инициализация библиотеки Zip-архиватора :  
  DECLARE INTEGER zipOpen IN ZLib STRING cPath, INTEGER cMode  
  DECLARE INTEGER zipOpenNewFileInZip IN ZLib ;  
  INTEGER IdFile, STRING NameFile, STRING InfoFile, STRING ExtLocal, ;  
  INTEGER SizeExtLocal, STRING ExtGlobal, INTEGER SizeExtGlobal, ;  
  STRING Comment, INTEGER Method, INTEGER Level  
  DECLARE INTEGER zipWriteInFileInZip IN ZLib INTEGER IdFile, STRING @Buf, LONG LenBuf  
  DECLARE INTEGER zipCloseFileInZip IN ZLib INTEGER IdFile  
  DECLARE INTEGER zipClose IN ZLib INTEGER IdFile, STRING Comment  
    
  lHndlZip = ZipOpen(tcZip, 0)  
  THIS.pZipFiles(lHndlZip, tcFiles, lcAtr)  
  ZipClose(lHndlZip, "")  
  THIS.oleProcess.VALUE = 0  
    
  CLEAR DLLS zipOpen, zipOpenNewFileInZip, zipWriteInFileInZip, zipCloseFileInZip, zipClose  
  SET DEFAULT TO (lcPathSave)  
  ENDPROC &amp;&amp; Zip  
    
    
 *===== Архивация файлов каталога =====:  
  PROC pZipFiles (tHndlZip, tcFiles, tcAtr)  
 * tHndlZip - Хендл Zip-файла  
 * tcFiles - Полный путь каталога с шаблоном выбираемых файлов  
 * tcAtr - Атрибуты выбираемых файлов  
    
  LOCAL laFiles[1,1], ;  
  lHndlFile,i, ;  
  lcZipFileInfo,lcPath,lcBuff  
    
  lnAllFiles = ADIR(laFiles, tcFiles, tcAtr, 1)  
  FOR i=1 TO lnAllFiles  
  IF INLIST(laFiles[i, 1], ".", "..")  
  LOOP  
  ENDIF  
  lcPath = IIF("" $ tcFiles, LEFT(tcFiles, RAT("", tcFiles)), "")  
  lcZipFileInfo = THIS.fGetZipFileInfo(DTOC(laFiles[i, 3]),laFiles[i, 4],laFiles[i, 5])  
  ZipOpenNewFileInZip(tHndlZip, CPCONVERT(1251, 866, lcPath+laFiles[i, 1]), ;  
  @lcZipFileInfo, 0, 0, 0, 0, "", 8,-1)  
  lHndlFile = FOPEN(lcPath + laFiles[i, 1])  
  DO WHILE !FEOF(lHndlFile)  
  lcBuff = FREAD(lHndlFile, 65536)  
  ZipWriteInFileInZip(tHndlZip, @lcBuff, LEN(lcBuff))  
  THIS.oleProcess.VALUE = THIS.oleProcess.VALUE + LEN(lcBuff)  
  ENDDO  
  FCLOSE(lHndlFile)  
  ZipCloseFileInZip(tHndlZip)  
    
  IF CHRSAW() AND INKEY() = 27  
  RETURN .F.  
  ENDIF  
  IF "D" $ laFiles[i, 5] AND "D" $ tcAtr  
  IF !THIS.pZipFiles(tHndlZip, lcPath + laFiles[i, 1] + "*.*", tcAtr)  
  RETURN .F.  
  ENDIF  
  ENDIF  
  ENDFOR  
  ENDPROC &amp;&amp; pZipFiles  
    
    
 *===== Формирование структуры информации файла, записываемого в Zip-архив =====:  
  PROC fGetZipFileInfo (tcDate, tcTime, tcAttrib)  
 * tcDate - дата создания файла  
 * tcTime - время создания файла  
 * tcAttrib - атрибут файла  
    
 * typedef struct  
 * {  
 * tm_zip tmz_date; /* date in understandable format */  
 * uLong dosDate; /* if dos_date == 0, tmu_date is used */  
 * uLong internal_fa; /* internal file attributes 2 bytes */  
 * uLong external_fa; /* external file attributes 4 bytes */  
 * } zip_fileinfo;  
    
 * typedef struct tm_zip_s  
 * {  
 * uInt tm_sec; /* seconds after the minute - [0,59] */  
 * uInt tm_min; /* minutes after the hour - [0,59] */  
 * uInt tm_hour; /* hours since midnight - [0,23] */  
 * uInt tm_mday; /* day of the month - [1,31] */  
 * uInt tm_mon; /* months since January - [0,11] */  
 * uInt tm_year; /* years - [1980..2044] */  
 * } tm_zip  
    
  LOCAL lnAttrib,i, ;  
  lcZipFileInfo  
    
  lcZipFileInfo = ""  
  FOR i=3 TO 1 STEP -1  
  lcZipFileInfo = lcZipFileInfo + ;  
  THIS.DigitAsString(VAL(STREXTRACT(":"+tcTime+":", ":", ":", i)))  
  ENDFOR  
  FOR i=1 TO 3  
  lcZipFileInfo = lcZipFileInfo + ;  
  THIS.DigitAsString(VAL(STREXTRACT("/"+tcDate+"/", "/", "/", i)) - ;  
  IIF(i = 2, 1, 0))  
  ENDFOR  
  lcZipFileInfo = lcZipFileInfo + THIS.DigitAsString(0)  
  lcZipFileInfo = lcZipFileInfo + THIS.DigitAsString(0)  
  lnAttrib = 0  
  FOR i=1 TO 6  
  IF SUBSTR("RHSVDA", i, 1) $ UPPER(tcAttrib)  
  lnAttrib = BITSET(lnAttrib, i-1)  
  ENDIF  
  ENDFOR  
  lcZipFileInfo = lcZipFileInfo + THIS.DigitAsString(lnAttrib)  
  RETURN lcZipFileInfo  
  ENDPROC &amp;&amp; fGetZipFileInfo  
    
    
 *===== ОПРЕДЕЛЕНИЕ РАЗМЕРА КАТАЛОГА (в байтах) =====:  
  PROC GetSizeDir (tcFiles, tcAtr)  
 * tcFiles - Полный путь каталога с шаблоном выбираемых файлов  
 * tcAtr - Атрибуты выбираемых файлов  
    
  LOCAL laFiles[1,1], ;  
  lnAllBytes,i, ;  
  lcPath  
    
  lnAllBytes = 0  
  FOR i=1 TO ADIR(laFiles, tcFiles, tcAtr, 1)  
  IF INLIST(laFiles[i, 1], ".", "..")  
  LOOP  
  ENDIF  
  IF "D" $ laFiles[i, 5] AND "D" $ tcAtr  
  lcPath = IIF("" $ tcFiles, LEFT(tcFiles, RAT("", tcFiles)), "")  
  lnAllBytes = lnAllBytes + THIS.GetSizeDir(lcPath + laFiles[i, 1] + "*.*", tcAtr)  
  ELSE  
  lnAllBytes = lnAllBytes + laFiles[i, 2]  
  ENDIF  
  ENDFOR  
  RETURN lnAllBytes  
  ENDPROC &amp;&amp; GetSizeDir  
    
    
 *===== Возвращает число в виде строки чисел типа DWORD =====:  
  PROC DigitAsString (tnInteger)  
  RETURN CHR(BITAND(tnInteger, 255)) + CHR(BITAND(BITRSHIFT(tnInteger, 8), 255)) + ;  
  CHR(BITAND(BITRSHIFT(tnInteger, 16), 255)) + CHR(BITAND(BITRSHIFT(tnInteger, 24), 255))  
  ENDPROC &amp;&amp; DigitAsString  
    
    
 *===== Ширина контрола =====:  
  PROC WIDTH_ASSIGN (tnVal)  
  STORE tnVal TO THIS.WIDTH, THIS.oleProcess.WIDTH  
  ENDPROC &amp;&amp; WIDTH_ASSIGN  
    
    
 *===== Высота контрола =====:  
  PROC HEIGHT_ASSIGN (tnVal)  
  STORE tnVal TO THIS.HEIGHT, THIS.oleProcess.HEIGHT  
  ENDPROC &amp;&amp; HEIGHT_ASSIGN  
  ENDDEFINE &amp;&amp; clsZip</pre>
<div id="sol_avtor">Автор: Dmitry Aglyamov</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/zip-arhivator-na-osnove-zlib/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Система]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/vyvod-dannyh-general-polya-obratno-v-word/</link>
					<title><![CDATA[Вывод данных GENERAL поля обратно в WORD]]></title>
                    					    <author><![CDATA[KID]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 12:17:30 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Вывод данных GENERAL поля обратно в WORD</h1>
													</header>
													<div id="sol_opis">Если в GENERAL поле находится объект WORD - данные функции позволяют вывести содержимое поля обратно в ВОРД файл. Решение далеко не полностью мое, поэтому на авторство не претендую. Но все же у меня была такая задача - вдруг кому-нибудь пригодится...</div>
<div id="sol_body">
<pre class="bbcode">*************************************************  
 * Вывод результатов Дженерал поля в ВОРД - ResultToWord *  
 *************************************************  
  FUNCTION ResultToWord  
    
  cFileFolder = "c:"  
    
  close all  
    
 * CopyGen Demo routine - you can modify this to suit your needs  
 *======================  
    
 ********** Required code before CopyGen is called ********  
  SET LIBRARY TO &amp;Main_pathfoxtools.fll ADDITIVE &amp;&amp;  
 * &amp;&amp;  
  DIMENSION FnNum[7] &amp;&amp;  
  FnNum = -1 &amp;&amp;  
 **********************************************************  
    
    
  PrevSec = SECONDS()  
  use &amp;Main_path_tmp.DBF in 45 shared alias temporary &amp;&amp;c:_tmp.dbf in 0 shared  
  SELECT temporary  
  goto top  
  cNameOfStudent = ALLTRIM(temporary.person)  
    
  sum temporary.bal TO nAllBalls  
    
  SELECT temporary  
  goto 2  
    
    
  scan all  
    
 * QUEST = General field name  
    
  RetVal = CopyGen(DBF("temporary"), recno(), "Quest", "c:"+ALLTRIM(STR(RECNO())) ) &amp;&amp; do not use targetfile extension  
    
 *****************************************  
 * формирование ВОРД-документов  
 * если в General поле стоит картинка - то попросту будет создан bmp, gif, jpeg файд  
 *****************************************  
    
  DO CASE  
  CASE RetVal = 0  
 * WAIT WINDOW "File extracted successfully! ("+STR(SECONDS()-PrevSec)+" seconds)";  
 * + CHR(13) + "Press any key to continue......"  
  CASE RetVal = -1  
  WAIT WINDOW "CopyGen demo works only with 1986 dbf file size!" + CHR(13) + "Press any key to continue......"  
  CASE RetVal = -2  
  WAIT WINDOW "File access error - not found or in exclusive use!" + CHR(13) + "Press any key to continue......"  
  CASE RetVal = -3  
  WAIT WINDOW "Incorrect filetype - not FPW/memo or VFP/memo!" + CHR(13) + "Press any key to continue......"  
  CASE RetVal = -4  
  WAIT WINDOW "Specified field not found in DBF file!"  
  CASE RetVal = -5  
  WAIT WINDOW "Specified field is not a general field!"  
  CASE RetVal = -6  
 * WAIT WINDOW "No valid .BMP or .DOC file found inside general field!"  
  ENDCASE  
    
  endscan  
    
 *************************  
 * создаем массив с созданными  
 * выще ВОРД-документами  
 *************************  
    
  n = adir(afiles, cFileFolder + "*.doc")  
    
  oWord = createobject("Word.application")  
  y = oWord.documents.ADD  
    
 **************  
  oRange = oWord.ActiveDocument.Range()  
    
  oword.Selection.Font.Size=12  
  oword.Selection.Font.bold=.t.  
  oword.Selection.ParagraphFormat.Alignment=1  
  oword.Selection.insertafter("Р Е З У Л Ь Т А Т И " + CHR(13) + CHR(13))  
    
  oword.Selection.insertafter(cNameOfStudent + CHR(13))  
    
  oword.Selection.insertafter("ДАТА : " + DTOC(DATE()) + " РОКУ, ЧАС: " + ;  
  TIME() + CHR(13))  
    
  oword.Selection.insertafter(CHR(13))  
    
  oword.Selection.InsertAfter('ЗАГАЛЬНА КIЛЬКIСТЬ : ' + str(nAllBalls))  
    
  END=oword.activedocument.Bookmarks("ENDOFDOC").select  
  oword.Selection.ParagraphFormat.Alignment=0  
    
  With oRange  
  .moveend(6)  
  .collapse(0)  
  .insertafter(chr(13)+chr(13))  
  .collapse(0)  
  EndWith  
    
 ********************  
    
  oword.Selection.Font.Size=11  
  oword.Selection.Font.bold=.t.  
    
  oTable = oWord.ActiveDocument.Tables.Add(oRange,1,4)  
    
  WITH oTable  
    
 * First, put all borders  
  .Borders.InsideLineStyle = .t.  
  .Borders.OutsideLineStyle = .t.  
    
    
 * Put heading text in and set alignment  
    
  .Cell[1,1].Range.ParagraphFormat.Alignment = 1 &amp;&amp; wdAlignParagraphCenter  
  .Cell[1,2].Range.ParagraphFormat.Alignment = 1 &amp;&amp; wdAlignParagraphCenter  
  .Cell[1,3].Range.ParagraphFormat.Alignment = 1 &amp;&amp; wdAlignParagraphCenter  
  .Cell[1,4].Range.ParagraphFormat.Alignment = 1 &amp;&amp; wdAlignParagraphCenter  
    
  .cell[1,1].Range.InsertAfter('№')  
  .cell[1,1].Width = 30  
  .cell[1,2].Range.InsertAfter('Содержимое ВОРД файла')  
  .cell[1,2].Width = 320  
  .cell[1,3].Range.InsertAfter('Цифровое поле')  
  .cell[1,3].Width = 80  
  .cell[1,4].Range.InsertAfter('Еще одно цифровое поле')  
  .cell[1,4].Width = 40  
  ENDWITH  
 *oWord.visible = .t.  
    
  SELECT temporary  
  goto 2 &amp;&amp;top  
    
  nRowNum = 1  
    
  for i = 1 to n  
    
    
  z = oWord.documents.Open(cFileFolder + aFiles[i,1])  
  z.range.copyAsPicture  
  z.close  
  IF y.paragraphs.Count &gt; 1  
  y.paragraphs.Add  
  ENDIF  
    
  oTable.Rows.Add()  
  oTable.Cell(nRowNum + 1,1).Range.InsertAfter(STR(nRowNum))  
  oTable.Cell(nRowNum + 1,2).Select  
    
 * вставка содержимого файла в один  
  oWord.Selection.paragraphs.Last.Range.Paste  
    
  SELECT temporary  
  goto i + 1  
    
  oTable.Cell(nRowNum + 1,3).Range.InsertAfter(STR(temporary.Answer,8,2))  
  oTable.Cell(nRowNum + 1,4).Range.InsertAfter(STR(temporary.bal))  
    
  nRowNum = nRowNum + 1  
    
  endfor  
  _cliptext = ""  
    
    
  oWord.visible = .t.  
 *wait window "wait..."  
 *oWord.quit  
    
    
  ERASE cFileFolder + "*.doc" &amp;&amp; erase doc files  
  SELECT temporary  
  use in temporary  
    
 ********************************************************  
 * END of Вывод результатов теста в ВОРД - ResultToWord *  
 ********************************************************  
    
    
 **************************************************************  
 ********* ****************  
 ********* C O P Y C O N T E N T O F ****************  
 ********* G E N E R A L F I E L D ****************  
 ********* ****************  
 **************************************************************  
  procedure copygen  
  PARAMETER DBFFILE, RECNUM, FIELDNAME, OUTFILE  
  FIELDNAME = ALLTRIM(UPPER(FIELDNAME))  
  PRIVATE DBFHANDLE, MEMOHANDLE, OUTFHANDLE, MBLOCKSIZE, MEMOLEN  
  PRIVATE FIRSTRECPOS, RECORDLEN, MBLOCKSIZE, BLOCKPOS, DBFLEFT  
  PRIVATE FILETYPE, VFP_MEMO, GENFIELD  
  PRIVATE II, IICOUNT, IIREM, TEMPNO, FIELDFOUND  
  DBFHANDLE = LFOPEN(DBFFILE,64)  
  IF DBFHANDLE&lt;0  
  RETURN -2  
  ENDIF  
  FILETYPE = GETVALUE(DBFHANDLE,0,1,1)  
  VFP_MEMO = FILETYPE=48 .AND. BIT(1,GETVALUE(DBFHANDLE,28,1,1))  
  IF FILETYPE&lt;&gt;245 .AND. .NOT. VFP_MEMO  
  = LFCLOSE(DBFHANDLE)  
  RETURN -3  
  ENDIF  
  PRIVATE DBFLEN  
  DBFLEN = LFSEEK(DBFHANDLE,0,2)  
  IF DBFLEN&lt;&gt;1986  
 * = LFCLOSE(DBFHANDLE)  
 * RETURN -1  
  ENDIF  
  FIRSTRECPOS = GETVALUE(DBFHANDLE,8,2,1)  
  RECORDLEN = GETVALUE(DBFHANDLE,10,2,1)  
  FIELDFOUND = .F.  
  GENFIELD = .F.  
  TEMPNO = 32  
  DO WHILE .NOT. FIELDFOUND .AND. TEMPNO TEMPS = GETSTRING(DBFHANDLE,TEMPNO,LEN(FIELDNAME))  
  IF UPPER(FIELDNAME)=GETSTRING(DBFHANDLE,TEMPNO,LEN(FIELDNAME))  
  FIELDFOUND = .T.  
  POSINREC = GETVALUE(DBFHANDLE,TEMPNO+12,4,1)  
  GENFIELD = 'G'=GETSTRING(DBFHANDLE,TEMPNO+11,1)  
  ELSE  
  TEMPNO = TEMPNO+32  
  ENDIF  
  ENDDO  
  IF .NOT. FIELDFOUND  
  = LFCLOSE(DBFHANDLE)  
  RETURN -4  
  ENDIF  
  IF .NOT. GENFIELD  
  = LFCLOSE(DBFHANDLE)  
  RETURN -5  
  ENDIF  
  IF VFP_MEMO  
  BLOCKPOS = GETVALUE(DBFHANDLE,FIRSTRECPOS+(RECNUM-1)*RECORDLEN+POSINREC,4,1)  
  ELSE  
  BLOCKPOS = VAL(GETSTRING(DBFHANDLE,FIRSTRECPOS+(RECNUM-1)*RECORDLEN+POSINREC,10))  
  ENDIF  
  = LFCLOSE(DBFHANDLE)  
  DBFLEFT = UPPER(IIF(RAT('.', DBFFILE)&gt;0, LEFT(DBFFILE, RAT('.', DBFFILE)-1), DBFFILE))  
  MEMOHANDLE = LFOPEN(DBFLEFT+'.FPT',64)  
  MBLOCKSIZE = GETVALUE(MEMOHANDLE,6,2,-1)  
  MEMOLEN = GETVALUE(MEMOHANDLE,MBLOCKSIZE*BLOCKPOS+4,4,-1)  
  TEMPS = GETSTRING(MEMOHANDLE,MBLOCKSIZE*BLOCKPOS,128)  
  PRIVATE SIGNATURE, FILEEXT  
  DO CASE  
  CASE CHR(208)+CHR(207)+CHR(17)+CHR(224)$TEMPS  
  SIGNATURE = CHR(208)+CHR(207)+CHR(17)+CHR(224)  
  FILEEXT = '.DOC'  
  CASE 'BM'$TEMPS  
  SIGNATURE = 'BM'  
  FILEEXT = '.BMP'  
  OTHERWISE  
  = LFCLOSE(MEMOHANDLE)  
  RETURN -6  
  ENDCASE  
  = LFSEEK(MEMOHANDLE,MBLOCKSIZE*BLOCKPOS-1+AT(SIGNATURE, TEMPS),0)  
  IICOUNT = INT(MEMOLEN/512)  
  IIREM = MOD(MEMOLEN, 512)  
  IF '.'$OUTFILE  
  OUTFILE = UPPER(IIF(RAT('.', OUTFILE)&gt;0, LEFT(OUTFILE, RAT('.', OUTFILE)-1), OUTFILE))  
  ENDIF  
  OUTFHANDLE = LFCREATE(OUTFILE+FILEEXT)  
  FOR II = 1 TO IICOUNT  
  TEMPS = LFREAD(MEMOHANDLE,512)  
  = LFWRITE(OUTFHANDLE,TEMPS)  
  ENDFOR  
  IF IIREM&gt;0  
  = LFWRITE(OUTFHANDLE,LFREAD(MEMOHANDLE,IIREM))  
  ENDIF  
  = LFCLOSE(MEMOHANDLE)  
  = LFCLOSE(OUTFHANDLE)  
  RETURN 0  
  ENDFUNC  
 *  
  FUNCTION GetValue  
  PARAMETER FILEHANDLE, FILELOC, NBYTES, DIRN  
  = LFSEEK(FILEHANDLE,FILELOC,0)  
  RETURN BYTE2INT(LFREAD(FILEHANDLE,NBYTES),DIRN)  
  ENDFUNC  
 *  
  FUNCTION byte2int  
  PARAMETER STRING, DIRN  
  PRIVATE STRLEN, A, B, RETVAL, I, J  
  RETVAL = 0  
  J = 0  
  A = IIF(DIRN&gt;0, 0, LEN(STRING)-1)  
  B = IIF(DIRN&gt;0, LEN(STRING)-1, 0)  
  FOR I = A TO B STEP DIRN  
  J = J+1  
  RETVAL = ASC(SUBSTR(STRING, J, 1))*256**I+RETVAL  
  ENDFOR  
  RETURN RETVAL  
  ENDFUNC  
 *  
  FUNCTION GetString  
  PARAMETER FILEHANDLE, FILELOC, NBYTES  
  = LFSEEK(FILEHANDLE,FILELOC,0)  
  RETURN LFREAD(FILEHANDLE,NBYTES)  
  ENDFUNC  
 *  
  FUNCTION Bit  
  PARAMETER BITNO, A  
  RETURN INT(MOD(A/2**BITNO, 2))=1  
  ENDFUNC  
 *  
  FUNCTION LFCREATE  
  PARAMETER FNAME, FATTRIB  
  PRIVATE FILEHANDLE  
  PRIVATE PARMS  
  PARMS = PARAMETERS()  
  = REGFUNCTS(1)  
  FILEHANDLE = CALLFN(FNNUM(1),FNAME,IIF(PARMS&gt;2, FATTRIB, 0))  
  IF FILEHANDLE&gt;-1  
  FNNUM[7] = LFSEEK(FILEHANDLE,0,2)  
  = LFSEEK(FILEHANDLE,0,0)  
  ENDIF  
  RETURN FILEHANDLE  
  ENDFUNC  
 *  
  FUNCTION LFOPEN  
  PARAMETER FNAME, FATTRIB  
  PRIVATE FILEHANDLE  
  FILEHANDLE = -1  
  PRIVATE PARMS  
  PARMS = PARAMETERS()  
  = REGFUNCTS(2)  
  FILEHANDLE = CALLFN(FNNUM(2),FNAME,IIF(PARMS=1, 0, FATTRIB))  
  IF FILEHANDLE&gt;-1  
  FNNUM[7] = LFSEEK(FILEHANDLE,0,2)  
  = LFSEEK(FILEHANDLE,0,0)  
  ENDIF  
  RETURN FILEHANDLE  
  ENDFUNC  
 *  
  FUNCTION LFCLOSE  
  PARAMETER FILEHANDLE  
  = REGFUNCTS(3)  
  RETURN CALLFN(FNNUM(3),FILEHANDLE)  
  ENDFUNC  
 *  
  FUNCTION LFREAD  
  PARAMETER FILEHANDLE, BYTESTOREAD  
  PRIVATE READBUF, BYTESREAD  
  BYTESTOREAD = INT(BYTESTOREAD)  
  READBUF = REPLICATE(CHR(0), BYTESTOREAD)  
  = REGFUNCTS(4)  
  BYTESREAD = CALLFN(FNNUM(4),FILEHANDLE,@READBUF,BYTESTOREAD)  
  RETURN READBUF  
  ENDFUNC  
 *  
  FUNCTION LFWRITE  
  PARAMETER FILEHANDLE, WSTRING, BYTESTOWRITE  
  PRIVATE PARMS  
  PARMS = PARAMETERS()  
  = REGFUNCTS(5)  
  RETURN CALLFN(FNNUM(5),FILEHANDLE,WSTRING,IIF(PARMS&lt;3, LEN(WSTRING), BYTESTOWRITE))  
  ENDFUNC  
 *  
  FUNCTION LFSEEK  
  PARAMETER FILEHANDLE, FOFFSET, RELTO  
  PRIVATE PARMS  
  PARMS = PARAMETERS()  
  = REGFUNCTS(6)  
  RETURN CALLFN(FNNUM(6),FILEHANDLE,INT(FOFFSET),IIF(PARMS=3, RELTO, 0))  
  ENDFUNC  
 *  
  FUNCTION LFEOF  
  PARAMETER FILEHANDLE  
  = REGFUNCTS(6) &amp;&amp; = REGFUNTCS(6)  
  RETURN CALLFN(FNNUM(6),FILEHANDLE,0,1)&gt;=FNNUM(7)  
  ENDFUNC  
 *  
  PROCEDURE RegFuncts  
  PARAMETER FNID  
  IF FNNUM(FNID)&gt;-1  
  RETURN  
  ENDIF  
  DO CASE  
  CASE FNID=1  
  FNNUM[1] = REGFN("_lcreat","CI","I")  
  CASE FNID=2  
  FNNUM[2] = REGFN("_lopen","CI","I")  
  CASE FNID=3  
  FNNUM[3] = REGFN("_lclose","I","I")  
  CASE FNID=4  
  FNNUM[4] = REGFN("_lread","I@CI","I")  
  CASE FNID=5  
  FNNUM[5] = REGFN("_lwrite","ICI","I")  
  CASE FNID=6  
  FNNUM[6] = REGFN("_llseek","ILI","L")  
  ENDCASE  
  ENDPROC  
 *  
 ***********************</pre>
<p>&nbsp;</p>
</div>
<div id="sol_avtor">Автор: KID</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4528">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4528">KID</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="KID" href="https://foxclub.ru/account/?user=4528">
				<img alt='' src='https://secure.gravatar.com/avatar/78612c68323df686709718bc32ea885a?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/78612c68323df686709718bc32ea885a?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 07-02-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/vyvod-dannyh-general-polya-obratno-v-word/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/fixreccount/</link>
					<title><![CDATA[Fixreccount. Утилита для проверки и фиксации счетчика записей в заголовке dbf таблицы]]></title>
                    					    <author><![CDATA[AnatolyS]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Fixreccount. Утилита для проверки и фиксации счетчика записей в заголовке dbf таблицы</h1>
													</header>
													<div id="sol_opis">Утилита для проверки и фиксации счетчика записей в заголовке dbf таблицы</div>
<div id="sol_body">
<pre>***************************************************************
* fixreccount.prg
*
* Title:
*     Check and fix header record counter of a table
*
* Author(s): 
*     Shirokov A.V.
*
* Syntax:
*     do fixreccount [with tcTableName[, tlNeedInfo = .f.]]
*
* Parameters:
*     tcTableName - a table name
*     tlNeedInfo - flag "need debug info". Default .f.
*
* Example:
*     set printer to log.txt
*     set printer on
*     do fixreccount with "test.dbf", .t.
*     set printer off
*     set printer to
*
***************************************************************
* FOPEN's constants
*
*     0     (Default) Read Only     Buffered
#define FA_READONLY 0
*     1     Write-Only     Buffered
#define FA_WRITEONLY 1
*     2     Read and Write     Buffered
#define FA_READWRITE 2
*     10     Read-Only     Unbuffered
#define FA_READONLY_DIRECT 10
*     11     Write-Only     Unbuffered
#define FA_WRITEONLY_DIRECT 11
*     12     Read and Write     Unbuffered
#define FA_READWRITE_DIRECT 12
* FSEEK's constants
*
*     0     (Default) The beginning of the file.
#define FS_BEGIN 0
*     1     The current file pointer position
#define FS_CURRENT 1
*     2     The end of the file
#define FS_END 2
lparam tcFile, tlNeedInfo
private all
if type('m.tcFile') != 'C'
     tcFile = getfile("DBF", "Browse table")
     if empty(m.tcFile)
          return
     endif
endif
lnFile = fopen(m.tcFile, FA_READWRITE)
if m.lnFile = -1
     =MessageBox("Could not open "+m.tcFile, 16, "Error")
     return
endif
lnByte = asc(fread(m.lnFile, 1))
if not inlist(m.lnByte, ;
     0*16+2,      ; &amp;&amp;     FoxBASE
     0*16+3,      ; &amp;&amp;     FoxBASE+/dBASE III PLUS, no memo
     3*16+0,      ; &amp;&amp;     Visual FoxPro
     4*16+3,          ; &amp;&amp;     dBASE IV SQL table files, no memo
     6*16+3,      ; &amp;&amp;     dBASE IV SQL system files, no memo
     8*16+3,          ; &amp;&amp;     FoxBASE+/dBASE III PLUS, with memo
     8*16+11,      ; &amp;&amp;     dBASE IV with memo
     12*16+11,     ; &amp;&amp;     dBASE IV SQL table files, with memo
     15*16+5,      ; &amp;&amp;     FoxPro 2.x (or earlier) with memo
     15*16+11     ; &amp;&amp;     FoxBASE
     )

     =MessageBox("The file '" + m.tcFile + "' is not DBF", 16, "Error")
     fclose(m.lnFile)
     return
endif
=fseek(m.lnFile, 0, FS_BEGIN)
lnSize = fseek(m.lnFile, 0, FS_END)
lnRecCount = 0
fseek(m.lnFile, 4, FS_BEGIN) 
for lnIndex = 1 to 4
   lnByte = asc(fread(m.lnFile, 1))
   lnRecCount = bitor(m.lnRecCount, bitlshift(m.lnByte, 8*(m.lnIndex-1)))
endfor   
lnDataStart = 0
for lnIndex = 1 to 2
   lnByte = asc(fread(m.lnFile, 1))
   lnDataStart = bitor(m.lnDataStart, bitlshift(m.lnByte, 8*(m.lnIndex-1)))
endfor   
lnRecLength = 0
for lnIndex = 1 to 2
   lnByte = asc(fread(m.lnFile, 1))
   lnRecLength = bitor(m.lnRecLength, bitlshift(m.lnByte, 8*(m.lnIndex-1)))
endfor   
lnDataSize = m.lnSize - m.lnDataStart
lnFactRecCount = int(m.lnDataSize/m.lnRecLength)
lnAnswer = 0
if m.lnFactRecCount != m.lnRecCount
     lnAnswer = MessageBox(m.tcFile + chr(13) + "Do fix record counter?", 3+32, "Question")
     if m.lnAnswer == 6
          fseek(m.lnFile, 4, FS_BEGIN)      
          for lnIndex=1 to 4
               lnByte = bitand(bitrshift(m.lnFactRecCount, 8*(m.lnIndex-1)), 255)
               fwrite(m.lnFile, chr(m.lnByte), 1)
          endfor          
     endif
endif
fclose(m.lnFile)
if m.tlNeedInfo
     ? "FIXRECCOUNT FOR "+alltrim(m.tcFile) 
     ? replicate("=", 80)
     ? "Size", m.lnSize 
     ? "Data Start", m.lnDataStart
     ? "Data Size = Size - Data Start = ", m.lnSize, "-", m.lnDataStart, " = ", m.lnDataSize 
     ? "Record Length", m.lnRecLength
     ? "Header Record Count", m.lnRecCount
     ? "Fact Record Count = Data Size / Record Length = ", m.lnDataSize, "/", m.lnRecLength,
"=",m.lnFactRecCount
     if m.lnFactRecCount = m.lnRecCount
          ? "NO NEED FIX"
     else
          ? iif(m.lnAnswer == 6, "FIXED", "FIX IS SKIPED")
     endif
endif
return m.lnAnswer == 6</pre>
</div>
<div id="sol_avtor">Автор: Анатолий Широков</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4795">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4795">AnatolyS</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="AnatolyS" href="https://foxclub.ru/account/?user=4795">
				<img alt='' src='https://secure.gravatar.com/avatar/7fa98018dda23101b3dea46505c93f33?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7fa98018dda23101b3dea46505c93f33?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 21-01-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/fixreccount/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/combigrepd-1-01-zamena-shtatnomu-generatoru-otchetov/</link>
					<title><![CDATA[COMBigRepD 1.01 – замена штатному генератору отчетов]]></title>
                    					    <author><![CDATA[YuriWhite]]></author>
                    										    <pubDate>Mon, 31 Aug 2020 06:12:38 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>COMBigRepD 1.01 – замена штатному генератору отчетов</h1>
													</header>
													<div id="sol_opis">
<p>Новое в версии 1.01: Можно передавать до 10 переменных из VFP в репортер</p>
<p>Уважаемые коллеги по VFP - Вам еще не надоел штатный генератор отчетов?</p>
<p>Лично мне уже очень давно. Однако использовать альтернативные<br />
монстры типа Crystal Report и прочее мне тоже не хотелось.</p>
<p>Некоторое время назад мне пришла дурацкая ( а может и нет ) идея прикрутить к дельфевому компоненту FastReport ( www.fastreport.ru ) COM-интерфейс и использовать его из VFP. Задумано - сделано. Идея заключается в том - чтобы готовить результат в DBF файле, а уже все остальное делать в этом COM-сервере.<br />
Хотя, можно и непосредственно, при помощи ADO брать данные из любой БД.</p>
<p>COMBigRepD - написан на Delphi6 с использованием FastReport 2.46<br />
Сервер реализован в виде In-Proc сервера, поэтому “падение” сервера приведет к падению Вашего приложения, но надеюсь, этого не случится. Если все же такое случится – перепишу в виде Out-Proc сервера.</p>
<p>Перечислю некоторые возможности компонента FastReport ,а значит, и COM-сервера:<br />
- Бэнд-ориентированный генератор отчетов.<br />
- Встроенный мощный дизайнер, доступный и в run-time.<br />
- Preview как в MS Word.<br />
- Компактность кода;<br />
- Неограниченное количество страниц сформированного отчета.<br />
- Многостраничные отчеты; составные (композитные) отчеты; вложенные отчеты;<br />
группы; многоколоночные отчеты; master-detail-detail отчеты; cross-tab отчеты; двухпроходные отчеты; \"живые\" отчеты. - Полный контроль над процессом печати, поддержка всех типов бумаги.<br />
- Набор наиболее популярных компонентов: Текст, Линия, Рисунок, Фигура, OLE объект, RichText, RX Rich 2.0, Диаграмма, Штрих-код. - Экспорт в TXT, RTF, CSV, HTML (RTF и HTML - с картинками).<br />
- Поиск текста в сформированном отчете.<br />
- ActiveX Data Objects (ADO).<br />
- Редактирование сформированного отчета.<br />
- Встроенный интерпретатор Pascal-подобного языка для управления процессом<br />
построения отчета.</p>
<p>И это далеко не полный список возможностей, и это при размере всего одной dll размером около 2 Mb.<br />
*<br />
Инсталляция:<br />
*<br />
1.Зарегистрировать COM-server в системе : Regist.bat<br />
2.Пример использования:<br />
....</p>
<p><pre class='bbcode'>   o =CREATEOBJECT("COMBigRepD.BigReport") &amp;&amp; Создаем указатель и загружаем сервер<br />  
  o.ReportFileName = "c:\combigrepdtest1.frf" &amp;&amp; Полное имя отчета<br />  
  o.DesignExist() &amp;&amp; Редактирования отчета указанного в o.ReportFileName<br />  
  o.Report(.F.,1) &amp;&amp; Печать указанного в o.ReportFileName отчета без привью, 1 экз.<br />  
  o.Report(.T.,1) &amp;&amp; Печать указанного в o.ReportFileName отчета с привью, 1 экз.<br />  
  o.DesignNew() &amp;&amp; Создание нового отчета<br />  
  RELEASE o &amp;&amp; Выгрузка и удаление сервера  
</pre><br />
3.Убрать COM-server из системы : UnRegist.bat<br />
4.Дополнительную информацию о возможностях FastReport на www.fastreport.ru<br />
Еще раз спасибо разработчикам FastReport .<br />
По вопросам развития COM-Server – maysnikov@rbt.ru</p>
<p>С уважением,<br />
Юрий Мясников</p>
</div>
<div></div>
<div id="sol_avtor">Автор: YuriWhite</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4699">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4699">YuriWhite</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="YuriWhite" href="https://foxclub.ru/account/?user=4699">
				<img alt='' src='https://secure.gravatar.com/avatar/c494223377c4770632b0bdcbcb26dd5e?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c494223377c4770632b0bdcbcb26dd5e?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/combigrepd-1-01-zamena-shtatnomu-generatoru-otchetov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/avtonastrojka-papok-pri-zapuske-proektov/</link>
					<title><![CDATA[Автонастройка папок при запуске проектов.]]></title>
                    					    <author><![CDATA[RusMikle]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Автонастройка папок при запуске проектов.</h1>
													</header>
													<div id="sol_opis">Как при загрузке проекта автоматически настроить папки по умолчанию и пути поиска.</div>
<div id="sol_body">
<p>Сам пол дня эксперементируя попотерял<br />
чтоб другие не мучались вот к чему пришел.<br />
Создаю 2 файла<br />
один "config.fpw" для запуска проекта (лучьше в спец под.папке т.к. "config.fpw" для самой программы понятно у Вас другой)<br />
второй программа запуска проекта у меня она называется "sp.prg"<br />
В "config.fpw" вписываю такой текст:<br />
DEFAULT="c:a-zmmerkur_dll"<br />
COMMAND=DO c:a-zmmerkur_dllsp.prg</p>
<p>В sp.prg такой:<br />
[cc lang="visualfoxpro"]CLOSE ALL<br />
SET RESOURCE TO "c:a-zmmerkur_dllfoxuser.dbf"<br />
SET RESOURCE ON<br />
SET PATH TO "c:a-zmmerkur_dllgraphics;c:a-zmmerkur_dllhelp;c:a-zmmerkur_dllinclude;c:a-zmmerkur_dlllibsdictionary;c:a-zmmerkur_dllprogs;c:a-zmmerkur_dllreports;c:programmemicrosoft visual foxpro 7wizards"<br />
MODIFY PROJECT "c:a-zmmerkur_dllmerkur.pjx" NOWAIT[/cc]</p>
<p>Затем создаю ярлык на сам фокс а ключём -c указываю файл config.fpw (который в свою очередь запустит программу старта проекта)<br />
У меня линк выглядел так:<br />
"C:ProgrammeMicrosoft Visual FoxPro 7vfp7.exe" -cC:a-zmmerkur_dllconfigconfig.fpw</p>
<p>Запуская затем этот ярлык получаю этот проект аккурат с нужными настройками папок.<br />
Так создав линк на каждый проект Вы упростите себе их старт.<br />
Понятно что оба файла можно усложнять до безобразия, но основная идея такая.</p>
<p>Прим. как Вы поняли "c:a-zmmerkur_dll" . это папка где лежит мой проект</p>
<p>Успехов всем.<br />
Михаил Червоненко. Русский программер в Германии 🙂</p>
</div>
<div id="sol_avtor">Автор: Михаил Червоненко</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4718">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4718">RusMikle</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="RusMikle" href="https://foxclub.ru/account/?user=4718">
				<img alt='' src='https://secure.gravatar.com/avatar/62ad38624e87679ba913e97c235c46f4?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/62ad38624e87679ba913e97c235c46f4?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-04-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/avtonastrojka-papok-pri-zapuske-proektov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/udalenie-dublikatov-fajlov-staraya-programma-2008g/</link>
					<title><![CDATA[Удаление дубликатов файлов (старая программа 2008г.)]]></title>
                    					    <author><![CDATA[my]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:38 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Удаление дубликатов файлов (старая программа 2008г.)</h1>
													</header>
													<div id="sol_opis">Удаляет дубликаты файлов в указанном каталоге</div>
<div id="sol_body">DDF - Delete duplicate files</p>
<p> Утилита для удаления дубликатов файлов.<br /> Область применения - удаление одинаковых<br /> по содержанию файлов в каталогах<br /> и субкаталогах после Спутниковой рыбалки</p>
<p> 2008-08-08</p>
<p> Version 0.0.001</p>
<p> Способ применения<br /> DDF.EXE </p>
<p> Пример</p>
<p> DDF.EXE E:DoSort<br /> DDF.EXE "E:Sort Dir"<br /> DDF.EXE "Путь к вашему каталогу"</p>
<p> Для каталогов содержащих в наименовании пробелы<br /> путь передается в кавычках " "</div>
<div id="sol_avtor">Автор: my</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4532">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 дня</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4532">my</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="my" href="https://foxclub.ru/account/?user=4532">
				<img alt='' src='https://secure.gravatar.com/avatar/df4f5dc671f23e1c4ac9d1ed929790b5?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/df4f5dc671f23e1c4ac9d1ed929790b5?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 09-06-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/udalenie-dublikatov-fajlov-staraya-programma-2008g/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/advanced-rtf-report/</link>
					<title><![CDATA[Advanced RTF Report]]></title>
                    					    <author><![CDATA[TAS]]></author>
                    										    <pubDate>Wed, 03 Jan 2024 05:01:37 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Advanced RTF Report</h1>
													</header>
													<div id="sol_opis">Генератор предназначен для получения RTF отчетов без использования WORD а также текстовых отчетов с заданной структурой (например, XML или HTML). Имеет гибкую структуру, позволяющую последовательно добавлять неограниченное количество таблиц. Также можно вложить таблицу в контейнер и размножить ее по количеству записей в таблице контейнера. Скорость генерации – 10-100 листов в секунду</div>
<div id="sol_body">Генератор предназначен для получения RTF отчетов без использования WORD а также текстовых отчетов с заданной структурой (например, XML или HTML). Имеет гибкую структуру, позволяющую последовательно добавлять неограниченное количество таблиц. Также можно вложить таблицу в контейнер и размножить ее по количеству записей в таблице контейнера.<br />
Скорость генерации – 5-50 листов в секунду<br />
<strong>Ver 1.1</strong><br />
1. Добавлена возможность обратной сортировки, для этого конструкцию "ORD=выражение" писать как "ORD=DESC:выражение"<br />
2. Добавлен показ % выполнения формирования разделов отчета<br />
3. Добавлена возможность замены русских букв на HEX-коды при обработке символьных переменных<br />
<strong>Ver 1.2</strong><br />
1. Добавлены теги [CASE], [OTHERWISE], [ENDCASE], позволяющие выбрать альтернативные варианты печати каждой строки отчета. Принцип действия аналогичен такому же оператору в фоксе.<br />
2. Добавлен предварительный подсчет кол-ва разделов и вывод в градуснике "*** из ***"<br />
3. Изменен метод запуска готового файла на WScript.<br />
<strong>Ver 1.3</strong><br />
1. Добавлена возможность вывода в отчет PNG файлов (конструкция IMG: в описании символьных переменных)<br />
2. Для картинок (переменных с IMG:) можно задавать 3 типа рамки: RM1-простая рамка,RM2-рамка с тенью,RM3-двойная рамка<br />
3. Добавлена возможность разделения разрядов при обработке числовых переменных (конструкция RAZ).<br />
4. Добавлен вывод ДА/НЕТ при обработке логических переменных (конструкция LRU:)<br />
<strong>Ver 1.4</strong><br />
1. Исправлена неадекватная работа счетчика str_tbl (не сбрасывался на 0 при смене таблицы)<br />
2. Исправлен рабочий алиас заголовка и подвала контейнера (переменные не отрабатывались правильно без явного указания алиаса контейнера)<br />
3. Добавлена возможность задавать условие в теге [ALI] как USL$выражение для поиска по списку. Условием для добавления записей в таблицу, находящуюся в группе, в этом случае является: выражение IN (ключ), т.е. ключ должен быть вида "1,2,3" или "'AA','BB','CC'".<br />
<strong>Ver 1.5</strong><br />
1. Добавлена возможность задавать подстановки для переменных (конструкция REPVAR*:) Потом использование в переменных вида [&amp;*], где * - ID подстановки. Переменная наследует все функции подстановки, при этом функции самой переменной приоритетней функций подстановки.<br />
2. Ранее переменные переводились UPPER() теперь этого не делается. Это сделано для того, чтобы переменные вида ["Дата:"+DTOC(DATE())] выводились в виде "Дата:..." а не "ДАТА:...". Индексы, условия, группировки и сортировки остались регистронезависимыми (переводятся в UPPER() перед обработкой)!<br />
<strong>Ver 1.6</strong><br />
1. Добавлен параметр [ADDF] в конфигурации запуска для подавления ошибки создания выходного файла. В случае, если файл результата не может быть перезаписан, добавляет к имени файла "_N", где N может быть от 1 до 49 и пытается записать с новым именем. При достижении N=50, формирует ошибку доступа к диску.<br />
2. Добавлена возможность вывода в отчет JPG файлов.<br />
<strong>Ver 2.0</strong><br />
ВНИМАНИЕ! VER 2.0 НЕСОВМЕСТИМА С ПРЕДЫДУЩИМИ ВЕРСИЯМИ В ПЛАНЕ СЧЕТЧИКОВ И АЛИАСОВ ГРУПП!!!<br />
1. Добавлена возможность добавлять подгруппы. Подгруппы объявляются также как и группы. МАХ вложенность групп=6.<br />
2. Полностью изменен подход к счетчикам, теперь их стало 72 штуки.<br />
3. Алиас группы изменился с GRP на GR1,GR2,GR3... - в зависимости от вложенности.<br />
<strong>Ver 2.1</strong><br />
1. Поправлен счетчик [tbl_str] (в некоторых случаях считал неверно)<br />
2. Исправлена ошибка обработки файлов у которых внутренние шрифты указаны без кодировки.<br />
3. Добавлена функция форматирования "BLZ" - выводит число 1000000 как 1 000 000, разделяя разряды пробелами, при этом если число=0, то не выводит ничего.<br />
4. Добавлена функция форматирования "BLK" - если число=0, то не выводит ничего.<br />
5. Добавлен параметр [HIDE] в конфигурации запуска для подавления сообщений процесса генерации<br />
<strong>Ver 2.2</strong><br />
1. Поправлены косяки с подстановками в переменных. (Для ряда функций брались не те данные)<br />
2. В целях унификации шаблонов добавлена подстановка "&amp;" при описании контейнеров, таблиц или групп.<br />
Пример использования [REP:ALI=&amp;myalias|ORD=&amp;myorder] - здесь в "ALI=&amp;myalias" - "&amp;" - признак подстановки, "myalias" - переменная, которая содержит значения алиаса. Так же и для сортировки. Переменные "myalias" и "myorder" должны быть описаны до запуска генератора! Подстановка может быть использована для любой секции и позволит многократно использовать один и тот же шаблон для схожих по структуре данных.<br />
3. Добавлена функция преобразования "RD3" - округление до 3 знаков после запятой.<br />
4. Добавлена пользовательская функция форматирования переменных: конструкция "FUN=USERFUNC" или "FUN=USERFUNC(m.znh_now)". Если нужно в вашу функцию передать более одного значения, то для передачи текущего значения поля нужно пользоваться переменной m.znh_now.Если параметр только один, то задавать его не нужно - будет автоматически добавлено к имени функции концовка "(m.znh_now)"! Эта конструкция разделяется двоеточием от остальных функций. Выполняется после всех преобразований, при этом имейте ввиду, что тип переменной m.znh_now в момент запуска пользовательской функции, всегда символьный! На выходе также ожидается значение символьного типа!<br />
<strong>Ver 2.3</strong><br />
1. Поправлен подвал группировок и ссылки на другие группы. (Теперь в алиасе, на который ссылается переменная, указатель записи из EOF() переводится на BOTTOM).<br />
2. Исправлена ошибка с ограничением до 3, распознавания секций в описании переменных. В связи с этим часть ф-й могли не распознаться. (Теперь увеличено до 10)<br />
3. Теперь концовка к имени пользовательской функции форматирования переменных добавляется не "(m.znh_now)" a "(m.znh_val)". Проверьте свои шаблоны!<br />
4. Добавлена переменная ZNH_VAL с вычисленным, но не преобразованным значением для использования во внешних функциях. Тип переменной ZNH_VAL тот, который имеет поле (выражение) в источнике. ВНИМАНИЕ! Если вы используете внешнюю функцию с переменной ZNH_VAL, то функции преобразования и форматирования задавать бессмысленно!<br />
5. Добавлена переменная ZNH_CON с вычисленным и преобразованным но не отформатированным значением для использования во внешних функциях. Тип переменной ZNH_CON тот, который имеет который имеет функция преобразования на выходе. ВНИМАНИЕ! Если вы используете внешнюю функцию с переменной ZNH_CON, то функции форматирования задавать бессмысленно!<br />
<strong>Ver 2.4</strong><br />
1. Исправлена ошибка с длинными путями при показе готового отчета (теперь полное имя файла оборачивается в кавычки).<br />
2. Добавлен параметр [PRINT] или [PRINT=имя_принтера] в конфигурации запуска для печати отчета без просмотра. После знака равенства можно задать целевой принтер.<br />
3. Добавлен параметр [COPIES=*] для печати * копий отчета. Актуально только совместно с [PRINT].<br />
4. Добавлен параметр [PAGES=1,2,5-8] для печати заданных страниц или [PAGES=BOOK] для формирования книжки.<br />
Актуально только совместно с [PRINT]!<br />
<strong>Ver 2.5</strong><br />
1. Добавлен параметр [MERGE] - Позволяет объединять текущий результат с существующим файлом WORD.<br />
2. Тег [ENDPAGE] теперь не срабатывает на последних записях текущей таблицы.<br />
3. У тега [ENDPAGE] добавлена возможность задавать условие срабатывания: конструкция USL=выражение (задается через разделитель "|")<br />
4. Добавлена пост обработка полученного файла (параметр [FORMAT]): обновление оглавления, если оно есть (только если установлен MS Office)<br />
5. Оптимизация ввода/вывода. Существенное ускорение разборки шаблонов отчетов.<br />
6. Добавлена функция форматирования "TDT" – преобразует DATETIME значение в тип DATE.<br />
7. Исправлена ошибка исполнения условий объектов в безалиасной зоне.<br />
<strong>Ver 2.6</strong><br />
Добавлена функция SPLIT_REPORT(), надстройка над RTF_REPORT() - дает возможность разделения отчета на несколько файлов. Здесь и далее будут использоваться ссылки, для привязки изменений к конкретной функции.<br />
[1] - изменения для функции RTF_REPORT()<br />
[2] - изменения для функции SPLIT_REPORT()<br />
1. [1].ADD: Генератор можно использовать для формирования текстовых (HTML и XML) отчетов.<br />
2. [1].ERR: Исправлена ошибка применения условия таблицы, заданной вне контейнера<br />
3. [1].ADD: Добавлен параметр [COD=N] - Позволяет записывать данные поля в перекодированном виде. Варианты N см. в параметрах ф-и STRCONV(). Параметр [COD] имеет более высокий приоритет, чем параметр [ENCODE].<br />
4. [1].ADD: Добавлен параметр [ENCODE=N] - Позволяет записывать все данные отчета в перекодированном виде. Варианты N см. в параметрах ф-и STRCONV(). (Например, есть шаблон в кодировке 1251, необходимо сохранить XML файл в кодировке utf-8).<br />
5. [2].ADD: Добавлена функция SPLIT_REPORT(), надстройка над RTF_REPORT() - дает возможность разделения отчета на несколько файлов.<br />
6. [2].ADD: Добавлен ОБЯЗАТЕЛЬНЫЙ параметр [SPLIT=*] - где "*" - MAX количество записей в томе.<br />
7. [2].ADD: Добавлен параметр [STOMS=1,2,5-8] для формирования только указанных томов.<br />
<strong>Ver 2.7</strong><br />
1. [1].ADD: Добавлена функция преобразования "PAR" - для добавления текста содержащего несколько строк в виде отдельных параграфов. Актуально только для RTF файла. Ver 2.8<br />
1. [1].ERR: Добавлена проверка длины наименования функции преобразования, чтобы исключить их срабатывание при похожем начале имени переменной и установкой SET EXACT OFF. 2. [1].ADD: Добавлена функция преобразования "ML5" - масштабирование (уменьшение) картинки на 50% (актуально только для конструкции "IMG"). Ver 2.9<br />
1. [1].IZM: Более чем в 2 раза ускорена функция разборки шаблона READ_RTF(). Ver 3.0<br />
Добавлена функция XLS_REPORT, надстройка над RTF_REPORT() для формирования отчетов в EXCEL с использованием XML шаблонов. Добавлена функция DBF_TOEXCEL - продвинутая выгрузка данных курсора в EXCEL – для любителей творить отчеты кодом. Здесь и далее будут использоваться ссылки, для привязки изменений к конкретной функции: • [1] - изменения для функции RTF_REPORT() • [2] - изменения для функции SPLIT_REPORT() • [3] - изменения для функции XLS_REPORT() • [4] - изменения для функции DBF_TOEXCEL() 1. [1].ADD: Добавлена поддержка выгрузки в EXCEL. 2. [3].ADD: Добавлена функции XLS_REPORT(). 3. [4].ADD: Добавлена функции DBF_TOEXCEL().</div>
<div id="sol_avtor">
<p dir="auto"><strong>Ver 2.8</strong></p>
<ol dir="auto">
<li>[1].ERR: Добавлена проверка длины наименования функции преобразования, чтобы исключить их срабатывание при похожем начале имени переменной и установкой SET EXACT OFF.</li>
<li>[1].ADD: Добавлена функция преобразования "ML5" - масштабирование (уменьшение) картинки на 50% (актуально только для конструкции "IMG").</li>
</ol>
<p dir="auto"><strong>Ver 2.9</strong></p>
<ol dir="auto">
<li>[1].IZM: Более чем в 2 раза ускорена функция разборки шаблона READ_RTF().</li>
</ol>
<p dir="auto"><strong>Ver 3.0</strong></p>
<p dir="auto">Добавлена функция XLS_REPORT, надстройка над RTF_REPORT() для формирования отчетов в EXCEL с использованием XML шаблонов. Добавлена функция DBF_TOEXCEL - продвинутая выгрузка данных курсора в EXCEL – для любителей творить отчеты кодом. Здесь и далее будут использоваться ссылки, для привязки изменений к конкретной функции:</p>
<p dir="auto">• [1] - изменения для функции RTF_REPORT() • [2] - изменения для функции SPLIT_REPORT() • [3] - изменения для функции XLS_REPORT() • [4] - изменения для функции DBF_TOEXCEL()</p>
<ol dir="auto">
<li>[1].ADD: Добавлена поддержка выгрузки в EXCEL.</li>
<li>[3].ADD: Добавлена функции XLS_REPORT().</li>
<li>[4].ADD: Добавлена функции DBF_TOEXCEL().</li>
</ol>
<p dir="auto"><strong>Ver 3.1</strong></p>
<ol dir="auto">
<li>[1].IZM: Добавлена функция преобразования "NUM" - для приведения типа ячейки к числовому формату (актуально только для формирования отчетов в EXCEL).</li>
</ol>
<p dir="auto"><strong>Ver 3.2</strong></p>
<ol dir="auto">
<li>[1].IZM: Функция ENCODE_SYMBOLS переписана для более быстрого выполнения.</li>
<li>[3].ADD: Добавлен тег «[REP:NOTE]» для добавления в шаблон строк с комментариями (актуален только для шаблонов EXCEL). В готовый отчет эти строки добавлены не будут.</li>
</ol>
<p dir="auto"><strong>Ver 3.3</strong></p>
<ol dir="auto">
<li>[1].IZM: Добавлена возможность вывода в WORD отчет PNG графиков (нужен EXCEL!!!, конструкция DIA: GEN_DIAGR() - см. пример для WORD № 12)</li>
<li>[3].IZM: Добавлен 4-й параметр для конвертации результата в большое кол-во форматов. Теперь по умолчанию результат остается в XML виде.</li>
<li>[3].IZM: Изменен подход к шаблонам с выделенной служебной колонки на служебные строки (см. примеры EXCEL).</li>
</ol>
<p><strong> Ver 3.4 - 2019 г.</strong><br />
--------------------------------------------------------------------------------------------<br />
 1. [1].ADD: Добавлена конструкция [RAWIN] - указывает, что в параметре f_shabl передается не файл а текст шаблона (кодировка UTF-8)<br />
 2. [3].ADD: добавлен параметр rez_format (не обязательно) - формат результата, для функции SaveAs() MS EXCEL (см. xlFileFormat https://docs.microsoft.com/en-us/office/vba/api/excel.xlfileformat).<br />
 3. [3].ERR: BUGFIX.<br />
--------------------------------------------------------------------------------------------<br />
<strong> Ver 3.5 - 2019 г.</strong><br />
--------------------------------------------------------------------------------------------<br />
 1. [1].ERR: Добавлено экранирование специальных символов при формировании отчета с параметром [EXCEL].<br />
--------------------------------------------------------------------------------------------<br />
 <strong>Ver 3.6 - 2019 г.</strong><br />
--------------------------------------------------------------------------------------------<br />
 1. [1].ERR: Исправлена ошибка при формировании [EXCEL] отчета с экранированной кавычкой в источнике.<br />
 2. [3].ERR: Исправлена ошибка при формировании [EXCEL] отчета с пустой колонкой.<br />
 3. [3].ERR: BUGFIX.<br />
--------------------------------------------------------------------------------------------<br />
<strong> Ver 3.7 - 2021 г.</strong><br />
--------------------------------------------------------------------------------------------<br />
 1. [1].ADD: Добавлен параметр [DELEBLANKLINE] для удаления пустых строк при формировании текстовых отчетов<br />
 3. [1].ERR: Исправлено добавление пустых строк при формировании текстовых отчетов<br />
-------------------------------------------------------------------------------------------<br />
 <strong>Ver 3.8 - 2023 г.</strong><br />
--------------------------------------------------------------------------------------------<br />
 1. [1].ERR: При формировании отчета в Excel увеличивает значения на 2 порядка. Причина - изменен подход в EXCEL к дробному разделителю. <br />
 2. [1].IZM: При [EXCEL] теперь не зависимо от настроек "Point" для дробных чисел принудительно устанавливает разделителем точки.<br />
--------------------------------------------------------------------------------------------</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4728">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4728">TAS</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="TAS" href="https://foxclub.ru/account/?user=4728">
				<img alt='' src='https://secure.gravatar.com/avatar/7004b77ba9803498111fe71a830bd53f?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7004b77ba9803498111fe71a830bd53f?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/advanced-rtf-report/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/vfp-redaktor-prg/</link>
					<title><![CDATA[VFP редактор PRG]]></title>
                    					    <author><![CDATA[Taran]]></author>
                    										    <pubDate>Mon, 04 Jul 2022 06:34:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>VFP редактор PRG</h1>
													</header>
													<div id="sol_opis">Редактор кода PRG</div>
<div id="sol_body">
<p>В архиве EXE - редактор PRG`шек.<br />
Вроде как самодостаточен.<br />
Вероятно будет пригоден для редактирования кода у клиента, когда нет установленного фокса.<br />
Конечно существует команда MODIFY COMMAND, но, насколько я в курсе, она не поддерживает окно «Document View».<br />
Здесь эта псевдо-возможность есть.<br />
+ в дереве классов/процедур/методов есть возможность организовать группировку.<br />
+ иконка методов меняет вид в зависимости от PUBLIC/PRIVATE/HIDDEN.<br />
+ в строке с методом видны параметры и тип возвращаемого значения.<br />
+ есть возможность скопировать в _cliptext метод и параметры не переходя к нему (RightClick).</p>
<p>Для корректной работы необходим foxtools.fll. Он лежит в архиве.</p>
<p>Для IntelliSence желательно:<br />
foxcode.app<br />
foxcode.dbf<br />
foxcode.fpt<br />
Эти файлы подхватываются из Home(1) если фокс установлен и эти файлы присутствуют.<br />
Либо из каталога в котором находится сам xCodeEditor.EXE.<br />
(Но в архиве их нет.)</p>
<p>Небольшой пример оформления кода также присутствует в архиве.<br />
xCode_Example.prg</p>
<p>Косяки есть, и идеи по развитию также.<br />
Как минимум просится возможность просмотра всех методов родительского класса.<br />
А также свойств как теущего класса, так и родителя.</p>
</div>
<div id="sol_avtor">Автор: Taran</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4813">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 18 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4813">Taran</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Taran" href="https://foxclub.ru/account/?user=4813">
				<img alt='' src='https://secure.gravatar.com/avatar/e3417a940245f517ff88c028bf7badb7?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e3417a940245f517ff88c028bf7badb7?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 16-01-2008        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/vfp-redaktor-prg/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/mikrotik-routeros-api-vfp-9-0-sp2/</link>
					<title><![CDATA[Mikrotik RouterOS API VFP 9.0 SP2]]></title>
                    					    <author><![CDATA[Bobr]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:38 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Mikrotik RouterOS API VFP 9.0 SP2</h1>
													</header>
													<div id="sol_opis">Mikrotik RouterOS API implementation based on Ben Menking's https://github.com/BenMenking/routeros-api Written in Visual FoxPro 9.0 SP2</div>
<div id="sol_body">Mikrotik RouterOS API implementation based on Ben Menking's https://github.com/BenMenking/routeros-api<br /> Written in Visual FoxPro 9.0 SP2 </p>
<p> You'll find a test project with simple examples and comments inside the archive.</p>
<p> P.S. Not tested, but should be possible to use under VFP 8 and even VFP 7. P.P.S. Updated to work with win8/10</p></div>
<div id="sol_avtor">Автор: Bobr</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4757">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 19 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4757">Bobr</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Bobr" href="https://foxclub.ru/account/?user=4757">
				<img alt='' src='https://secure.gravatar.com/avatar/c10b0deeb42ef61717bdb6e5568f1385?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c10b0deeb42ef61717bdb6e5568f1385?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 21-11-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/mikrotik-routeros-api-vfp-9-0-sp2/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/generator-parolej/</link>
					<title><![CDATA[Генератор паролей]]></title>
                    					    <author><![CDATA[awake]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 13:16:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Генератор паролей</h1>
													</header>
													<div id="sol_opis">Позволяет создавать пароли из разного набора комбинаций символов таблицы ASCII.</div>
<div id="sol_body">
Генератор паролей<br />
=================<br />
1. Применён объект Mutex для контроля повторного запуска приложения.<br />
2. Пример одноформенной программы с использованием главного окна VFP.<br />
Автор идеи: Колосов Владислав Владимирович, г.Ростов-на-Дону, 2007 г.<br />
3. Использован INI-файл для сохранения настроек приложения.<br />
4. Использование программы DeFoxIV для защиты приложений в средах VFP6-9.<br />
=================<br />
Ссылка для скачивания: https://yadi.sk/d/YSsHvHgV3aPQNP</p>
</div>
<div id="sol_avtor">Автор: awake</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1488">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1488">awake</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="awake" href="https://foxclub.ru/account/?user=1488">
				<img alt='' src='https://secure.gravatar.com/avatar/7e97ee64fe10fd4380fd8ae16503a0d7?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7e97ee64fe10fd4380fd8ae16503a0d7?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 14-02-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/generator-parolej/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/mikrotik-routeros-api-vfp-9-0-sp2_x000d_/</link>
					<title><![CDATA[Mikrotik RouterOS API VFP 9.0 SP2]]></title>
                    					    <author><![CDATA[Bobr]]></author>
                    										    <pubDate>Wed, 02 Sep 2020 11:19:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Mikrotik RouterOS API VFP 9.0 SP2</h1>
													</header>
													<div id="sol_opis">Mikrotik RouterOS API realization based on Ben Menking's https://github.com/BenMenking/routeros-api Written in Visual FoxPro 9.0 SP2</div>
<div id="sol_body">Mikrotik RouterOS API realization based on Ben Menking's https://github.com/BenMenking/routeros-api<br />
Written in Visual FoxPro 9.0 SP2</div>
<div id="sol_avtor">Автор: Bobr</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4757">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 19 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4757">Bobr</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Bobr" href="https://foxclub.ru/account/?user=4757">
				<img alt='' src='https://secure.gravatar.com/avatar/c10b0deeb42ef61717bdb6e5568f1385?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c10b0deeb42ef61717bdb6e5568f1385?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 21-11-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/mikrotik-routeros-api-vfp-9-0-sp2_x000d_/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/udalennoe-administrirovanie-po-sredstvami-wmi/</link>
					<title><![CDATA[Удаленное администрирование ПО средствами WMI]]></title>
                    					    <author><![CDATA[Яковлев Игорь]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:38 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Удаленное администрирование ПО средствами WMI</h1>
													</header>
													<div id="sol_opis">Начинающим знакомство с WMI предлагаю фрагмент проекта по администрированию сегмента доменной локальной вычислительной сети. В представленной реализации средствами WMI осуществляется удаленная инвентаризация приложений, установленных с помощью службы Windows Installer, удаленная деинсталляция c возможностью запуска инсталляции, удаленный запуск некоторой программы или копирование отдельных файлов с ресурса, открытого для совместного использования. Перечисленные функции работают в асинхронном режиме, что обеспечивает одновременное их выполнение на удаленных хостах, сокращающее общее время выполнения задач администрирования.</div>
<div id="sol_body">С огромной благодарностью выражаю свою признательность сайту и авторам, щедро делящимся своими знаниями в различных областях создания программного кода. К сожалению, на сайте мало материалов, касающихся такой мощной технологии от Microsoft, как  Windows Management Instrumentation (WMI). Начинающим знакомство с WMI предлагаю фрагмент проекта по администрированию сегмента доменной локальной вычислительной сети. В представленной реализации средствами WMI осуществляется удаленная инвентаризация приложений, установленных с помощью службы Windows Installer, удаленная деинсталляция c возможностью запуска инсталляции, удаленный запуск некоторой программы или копирование отдельных файлов с ресурса, открытого для совместного использования. Перечисленные функции работают в асинхронном режиме, что обеспечивает одновременное их выполнение на удаленных хостах, сокращающее общее время выполнения задач администрирования.<br /> В таблице ip_arm.dbf необходимо указать IP и имя хоста удаленных компьютеров, подлежащих администрированию. Символьные поля   Zdan (здание), room (кабинет), Arm (индекс автоматизированного рабочего места) должны определять уникальное сочетание, описывающее местоположение автоматизированного рабочего места (хоста). <br /> После формирования списка IP адресов и наименований хостов выбираем  и получаем Список Программного Обеспечения. По полученному списку встаем на нужное ПО и жмем .<br /> Для успешного выполнения необходимо указать учетную запись, имеющую права администратора на удаленных хостах.</div>
<div id="sol_avtor">Автор: Яковлев Игорь</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5156">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 5 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5156">Яковлев Игорь</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Яковлев Игорь" href="https://foxclub.ru/account/?user=5156">
				<img alt='' src='https://secure.gravatar.com/avatar/866eac8c6636ca5ecdf386c931967b47?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/866eac8c6636ca5ecdf386c931967b47?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 20-10-2017        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/udalennoe-administrirovanie-po-sredstvami-wmi/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/treeview-listview-unicode/</link>
					<title><![CDATA[Treeview+Listview+Unicode]]></title>
                    					    <author><![CDATA[dimuhametov]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:38 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Treeview+Listview+Unicode</h1>
													</header>
													<div id="sol_opis">Поддержка Unicode-символов в котролах ActiveX - Treeview и Listview</div>
<div id="sol_body">Небольшой пример отображения кодировки Unicode в ActiveX-объектах Listview  и Treeview на основе MS Windows Common Controls 5.0(comctl32.ocx,ver 6.0.98 и выше). <br /> Listview в данном примере используется как таблица для отображения символов UTF8. Можно добавлять и редактировать строки. <br /> Внутри архива две формы, одна для работы с Listview, другая c Treeview. Также возможно понадобится регистрация в системе двух библиотек comctl32.ocx и FM20.DLL (или их обязательное наличие в папках System32,SysWOW64), в случае неправильного отображения двубайтной кодировики (Unicode символов).</p>
</div>
<div id="sol_avtor">Автор: dimuhametov</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4750">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 4 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4750">dimuhametov</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="dimuhametov" href="https://foxclub.ru/account/?user=4750">
				<img alt='' src='https://secure.gravatar.com/avatar/d20d63cb86d272d231ef055ce82b5663?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/d20d63cb86d272d231ef055ce82b5663?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 01-11-2008        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/treeview-listview-unicode/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/modul-abstraktnogo-uchyotno-analiticheskogo-prilozheniya-prototyp/</link>
					<title><![CDATA[Модуль абстрактного учётно-аналитического приложения (PROTOTYP)]]></title>
                    					    <author><![CDATA[INFO2MAX]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:38 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Модуль абстрактного учётно-аналитического приложения (PROTOTYP)</h1>
													</header>
													<div id="sol_opis">Создание основы сложных прикладных программ на основании метаданных .</div>
<div id="sol_body">Модуль позволяет создать прикладную программу с множеством встроенных инструментов.</p>
<p> Каждое новое приложение - это отдельная папка с расширенным описанием прикладных данных в специальных таблицах<br /> и несколько стандартных  подпрограмм  (PROG, INIT, INIT_U, MMENU и EXIT_U). </p>
<p> Встроенные инструменты и их сочетания используя метаданные позволяют решать большинство задач пользователя.</p>
<p> Дальнейшее развитие приложения может быть выполнено  изнутри пользователем, используя конструктор выражений,<br /> конструкторы отчётов и схем (процедур) обработки. Подготовленные программистами специальные подпрограммы и отчёты<br /> можно описать в основном меню приложения (MMENU) или включить в реестр схем обработки и реестр отчётов.<br /> Для написания схем обработки можно использовать не только VFP, но и VB, JS и PHP.  </p>
<p> Модуль является частью сетевой распределённой системы учёта и поэтому имеет некоторые ограничения по своему <br /> расположению - базовая часть должна находится в папке c фиксированным именем (в данном варианте - по адресу C:IT !) </p>
<p> В архиве по адресу :https://www.onepro.su/download/c_it.7z, кроме самой основы (папки AL и VCOMMON), есть еще<br /> ряд примеров приложений, которые расположены в отдельных папках (VALCUR, PHONES, FUNCTION, FACTURA). <br /> Архив необходимо распаковать в папку C:IT . <br /> Информация о дальнейших действиях Вы найдёте по адресу C:ITreadme.txt. </p>
<p> Описание общих функциональных возможностей созданного таким способом программ лежит по адресу:<br />  https://www.onepro.su/desc/maindoc. </div>
<div id="sol_avtor">Автор: INFO2MAX</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="683">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 15 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=683">INFO2MAX</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="INFO2MAX" href="https://foxclub.ru/account/?user=683">
				<img alt='' src='https://secure.gravatar.com/avatar/ead4a58aedce2982b9d992e3528e6b13?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ead4a58aedce2982b9d992e3528e6b13?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 23-02-2011        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/modul-abstraktnogo-uchyotno-analiticheskogo-prilozheniya-prototyp/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/proverka-statusa-kontragenta-versiya-2-proveryaem-inn-kpp-na-datu/</link>
					<title><![CDATA[Проверка статуса контрагента (версия 2), проверяем ИНН/КПП на дату]]></title>
                    					    <author><![CDATA[Alex Roublev]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:38 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Проверка статуса контрагента (версия 2), проверяем ИНН/КПП на дату</h1>
													</header>
													<div id="sol_opis">Проверка статуса контрагента, проверяем ИНН/КПП на дату через SOAP-интерфейс на сайте Федеральной налоговой службы. Версия 2 по состоянию на 27.04.2017 г. работает в тестовом режиме.</div>
<div id="sol_body">
<pre class="bbcode">* ==============================================================================================================================  
 * Автор:            vic119, Alex Roublev (доработка), Igor Korolyov (верификация, доработка), SSA (верификация, доработка)  
 * Дата:             10.12.2014, 27.04.2017  
 * Описание:         статус ИНН/КПП на дату  
 *                   проверка контрагента через SOAP-интерфейс на сайте Федеральной налоговой службы <a href="https://npchk.nalog.ru/" target="_blank" rel="nofollow noopener noreferrer"><u>https://npchk.nalog.ru/</u></a>  
 * Документация:     <a href="https://npchk.nalog.ru/ws2.doc" target="_blank" rel="nofollow noopener noreferrer"><u>https://npchk.nalog.ru/ws2.doc</u></a>  
 *  
 * Примечание:       на 27.04.2017 на сайте ФНС сервис работает в тестовом режиме  
 *  
 * Доп. информация:  Использование WEB сервиса для проверки ИНН/КПП контрагента: <a href="http://infostart.ru/public/439808/" target="_blank" rel="nofollow noopener noreferrer"><u>http://infostart.ru/public/439808/</u></a>  
 *                   Обсуждение на форуме Foxclub: <a href="http://forum.foxclub.ru/read.php?29,645686" target="_blank" rel="nofollow noopener noreferrer"><u>http://forum.foxclub.ru/read.php?29,645686</u></a>  
 *  
 * Библиотека:       используется библиотека Microsoft XML Core Service версия 6 SP3 (msxml6.dll)  
 *                   альтернатива - MSXML версия 4 SP2 (msxml4.dll) с вызовом объекта класса Msxml2.XMLHTTP.4.0  
 *                   описание версий <a href="https://support.microsoft.com/ru-ru/help/269238/list-of-microsoft-xml-parser-msxml-versions" target="_blank" rel="nofollow noopener noreferrer"><u>https://support.microsoft.com/ru-ru/help/269238/list-of-microsoft-xml-parser-msxml-versions</u></a>  
 *  
 * Параметры:  
 *                   tcInn  - ИНН контрагента  
 *                   tcKpp  - КПП контрагента  
 *                   tcDate - дата, на которую проверяем в строковом формате 'дд.мм.гггг'  
 *  
 * Возврат:          строка с описанием статуса проверки  
 * =============================================================================================================================  
  #DEFINE TIME_LIMIT    30 &amp;&amp; лимит времени при обращении к сайту ФНС (для выхода из цикла)  
    
  CLEAR  
    
  LOCAL lcInn AS STRING, lcKpp AS STRING, ldDate AS DATE  
    
  lcInn = '6441012385'  
  lcKpp = '583601001'  
  ldDate = {^2014.12.08}  
    
  LOCAL ARRAY vaState(1,2)  
    
  vaState(1,1) = '-1'  
  vaState(1,2) = ''  
    
  Check_INN_KPP(m.lcInn, m.lcKpp, m.ldDate, @vaState)  
    
  ?Check_Status_INN_KPP(@vaState)  
    
  FUNCTION Check_INN_KPP()  
    
      LPARAMETERS tcInn AS STRING, tcKpp AS STRING, tdDate AS DATE, vaState  
    
      LOCAL ;  
          loHttp AS 'Msxml2.XMLHTTP.6.0', ; &amp;&amp; класс объекта для работы с SOAP-интерфейсом на сайте ФНС  
          loError AS OBJECT, ; &amp;&amp; объект для записи сообщения об ошибке  
          lcRequest AS STRING, ; &amp;&amp; xml-данные для запроса статуса контрагента  
          ltTimeout AS DATETIME &amp;&amp; время перед началом выполнения опроса сайта в цикле  
    
     ****************************************  
     * проверка корректности ввода параметров  
    
      DO CASE  
          CASE PCOUNT() &lt; 3  
              tdDate = DATE()  
          CASE PCOUNT() &lt; 2  
              tcKpp = ''  
          CASE PCOUNT() &lt; 1  
              tcInn = ''  
      ENDCASE  
    
      DO CASE  
          CASE EMPTY(tcInn)  
              vaState(1,2) = 'не заполнен номер ИНН.'  
              RETURN  
          CASE TYPE('tcInn') &lt;&gt; 'C' OR LEN(CHRTRAN(tcInn, "0123456789", "")) &gt; 0  
              vaState(1,2) = 'некорректно заполнен номер ИНН.'  
              RETURN  
      ENDCASE  
    
      DO CASE  
          CASE LEN(tcInn) = 10 &amp;&amp; юр. лицо  
              DO CASE  
                  CASE EMPTY(tcKpp)  
                      vaState(1,2) = 'не заполнен обязательный для юр. лица номер КПП.'  
                      RETURN  
                  CASE TYPE('tcKpp') &lt;&gt; 'C' OR LEN(tcKpp) &lt;&gt; 9 OR LEN(CHRTRAN(tcKpp, "0123456789", "")) &gt; 0  
                      vaState(1,2) = 'некорректно заполнен обязательный для юр. лица номер КПП.'  
                      RETURN  
              ENDCASE  
          CASE LEN(tcInn) = 12 &amp;&amp; индивид. предприниматель  
              IF !EMPTY(tcKpp)  
                  vaState(1,2) = 'номер КПП не указывается для ИП.'  
                  RETURN  
              ENDIF  
      ENDCASE  
    
      DO CASE  
          CASE EMPTY(tdDate)  
              vaState(1,2) = 'не заполнена дата.'  
              RETURN  
          CASE TYPE('tdDate') &lt;&gt; 'D'  
              vaState(1,2) = 'некорректно заполнена дата.'  
              RETURN  
      ENDCASE  
    
     ****************************************  
    
      TEXT TO lcRequest TEXTMERGE PRETEXT 1 + 2 NOSHOW  
      &lt;?xml version="1.0" encoding="UTF-8"?&gt;  
      &lt;soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:req="http://ws.unisoft/FNSNDSCAWS2/Request"&gt;  
          &lt;soapenv:Header/&gt;  
              &lt;soapenv:Body&gt;  
                  &lt;req:NdsRequest2&gt;  
                      &lt;req:NP INN="&lt;&lt;tcInn&gt;&gt;" KPP="&lt;&lt;tcKpp&gt;&gt;" DT="&lt;&lt;Transform(Day(tdDate), '@L 99')&gt;&gt;.&lt;&lt;Transform(Month(tdDate), '@L 99')&gt;&gt;.&lt;&lt;Transform(Year(tdDate), '9999')&gt;&gt;"/&gt;  
                  &lt;/req:NdsRequest2&gt;  
              &lt;/soapenv:Body&gt;  
      &lt;/soapenv:Envelope&gt;  
      ENDTEXT  
    
      TRY  
    
          loHttp = CREATEOBJECT('Msxml2.XMLHTTP.6.0')  
    
          WITH m.loHttp  
              .OPEN('POST', 'http://npchk.nalog.ru/FNSNDSCAWS_2?wsdl', .F.)  
              .setRequestHeader('Content-Type', 'text/xml; charset=utf-8')  
              .setRequestHeader('Content-length', TRANSFORM(LEN(lcRequest)))  
              .Send(m.lcRequest)  
    
              ltTimeout = DATETIME() + TIME_LIMIT  
    
             * опрашиваем данные до тех пор, пока не будет получен ответ или не исчерпается лимит времени  
              DO WHILE .ReadyState &lt;&gt; 4  
                  DOEVENTS FORCE  
                  IF DATETIME() &gt; m.ltTimeout  
                      EXIT  
                  ENDIF  
                  INKEY(0.5)  
              ENDDO  
    
              IF .STATUS = 200 &amp;&amp; ответ был получен  
                  WITH .responseXML  
                      .setProperty('SelectionNamespaces', 'xmlns:rsp="http://ws.unisoft/FNSNDSCAWS2/Response"')  
                      vaState(1,1) = .selectSingleNode("//rsp:NdsResponse2/rsp:NP/@State").nodeValue &amp;&amp; статус контрагента  
                  ENDWITH  
              ELSE  
                  vaState(1,2) = 'ответ не получен, код ' + TRANSFORM(.STATUS) + ', ' + .StatusText + '.'  
              ENDIF  
          ENDWITH  
    
      CATCH TO loError  
          vaState(1,2) = 'Cтрока ' + TRANSFORM(loError.LINENO) + ', ' + loError.MESSAGE  
      ENDTRY  
    
  ENDFUNC  
    
  FUNCTION Check_Status_INN_KPP()  
    
      LPARAMETERS vaState  
    
      LOCAL lnState AS INTEGER, lcError AS STRING  
    
      lnState = CAST(vaState(1, 1) AS I)  
      lcError = vaState(1, 2)  
    
      RETURN ICASE ;  
          (;  
              m.lnState = -1, 'Данные контрагента не обработаны' + IIF(!EMPTY(lcError), ': ' + lcError, ''), ;  
              m.lnState =  0, 'Налогоплательщик зарегистрирован в ЕГРН и имел статус действующего в указанную дату', ;  
              m.lnState =  1, 'Налогоплательщик зарегистрирован в ЕГРН, но не имел статус действующего в указанную дату', ;  
              m.lnState =  2, 'Налогоплательщик зарегистрирован в ЕГРН', ;  
              m.lnState =  3, 'Налогоплательщик с указанным ИНН зарегистрирован в ЕГРН, КПП не соответствует ИНН или не указан', ;  
              m.lnState =  4, 'Налогоплательщик с указанным ИНН не зарегистрирован в ЕГРН', ;  
              m.lnState =  5, 'Некорректный ИНН', ;  
              m.lnState =  6, 'Недопустимое количество символов ИНН', ;  
              m.lnState =  7, 'Недопустимое количество символов КПП', ;  
              m.lnState =  8, 'Недопустимые символы в ИНН', ;  
              m.lnState =  9, 'Недопустимые символы в КПП', ;  
              m.lnState = 10, 'КПП не должен использоваться при проверке ИП', ;  
              m.lnState = 11, 'Некорректный формат даты', ;  
              m.lnState = 12, 'Некорректная дата (ранее 01.01.1991 или позднее текущей даты)', ;  
              'Сатус контрагента не определен (' + TRANSFORM(m.lnState) + ')' ;  
          )  
  ENDFUNC</pre>
</div>
<div id="sol_avtor">Автор: vic119, Alex Roublev (доработка)</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4786">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4786">Alex Roublev</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Alex Roublev" href="https://foxclub.ru/account/?user=4786">
				<img alt='' src='https://secure.gravatar.com/avatar/00346040923c19be64dc8ef2c05347d9?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/00346040923c19be64dc8ef2c05347d9?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-09-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/proverka-statusa-kontragenta-versiya-2-proveryaem-inn-kpp-na-datu/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/proczedura-dlya-preobrazovaniya-stroki-formata-url-v-ascii-libo-obratno/</link>
					<title><![CDATA[Процедура для преобразования строки формата URL в ASCII, либо обратно.]]></title>
                    					    <author><![CDATA[Crispy]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:38 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Процедура для преобразования строки формата URL в ASCII, либо обратно.</h1>
													</header>
													<div id="sol_opis">При передаче в качестве единственного параметра строки формата URL - возвращает строку, преобразованную в формат ASCII. При передаче в качестве первого параметра строки формата ASCII и указании дополнительно второго параметра (любое число) - возвращает строку, преобразованную в формат URL.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Crispy</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4819">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4819">Crispy</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Crispy" href="https://foxclub.ru/account/?user=4819">
				<img alt='' src='https://secure.gravatar.com/avatar/48a3902acba9a2d85995b342a89fda7b?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/48a3902acba9a2d85995b342a89fda7b?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 16-05-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/proczedura-dlya-preobrazovaniya-stroki-formata-url-v-ascii-libo-obratno/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/prosmotr-v-off-lajne-nashego-foruma-forum-foxclub-ru/</link>
					<title><![CDATA[Просмотр в офф-лайне нашего форума forum.foxclub.ru]]></title>
                    					    <author><![CDATA[Foxtrot]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Просмотр в офф-лайне нашего форума forum.foxclub.ru</h1>
													</header>
													<div id="sol_opis">Исходные тексты программы просмотра форума в режиме офф-лайн: загрузка сообщений из архива (DBF+XML) и из ленты новостей (RSS). Внимание: в базе данных есть посты только в разделе FAQ (остальные удалены для экономии места), а также профайлы некоторых пользователей. Программа не проверяет наличия связи с Интернетом. Использовал VFP8SP1, Microsoft TreeView Control 6.0 (SP6), обозреватель веб-страниц (Microsoft)(Shell.Explorer.2), Microsoft MonthView Control 6.0 (SP4), Microsoft Chart Control 6.0 (SP4), Microsoft ImageList Control 6.0 (SP6), Microsoft List View Control 6.0 (SP6)</div>
<div id="sol_body">Реализовано:<br /> 1 строит дерево сообщений<br /> 2 автоматическая загрузка сообщений с сайта (RSS) по таймеру<br /> 3 статистика загрузок, активность форума и прочего<br /> 4 активированы тэги сообщений (отдельное спасибо Вадиму Пирожкову за предоставленный класс)<br /> 5 загрузка профилей, аватарок авторов постов (нужно знать id программиста)<br /> 6 поиск сообщений<br /> 7 протоколирование работы программы<br /> 8 импорт из архива DBF или XML http://www.foxclub.ru/phoff/index.php (при условии существования предыдущих постов импортируемого месяца)<br /> 10 удаление, архивирование постов<br /> 11 напоминалка о днях рождениях при старте<br /> 12 галерея аватарок<br /> a также имеется небольшой функционал:<br /> в заголовках гридов - DoubleClick, RightClick<br /> индикация статуса ICQ<br /> и всякая разная мелочь: ListBox-RightClick, Label-RightClick...</p>
<p> PS: просьба ко всем, кто нашел какие-нибудь ошибки, сообщить мне в ЛС или объявить их в разделе "Обсуждаем проекты"</p></div>
<div id="sol_avtor">Автор: Foxtrot</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4782">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4782">Foxtrot</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Foxtrot" href="https://foxclub.ru/account/?user=4782">
				<img alt='' src='https://secure.gravatar.com/avatar/14af643bd13aa7e300bf3487d9a2cdc5?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/14af643bd13aa7e300bf3487d9a2cdc5?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-04-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/prosmotr-v-off-lajne-nashego-foruma-forum-foxclub-ru/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/derevo-v-kolonke-grida/</link>
					<title><![CDATA[Дерево в колонке грида]]></title>
                    					    <author><![CDATA[Андрей Тарасов]]></author>
                    										    <pubDate>Sun, 20 Nov 2022 09:31:50 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Дерево в колонке грида</h1>
													</header>
													<div id="sol_opis">Отображение древовидных данных в нативном фоксовском гриде</div>
<div id="sol_body">
<p>Назначение.<br />
Класс предназначен для отображения иерархических данных фиксированной глубины вложения в нативном фоксовском гриде. Иными словами - дерево в колонке грида. Зачем это нужно? Для совмещения наглядности и компактности дерева (как известно, человек адекватно воспринимает 7-8 записей в списке), удобства обработки данных в таблице, скорости грида, и не хочу ActiveX.</p>
<p>Плюсы и минусы решения.<br />
+ можно запихнуть прямо в родной фоксовский грид;<br />
+ работает быстро на любых объёмах данных (индекс);<br />
+ вместо textbox для отображения элемента дерева можно использовать editbox или container с любым наполнением, т.е. можно сделать текст многострочный, с выделением подстрок, с правильным ресайзом и т.д.;<br />
+ можно выделять записи шрифтом и/или цветом;<br />
+ можно использовать собственные картинки как для разных уровней дерева, так и для отдельных узлов/веток;<br />
+ есть отметка записей дерева, замечу - правильная, троичная;<br />
+ не ActiveX;<br />
- требует времени при начальной инициализации на больших таблицам;<br />
- предъявляет определенные требования к структуре таблицы с деревом.</p>
<p>Описание класса находится в методе Docum.</p>
<p>Для примера использования запустить форму Example.<br />
Скриншот и архивы есть тут http://forum.foxclub.ru/read.php?29,370548,475187#msg-475187</p>
</div>
<div id="sol_avtor">Автор: А.Тарасов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4787">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4787">Андрей Тарасов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Андрей Тарасов" href="https://foxclub.ru/account/?user=4787">
				<img alt='' src='https://secure.gravatar.com/avatar/1ed364b4b8071e80f5c10332d8268ba0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1ed364b4b8071e80f5c10332d8268ba0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 05-02-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/derevo-v-kolonke-grida/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/nabor-klassov-http-winsock-pop3-smtp/</link>
					<title><![CDATA[Набор классов HTTP, winsock, POP3, SMTP]]></title>
                    					    <author><![CDATA[Влад Колосов]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:38 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Набор классов HTTP, winsock, POP3, SMTP</h1>
													</header>
													<div id="sol_opis">Классы позволяют получать и отправлять письма, загружать страницы.</div>
<div id="sol_body">Минимальный набор действий, примеры прилагаются. Шифрование соединения не поддерживается.</div>
<div id="sol_avtor">Автор: Влад Колосов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4894">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4894">Влад Колосов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Влад Колосов" href="https://foxclub.ru/account/?user=4894">
				<img alt='' src='https://secure.gravatar.com/avatar/6d059ca093aa6e3bd9ac83999fb80409?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/6d059ca093aa6e3bd9ac83999fb80409?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 05-05-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/nabor-klassov-http-winsock-pop3-smtp/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/rusifikacziya-kalendarya-onytoo-dorabotka-ego-datepicker/</link>
					<title><![CDATA[Русификация календаря OnyToo, доработка его datepicker]]></title>
                    					    <author><![CDATA[krin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:38 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Русификация календаря OnyToo, доработка его datepicker</h1>
													</header>
													<div id="sol_opis">Русификация календаря OnyToo, доступного, например, на  http://www.foxite.com/archives/calendar-and-datepicker-with-holiday-0000291009.htm и доработка его datepicker, использующего для всплывающего календаря отдельную форму.  дополнения календаря: можно подключить/отключить использование фоновой картинки, таблицы праздничных дней, задать BackColor.  дополнения datepicker: - повторное нажатие кнопки не переоткрывает календарь на немодальной форме, а закрывает его. - отдельная picture для .Enabled=.f. - элементы datepicker'а подправляют свой размер/положение/видимость при наличии или отсутствии темы windows, поэтому он остаётся удобным для ввода. - можно задавать BackColor, BackStyle.  приведены 2 контейнера для практического использования: ввод даты, ввод диапазона дат. форма example.scx реагирует на появление/отмену темы windows и вызывает изменение вида datepicker'ов на ней.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: krin</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4495">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4495">krin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="krin" href="https://foxclub.ru/account/?user=4495">
				<img alt='' src='https://secure.gravatar.com/avatar/1ec6ad5c203e6b165ed965172632eaf7?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1ec6ad5c203e6b165ed965172632eaf7?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 08-02-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/rusifikacziya-kalendarya-onytoo-dorabotka-ego-datepicker/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-dlya-avtoinkrementnogo-poiska-v-gride/</link>
					<title><![CDATA[Класс для автоинкрементного поиска в гриде]]></title>
                    					    <author><![CDATA[Crispy]]></author>
                    										    <pubDate>Mon, 31 Aug 2020 19:12:56 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс для автоинкрементного поиска в гриде</h1>
													</header>
													<div id="sol_opis">Класс для автоинкрементного поиска в гриде с использованием Label в качестве элемента псевдоввода</div>
<div id="sol_body">Номера полей, по которым осуществляется поиск, передаются в экземпляр класса, помещаемый на форму, через его свойство Tag - либо непосредственно при макетировании формы, либо в дальнейшем - программным путем, что дает дополнительную возможность подменять поля для поиска в процессе работы. Первым при занесении указывается номер числового поля, далее через запятую - номер символьного. При отсутствии необходимости в числовом, нужно обязательно указывать 0. Т.е. например так: 0,2 - поиск будет осуществляться только по второму символьному полю.<br />
Тип поля для числового идентификатора (C или N) автораспознается.<br />
Т.е., при использовании поля для хранения каких-либо индивидуальных числовых идентификаторов, его обычно всегда делают типа "C", т.к. это упрощает работу со всеми идентификаторами, начинающимися на "0". Соответственно для поиска в таком поле идентификаторов, начинающихся на "0" - вначале всегда необходимо вводить нужное количество нулей, стоящих слева перед цифрами.<br />
Для полей же, хранящих какие-либо номера с типом "N" - для поиска необходимо сразу же вводить первые цифры искомого номера (без пробелов перед ними).<br />
Т.е. здесь соблюден давно принятый и вполне стандартный подход, и само пояснение разницы ввода предназначено собственно лишь для начинающих. 🙂 В прилагаемом к классу примере эту разницу можно вполне наглядно увидеть для полей 1 и 3.<br />
В качестве дополнительного удобства при использовании добавлен автоматический "перевод" всех нажатий на клавиатуру сразу в русские символы без необходимости переключений раскладки. Т.е. независимо от раскладки ввод поискового предложения будет осуществлен на кириллице. При отсутствии подобной необходимости это можно легко убрать, либо изменить - в методе KeyPress данного класса, открыв его на модификацию.<br />
Нажатие клавиши пробела - очищает строку ввода, и переводит указатель записи в начало таблицы.<br />
Также в качестве дополнительного удобства использования класса - в поле Comment экземпляра класса, либо сразу при макетировании, либо программно, можно вставлять (как символьную строку) имя любого своего метода, который должен будет выполняться при нажатии клавиши Enter или же двойном клике на выбранной строке грида. Разумеется имя должно быть правильным в отношении пути вложенности (если оно указано относительно грида через Parent), либо же, что зачастую проще - абсолютным адресом - т.е. указанным относительно непосредственно самой формы, скажем какой-нибудь метод thisform.object1.MyMethod(), который производит действия с участием данной строки.<br />
Вместо метода также может быть вставлена и любая исполняемая строка. Например во вложенном примере это может быть включение свойства Enabled текстбоксов, что справа от грида, в .T. - для возможности редактирования выбранной строки.<br />
Дополнительно реализовано перекрашивание грида при потере им фокуса. Т.е. когда фокус находится на другом объекте - и грид, и его полоса выделения имеют более темный цвет. При этом поиск естественно производиться не может, что и демонстрирует пользователю потемневший грид. При возвращении же фокуса - через клик по гриду, либо клавиатурой через табуляцию, либо как-то программно - грид становится вновь более яркого цвета, визуально показывая пользователю, что поиск теперь снова возможен.<br />
При этом, поскольку показ поискового предложения реализован через label, нет необходимости кликать именно по поисковой строке.<br />
Вообще говоря, сделанная конкретно таким образом перекраска грида не совсем красива, я приделал сюда ее скорее лишь для демонстрации большей, на мой взгляд, наглядности такого способа - т.е. когда пользователю визуально намного более очевидно, что объект без фокуса в данный момент "не работает", пока по нему не кликнешь. В реальных же проектах я обычно помещаю все объекты, требующие показа неактивности объектов в данный момент - в контейнеры на базе специально сделанного класса. Поскольку через контейнер показ потери активности объектов можно осуществлять и более универсально, к тому же более красивым и простым путем. Но пристегивать к данному классу какой-то другой с различными наворотами, не относящимися к демонстрируемому, мне показалось излишним. Отсюда и простейшим образом организованная данная перекраска грида.<br />
Ну и еще одна совсем небольшая фича, на мой взгляд также достаточно удобная - в метод MiddleClick грида вставлен вызов звукового сигнала встроенного динамика компьютера. Что бывает удобно для случаев, когда у пользователей например нет звуковых колонок. Звук с помощью данного метода можно вызывать и из любого другого объекта путем передачи в качестве параметра частоты звука, т.е. например так: thisform.GridFinder1.MiddleClick(5000). В частности, по стандартно сложившемуся подходу, например при вызове этого метода 2-3 раза с разными частотами можно более эффективно привлекать внимание пользователя к выводу какой-либо важной информации на экран.</div>
<div id="sol_avtor">Автор: Crispy</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4819">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4819">Crispy</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Crispy" href="https://foxclub.ru/account/?user=4819">
				<img alt='' src='https://secure.gravatar.com/avatar/48a3902acba9a2d85995b342a89fda7b?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/48a3902acba9a2d85995b342a89fda7b?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 16-05-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-dlya-avtoinkrementnogo-poiska-v-gride/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/generator-otchetov-x-report/</link>
					<title><![CDATA[Генератор отчетов X-Report]]></title>
                    					    <author><![CDATA[bell]]></author>
                    										    <pubDate>Sat, 05 Nov 2022 18:31:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Генератор отчетов X-Report</h1>
													</header>
													<div id="sol_opis">Формирование xls-отчетов на основе предварительно подготовленных xls-шаблонов без использования Microsoft Excel.</div>
<div id="sol_body">
<p>Генератор X-Report предназначен для формирования xls-отчетов на основе предварительно подготовленных xls-шаблонов без использования Microsoft Excel, но с использованием ActiveX-компонента Tidestone Formula One. Сгенерированный отчет можно просмотреть и напечатать с помощью Microsoft Excel Viewer, OpenOffice Calc или любого другого просмотрщика/редактора файлов xls-формата.</p>
<p>Tidestone Formula One 6.1.5.12 Trial прилагается</p>
</div>
<div id="sol_avtor">Автор: Виктор Белан</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4505">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4505">bell</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="bell" href="https://foxclub.ru/account/?user=4505">
				<img alt='' src='https://secure.gravatar.com/avatar/1df667e24bf58e460d0226c5721678a2?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1df667e24bf58e460d0226c5721678a2?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 04-04-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/generator-otchetov-x-report/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/primer-nastraivaemoj-podsistemy-personificzirovannogo-ucheta/</link>
					<title><![CDATA[Пример настраиваемой подсистемы персонифицированного учета.]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:37 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Пример настраиваемой подсистемы персонифицированного учета.</h1>
													</header>
													<div id="sol_opis">Разработка предназначена для  быстрой разработки персонифицированного учета  (сотрудники, клиенты, покупатели, соискатели и т.д.).</div>
<div id="sol_body">Разработка представляет собой частично настраиваемый  фреймворк,  не содержит  жесткой привязки к структуре данных  и алгоритмам обработки, имеет настраиваемый интерфейс, а так же подсистему формирования отчетов. Может кому  пригодится – так, поковырять для примера, или для курсового. Многое из Фоксклаба пришло, так пусть, хоть что-то здесь и «упокоится».</div>
<div id="sol_avtor">Автор: its41</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/primer-nastraivaemoj-podsistemy-personificzirovannogo-ucheta/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/tablichnyj-kontrol-grid-dlya-zameny-standartnogo-tablichnogo-kontrola-grid-sortirovka-filtracziya-pechat-poisk-eksport-v-excell-openoffice-i-t-d/</link>
					<title><![CDATA[Табличный контрол (Grid) для замены стандартного табличного контрола (Grid). (сортировка, фильтрация, печать, поиск, експорт в Excell, OpenOffice и т.д.)]]></title>
                    					    <author><![CDATA[alextretij]]></author>
                    										    <pubDate>Mon, 31 Aug 2020 08:04:10 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Табличный контрол (Grid) для замены стандартного табличного контрола (Grid). (сортировка, фильтрация, печать, поиск, експорт в Excell, OpenOffice и т.д.)</h1>
													</header>
													<div id="sol_opis">Табличный контрол (Grid) для замены стандартного табличного контрола (Grid). (сортировка, фильтрация, печать, поиск, експорт в Excell, OpenOffice и т.д.) Возможности: Сортировка (убывание/увеличение) фильтрация (быстрая через хидер/ или через отдельное окно) поиск заморозка столбцов Автоматическая печать (автоматом генерится frx-файл) Експорт в OpenOffice, Excell, formulaone (советую ее, ракета!!!) Настройка столбцов (ширина, спрятать) Поддержка многоязычности (Украинский, Росийский, Английский) Итоговые данные (Сумма, количество записей) Простота использования и настройки для програмиста (это стандартный Grid Foxpro).</div>
<div id="sol_body">
<p>Табличный контрол (Grid) для замены стандартного табличного контрола (Grid). (сортировка, фильтрация, печать, поиск, експорт в Excell, OpenOffice и т.д.) версия 1.1<br />
(исправлена ошибка для некоторых разрешений экрана с высотой нижнего грида, показал Дима Григорьев)</p>
<p>Возможности:</p>
<p>Сортировка (убывание/увеличение)<br />
фильтрация (быстрая через хидер/ или через отдельное окно)<br />
поиск<br />
заморозка столбцов<br />
Автоматическая печать (автоматом генерится frx-файл)<br />
Експорт в OpenOffice, Excell, formulaone (советую ее, ракета!!!)<br />
Настройка столбцов (ширина, спрятать)<br />
Поддержка многоязычности (Украинский, Росийский, Английский)<br />
Итоговые данные (Сумма, количество записей)<br />
Простота использования и настройки для програмиста (это стандартный Grid Foxpro).<br />
“Резиновость” колонок (Anchor)</p>
<p>Как это работает.<br />
Это стандартный Grid Foxpro, для работы достаточно положить его на форму, настраивать его как стандартный Grid. Можно делать несколько контроллов в ячейках.<br />
Во время запуска форми (int контрола), он уничтожает свой хидер и на его основе делает контейнера, которые по настройках дублируют стандартные хидера, после этого синхронизирует нижный грид (итоговые суммы). Когда Вы пробуете сортировать, контролл проверяет на наличие интекса по этому полю, если он есть то использует его, если его нет, то индексирует таблицу (курсор). Все операции индексирования, фильтрации, и т.д.<br />
находятся в конструкциях try.</p>
<p>Пример настройки</p>
<pre><pre class='bbcode'>  thisform.addproperty('grid1')  
  thisform.grid1 = thisform.targrid1.dataGrid  
  thisform.grid1.RecordSource =''  
 *targrid1 - это контейнер  
 * дальше нужно работать с thisform.grid1 - это стандартный контролл фокспро.  
    
  USE tovar.dbf  
  select tovar  
  THISFORM.grid1.RecordSource = 'tovar'  
  THISFORM.grid1.column1.ControlSource = 'tovar.nametv'  
  THISFORM.grid1.column2.ControlSource = 'tovar.ov'  
  THISFORM.grid1.column3.ControlSource = 'tovar.zal'  
  THISFORM.grid1.column4.ControlSource = 'tovar.cena_r'  
  THISFORM.grid1.column5.ControlSource = 'tovar.sumall'  
  THISFORM.grid1.column6.ControlSource = 'tovar.codetvun'  
  THISFORM.grid1.column7.ControlSource = 'tovar.namegr2'  
</pre></pre>
<p>Есть много возможностей (часть из них будем описывать позднее):</p>
<p>1. автоматом вывести итоговую сумму в колонку которая имеет название column5.<br />
thisform.targrid1.showsumacolumn('column5')</p>
<p>2. спрятать колонку так чтобы пользователь ее не мог никак увидеть, например цена товара для кладовщика.<br />
thisform.targrid1.showcolumn('column5',.f.)<br />
.f. - спрятать<br />
.t. - показать</p>
<p>Если сделать<br />
thisform.targrid1.dataGrid.column5.visible=.f.<br />
то колонку будет не видно, но пользователь через окно натройки сможет ее отобразить.</p>
<p>3. Стартовий фильтр. Если нужно чтобы на таблицу был наложен такой фильтр, для того чтобы пользователь его<br />
не видел и не мог снять, есть свойсто<br />
thisform.targrid1.setglobalfilter('sumall&lt;1000')<br />
Пользователь сможет настраивать свои фильтры, но об этом стартовом и знать не будет.</p>
<p>узнать какой стартовый фильтр<br />
wait window thisform.targrid1.startfilter</p>
<p>4. Текст который будет печататься сверху и снизу отчета (frx автоматом генерится на основе Grid). Например нужно знать фамилию того кто это напечатал.<br />
thisform.targrid1.reportnameoperator='напечатал Пупкин'<br />
thisform.targrid1.reporttextsummary=' напечатоно с компьютера Petya'</p>
<p>5. Запрет печатать Grid и экспортировать его куда-нибуть. Например, кладовщик должен видеть но ему нельзя печатать эти данные.<br />
thisform.targrid1.nodruk=.t.</p>
<p>6. Папка куда котрол ложит мусор (индексы, отчеты). Контрол автоматически мусор убирает за собой.<br />
thisform.targrid1.fpathtemp='c:temp'</p>
<p>7. Запрет автоматического растяжения контрола (по умолчанию он резиновый).<br />
thisform.targrid1.noresize=.t.</p>
<p>8. Метод. Напечатать котрол.<br />
thisform.targrid1.doreport()</p>
<p>9. Метод. Експортировать в Ексель/ОпенОфис<br />
thisform.targrid1.export_to_excel()<br />
thisform.targrid1.export_to_ooo()</p>
<p>10. Методы для удобства. BindEvent'ом связаны с соответствующими методати контролов в ячейках Grid. Например в Grid есть 10 колонок и в них есть TexBox, когда нужно чтобы по ondblclick в любой колонке Grid запускалась какая-то форма, то чтобы не писать код в 10 колонках пишем код в одном методе thisform.targrid1.ondblclick.</p>
<p>thisform.targrid1.ondblclick()<br />
thisform.targrid1.onkeypress()<br />
thisform.targrid1.onmousedown()<br />
thisform.targrid1.onrightclick()</p>
<p>11. Если Вы програмно изменяете Grid или в конце оформления, то потом нужно выполнить thisform.targrid1.dataGrid.refresh<br />
Он автоматом, построит Хидер колонки и итоговые данные. Это комманда обязательная!!!</p>
<p>12. Запрет выводить итоговую сумму по колонке. Например кладовщики должны видеть суммы накладных, но на какую сумму они сегодня отгрузили всего товаров нельзя.<br />
thisform.grid1.column4.noshowsuma = .t.<br />
Я понимаю что кладовщики могут вручную сложить все накладные :). Но автоматически возможность видеть итоговую сумму будет недоступна.</p>
<p>13. Сбросить все фильтры (кроме стартового!!!) и сортировки, уничтожить индексы. Делает внешний вид контролла как по умолчанию.<br />
thisform.targrid1.rebuildall()</p>
<p>14. Изменть язык контролла.<br />
<code>thisform.targrid1.languageload(1)</code><br />
<code>*m.pnLanguageId=1 &amp;&amp;English</code><br />
<code>*m.pnLanguageId=2 &amp;&amp;Russian</code><br />
<code>m.pnLanguageId=3 &amp;&amp;Ukraine</code></p>
<p>15. Автоматическая убока мусора.<br />
После комманды<br />
THISFORM.grid1.RecordSource='tovar2'<br />
для прошлой таблицы tovar будут удалеы индексы которые сам котролл создал. Если таблица имела какойто индекс до использования в контролле, то он остается.Повторюсь. Удаляются только созданные им индексы.</p>
<p>16.“Резиновость” колонок (Anchor). По умолчанию выключен. Для включения нужно: thisform.targrid1.noResize =.t.<br />
Напоследок.<br />
Это обычный Grid.</p>
<p>Если таблица большая (широкая), то он НЕ УМЕЕТ ее резать, для этого мы позднее внедрим решение Александра Юдина (Девкон Измаил 2011).</p>
<p>Я понимаю что это контейнер с двумя гридами внутри (базовый и итоговые данные) и ничего умного там нет. У каждого програмиста уже есть такие контроллы.<br />
Это мы делали 7-8 лет назад, после того как увидели Devexpress Grid ActiveX. Он круче нашего, в нем есть групировка, но он очень тормознутый. А также примера Алексея Климова, у него есть тоже классный грид, советю его посмотреть. Кроме грида у него много чего было интересного.<br />
Особая признательность сайту www.foxclub.ru.</p>
<p>С ошибками и предложениями пишите на<br />
alextretij(с_o__б_a_к_а)mail(т_o_ч_к_a)ru<br />
Третьяков Александр / Будзяк Тарас.</p>
</div>
<div id="sol_avtor">Автор: alextretij</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4615">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4615">alextretij</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="alextretij" href="https://foxclub.ru/account/?user=4615">
				<img alt='' src='https://secure.gravatar.com/avatar/1e419a1765c9adeb0346887bc4dcdad7?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1e419a1765c9adeb0346887bc4dcdad7?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 03-01-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/tablichnyj-kontrol-grid-dlya-zameny-standartnogo-tablichnogo-kontrola-grid-sortirovka-filtracziya-pechat-poisk-eksport-v-excell-openoffice-i-t-d/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/samaya-korotkaya-funkcziya-summy-propisyu-pozvolyaet-vyvodit-do-1036-parametr-chislo-ili-stroka/</link>
					<title><![CDATA[Самая короткая :) функция суммы прописью, позволяет выводить до 10^36, параметр &#8211; число или строка.]]></title>
                    					    <author><![CDATA[Crispy]]></author>
                    										    <pubDate>Wed, 16 Sep 2020 16:51:50 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Самая короткая :) функция суммы прописью, позволяет выводить до 10^36, параметр &#8211; число или строка.</h1>
													</header>
													<div id="sol_opis">Возвращает строку, представляющую число прописью, распознавая числовой или строковый тип параметра ввода. В случае параметра строкового типа, возможен вывод прописью числа вплоть до 999 дециллионов, т.е. порядка n*10^36. При желании несложно и увеличение этого предела. 🙂 Для числового параметра - обычное ограничение на порядок числа, исходя из стандарта FoxPro. Примечание: В тексте закомменчены строки возврата для случая использования функции в качестве вывода суммы прописью с добавлением склонения валюты, исходя из правил русского языка, в качестве примера - рубли-копейки. По аналогии их можно заменять и на любые другие.</div>
<div id="sol_body"></div>
<div id="sol_avtor"></div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4819">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4819">Crispy</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Crispy" href="https://foxclub.ru/account/?user=4819">
				<img alt='' src='https://secure.gravatar.com/avatar/48a3902acba9a2d85995b342a89fda7b?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/48a3902acba9a2d85995b342a89fda7b?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 16-05-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/samaya-korotkaya-funkcziya-summy-propisyu-pozvolyaet-vyvodit-do-1036-parametr-chislo-ili-stroka/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/krasivyj-checkbox/</link>
					<title><![CDATA[Красивый CheckBox]]></title>
                    					    <author><![CDATA[Chemberzhy]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:37 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Красивый CheckBox</h1>
													</header>
													<div id="sol_opis">Класс и форма-пример Арт-CheckBox-а</div>
<div id="sol_body">Навеяно этой темой от Юдина Александра: http://forum.foxclub.ru/read.php?29,556342 Все просто и незамысловато. Особенно описывать нечего: Свойства: ChBoxValue=(0 или 1), ChBoxEnabled=(.T. или .F.) Методы: ChBoxChangeValue- программно сменить значение ChBoxValue, ChBoxChangeEnabled- сменить значение ChBoxEnabled</div>
<div id="sol_avtor">Автор: Chemberzhy</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4815">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4815">Chemberzhy</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Chemberzhy" href="https://foxclub.ru/account/?user=4815">
				<img alt='' src='https://secure.gravatar.com/avatar/302fe7d2e93c47fd84b1a40063e861fc?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/302fe7d2e93c47fd84b1a40063e861fc?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-04-2009        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/krasivyj-checkbox/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/vertikalnyj-tekst-v-zagolovke-tabliczy/</link>
					<title><![CDATA[Вертикальный текст в заголовке таблицы.]]></title>
                    					    <author><![CDATA[dimuhametov]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:37 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Вертикальный текст в заголовке таблицы.</h1>
													</header>
													<div id="sol_opis">Вертикальное расположение текста в заголовке Grid-а. Построено на основе открытых решений клуба foxite.com</div>
<div id="sol_body">Открытая ссылка взята из http://www.foxite.com/archives/grid-with-gradient-header-0000333015.htm<br /> Класс переделан под вертикальное расположение текста в заголовке грида. За основу взят базовый класс GDI+. Также используется класс-обертка для объекта header. Необходимо определить имя экземпляра класса,библиотеки классов, когда добавляется новый экземпляр объекта header в контейнер столбца.  <br /> Column.HeaderClass ='myheader'<br /> Column.HeaderClassLibrary = 'mycolumn.prg'</p>
<p> Не удалось правильно сделать WordWrap теста, но если кто подскажет, то можно расширить возможности данного класса.</p></div>
<div id="sol_avtor">Автор: dimuhametov</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4750">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 4 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4750">dimuhametov</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="dimuhametov" href="https://foxclub.ru/account/?user=4750">
				<img alt='' src='https://secure.gravatar.com/avatar/d20d63cb86d272d231ef055ce82b5663?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/d20d63cb86d272d231ef055ce82b5663?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 01-11-2008        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/vertikalnyj-tekst-v-zagolovke-tabliczy/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/vyvod-treeview-na-pechat-gdigdi/</link>
					<title><![CDATA[Вывод TreeView на печать (GDI,GDI+)]]></title>
                    					    <author><![CDATA[Александр Жевелев]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:36 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Вывод TreeView на печать (GDI,GDI+)</h1>
													</header>
													<div id="sol_opis">Пример графического вывода на печать развернутого &quot;дерева&quot; (TreeView) на основе классов В.Клепинина (c минимальными правками)</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Александр Жевелев</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4832">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4832">Александр Жевелев</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Александр Жевелев" href="https://foxclub.ru/account/?user=4832">
				<img alt='' src='https://secure.gravatar.com/avatar/c26484fb4cb3d558afb40c4ada19085c?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c26484fb4cb3d558afb40c4ada19085c?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 09-10-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/vyvod-treeview-na-pechat-gdigdi/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/mini-mp3-proigryvatel-kak-otdelnyj-klass/</link>
					<title><![CDATA[Мини MP3- проигрыватель, как отдельный класс]]></title>
                    					    <author><![CDATA[Chemberzhy]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:37 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Мини MP3- проигрыватель, как отдельный класс</h1>
													</header>
													<div id="sol_opis">Сам я использую его как дополнительный бонус Заказчику в коммерческих программах.</div>
<div id="sol_body">11/11/2011<br /> Новый релиз.<br /> Исправлено пару фичек.<br /> Добавлена возможность выбора папки с МП-3 файлами.<br /> Добавлено сохранение параметров настройки <br /> в файле текстового формата "MyMusikAlbum.iks" при деактивации и выгрузки из памяти плеера. </p>
<p> Ставиться на форму как есть.</p>
<p> Из настроек свойств требует только путь к папке с MP3-файлами. Свойство- "path2musik".</p>
<p> Основные возможности:<br /> 	1. Собственно, проигрывание/пауза/стоп MP3 музыки из указанной в свойстве "path2musik" папки.<br /> 	2. Переход на песню назад/вперед.<br /> 	3. Регулировка звука как кликом мыши так и вращением колесика мыши.<br /> 	4. Полное отключение звука одним кликом мыши.<br /> 	5. Вывод на экран имени проигрываемого файла.<br /> 	6. Вывод на экран оставшегося времени проигрывания текущей композиции.</p>
<p> Основные требования:<br /> 	Наличие библиотеки "bass.dll". В комплекте в архиве имеется. Регистрация не требуется.<br /> 	Занимает на форме площадь (пиксели) 116х192.</p>
<p> Писано в VFP9/SP2.<br /> Ограничений по версиям VFP начиная с 6 быть не должно.</div>
<div id="sol_avtor">Автор: Chemberzhy</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4815">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4815">Chemberzhy</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Chemberzhy" href="https://foxclub.ru/account/?user=4815">
				<img alt='' src='https://secure.gravatar.com/avatar/302fe7d2e93c47fd84b1a40063e861fc?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/302fe7d2e93c47fd84b1a40063e861fc?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-04-2009        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/mini-mp3-proigryvatel-kak-otdelnyj-klass/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/fastreport-for-foxpro-frfox/</link>
					<title><![CDATA[FastReport for FoxPro (FrFox)]]></title>
                    					    <author><![CDATA[SergeySpirin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:37 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>FastReport for FoxPro (FrFox)</h1>
													</header>
													<div id="sol_opis">FastReport является одним из лучших генераторов отчетов в Win32, теперь доступен и для FoxPro.</div>
<div id="sol_body">Напомним, что FastReport является одним из лучших генераторов отчетов в Win32. FrFox является прямым (нативным) интегрированием FastReport в FoxPro на уровне FoxAPI. То есть, по уровню интеграции, FrFox мало отличается от родных средств отчетности Фокса, никаких COM/OLE/ActiveX и т.д. и т.п. Прямой доступ "ко всему в обе стороны". <br /> Напомню также, что FastReport, при всей его мощности, считается наиболее легким в освоении и наиболее интуитивно ясным генератором. </p>
<p> --- <br /> Общая информация об FrFox: </p>
<p> http://www.paritetsoft.ru/frfox.htm </p>
<p> Прямая ссылка для скачивания демо:</p>
<p> http://www.paritetsoft.ru/downloads/frfoxdemo.zip</p>
<p> Ссылка для покупки через "shareit":</p>
<p> http://www.shareit.com/product.html?productid=300480134</p>
<p> ---<br /> Спирин Сергей <br /> Компания "Паритет Софт".</div>
<div id="sol_avtor">Автор: SergeySpirin</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4549">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 16 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4549">SergeySpirin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="SergeySpirin" href="https://foxclub.ru/account/?user=4549">
				<img alt='' src='https://secure.gravatar.com/avatar/a2beaf75a3c30fe82f8a0f34f8b58fac?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/a2beaf75a3c30fe82f8a0f34f8b58fac?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 20-07-2010        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/fastreport-for-foxpro-frfox/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-dlya-avtopoiska-i-vybora-mesyachnyh-arhivov-po-vlozhennomu-puti-i-maske/</link>
					<title><![CDATA[Класс для автопоиска и выбора месячных архивов по вложенному пути и маске.]]></title>
                    					    <author><![CDATA[Crispy]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:37 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс для автопоиска и выбора месячных архивов по вложенному пути и маске.</h1>
													</header>
													<div id="sol_opis">Позволяет с указанием вложенного каталога и маски выбирать архивы через названия месяцев-лет с помощью спиннера. Можно включать автозапуск метода формы (например расчет) при выборе. Также включать автофокус на любом объекте формы. Работает озвучка встроенным динамиком (через API) при ряде событий. Позволяет использовать вложенный в класс метод для озвучки любых событий в проекте.</div>
<div id="sol_body">В качестве подгружаемых параметров использованы свойства объекта Tag и Comment.<br /> Т.е. кидаем экземпляр класса на форму, и в Tag прописываем относительный путь и маску.<br /> Класс в первую очередь предназначен для подгрузки таблиц, лежащих например во вложенном каталоге Arhiv, с именами вида ABCD????.DBF. Хотя при незначительной модификации возможны и прочие варианты.<br /> В данном же случае нужно прописать в свойство Tag экземпляре класса (визуально или программно) выражение: arhivabcd????.dbf, которое и будет использовано как маска поиска имеющихся в каталоге arhiv таблиц месячных архивов вида abcd1101, где 11- год, 01 - месяц архива.<br /> В свойство Comment можно прописать параметр, указывающий на имя объекта, которому передается фокус после выбора имени архива. Через пробел туда же можно прописать имя метода формы, который будет выполняться каждый раз при новом выборе месяца.<br /> Для получения имени выбранного архива (но уже без пути) используется все то же свойство данного экземпляра класса Tag.<br />  В класс также встроен вызов через API звука встроенного динамика. Который можно вызывать с параметром частоты звука в Гц.<br /> Все вышеописанное можно  изучить в прилагаемом образце проекта с использованием данного класса.</div>
<div id="sol_avtor">Автор: Crispy</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4819">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4819">Crispy</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Crispy" href="https://foxclub.ru/account/?user=4819">
				<img alt='' src='https://secure.gravatar.com/avatar/48a3902acba9a2d85995b342a89fda7b?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/48a3902acba9a2d85995b342a89fda7b?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 16-05-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-dlya-avtopoiska-i-vybora-mesyachnyh-arhivov-po-vlozhennomu-puti-i-maske/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/programma-testirovaniya-1-vopros-4-otveta/</link>
					<title><![CDATA[Программа тестирования 1 вопрос 4 ответа]]></title>
                    					    <author><![CDATA[guna]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:37 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Программа тестирования 1 вопрос 4 ответа</h1>
													</header>
													<div id="sol_opis">Проект без красивостей, должен подойти в т.ч. для изучения основ VFP.</div>
<div id="sol_body">Критика приветствуется.</p>
<p> Функционал:<br /> настраиваемое количество вопросов для теста<br /> 1 вопрос 4 ответа<br /> рандомный выбор вопросов из общей таблицы<br /> рандом ответов<br /> редактирование вопросов/ответов<br /> вопрос 254 символа<br /> ответы 249 символов</div>
<div id="sol_avtor">Автор: guna</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4292">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4292">guna</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="guna" href="https://foxclub.ru/account/?user=4292">
				<img alt='' src='https://secure.gravatar.com/avatar/becb451c356ee7ab1412cb91b0c06f24?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/becb451c356ee7ab1412cb91b0c06f24?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 22-07-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/programma-testirovaniya-1-vopros-4-otveta/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/visual-foxpro-9-izmeneniya-v-dialekte-sql/</link>
					<title><![CDATA[Visual FoxPro 9. Изменения в диалекте SQL]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 02 Jun 2023 14:45:07 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Visual FoxPro 9. Изменения в диалекте SQL</h1>
													</header>
													
<p><strong>Содержание</strong><br /><a href="#_Toc164071694">Изменения в диалекте SQL</a><br /><a href="#_Toc164071695">Почти неограниченное количество параметров в IN</a><br /><a href="#_Toc164071696">Вложенные подзапросы</a><br /><a href="#_Toc164071697">Дополнительная гибкость подзапросов</a><br /><a href="#_Toc164071698">Вычисляемые поля с подзапросом</a><br /><a href="#_Toc164071699">Вычисленние значения замены в UPDATE</a><br /><a href="#_Toc164071700">Соотнесенные подзапросы и группировка</a><br /><a href="#_Toc164071701">Использование предложения TOP N в подзапросах</a><br /><a href="#_Toc164071702">Соотнесенные модификации</a><br /><a href="#_Toc164071703">Соотнесённое удаление</a><br /><a href="#_Toc164071704">Дальнейшее усовершенствование UNION</a><br /><a href="#_Toc164071705">Использование имён в UNION</a><br /><a href="#_Toc164071706">Вставка данных из объединённых запросов</a><br /><a href="#_Toc164071707">Использование круглых скобки в UNION теперь не разрешается</a><br /><a href="#_Toc164071708">Комбинирование DISTINCT и ORDER BY</a><br /><a href="#_Toc164071709">Изменения в оптимизации</a><br /><a href="#_Toc164071710">Полностью оптимизирован оператор LIKE с “%”</a><br /><a href="#_Toc164071711">Улучшение быстродействия для TOP N</a><br /><a href="#_Toc164071712">Улучшение эффективности с OR</a><br /><a href="#_Toc164071713">Фильтрация и временные индексы</a><br /><a href="#_Toc164071714">Ускорение соотнесений (корелляции)</a><br /><a href="#_Toc164071715">Регистрация результатов оптимизации</a><br /><a href="#_Toc164071716">Выборка из буферизированных таблиц</a><br /><a href="#_Toc164071717">Отключение нового поведения</a><br /><a href="#_Toc164071718">Новые возможности команд SQL</a><br /><a href="#_Toc164071719">Новые возможности</a><br /><a href="#_Toc164071720">Расширенные подзапросы</a><br /><a href="#_Toc164071721">Составные подзапросы</a><br /><a href="#_Toc164071722">GROUP BY в соотнесенном подзапросе</a><br /><a href="#_Toc164071723">Предложение TOP N в не-соотнесенном подзапросе</a><br /><a href="#_Toc164071724">Подзапросы в cписке полей команды SELECT</a><br /><a href="#_Toc164071725">Агрегатные функции в списке полей SELECT подзапроса</a><br /><a href="#_Toc164071726">Соотнесенные подзапросы позволяют сложным выражениям быть сравненимыми с соотнесенным полем</a><br /><a href="#_Toc164071727">Изменения для выражений по сравнению с подзапросами.</a><br /><a href="#_Toc164071728">Подзапросы в команде UPDATE...SQL</a><br /><a href="#_Toc164071729">Подзапросы в предложении FROM</a><br /><a href="#_Toc164071730">GROUP BY с именами полей в предложении UNION..</a><br /><a href="#_Toc164071731">Эффективное выполнение TOP N</a><br /><a href="#_Toc164071732">Улучшенная оптимизация для множественной таблицы с условием OR</a><br /><a href="#_Toc164071733">Поддержка для локальных буферизированных данных.</a><br /><a href="#_Toc164071734">Расширения других SQL команд</a><br /><a href="#_Toc164071735">Предложение UNION в команде INSERT...SQL</a><br /><a href="#_Toc164071736">Соотнесенная команда UPDATE...SQL</a><br /><a href="#_Toc164071737">Соотнесенная команда DELETE...SQL</a><br /><a href="#_Toc164071738">Обновляемые поля в команде UPDATE...SQL</a><br /><a href="#_Toc164071739">SET ENGINEBEHAVIOR</a><br /><a href="#_Toc164071740">Преобразование типов данных</a><br /><a href="#_Toc164071741">Особенности использования команды SELECT… SQL</a><br /><a href="#_Toc164071742">Определяемые пользователем функции в командах SELECT...SQL</a><br /><a href="#_Toc164071743">Агрегатные функции</a><br /><a href="#_Toc164071744">Правила присваивания имён столбцам</a><br /><a href="#_Toc164071745">Операция объединения (UNION)</a><br /><a href="#_Toc164071746">Команда SELECT...SQL c предложением WITH</a><br /><a href="#_Toc164071747">Команда SET SQLBUFFERING</a><br /><br clear="all" /> </p>
<a name="_Toc164071694" id="_Toc164071694"></a>
<h2>Изменения в диалекте SQL</h2>
<p style="text-align: justify;">Диалект SQL в VFP фактически не менялся в течение длительного времени. Начиная с восьмой версии, Microsoft начала включать в диалект дополнительные возможности, тем самым увеличивая соответствие его стандарту ANSI SQL-92. В VFP 9 существенно расширен диалект SQL для команд SELECT, INSERT, UPDATE и DELETE, а также добавлен ряд других усовершенствований.<br />Многие из ограничений, касающиеся запросов,  были отменены, было значительно расширено использование подзапросов, а в командах UPDATE и DELETE стало возможным использование условия объединения записей. В VFP 9 также предложены некоторые усовершенствования, повышающие эффективность, более простые способы проверки эффективности, и способность выполнять запросы для буферизированных таблиц.<br />Наиболее значимое изменение в системе запросов VFP 9 — это отмена ряда ограничений. В более ранних версиях, например, общее число объединений и подзапросов в одиночном запросе было ограничено девятью; в VFP 9 не имеется никаких ограничений. В таблице 1 показаны ограничения, связанные с запросами, отменённые или  расширенные в VFP 9.<br />Таблица 1. Сравнение ограничений SQL в разных версиях VFP</p>
<table border="1" cellspacing="0" cellpadding="0" class="aligncenter" style="width: 100%;">

<tr>
<td width="253" valign="top" style="width: 45.3571%;"><br />Описание</td>
<td width="132" valign="top" style="width: 4.76191%;">
<p>Ограничения в VFP 8 (и более ранних версиях)</p>
</td>
<td width="235" valign="top" style="width: 24.4048%;">
<p>Ограничения в VFP 9</p>
</td>
</tr>


<tr>
<td width="253" valign="top" style="width: 45.3571%;">
<p align="left">Общее количество объединений и подзапросов</p>
</td>
<td width="132" valign="top" style="width: 4.76191%;">
<p align="left">9</p>
</td>
<td width="235" valign="top" style="width: 24.4048%;">
<p align="left">Нет ограничений</p>
</td>
</tr>
<tr>
<td width="253" valign="top" style="width: 45.3571%;">
<p align="left">Общее количество Unions</p>
</td>
<td width="132" valign="top" style="width: 4.76191%;">
<p align="left">9</p>
</td>
<td width="235" valign="top" style="width: 24.4048%;">
<p align="left">Нет ограничений</p>
</td>
</tr>
<tr>
<td width="253" valign="top" style="width: 45.3571%;">
<p align="left">Количество ссылок на таблицы (псевдонимы)</p>
</td>
<td width="132" valign="top" style="width: 4.76191%;">
<p align="left">30</p>
</td>
<td width="235" valign="top" style="width: 24.4048%;">
<p align="left">Нет ограничений</p>
</td>
</tr>
<tr>
<td width="253" valign="top" style="width: 45.3571%;">
<p align="left">Количество значений в предложении IN</p>
</td>
<td width="132" valign="top" style="width: 4.76191%;">
<p align="left">24</p>
</td>
<td width="235" valign="top" style="width: 24.4048%;">
<p align="left">Определяется установкой функции SYS(3055)</p>
</td>
</tr>
<tr>
<td width="253" valign="top" style="width: 45.3571%;">
<p align="left">Уровни вложенности для подзапросов</p>
</td>
<td width="132" valign="top" style="width: 4.76191%;">
<p align="left">1</p>
</td>
<td width="235" valign="top" style="width: 24.4048%;">
<p align="left">Нет ограничений</p>
</td>
</tr>

</table>
<p>В повседневности разработчики, формирующие SQL запросы, обычно не сталкиваются с этими ограничениями; но любой из них может оказаться в ситуации, когда подобная проблема возникнет.<br />Если данные в базе данных хорошо нормализованы, то существовавшие ранее ограничения как на количество объединений, так и на количество используемых таблиц (псевдонимов), могли приводить к значительным трудностям при выборке данных. Например, рассмотрим базу данных Northwind, которая поставляется с восьмой и девятой версиями VFP. В выборке всех данных, касающихся заказов, включая информацию о заказчиках, информацию о грузоотправителях, информацию о поставщиках и т.д, используется 11 таблиц. В листинге 1 показан такой запрос.</p>
<div><br />Листинг 1. Хорошо нормализованная база данных может включать множество обьединений и таблиц.</div>
<pre class="bbcode">SELECT ProductName, CategoryName, OrderDate, Customers.CompanyName AS CustomerName, ;
         OrderDetails.Quantity, OrderDetails.UnitPrice, ;
         Suppliers.CompanyName AS SupplierName, Employees.LastName, Employees.FirstName, ;
         Territories.TerritoryDescription, Region.RegionDescription, ;
         Shippers.CompanyName AS ShipperName;
    FROM Orders ;
      LEFT JOIN Customers ON Orders.CustomerID = Customers.CustomerID ;
      LEFT JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID ;
      LEFT JOIN Products ON OrderDetails.ProductID = Products.ProductID ;
      LEFT JOIN Categories ON Products.CategoryID = Categories.CategoryID ;
      LEFT JOIN Suppliers ON Products.SupplierID = Suppliers.SupplierID ;
      LEFT JOIN Shippers ON Orders.ShipVia = Shippers.ShipperID ;
      LEFT JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID ;
      LEFT JOIN EmployeeTerritories ;
           ON Employees.EmployeeID = EmployeeTerritories.EmployeeID ;
      LEFT JOIN Territories ON EmployeeTerritories.TerritoryID = Territories.TerritoryID ;
      LEFT JOIN Region ON Territories.RegionID = Region.RegionID ;
    ORDER BY Products.ProductID, Orders.OrderDate ;
    INTO CURSOR Unfolded</pre>
<p><br />В этом запросе перечислены 11 различных псевдонимов и выполняется 10 объединений; VFP 8 и более ранние версии не могли выполнять такой запрос (генерировалась ошибка 1805, «SQL — Слишком много подзапросов»). VFP 9 без проблем выполняет его. (В то время как этот пример был придуман, выборка из нормализованной базы данных может включать множество источников и объединений).</p>
<a name="_Toc164071695" id="_Toc164071695"></a>
<h2>Почти неограниченное количество параметров в IN</h2>
<p style="text-align: justify;">В более ранних версиях VFP количество перечисляемых в предложении IN параметров было ограничено 24. VFP 9 не отменяет это ограничение, но предоставляет вам контроль над ним при помощи функции SYS(3055). Даже без использования этой функции существующее ограничение значительно выше, чем в более ранних версиях языка (154 параметра).<br />Предложение IN может использоваться как фильтр, основанный на списке параметров, так и как фильтр, основанный на результате подзапроса. Внесённое изменение относится только к использованию IN со списком параметров.<br />Когда вы самостоятельно управляете запросом, ограничение, налагаемое предложением IN, вообще не является проблемой. Как правило, вы находите другое решение, позволяющее избежать большого количества параметров в предложении IN. Одно из решений состоит в том, чтобы сохранить список значений в курсор и выполнить объединение с этим курсором. Например, этот запрос:</p>
<pre class="bbcode">SELECT cFirst, cLast FROM Person ;
     WHERE UPPER(cLast) IN ("BLACK", "BROWN", "GREEN", "SILVER", "WHITE")
  мог бы быть заменен на:
  CREATE CURSOR Names (cName C(25))
  INSERT INTO Names VALUES ("BLACK")
  INSERT INTO Names VALUES ("BROWN")
  INSERT INTO Names VALUES ("GREEN")
  INSERT INTO Names VALUES ("SILVER")
  INSERT INTO Names VALUES ("WHITE")
  SELECT cFirst, cLast FROM Names JOIN Person ON UPPER(cLast) = RTRIM(cName)</pre>
<br />Однако, вы не всегда имеете возможность написать код в таком виде. В частности, другие приложения, которые обращаются к данным VFP через OLE DB, могут генерировать запросы, которые используют только предложение IN, и не предлагают никакой иной возможности.<br />Функция SYS(3055) была добавлена в VFP 6 для того, чтобы решить проблему модифицируемых представлений. Она управляла распределением пространства для оценки предложений FOR и WHERE. Значение по умолчанию - 320, и оно может увеличиваться с приращением на 8. В наших тестах, каждое увеличение значения на 8 в SYS(3055) позволяло использовать еще 4 параметра в списке для IN.<a name="_Toc164071696" id="_Toc164071696"></a>
<h2>Вложенные подзапросы</h2>
<p>Возможность использовать подзапросы (запрос внутри запроса) позволяет получить результат, используя одиночный запрос; иначе потребовалось бы множество запросов. Возможно, наиболее часто используется запрос, включающий подзапрос, для выборки всех записей из одной таблицы, которых нет в другой. Например, следующий запрос (используется  база данных TasTrade, поставляемая с VFP) получает список компаний из таблицы Customer, которые не разместили никаких заказов:</p>
<pre class="bbcode">SELECT Company_Name FROM Customer ;
     WHERE Customer_ID NOT IN (SELECT Customer_ID FROM Orders) ;
     INTO CURSOR NoSales</pre>
<br />Другое общее использование для подзапроса — соединение частей, которое затем позволяет основному запросу выбрать дополнительную информацию из составных результатов. Например, Вы можете использовать подзапрос для получения списка продуктов, последний раз приобретённых каждым покупателем, как показано в листинге 2. Подзапрос в этом примере кореллируется, что означает использование им поля из таблицы, не перечисленной непосредственно в подзапросе, а только в основном запросе. В этом примере OrdLast.Customer_ID используется в предложении WHERE подзапроса, но OrdLast — псевдоним для Orders, определенных в основном запросе.
<div><br />Листинг 2. Здесь подзапрос находит самый последний заказ каждого заказчика, и затем использует эти результаты, чтобы получить список продуктов, включенных в этот заказ.</div>
<pre class="bbcode">SELECT CustLast.Customer_ID, Product_ID FROM Order_Line_Items OLILast ;
       JOIN Orders OrdLast ON OLILast.Order_ID = OrdLast.Order_ID ;
       JOIN Customer CustLast ON OrdLast.Customer_ID = CustLast.Customer_ID ;
     WHERE OrdLast.Order_Date = (SELECT MAX(Order_Date) FROM Orders Ord ;
          WHERE OrdLast.Customer_ID = Ord.Customer_ID ) ;
     INTO CURSOR CustProducts</pre>
<p>В VFP 8 и более ранних версиях вложенные подзапросы не поддерживались. То есть в предложении WHERE подзапроса нельзя было использовать другой подзапрос. VFP 9 позволяет использовать вложенные подзапросы, увеличивая число вопросов, на которые вы можете ответить, одиночным запросом.<br />Предположим, что вы хотите выяснять то, какие продукты компания включила в первый,  но не самый последний, заказ. В то время как вы могли бы использовать курсор, созданный в листинге 2 в другом запросе, в VFP 9 вы можете выполнить всю работу целиком в одиночном запросе, показанном в листинге 3.</p>
<div><br />Листинг 3. Вложеные подзапросы позволяют вам решать большее количество проблем в одиночном запросе скорее, чем в ряде запросов.</div>
<pre class="bbcode">SELECT Customer.Company_Name, Product_ID FROM Order_Line_Items ;
    JOIN Orders ON Order_Line_Items.Order_ID = Orders.Order_ID ;
    JOIN Customer ON Orders.Customer_ID = Customer.Customer_ID ;
    WHERE Orders.Order_Date = ;
     (SELECT MIN(Order_Date) FROM Orders Ord ;
        WHERE Orders.Customer_ID=Ord.Customer_ID );
          AND Product_ID NOT IN ;
          (SELECT Product_ID FROM Order_Line_Items OLILast;
             JOIN Orders OrdLast ON OLILast.Order_ID = OrdLast.Order_ID ;
             JOIN Customer CustLast ;
                ON OrdLast.Customer_ID = CustLast.Customer_ID ;
             WHERE OrdLast.Order_Date = ;
               (SELECT MAX(Order_Date) FROM Orders Ord ;
                  WHERE OrdLast.Customer_ID = Ord.Customer_ID ) );
    INTO CURSOR FirstNotLast</pre>
<a name="_Toc164071697" id="_Toc164071697"></a>
<h3>Дополнительная гибкость подзапросов</h3>
<p style="text-align: justify;">Выше рассмотрен один способ улучшенного использования подзапросов в VFP 9. Фактически, группа VFP проделала большую работу над поддержкой подзапросов в этой версии. В VFP 8 и более ранних версиях, подзапросы могли использоваться только в предложении WHERE команды SQL, то есть только в фильтрации данных. В дополнение к отмене ограничения вложенности, VFP 9 позволяет вам использовать подзапросы в списке полей и предложении FROM запроса и в предложении SET команды SQL UPDATE. VFP 9 также позволяет использовать предложение GROUP BY в соотнесенных подзапросах (подзапросы, которые обращаются к одному или большему количеству полей из таблиц в основном запросе, подобно подзапросу в листинге 2). И, наконец, VFP 9 позволяет вам использовать в подзапросах предложение TOP в  не соотнесеных подзапросах.<br />Результат подзапроса в предложении FROM называется <em>производной таблицей</em>. Одно из использований производной таблицы — извлечение дополнительных данных, если вы применяете агрегатные функции.<br />Продолжим использовать базу данных TasTrade, которая поставляется с VFP, для рассмотрения проблемы обнаружения последнего заказа для каждого заказчика. Если все, что вы хотите получить - это ID заказчика и дата заказа, то это проще простого:<br />SELECT Customer_ID, MAX(Order_Date) FROM Orders GROUP BY 1 INTO CURSOR MostRecentOrder<br /><br />Этот запрос прост и работает в каждой версии VFP. Тем не менее, предположите, что вы хотите получить не только ID заказчика, но и  дополнительную информацию о заказе, типа названия компании, контактное лицо компании и названия грузоотправителя. До VFP 9 вы должны были использовать соотнесенный подзапрос, два запроса в последовательности, или очень безобразный подзапрос. В листинге 4 показано  решение, использующее соотнесенный подзапрос, в листинге 5 показано использование методики двух последовательных запросов, и, наконец, в листинге 6 показан безобразный подзапрос. То, что делает подзапрос в листинге 6, не что иное, как безобразие - т.е. необходимость объединить ID заказчика и самую последнюю дату заказа в одно поле для сравнения.</p>
<div><br />Листинг 4. Обнаружение агрегатированных данных - одна из причин использования соотнесенного подзапроса.</div>
<pre class="bbcode">SELECT Orders.Order_ID, Customer.Company_Name as Cust_Name, ;
         Shippers.Company_Name AS Ship_Name, Orders.Order_Date ;
    FROM Orders ;
      JOIN Customer ON Orders.Customer_ID = Customer.Customer_ID ;
      JOIN Shippers ON Orders.Shipper_ID = shippers.Shipper_ID ;
    WHERE Orders.Order_Date = ;
      (SELECT MAX(Order_Date) ;
            FROM Orders Ord WHERE Orders.Customer_ID=Ord.Customer_ID );
       ORDER BY Cust_Name ;
    INTO CURSOR MostRecentOrders</pre>
<div><br />Листинг 5. Другой способ находить данные, связанные с составным результатом, состоит в том, чтобы использовать двапоследовательных запроса. Первый запрос выполняет группировку, и затем второй запрос выполняет объединение с полученной выборкой.</div>
<pre class="bbcode">SELECT Orders.Order_ID, Customer.Company_Name as Cust_Name, ;
         Shippers.Company_Name AS Ship_Name, Orders.Order_Date ;
    FROM Orders ;
      JOIN Customer ON Orders.Customer_ID = Customer.Customer_ID ;
      JOIN Shippers ON Orders.Shipper_ID = shippers.Shipper_ID ;
    WHERE Orders.Order_Date = ;
      (SELECT MAX(Order_Date) ;
            FROM Orders Ord WHERE Orders.Customer_ID=Ord.Customer_ID );
       ORDER BY Cust_Name ;
    INTO CURSOR MostRecentOrders</pre>
<div><br />Листинг 6. Тем не менее, другой способ находить данные, связанные с составным результатом, состоит в том, чтобы использовать подзапрос в предложении WHERE. Возникающий в результате запрос должен жёстко поддерживаться из-за странного выражения, используемого, чтобы соответствовать данным результирующего подзапроса.</div>
<pre class="bbcode">SELECT Orders.Order_ID, Customer.Company_Name as Cust_Name, ;
         Shippers.Company_Name AS Ship_Name, Orders.Order_Date FROM Orders ;
      JOIN Customer ON Orders.Customer_ID = Customer.Customer_ID ;
      JOIN Shippers ON Orders.Shipper_ID = shippers.Shipper_ID ;
    WHERE Orders.Customer_ID + DTOS(Orders.Order_Date) IN ;
      (SELECT Customer_ID + DTOS(MAX(Order_Date)) FROM Orders GROUP BY Customer_ID );
    ORDER BY Cust_Name ;
    INTO CURSOR MostRecentOrders</pre>
<br />VFP 9 дает вам лучший вариант. Вы можете выполнять подзапрос на лету в правой части предложении объединения. Помещение подзапроса в предложение обьединения означает, что он не должно быть соотнесённым; в некоторых случаях это приводит к тому, что запрос выполняется быстрее. Запрос в листинге 7 использует этот подход. Здесь подзапрос перемещён в предложение JOIN, и не должен объединять ID заказчика и самую последнюю дату. Вместо этого, ON часть JOIN сравнивает два поля по отдельности, что очень похоже на решение с двумя запросами в листинге 5.
<div><br />Листинг 7. Этот запрос использует подзапрос в предложении FROM (производная таблица), чтобы решить проблему нахождения агрегатированных данных.</div>
<pre class="bbcode">SELECT Orders.Order_ID, Customer.Company_Name as Cust_Name, ;
         Shippers.Company_Name AS Ship_Name, Orders.Order_Date ;
    FROM Orders ;
      JOIN (SELECT Customer_ID, MAX(Order_Date) as Order_Date ;
          FROM Orders CheckOrderDate GROUP BY 1) RecentOrder ;
        ON Orders.Customer_ID = RecentOrder.Customer_ID ;
        AND Orders.Order_Date = RecentOrder.Order_Date ;
      JOIN Customer ON Orders.Customer_ID = Customer.Customer_ID ;
      JOIN Shippers ON Orders.Shipper_ID = shippers.Shipper_ID ;
    ORDER BY Cust_Name ;
    INTO CURSOR MostRecentOrders</pre>
<br />Имейте в виду, что подзапрос в предложении FROM не может быть коррелированным; это означает, что он не может обратиться к полям таблиц, используемых в основном запросе, а только к полям таблиц, которые он перечисляет. Происходит это потому, что все подзапросы в предложении FROM вычисляются прежде, чем выполняются обьединения, таким образом еще не ясно, какие записи находятся в результате.<a name="_Toc164071698" id="_Toc164071698"></a>
<h3>Вычисляемые поля с подзапросом</h3>
<p style="text-align: justify;">В дополнение к поддержке производных таблиц, VFP 9 позволяет вам помещать подзапросы в список полей запроса. То есть вы можете использовать подзапрос, чтобы вычислить поле, которое должно появиться в результате. Подзапрос, использующий этот способ, должен возвратить одиночное поле и не больше, чем одиночная запись. Если не имеется никаких записей в результирующем наборе для специфической записи, то значение поля устанавливается равным NULL.<br />Для чего это нужно? Почему бы не включить выражение в основной запрос и добавить любые необходимые таблицы? Как и с производными таблицами, этот подход удобен, когда используется группировка. Допустим, что вы хотите найти общее количество заказов, размещённых каждым заказчиком в конкретном году. Вместе с этим вы хотите иметь больше информации о заказчике, которая включала бы его адрес, номер телефона и факса.<br />Несомненно, для того, чтобы вычислить общее количество заказов для каждого заказчика, вы должны группировать данные из Order_Line_Items по заказчикам. Вы можете извлекать множественные поля из таблицы Customer обычным способом, указывая их в предложении GROUP BY. (До VFP 8, вы могли указывать в запросе дополнительные поля, даже не перечисляя их в предложении GROUP BY. В VFP 8, Вы можете сделать то же самое,  выдав команду SET ENGINEBEHAVIOR 70) В листинге 8 показан запрос, который отыскивает id заказчика, название компании, адрес, телефон и факс наряду с общим значением количества заказов каждого заказчика.</p>
<div><br />Листинг 8. В запрос, группирующий поле или поля дочерней таблицы, вы можете добавлять поля из родительской таблицы, перечисляя их в предложении GROUP BY. Не забудьте определить значение nYear перед выполнением этого запроса.</div>
<pre class="bbcode">SELECT Customer.Customer_ID, Customer.Company_Name, ;
         Customer.Address, Customer.City, Customer.Region, ;
         Customer.Postal_Code, Customer.Phone, Customer.Fax, ;
         SUM(quantity*unit_price) AS yTotal ;
  FROM Customer ;
    LEFT JOIN Orders ;
      JOIN Order_Line_Items;
        ON Orders.Order_ID = Order_Line_Items.Order_ID ;
      ON Customer.Customer_ID = Orders.Customer_ID ;
      AND BETWEEN(Order_Date,DATE(m.nYear,1,1),DATE(m.nYear,12,31)) ;
    GROUP BY 1, 2, 3, 4, 5, 6, 7, 8;
  INTO CURSOR CustomerTotal</pre>
<br />Однако, добавление такого множества полей в предложение GROUP BY замедляет запрос. Другой вариант, который может использоваться в этой ситуации, должен удалить поля из предложения GROUP BY и перенести их в агрегатные функции  MAX() или MIN(). Как и в случае с группировкой, так как эти поля - те же самые для всех записей в группе, использование MAX() или MIN() не изменяет результат. Эта версия, показанный в листинге 9, является несколько более быстрой, чем перечисление всех полей в предложении GROUP BY.
<div><br />Листинг 9. Второй вариант выборки родительских данных в сгруппированном запросе должен перенести все дополнительные поля в агрегатные функции MIN() или MAX(). Как обычно, не забудьте определить значение nYear перед выполнением этого запроса.</div>
<pre class="bbcode">SELECT Customer.Customer_ID, MAX(Customer.Company_Name), ;
         MAX(Customer.Address), MAX(Customer.City), MAX(Customer.Region), ;
         MAX(Customer.Postal_Code), MAX(Customer.Phone), MAX(Customer.Fax), ;
         SUM(quantity*unit_price) AS yTotal ;
  FROM Customer ;
    LEFT JOIN Orders JOIN Order_Line_Items ON Orders.Order_ID = Order_Line_Items.Order_ID ;
      ON Customer.Customer_ID = Orders.Customer_ID ;
      AND BETWEEN(Order_Date,DATE(m.nYear,1,1),DATE(m.nYear,12,31)) ;
    GROUP BY 1;
    INTO CURSOR CustomerTotal</pre>
<br />Однако, способность использовать подзапрос в списке поля обеспечивает гораздо более простое и более эффективное решение для этой проблемы. Вы можете вычислять общее количество заказов в подзапросе, позволяя основному запросу, обращаться только к родительской таблице. Вы не только устраняете дополнительные поля в GROUP BY и дополнительные обращения к агрегатным функциям, но вы можете также не использовать внешнее обьединение. Такой запрос показан в листинге 10.
<div><br />Листинг 10. Использование подзапроса в списке полей упрощает проблему выборки дополнительных полей из родительской таблицы, когда объединение данных основано на дочерней таблице. Убедитесь, что присвоили nYear значение перед выполнением этого запроса.</div>
<pre class="bbcode">SELECT Customer.Customer_ID, Customer.Company_Name, ;
         Customer.Address, Customer.City, Customer.Region, ;
         Customer.Postal_Code, Customer.Phone, Customer.Fax, ;
         (SELECT SUM(quantity * unit_price) ;
            FROM Orders ;
              JOIN Order_Line_Items;
                ON Orders.Order_ID = Order_Line_Items.Order_ID ;
            WHERE BETWEEN(Order_Date,DATE(m.nYear,1,1),DATE(m.nYear,12,31)) ;
              AND Customer.Customer_ID=Orders.Customer_ID ) as yTotal ;
    FROM Customer ;
    INTO CURSOR CustomerTotal</pre>
В наших тестах, используя показанные запросы, подзапрос в последнем варианте (листинг 10) выполнился приблизительно на 12% быстрее, чем в варианте с обращениями к MAX() (листинг 9), который, в свою очередь, выполнился приблизительно на 12% быстрее, чем запрос с перечислением всех родительских полей в предложении GROUP BY (листинг 8).<a name="_Toc164071699" id="_Toc164071699"></a>
<h3>Вычисленние значения замены в UPDATE</h3>
<p>Третье новое место, где вы можете использовать подзапросы — это предложение SET команды UPDATE. То есть вы можете использовать подзапрос, чтобы вычислить значение, в которое должно быть установлено поле. Однако, когда Вы используете такой подход, команда UPDATE не может включать подзапрос в предложение WHERE. Кроме того, вы ограничены одиночным подзапросом в предложении SET, так что вы не можете использовать этот подход, чтобы вычислить значения множественных полей.<br />Для примера предположите, что вы имеете данные по складу (SalesByProduct) для базы данных TasTrade, которые сообщают вам, сколько и какие продукты были проданы и количество этого сбыта в  долларах. Это разработано, чтобы хранить данные в течение одиночного месяца, и Вы хотите изменить их в конце месяца.<br />Чтобы модифицировать данные, используйте следующие команды UPDATE. Установите nMonth и nYear к значениям месяца и года для данных, которые вы собрали перед выполнением кода из листинга 11. (“Соотнесенные изменения”, рассматривающиеся позже в этой главе, обеспечивают лучшее решение для этой проблемы).</p>
<div><br />Листинг 11. Вы можете использовать подзапрос в предлжении SET команды UPDATE SQL, чтобы вычислить новые значения поля на лету.</div>
<pre class="bbcode">UPDATE SalesByProduct SET TotalSales = ;
      (SELECT NVL(SUM(quantity * unit_price), $0) ;
        FROM Order_Line_Items ;
          JOIN Orders ON Order_Line_Items.Order_ID = Orders.Order_ID ;
        WHERE MONTH(Order_Date) = nMonth AND YEAR(Order_Date) = nYear ;
          AND Order_Line_Items.Product_ID = SalesByProduct.Product_ID)

  UPDATE SalesByProduct SET UnitsSold = ;
      (SELECT CAST(NVL(SUM(quantity),0) AS N(12)) ;
        FROM Order_Line_Items ;
          JOIN Orders ON Order_Line_Items.Order_ID = Orders.Order_ID ;
        WHERE MONTH(Order_Date) = nMonth AND YEAR(Order_Date) = nYear ;
          AND Order_Line_Items.Product_ID = SalesByProduct.Product_ID)</pre>
<br />Во втором примере UPDATE используется новая функция CAST(), которая позволяет вам изменять типы данных на лету.<a name="_Toc164071700" id="_Toc164071700"></a>
<h3>Соотнесенные подзапросы и группировка</h3>
<p>Соотнесенный подзапрос - это запрос, который обращается к одному или большему количеству полей основного запроса, обычно в предложении WHERE подзапроса. VFP 8 запрещает использование предложения GROUP BY в соотнесенных подзапросах. Поскольку корреляция во многих случаях может давать тот же самый эффект, как группировка (см. например листинг 4), вы, возможно, столкнулись с этим ограничением.<br />Но имеется ряд ситуаций, где способность использовать GROUP BY в соотнесенном подзапросе позволяет гораздо проще получить желательные результаты. К счастью, VFP 9 разрешает группировки в соотнесенном подзапросе.<br />Например, рассмотрим случай, когда вы хотите получить список заказчиков, которые разместили в итоге по крайней мере один на один заказ больше, чем указанное значение, и имелись такие заказы, отправленные не в их адрес. (Вы могли бы проверять здесь подозрительные транзакции.) В VFP 8 и более ранних версиях для извлечения этой информации потребовалось бы выполнить два запроса: первый собирал бы информацию относительно заказов с определенной суммой, в то время как второй сравнивал бы адреса отправки с адресами заказчиков и извлекал информацию о заказчиках. Листинг 12 показывает один из способов сделать это, с пороговым набором значений суммы от $4000.</p>
<div><br />Листинг 12. В VFP 8 и более ранних версиях требовалось два запроса для получения списока больших заказов, отправленных куда-то, но не в штаб-квартиру компании, наряду с информацией о заказчике.</div>
<pre class="bbcode">SELECT Orders.Customer_ID, Orders.Ship_to_Address, Orders.Order_ID, Orders.Order_Date ;
    FROM Orders JOIN Order_line_items ON Orders.Order_ID=Order_Line_Items.Order_ID ;
    GROUP BY 1, 2, 3, 4 HAVING SUM(Quantity * Unit_Price)&gt; 4000 ;
    INTO CURSOR BigOrders

  SELECT Company_Name, Order_ID, Order_Date FROM Customer ;
      JOIN BigOrders ON Customer.Customer_ID = BigOrders.Customer_ID ;
    WHERE BigOrders.Ship_to_Address &lt;&gt; Customer.Address INTO CURSOR Suspicions</pre>
<br />В VFP 9 способность группировки в соотнесенных подзапросах означает, что вы можете получить такой же результат в одном, более читаемом запросе. В листинге 13 показан вариант с одним запросом.
<div><br />Листинг 13. Использование GROUP BY в соотнесенном подзапросе в VFP делает возможным найти заказчиков с подозрительными заказами в одиночном запросе.</div>
<pre class="bbcode">SELECT Company_Name, Ord.Order_ID, Ord.Order_Date FROM Customer ;
     JOIN Orders Ord ON Customer.Customer_ID = Ord.Customer_ID ;
    WHERE Ord.Order_ID in ;
      (SELECT Orders.Order_ID FROM Orders ;
        JOIN Order_Line_Items ON Orders.Order_ID=Order_Line_Items.Order_ID ;
          AND Orders.Customer_ID=Customer.Customer_ID ;
          AND Orders.Ship_to_Address &lt;&gt; Customer.Address ;
      GROUP BY Orders.Order_ID ;
      HAVING SUM(Quantity * Unit_Price)&gt; 4000) ;
    INTO CURSOR Suspicions</pre>
<br />Как и в ряде других случаев, когда одиночный запрос заменяет два запроса, вариант, показанный в листинге 13, работает  быстрее, чем вариант в листинге 12.<a name="_Toc164071701" id="_Toc164071701"></a>
<h3>Использование предложения TOP N в подзапросах</h3>
<p>Предложение TOP N в SELECT возвращает в результирующем наборе только первые N записей (или первые N% записей). В то время как функции MIN() и MAX() позволяют вам выбирать одно самое маленькое или самое большое значение в данном поле, TOP N позволяет вам выбирать множественные значения. Вы можете использовать его, чтобы видеть вещи подобно 10 самым последним заказам или 30 наиболее дорогим изделиям. Например, следующий запрос возвратит в результате 10% изделий с наименьшей общей стоимостью.</p>
<pre class="bbcode">SELECT TOP 10 PERCENT Product_ID, SUM(Quantity) AS nSales FROM Order_Line_Items ;
   GROUP BY Product_ID ORDER BY nSales INTO CURSOR LowSales</pre>
<br />В VFP 8 и более ранних версиях вы не могли использовать предложение TOP N в подзапросах. VFP 9 разрешает использование TOP N в подзапросах, если подзапрос не соотнесен. Когда вы используете TOP N в подзапросе, вы должны обязательно включить в этот подзапрос предложение ORDER BY.<br />Представьте себе, что вы рассматриваете вопрос прекращения поставок изделий, извлеченных предыдущим запросом  (наиболее плохо продающиеся изделия). Возможно, вы захотите установить контакт с теми заказчиками, которые приобрели эти изделия, чтобы удостовериться, что это не создало для них проблемы. Запрос в листинге 14 использует предыдущий запрос как подзапрос для создания такого списка заказчиков.
<div><br />Листинг 14. Здесь подзапрос находит самые плохо продаваемые 10% изделий. Основной запрос использует эту информацию для получения списка заказчиков, купивших эти изделия.</div>
<pre class="bbcode">SELECT DISTINCT Company_Name, English_Name FROM Customer ;
     JOIN Orders ON Customer.Customer_ID = Orders.Customer_ID ;
     JOIN Order_Line_Items ON Orders.Order_ID = Order_Line_Items.Order_ID ;
     JOIN (SELECT TOP 10 PERCENT Product_ID, SUM(Quantity) AS nSales FROM Order_Line_Items ;
              GROUP BY Product_ID ORDER BY nSales ) AS LowSales ;
        ON Order_Line_Items.Product_ID = LowSales.Product_ID ;
     JOIN Products ON LowSales.Product_ID = Products.Product_ID ;
     ORDER BY English_Name, Company_Name INTO CURSOR BoughtLowSellers</pre>
<a name="_Toc164071702" id="_Toc164071702"></a>
<h2>Соотнесенные модификации</h2>
<p>В дополнение к поддержке подзапросов в предложении SET, команда UPDATE SQL в VFP 9 имеет новое предложение FROM, которое позволяет Вам получать данные модификации из другой таблицы. Это позволяет вам использовать соотнесенные модификации.<br />Пример в листинге 11 имеет один серьезный недостаток. Вы должны использовать отдельную команду UPDATE для каждого поля, которое вы хотите изменить. При использовании предложения FROM вы можете получить тот же самый результат с запросом, сопровождаемым командой UPDATE. Код в листинге 15 вычисляет новые значения, сохраняет их в курсоре, и затем ссылается на этот курсор в команде UPDATE.</p>
<div><br />Листинг 15. Новое предложение FROM в UPDATE SQL позволяет вам получать значения для замены из другой таблицы.</div>
<pre class="bbcode">SELECT Order_Line_Items.Product_ID, ;
         SUM(Quantity*Order_Line_Items.Unit_Price) as TotalSales, ;
         SUM(Quantity) AS UnitsSold ;
    FROM Order_Line_Items ;
      JOIN Orders ON Order_Line_Items.Order_ID = Orders.Order_ID ;
        AND MONTH(Order_Date) = nMonth AND YEAR(Order_Date) = nYear ;
    GROUP BY 1 ;
    INTO CURSOR MonthlySales

  UPDATE SalesByProduct ;
    SET SalesByProduct.TotalSales = NVL(MonthlySales.TotalSales, $0), ;
        SalesByProduct.UnitsSold = NVL(MonthlySales.UnitsSold, 0) ;
    FROM SalesByProduct ;
      LEFT JOIN MonthlySales ;
        ON SalesByProduct.Product_ID = MonthlySales.Product_ID</pre>
<br />Наряду с определением того, что значения берутся из другой таблицы, вы можете фактически выполнять объединения в предложении FROM, чтобы получить список значений. В листинге 15 внешнее обьединение гарантирует, что записи для изделий, не проданных в указанном месяце, установлены в 0.<br />Фактически, предложение FROM в UPDATE поддерживает подзапросы (производные таблицы), так что вы можете выполнить всю эту операцию в одиночной команде UPDATE, как показано в листинге 16.
<div><br />Листинг 16. Вместо того, чтобы выполнять запрос до того, как получены результаты, вы можете использовать полученную таблицу в предложении FROM команды UPDATE.</div>
<pre class="bbcode">UPDATE SalesByProduct ;
    SET SalesByProduct.TotalSales = NVL(MonthlySales.TotalSales, $0), ;
        SalesByProduct.UnitsSold = NVL(MonthlySales.UnitsSold, 0) ;
    FROM SalesByProduct ;
      LEFT JOIN (;
        SELECT Order_Line_Items.Product_ID, ;
               SUM(Quantity*Order_Line_Items.Unit_Price) as TotalSales, ;
               SUM(Quantity) AS UnitsSold ;
          FROM Order_Line_Items ;
            JOIN Orders ;
              ON Order_Line_Items.Order_ID = Orders.Order_ID ;
              AND (MONTH(Order_Date) = nMonth AND YEAR(Order_Date) = nYear) ;
          GROUP BY 1) AS MonthlySales ;
        ON SalesByProduct.Product_ID = MonthlySales.Product_ID</pre>
<a name="_Toc164071703" id="_Toc164071703"></a>
<h2>Соотнесённое удаление</h2>
<p>В VFP 8 и в более раних версиях, команда DELETE SQL позволяла вам указывать только одну таблицу. В то время как вы могли использовать подзапросы в предложении WHERE, удаление записей, основанных на информации из других таблиц, было сложным. VFP 9 позволяет Вам перечислять множественные таблицы в предложении DELETE's FROM, соединяя их согласно обычным правилам. Это обеспечивает намного более качественный способ выполнить соотнесенное удаление, удаляя строки из одной таблицы, основанной на данных из одной или большего количества других таблиц.<br />В синтаксисе для соотнесенного DELETE существует небольшая путаница. Если предложение FROM в DELETE содержит больше чем одну таблицу, вы должны определить целевую таблицу для удаления записей между DELETE и FROM:</p>
<p>DELETE [Адресат] FROM Table1 [JOIN Table2 …]<br /><br />Используйте локальный псевдоним целевой таблицы между DELETE и FROM. Это может быть имя таблицы, но если вы назначаете локальный псевдоним к таблице в предложении FROM, используйте его вместо имени. (Обратите внимание, что те же самые правила относятся к UPDATE, когда модифицируемая таблица также включена в предложение FROM, как в листинге 16.)<br />База данныхTasTrade не содержит в себе примеров удаления такого типа; она разработана с учётом того, что записи отмечены неактивными скорее чем удаленными. Тем не менее, предположите, что вы имеете таблицы Products (Продукты) и Suppliers (Поставщики), подобные таким же таблицам в TasTrade, с первичным ключом Supplier, используемым как внешний ключ в Products. Предположите, что имеется проблема при получении изделий из Австралии, и вы решаете убрать из вашего списка изделий все изделия, которые приходят от поставщиков из Австралии. Чтобы выполнять такое удаление в VFP 8, вы используете подзапрос, подобный показанному в листинге 17. В VFP 9 вы можете вместо этого использовать условие JOIN. листинге 18 показана команда DELETE, удаляющая эти изделия из таблицы Products.</p>
<div><br />Листинг 17. В VFP 8 и более ранних версиях использовался такой способ удаления записей из таблицы, основанной на данных,  полученных в другом подзапросе.</div>
<pre class="bbcode">DELETE FROM Products ;
            WHERE Supplier_ID IN ( ;
                    SELECT Supplier_ID ;
                    FROM Supplier ;
                          WHERE UPPER(Supplier.Country) = "AUSTRALIA" )</pre>
<div><br />Листинг 18. Команда DELETE теперь поддерживает множественные таблицы в предложении FROM. Условия обьединения определяют, какие записи должны быть удалены.</div>
<pre class="bbcode">DELETE Products FROM Products ;
       JOIN Supplier ON Products.Supplier_ID = Supplier.Supplier_ID ;
       WHERE UPPER(Supplier.Country) = "AUSTRALIA"</pre>
<a name="_Toc164071704" id="_Toc164071704"></a>
<h2>Дальнейшее усовершенствование UNION</h2>
<p>Предложение UNION в SELECT позволяет Вам объединять результаты нескольких запросов в одиночный набор результатов. В VFP 8, правила для UNION были ослаблены, делая более легким использование этого предложения. VFP 9 предлагает еще два усовершенствования в UNION и одно ограничение.</p>
<a name="_Toc164071705" id="_Toc164071705"></a>
<h3>Использование имён в UNION</h3>
<p>В более ранних версиях VFP, когда Вы использовали  предложение UNION для объединения множества запросов в одиночный результат, предложение ORDER BY могло перечислять только позиции полей из списка полей. Вы не могли обратиться к полям по их именам, даже если поле имело одно и то же имя в каждом запросе в UNION. Это делало такие запросы трудно читаемыми и трудно поддерживаемыми, потому список в ORDER BY должен быть откорректирован, если появлялись изменения в порядке указания полей.<br />В VFP 9 вы можете использовать имена полей в предложении ORDER BY объединяющего запроса. Имена поля, которые вы используете - те же, что и в результирующем наборе. Нужно иметь ввиду, что, когда имена соответствующих полей в UNION различны, в результирующем наборе будет использоваться имя поля из последнего запроса в UNION. Лучшим подходом, чем зависимость от порядка запросов, было бы использование предложения AS, чтобы гарантировать, что соответствующие поля имеют то же самое имя в каждом запросе в UNION.<br />В листинге 19 показан простой пример, реализующий эту возможность. Даже в этом простом запросе использование имён полей значительно увеличивает читабельность.</p>
<div><br />Листинг 19. Имена полей в ORDER BY — VFP 9 позволяет вам использовать имена полей из результирующего набора в предложении ORDER BY объединяемых в UNION запросов.</div>
<pre class="bbcode">SELECT Company_Name, Address, City, Region, Postal_Code, Country FROM Customer ;
UNION ;
SELECT Company_Name, Address, City, Region, Postal_Code, Country FROM Supplier ;
ORDER BY Country, City ;
INTO CURSOR AllCompanies</pre>
<a name="_Toc164071706" id="_Toc164071706"></a>
<h3>Вставка данных из объединённых запросов</h3>
<p>VFP 8 представил возможность заполнять таблицу или курсор непосредственно из результата запроса, используя синтаксис INSERT INTO … SELECT. Это сделало возможным получать результаты и добавлять их за один шаг.<br />VFP 9 добавляет дополнительную возможность в этот синтаксис: используемый запрос может включать предложение UNION. Это означает, что Вы можете консолидировать данные и добавлять их в таблицу или курсор за один шаг.<br />Например, предположите, что вы имеете данные по складу для TasTrade, содержащие ежегодную продажу каждым служащим товаров, а так же годовой итог по каждому служащему. (Обратите внимание, что это - другие данные со склада, чем те, которые описаны в разделе "Вычисленние значения замены в UPDATE" ранее в этой главе.)<br />Вы можете вычислять продажи каждого товара каждым служащим за указанный год в одном запросе; точно так же вы можете вычислять в одном запросе общие количества продаж для каждого служащего в течение года. Однако, сбор специфических и общих данных для товара требует использования или двух запросов или запроса, включающего UNION. Если Вы хотите добавлять годовое состояние данных по складу, вы можете делать это в INSERT, как показано в листинге 20.</p>
<div><br />Листинг 20. VFP 8 добавил возможность использования в INSERT непосредственно результата запроса; VFP 9 расширяет эту возможность, позволяя использовать объединение запросов. Убедитесь, что присвоили значение к переменной nYear перед выполнением этого примера.</div>
<pre class="bbcode">INSERT INTO Warehouse ;
  SELECT CrossProd.Product_ID, ;
         CrossProd.Employee_ID, ;
         m.nYear as nYear, ;
         NVL(nUnitsSold, 0), ;
         NVL(nTotalSales, $0);
     FROM (SELECT Employee.Employee_ID, Products.Product_ID ;
        FROM Employee, Products) AS CrossProd ;
       LEFT JOIN ( ;
        SELECT Product_ID, Employee_ID, ;
               SUM(Quantity) AS nUnitsSold, ;
               SUM(Quantity * Unit_Price) AS nTotalSales ;
           FROM Orders ;
             JOIN Order_Line_Items ON Orders.Order_ID = ;
               Order_Line_Items.Order_ID ;
           WHERE YEAR(Order_Date) = m.nYear ;
           GROUP BY Product_ID, Employee_ID ) ;
           AS AnnualSales ;
        ON CrossProd.Employee_ID = AnnualSales.Employee_ID ;
        AND CrossProd.Product_ID = AnnualSales.Product_ID ;
  UNION ;
  SELECT "Total" AS Product_ID, Employee.Employee_ID, ;
         m.nYear AS nYear, ;
         CAST(NVL(SUM(Quantity),0) as N(12)) ;
           AS nUnitsSold, ;
         NVL(SUM(Quantity * Unit_Price), $0) ;
           AS nTotalSales ;
     FROM Orders ;
      JOIN Order_Line_Items ;
         ON Orders.Order_ID = Order_Line_Items.Order_ID ;
        AND YEAR(Order_Date) = m.nYear ;
       RIGHT JOIN Employee ;
         ON Orders.Employee_ID = Employee.Employee_ID ;
     GROUP BY Employee.Employee_ID ;
  ORDER BY 2, 1</pre>
<a name="_Toc164071707" id="_Toc164071707"></a>
<h3>Использование круглых скобки в UNION теперь не разрешается</h3>
<p>Хотя это действительно не было синтаксически правильно, более ранние версии VFP не создавали объект, если запросы в UNION были включены в круглые скобки. В VFP 9 одиночный запрос в UNION может быть окружен круглыми скобками, но круглые скобки, помещённые вокруг множественных запросов в UNION, генерируют новую ошибку с номером 2196.<br />Листинг 21 демонстрирует запрос, который работает в VFP 8, но терпит неудачу в VFP 9 из-за этого нового правила.</p>
<div><br />Листинг 21. Размещение круглых скобок вокруг множественных запросов в UNION приводит к возникновению ошибки.</div>
<p>SELECT Company_Name, Address, City, Region, Postal_Code, Country FROM Customer ;<br />UNION ;<br />(SELECT Company_Name, Address, City, Region, Postal_Code, Country FROM Supplier ;<br /> UNION ;<br /> SELECT Company_Name, "", "", "", "", "" FROM Shippers)<br /><br />Согласно рекомендации группы Fox team, использование круглых скобок для выделения множественных объединений может привести к неправильным результатам.</p>
<a name="_Toc164071708" id="_Toc164071708"></a>
<h2>Комбинирование DISTINCT и ORDER BY</h2>
<p>VFP позволяет Вам упорядочивать результаты запроса по любому полю из исходных таблиц; поля, указанные в списке ORDER BY, могут отсутствовать в списке полей запроса. В VFP 9 это больше не работает для запросов, которые используют SELECT DISTINCT. Например, следующий запрос выполняется в VFP 8, но приводит к ошибке 1808 (“SQL: предложение ORDER BY недопустимо”) в VFP 9:<br />SELECT Distinct Customer_ID    FROM Orders ORDER BY Order_Date<br /><br />На это поведение воздействует установка SET ENGINEBEHAVIOR. (См. “Отключение нового поведения” позже в этой главе).</p>
<a name="_Toc164071709" id="_Toc164071709"></a>
<h2>Изменения в оптимизации</h2>
<p>VFP 9 содержит несколько изменений, улучшающих эффективность ваших запросов, а также новую функцию, которая делает  тестирование оптимизации проще.</p>
<a name="_Toc164071710" id="_Toc164071710"></a>
<h3>Полностью оптимизирован оператор LIKE с “%”</h3>
<p>Оператор LIKE позволяет вам сравнивать строки. Если условие в команде SQL включает cField LIKE cString, указанное поле сравнивается с указанной символьной строкой на базе символ - символ. В отличие от оператора "=", если cString короче, чем cField, то они не соответствуют условию, если не используется группирующий символ. Оператор LIKE поддерживает два группирующих символа: “_”, чтобы представить одиночный неизвестный символ, и “%”, чтобы представить 0 или большее количество неизвестных символов. Например, вы можете найти всех заказчиков в TasTrade, чьи имена начинаются с символа “P”, используя следующий запрос:<br />SELECT Customer_ID, Company_Name FROM Customer ;<br />  WHERE UPPER(Company_Name) LIKE "P%" ;<br />  INTO CURSOR PCompanies<br /><br />Более ранние версии VFP не могли полностью оптимизировать этот запрос. Выражение LIKE “string%” могло быть только частично оптимизировано. VFP 9 полностью оптимизирует такие выражения. (Полная оптимизация применяется только, когда групповой символ % расположен в конце символьной строки.)<br />Наши тесты показали смешанные результаты относительно эффекта этой оптимизации. Для многих запросов, версии с использованием LIKE и "=" выполнялись одинаково быстро и в VFP 8, и в VFP 9. Однако в ситуации, возникающей, когда VFP берет сокращение и просто фильтрует первоначальную таблицу, оптимизация LIKE сделанного над значительным различием. VFP берет это сокращение с любым запросом, который включает одиночную таблицу, не имеет никаких расчетных полей и - полностью оптимизирует. Фильтрация исходной таблицы прежде чем создание фактического файла на диске экономит значительное время. Оптимизация LIKE означает, что движок  VFP может принимать этот подход с некоторыми дополнительными запросами. (Вы можете выключить это сокращение включением предложения NOFILTER в запросе.)</p>
<a name="_Toc164071711" id="_Toc164071711"></a>
<h3>Улучшение быстродействия для TOP N</h3>
<p>Когда вы используете предложение TOP N или TOP N PERCENT, чтобы возвратить только подмножество записей, которые так или иначе соответствуют условиям запроса, VFP должен выяснить, какие записи имеются наверху списка. Когда вы определяете TOP N для большого набора, тот процесс может потребовать значительного времи. VFP 9 улучшает эффективность в этой ситуации.<br />В наших тестах мы не замечали различий, пока мы работали с не очень большой таблицей. При выборе TOP 20 из таблицы c почти 75,000 записей различия практически отсутствовали. Но когда мы сделали TOP 20 для таблицы, содержащей более чем миллион записей, то VFP 9 закончил выборку приблизительно в три раза быстрее, чем VFP 8.<br />Помимо уменьшения времени выборки с TOP N, немного изменилось и поведение запросов с TOP N. В более ранних версиях VFP запрос с предложением TOP N мог возвращать больше чем N записей из-за связей в данных. VFP 9 никогда не возвращает больше, чем точное число записей, определенных в предложении TOP N. (См. “Отключение нового поведения” позже в этой главе для обзора исключений из этого правила.) Когда имеются связи, оказывается, что VFP выбирает записи в физическом порядке из группы с тем же самым значением.<br />Эти изменения относятся к тем, на которые воздействует новая установка SET ENGINEBEHAVIOR TO 90.  Для подробной информации см. “Отключение нового поведения” позже в этой главе.</p>
<a name="_Toc164071712" id="_Toc164071712"></a>
<h3>Улучшение эффективности с OR</h3>
<p>В более ранних версиях, когда запрос использовал оператор OR для объединения условий, включающих различные таблицы, результат не мог быть всегда оптимизирован. Изменения в движке SQL для VFP 9 позволяют оптимизировать такие условия, если индивидуальные условия - оптимизируемы.<br />В нашем тестировании не каждый запрос, использующий OR с условиями, основанными на различных таблицах, показал улучшенное быстродействие, но в некоторых случаях мы смогли заметить различие. Например, следующий запрос (используется база данных Northwind) в VFP 9 выполнился почти четыре раза быстрее:<br />SELECT Orders.OrderId, ProductId FROM Orders ;<br />     JOIN OrderDetails ON Orders.OrderId=OrderDetails.OrderId  ;<br /> WHERE ;<br />   (Orders.OrderDate=DATE(1997,9,1) AND OrderDetails.Quantity&gt;2);<br />    OR ;<br />   (Orders.OrderDate=DATE(1997,9,2) AND OrderDetails.Quantity&gt;3);<br /> INTO CURSOR Result<br /><br />Вы можете также заметить некоторые усовершенствования в использовании OR в подзапросах.</p>
<a name="_Toc164071713" id="_Toc164071713"></a>
<h3>Фильтрация и временные индексы</h3>
<p>Когда вы объединяете в запросе две таблицы, VFP выбирает индексный тэг, подходящий для соответствующей записи. Если рассматриваемые поля не индексированы, или существующий тэг не способен сильно помочь (например, когда обьединение включает маленькую таблицу и намного большую таблицу, и имеется только тэг для меньшей таблицы), VFP создает индекс на лету. При вызове функции SYS(3054) это обьединение показывается как “использующее временный индекс” (“using temp index”).<br />VFP 9 ускоряет выполнение запросов, которые формируют временный индекс и имеют не оптимизируемый фильтр для этой  таблицы (той, для которой индекс сформирован). Эффект проявляется наиболее сильно для больших таблиц и в случаях, где не оптимизированный фильтр маскирует много записей. Мы предполагаем, что двигатель делает фильтрацию перед формированием временного индекса, что ускоряет и формирование временного индекса и использование существующего.<br />В наших тестах ни одна из типовых таблиц, которые приходят с VFP, не была достаточно большой, чтобы наблюдать этот эффект. Мы смогли продемонстрировать это усовершенствование, используя таблицу с приблизительно 75,000 записей. Наш тестовый запрос соединил таблицу саму с собой на неиндексированном поле, используя условие фильтра, которое выбрало только приблизительно 250 записей. В VFP 9 запрос потребовал две секунды. В VFP 8 тот же самый запрос выполнялся почти 50 секунд.</p>
<a name="_Toc164071714" id="_Toc164071714"></a>
<h3>Ускорение соотнесений (корелляции)</h3>
<p>Вы можете никогда не столкнуться с другой областью, где эффективность была так улучшена. Если вы имеете запрос с соотнесенным подзапросом, и запрос также включает фильтр в таблице от основного запроса, которая используется в подзапросе, VFP 9 выполняет измерения лучше, чем VFP 8.<br />Мы создали следующий запрос, используя данные из TasTrade, и обнаружили, что VFP 9 отработал приблизительно в четыре раза быстрее:<br />SELECT Orders.Order_ID, Customer.Company_Name as Cust_Name, ;<br />       Shippers.Company_Name AS Ship_Name, Orders.Order_Date ;<br />  FROM Orders ;<br />    JOIN Customer ;<br />      ON Orders.Customer_ID = Customer.Customer_ID ;<br />    JOIN Shippers ;<br />      ON Orders.Shipper_ID = shippers.Shipper_ID ;<br />  WHERE Orders.Discount&gt;0 AND ;<br />    Orders.Order_Date = (SELECT MAX(Order_Date) ;<br />       FROM Orders Ord ;<br />       WHERE Orders.Customer_ID=Ord.Customer_ID );<br />  ORDER BY Cust_Name ;<br />  INTO CURSOR MostRecentOrders</p>
<a name="_Toc164071715" id="_Toc164071715"></a>
<h3>Регистрация результатов оптимизации</h3>
<p>Функция SYS(3054) появилась в VFP 5. Она предоставляла вам информацию относительно того, как FoxPro оптимизирует запрос. Она несколько раз улучшалась и теперь предоставляет множество данных относительно процесса оптимизации. Однако, нужно все еще интенсивно использовать SYS(3054), чтобы собрать информацию относительно эффективности запроса для всей программы или приложения.<br />Вызовите SYS(3092). Эта новая функция позволяет вам направлять вывод от функции SYS(3054) в регистрационный файл. Само собой, функция SYS(3054) может посылать вывод только активному окну или переменной. С SYS(3092) вы можете собирать данные относительно целого ряда запросов и исследовать их в свободное время.<br />Синтаксис:<br />CLogFile = SYS(3092 [, cFileName [, lAdditive]])<br /><br />Параметр <em>cFileName</em> определяет имя (включая путь) регистрационного файла. Используйте <em>lAdditive</em>, чтобы определить, нужно ли записывать информацию поверх существующей. Значение по умолчанию перезавписывает существующий файл.<br />Выключить регистрацию и сделать файл регистрации доступный для чтения можно, передав пустую строку в качестве параметра <em>cFileName</em>.<br />Функция возвращает имя активного регистрационного файла. Обратите внимание, что новый регистрационный файл создаётся прежде, чем какое-либо значение возвращено, поэтому для сохранения старого регистрационного файла перед его изменением вы должны вызвать функцию один раз без параметров, и затем вызывите её снова.<br />Когда Вы включаете регистрацию функцией SYS(3092), вывод из SYS(3054) все еще отображается на экране, в активном окне или сохраняется в указанной переменной.<br />Как только вы указываете регистрационный файл в SYS(3092), используйте SYS(3054) по мере того, как вы хотите, и выполните запросы, которые вы хотите проверить. Когда проверки выполнены, сбросьте SYS(3054), и затем выдайте SYS(3092, " ") чтобы прекратить регистрацию. Вы можете затем исследовать регистрационный файл, чтобы просмотреть ваши результаты оптимизации.<br />Информация в регистрационном файле наиболее полезна, если вы передаете значение 2 или 12 как второй параметр для SYS(3054). Добавленная в VFP 7, эта установка включают запрос непосредственно в вывод перед сообщением относительно оптимизации.</p>
<a name="_Toc164071716" id="_Toc164071716"></a>
<h2>Выборка из буферизированных таблиц</h2>
<p>Ещё со времён VFP 3 разработчики FoxPro были расстроены поведением SELECT по отношению к буферизированным курсорам. Когда в запросе  используется буферизированная таблица, VFP фактическую использует таблицу на диске, а не открытую буферизированную версию. Это означает, что результаты запроса не отражают несохранённые изменения данных.<br />Это поведение естественным образом следует из нормального поведения запросов. Независимо от того, открыта таблица или нет, когда она указана в предложении FROM запроса, VFP открывает её заново в новой рабочей области. В некоторых случаях было бы действительно удобно иметь возможность переместить данные из буферизированной таблицы в запрос. В VFP 8 и более ранних версиях вместо этого вы должны были обращаться к командам Xbase (типа  CALCULATE).<br />VFP 9 предоставляет вам опцию просмотра буферизированных данных. Добавьте новое предложение WITH (Buffering=.T.) к запросу, и он использует доступный буфер вместо таблицы, сохранённой на диске. В листинге 22 показан запрос, который подсчитывает количество заказчиков в каждой стране, используя буферизированные данные.</p>
<div><br />Листинг 22. Вы можете делать выборку из буферизированных данных, используюя новое предложение WITH (Buffering=.T.)</div>
<p>SELECT Country, CNT(*) FROM Customer WITH (Buffering = .T.) ;<br />   GROUP BY Country INTO CURSOR BufferedCount<br /><br />Предложение WITH применяется к одиночной таблице. Если запрос перечисляет множественные таблицы, для которых вы хотите использовать буферизированные данные, включите утверждение WITH для каждой таблицы.<br />Одно большое предупреждение. Если вы используете буферизацию строки, запрос выполняет изменения для текущей строки. Это фактически имеет смысл, поскольку запрос перемещает указатель записи в буферизированной таблице. В более ранних версиях, где запросы запрашивали данные с диска, указатель записи в буфере не двигался, но когда вы делаете запрос  непосредственно к буферу, указатель записи перемещается.<br />Вы можете также управлять поведением запросов с буферизированными таблицами глобально. Новая команда SET SQLBUFFERING позволяет вам определять, получают ли запросы данные по умолчанию с диска или из буферов. Предложение WITH (Buffering = lExpr) отменяет текущую установку для специфицированной таблицы и запроса. SET SQLBUFFERING действует в текущем сеансе данных. Используйте SET(“SQLBUFFERING”), чтобы узнать текущую установку.</p>
<a name="_Toc164071717" id="_Toc164071717"></a>
<h2>Отключение нового поведения</h2>
<p>Значительные изменения для двигателя SQL в VFP, появившиеся в VFP 8, вызвали ряд проблем для некоторых существующих приложений. Для того, чтобы не заставлять силой разработчиков изменять рабочий код в VFP 7 более ранних версиях, группа Fox team добавила команду SET ENGINEBEHAVIOR, которая позволяет вам отключать эти изменений в VFP 8. В то же время это не лучшее решение - использовать эту отмену постоянно, тем не менее команда обеспечила гибкое решение для уже существующих приложений.<br />Большинство изменений, появившихся в движке SQL в VFP 9, вряд ли вызовут проблемы совместимости. Однако, имеются несколько моментов, которые могут быть вызвать такие проблема в некоторых приложений, так что группа Fox team добавила новую установку для SET ENGINEBEHAVIOR.<br />Как отмечено в “Улучшении быстродействия для TOP N” ранее в этой главе, в VFP 9 запрос с TOP N теперь возвращает точно N записей; в случае связей между таблицами, это может привести к потере некоторых из связанных результатов.<br />Когда запрос включает одну из агрегатных функций (CNT(), SUM(), AVG(), MIN() or MAX())), но не содержит предложения GROUP BY, VFP 9 всегда возвращает одину запись. Если никакие записи не соответствуют условиям объединения и фильтрации, то результирующая запись содержит значение NULL для всех полей. В более ранних версиях такой запрос возвратил бы пустой результат (_TALLY = 0). <br />И, наконец, все поля, перечисленные в предложении ORDER BY запроса, использующего SELECT DISTINCT, должны быть включены в список полей запроса.<br />Чтобы отключить такое поведение, установите ENGINEBEHAVIOR в 80 или 70. По умолчанию значение ENGINEBEHAVIOR установлено в  90, что делает возможным новое поведение.<br /><strong>Заключение</strong><br />Многие изменения в диалекте SQL для VFP 9 увеличивают его совместимость со стандартом SQL-92. Они также обеспечивают большее количество необходимых инструментальных средств для управления вашими данными. В то время как одни из изменений, вероятно,  не будут сильно воздействать на вашу ежедневную работу, вы, вероятно найдете, что другие удобны и могут многократно использоваться. Способность извлекать некоторые данные в одиночном запросе там, где ранее были необходимы два запроса, не только имеет тенденцию к уменьшению времени на выполнение, но также делает код запроса проще.</p>
<strong><br clear="all" /></strong><a name="_Toc164071718" id="_Toc164071718"></a>
<h2>Новые возможности команд SQL</h2>
<p>Команда SELECT...SQL и другие команды SQL в девятой версии Visual FoxPro были значительно расширены. В этой главе рассматриваются расширения существующих команд и новые команды, повышающие эффективность применения SQL.</p>
<a name="_Toc164071719" id="_Toc164071719"></a>
<h3>Новые возможности</h3>
<p>В Visual FoxPro 9.0 некоторые ограничения команды SELECT...SQL были отменены или дополнены. Эти изменения показаны в следующей таблице.</p>
<table border="1" cellspacing="0" cellpadding="0">

<tr>
<td width="148" valign="top"><br />Изменения</td>
<td width="471" valign="top">
<p>Описание</p>
</td>
</tr>
<tr>
<td width="148" valign="top">
<p align="left">Количество объединений и подзапросов в команде SELECT</p>
</td>
<td width="471" valign="top">
<p align="left">В Visual FoxPro 9.0 отменено ограничение общего числа предложений обьединения и подзапросов. В предыдущих версиях  ограничение было равно девяти.</p>
</td>
</tr>
<tr>
<td width="148" valign="top">
<p align="left">Количество предложений UNION в команде SELECT</p>
</td>
<td width="471" valign="top">
<p align="left">В Visual FoxPro 9.0 отменено ограничение количества предложений UNION. В предыдущих версиях ограничение было равно девяти.</p>
</td>
</tr>
<tr>
<td width="148" valign="top">
<p align="left">Количество таблиц, на которые ссылалась команда SELECT</p>
</td>
<td width="471" valign="top">
<p align="left">В Visual FoxPro 9.0 отменено ограничение на количество таблиц (псевдонимов), вызваемых в SQL SELECT. Предыдущее ограничение было равно 30.</p>
</td>
</tr>
<tr>
<td width="148" valign="top">
<p align="left">Количество параметров в предложении IN ()</p>
</td>
<td width="471" valign="top">
<p align="left">В Visual FoxPro 9.0 отменено ограничение на  24 значения в предложении IN () для WHERE. Однако, количество значений по прежнему может устанавливаться функцией SYS(3055) - для сложных предложений FOR и WHERE. Подробнее об изменении функциональных возможностей предложения IN см. «<em>Изменения функциональных возможностей в текущей реализации</em>».</p>
</td>
</tr>

</table>
<a name="_Toc164071720" id="_Toc164071720"></a>
<h2>Расширенные подзапросы</h2>
<p>В Visual FoxPro 9.0 обеспечивает значительно более гибкие подзапросы. Например, теперь поддерживаются множественные подзапросы. Ниже рассматриваются расширения подзапросов в Visual FoxPro 9.0.</p>
<a name="_Toc164071721" id="_Toc164071721"></a>
<h3>Составные подзапросы</h3>
<p>Visual FoxPro 9.0 поддерживает множественное вложение подзапросов, с корреляцией, допускаемой непосредственным родителем. Ограничения по глубине вложения отсутствуют. В Visual FoxPro 8.0 исключение 1842 (SQL: превышен уровень вложенности подзапросов) генерировалось, когда имелось более одного уровня вложенности подзапроса.<br />Ниже показан общий синтаксис для множественных подзапросов:<br />SELECT … WHERE … (SELECT … WHERE … (SELECT …) …) …<br />Следующие запросы, выполнение которых приводило к возникновению исключения в Visual FoxPro 8.0, теперь выполняются правильно:<br />CREATE CURSOR MyCursor (field1 I)<br />INSERT INTO MyCursor VALUES (0)<br />CREATE CURSOR MyCursor1 (field1 I)<br />INSERT INTO MyCursor1 VALUES (1)<br />CREATE CURSOR MyCursor2 (field1 I)<br />INSERT INTO MyCursor2 VALUES (2)<br />SELECT * FROM MyCursor T1 WHERE EXISTS ;<br />   (SELECT * from MyCursor1 T2 WHERE NOT EXISTS ;<br />   (SELECT * FROM MyCursor2 T3))<br />*** Второй множественный подзапрос, вложенный в пример ***<br />SELECT * FROM table1 WHERE table1.iid IN ;<br />   (SELECT table2.itable1id FROM table2 WHERE table2.iid IN ;<br />   (SELECT table3.itable2id FROM table3 WHERE table3.cValue = "value"))</p>
<a name="_Toc164071722" id="_Toc164071722"></a>
<h3>GROUP BY в соотнесенном подзапросе</h3>
<p>Многие запросы могут быть оценены,  выполняя подзапрос один раз и заменяя возникающим в результате значением или значениями в предложение WHERE внешнего запроса. В запросах, которые включают,  соотнесенный подзапрос (также известный как повторяющийся подзапрос), подзапрос зависит от внешнего запроса для значений. Это означает, что подзапрос выполнен неоднократно, один раз для каждой строки, которая могла бы быть выбрана внешним запросом.<br />Visual FoxPro 8.0 не позволял использовать GROUP BY в соотнесенном подзапросе (генерировалось исключение 1828 (SQL: Использование GROUP BY в подзапросе запрещено). В Visual FoxPro 9.0 это ограничение отменего; теперь GROUP BY поддерживается для соотнесенных подзапросов, возвращающих больше чем одну запись.<br />Ниже показан общий синтаксис для предложения GROUP BY в соотнесенном подзапросе.<br />SELECT … WHERE … (SELECT … WHERE … GROUP BY …) …<br />Следующий пример генерировал исключение в Visual FoxPro 8.0; теперь,  в Visual FoxPro 9.0, он выполняется правильно.<br />CLOSE DATABASES ALL<br />CREATE CURSOR MyCursor1 (field1 I, field2 I, field3 I)<br />INSERT INTO MyCursor1 VALUES(1,2,3)<br />CREATE CURSOR MyCursor2 (field1 I, field2 I, field3 I)<br />INSERT INTO MyCursor2 VALUES(1,2,3)<br />SELECT * from MyCursor1 T1 WHERE field1;<br />   IN (SELECT MAX(field1) FROM MyCursor2 T2 ;<br />   WHERE T2.field2=T1.FIELD2 GROUP BY field3)</p>
<a name="_Toc164071723" id="_Toc164071723"></a>
<h3>Предложение TOP N в не-соотнесенном подзапросе</h3>
<p>Visual FoxPro 9.0 поддерживает предложениеTOP N в не-соотнесенном подзапросе. Предложение ORDER BY должно присутствовать, если предложение TOP N используется, и это — единственный случай, допустимый в подзапросе.<br />Ниже показан общий синтаксис для предложения TOP N в не-соотнесенном подзапросе.<br />SELECT … WHERE … (SELECT TOP nExpr [PERCENT] … FROM … ORDER BY …) …<br />Следующий пример генерировал исключение в Visual FoxPro 8.0; теперь,  в Visual FoxPro 9.0, он выполняется правильно.<br />CLOSE DATABASES ALL<br />CREATE CURSOR MyCursor1 (field1 I, field2 I, field3 I)<br />INSERT INTO MyCursor1 VALUES(1,2,3)<br />CREATE CURSOR MyCursor2 (field1 I, field2 I, field3 I)<br />INSERT INTO MyCursor2 VALUES(1,2,3)<br />SELECT * FROM MyCursor1 WHERE field1 ;<br />   IN (SELECT TOP 5 field2 FROM MyCursor2 order by field2)</p>
<a name="_Toc164071724" id="_Toc164071724"></a>
<h3>Подзапросы в cписке полей команды SELECT</h3>
<p>Visual FoxPro 9.0 позволяет указывать подзапрос как результирующее поле или часть выражения в проекции. Подзапрос в проекции должен удовлетворять тем же самым требованиям, как и подзапрос, используемый в операции сравнения. Если подзапрос не возвращает никакие записи, то возвращается значение NULL.<br />В Visual FoxPro 8.0, попытка использовать такую конструкцию вызывала исключение 1810 (SQL: Недопустимое использование подзапроса).<br />Ниже показан общий синтаксис для подзапроса в списке полей команды SELECT<br />SELECT … (SELECT …) … FROM …<br />Следующий пример генерировал исключение в Visual FoxPro 8.0; теперь,  в Visual FoxPro 9.0, он выполняется правильно.<br />SELECT T1.field1, (SELECT field2 FROM MyCursor2 T2;<br />   WHERE T2.field1=T1.field1) FROM MyCursor1 T1</p>
<a name="_Toc164071725" id="_Toc164071725"></a>
<h3>Агрегатные функции в списке полей SELECT подзапроса</h3>
<p>В Visual FoxPro 9.0 агрегатные функции теперь поддерживаются в списке SELECT сравниваемого подзапроса, используя операторы сравнения &lt;, &lt;=, &gt;, &gt;=, сопровождаемые  ALL, ANY, или SOME. См. «<em>Cоображения о команде </em><em>SQL </em><em>SELECT</em>» для получения подробной информации об агрегатных функциях.</p>
<p>Следующий пример показывает использование агрегатной функции COUNT в списке SELECT подзапроса.<br />CLOSE DATABASES ALL<br />CREATE CURSOR MyCursor (FIELD1 i)<br />INSERT INTO MyCursor VALUES (6)<br />INSERT INTO MyCursor VALUES (0)<br />INSERT INTO MyCursor VALUES (1)<br />INSERT INTO MyCursor VALUES (2)<br />INSERT INTO MyCursor VALUES (3)<br />INSERT INTO MyCursor VALUES (4)<br />INSERT INTO MyCursor VALUES (5)<br />INSERT INTO MyCursor VALUES (-1)<br />CREATE CURSOR MyCursor2 (FIELD2 i)<br />INSERT INTO MyCursor2  VALUES (1)<br />INSERT INTO MyCursor2  VALUES (2)<br />INSERT INTO MyCursor2  VALUES (2)<br />INSERT INTO MyCursor2  VALUES (3)<br />INSERT INTO MyCursor2  VALUES (3)<br />INSERT INTO MyCursor2  VALUES (3)<br />INSERT INTO MyCursor2  VALUES (4)<br />INSERT INTO MyCursor2  VALUES (4)<br />INSERT INTO MyCursor2  VALUES (4)<br />INSERT INTO MyCursor2  VALUES (4)<br />SELECT * FROM MYCURSOR WHERE field1 ;<br />   &lt; ALL (SELECT count(*) FROM MyCursor2 GROUP BY field2) ;<br />   INTO CURSOR MyCursor3<br />BROWSE</p>
<a name="_Toc164071726" id="_Toc164071726"></a>
<h3>Соотнесенные подзапросы позволяют сложным выражениям быть сравненимыми с соотнесенным полем</h3>
<p>В Visual FoxPro 8.0, соотнесённые поля могли быть вызваны только в следующих форматах:<br />Соотнесённое поле &lt;сравнение&gt; локальное поле<br />-или-<br />Локальное поле &lt;сравнение&gt; соотнесённое поле<br />В Visual FoxPro 9.0 соотнесенные поля поддерживают сравнение с локальными выражениями (как показано в следующих форматах):<br />Соотнесенное поле &lt;сравнение&gt; локальное выражение<br />-или-<br />Локальное выражение &lt;сравнение&gt; соотнесённое поле<br />Локальное выражение должно использовать по крайней мере одно локальное поле и не может ссылаться на любое внешнее (соотнесенное) поле.<br />В следующем примере локальное выражение (Mycursor2. field2 / 2) сравнивается с соотнесённым полем (Mycursor. field1).<br />SELECT * FROM MyCursor ;<br />   WHERE EXISTS(SELECT * FROM MyCursor2  ;<br />   WHERE MyCursor2.field2 / 2 &gt; MyCursor.field1)</p>
<a name="_Toc164071727" id="_Toc164071727"></a>
<h3>Изменения для выражений по сравнению с подзапросами.</h3>
<p>В Visual FoxPro 8.0 левая часть выражения, использующего операторы сравнения [NOT] IN &lt;, &lt;=, =, ==, &lt; &gt;, !=, &gt;, =&gt;, ALL, ANY или SOME с подзапросом, должны были ссылаться на одну и только одну таблицу из предложения FROM. В случае сравнения с соотнесенным подзапросом, таблица должна также быть соотнесённой таблицей.<br />В Visual FoxPro 9.0, сравнения обрабатываются следующими способами:</p>
<ul>
<li>Выражение слева от IN должно сравниваться со ссылкой по крайней мере на одну таблицу из предложения FROM.</li>
<li>Левая часть для условий =, ==, &lt;&gt;, !=, сопровождаемая предложениями ALL, SOME, или ANY, должна ссылаться по крайней мере на одну таблицу из предложения FROM.</li>
<li>Левая часть для условия &gt;, &gt;=, &lt;, &lt;=, сопровождаемая предложениями ALL, SOME, или ANY (SELECT TOP…), должна ссыслаться по крайней мере на одну таблицу из предложения FROM.</li>
<li>Левая часть для условия &gt;, &gt;=, &lt;, &lt;=, сопровождаемая предложениями ALL, SOME, или ANY (SELECT &lt;агрегатная функция&gt;…), должна ссыслаться по крайней мере на одну таблицу из предложения FROM.</li>
<li>Левая часть для условия &gt;, &gt;=, &lt;, &lt;=, сопровождаемая предложениями ALL, SOME, or ANY (подзапрос с GROUP BY и/или HAVING), должна ссылаться по крайней мере на одну таблицу из предложения FROM.</li>
</ul>
<p>В Visual FoxPro 9.0 левая часть выражения сравнения, которое не начинается со списка (например, предложения ALL, SOME, or ANY не указано), не должна ссылаться на какую-любую таблицу из предложения FROM.<br />Во всех случаях, в левой части выражения сравнения допускается ссылаться на более чем одну таблица из предложения FROM. Для соотнесенного подзапроса, левая часть выражения сравнения не должна сослаться на соотнесённую таблицу.</p>
<a name="_Toc164071728" id="_Toc164071728"></a>
<h3>Подзапросы в команде UPDATE...SQL</h3>
<p>В Visual FoxPro 9.0 команда UPDATE...SQL теперь поддерживает подзапрос в предложении SET.<br />К подзапросу в предложении SET предъявляются те же требования, как и к подзапросу, используемому в операции сравнения. Если подзапрос не возвращает никакие записи, то возвращается значение NULL.<br />В предложении SET допускается использовать только один подзапрос. Если имеется подзапрос в предложении SET, то использовать подзапросы в предложении WHERE не разрешается.<br />Ниже показан общий синтаксис для подзапроса в предложении SET.<br />UPDATE … SET … (SELECT …) …<br />В следующем примере показано использование подзапроса в предложении SET.<br />CLOSE DATA<br />CREATE CURSOR MyCursor1 (field1 I, field2 I NULL)<br />INSERT INTO MyCursor1 VALUES (1,1)<br />INSERT INTO MyCursor1 VALUES (2,2)<br />INSERT INTO MyCursor1 VALUES (5,5)<br />INSERT INTO MyCursor1 VALUES (6,6)<br />INSERT INTO MyCursor1 VALUES (7,7)<br />INSERT INTO MyCursor1 VALUES (8,8)<br />INSERT INTO MyCursor1 VALUES (9,9)<br />CREATE CURSOR MyCursor2 (field1 I, field2 I)<br />INSERT INTO MyCursor2 VALUES (1,10)<br />INSERT INTO MyCursor2 VALUES (2,20)<br />INSERT INTO MyCursor2 VALUES (3,30)<br />INSERT INTO MyCursor2 VALUES (4,40)<br />INSERT INTO MyCursor2 VALUES (5,50)<br />INSERT INTO MyCursor2 VALUES (6,60)<br />INSERT INTO MyCursor2 VALUES (7,70)<br />INSERT INTO MyCursor2 VALUES (8,80)<br />UPDATE MyCursor1 SET field2 = 100 + (SELECT field2 FROM MyCursor2 ;<br />  WHERE MyCursor2.field1 = MyCursor1.field1) WHERE field1 &gt; 5<br />SELECT MyCursor1<br />LIST</p>
<a name="_Toc164071729" id="_Toc164071729"></a>
<h2>Подзапросы в предложении FROM</h2>
<p>Подзапрос в предложении FROM обычно обозначается как полученная таблица. Полученная таблица - это команда SELECT в предложении FROM, упоминаемая под псевдонимом или определенным пользователем именем. Набор результатов SELECT в предложении FROM создает таблицу, используемую внешней командой SELECT. Visual FoxPro 9.0 разрешает использование подзапроса в предложении FROM.<br />Подзапрос должен быть заключен в круглые скобки, и обязательно связан с псевдонимом. Корреляция не обеспечивается. К подзапросу применяются те же ограничения синтаксиса, как и для обычной команды SELECT, не ограниченые синтаксисом ранее рассмотренных подзапросов. Все такие подзапросы выполненяются до выполнения самого верхнего SELECT.<br />Ниже показан общий синтаксис подзапроса в предложении FROM.<br />SELECT … FROM (SELECT …) [AS] Alias…<br />В следующем примере демонстрируется использование подзапроса в предложении FROM.<br />SELECT * FROM (SELECT * FROM MyCursor T1;<br />   WHERE field1 = (SELECT T2.field2 FROM MyCursor1 T2;<br />   WHERE T2.field1=T1.field2);<br />   UNION SELECT * FROM MyCursor2;<br />   ORDER BY 2 desc) AS subquery</p>
<p>*** Следующий код генерирует ошибку ***<br />SELECT * FROM (SELECT TOP 5 field1 FROM MyCursor) ORDER BY field1</p>
<a name="_Toc164071730" id="_Toc164071730"></a>
<h2>GROUP BY с именами полей в предложении UNION</h2>
<p>При использовании предложения UNION в Visual FoxPro 8.0 вы должны были использовать числовые ссылки в предложении ORDER BY. В Visual FoxPro 9.0, это ограничение было отменено, и теперь допускается использовать имена полей.<br />Ссылочные поля должны присутствовать в списке SELECT (проекция) для последнего SELECT в UNION; эта проекция используется для операции ORDER BY.<br />Следующий пример показывает использование имен полей в предложении ORDER BY.<br />CLOSE DATABASES all<br />CREATE CURSOR MyCursor(field1 I, field2 I)<br />INSERT INTO MyCursor values(1,6)<br />INSERT INTO MyCursor values(2,5)<br />INSERT INTO MyCursor values(3,4)<br />SELECT field1, field2, .T. AS FLAG, 1 FROM MyCursor;<br />   WHERE field1 = 1;<br />   UNION ;<br />   SELECT field1, field2, .T. AS FLAG, 1 FROM MyCursor;<br />   WHERE field1 = 3;<br />   ORDER BY field2 ;<br />   INTO CURSOR TEMP READWRITE<br />BROWSE NOWAIT</p>
<a name="_Toc164071731" id="_Toc164071731"></a>
<h2>Эффективное выполнение TOP N</h2>
<p>В Visual FoxPro 8.0 и более ранних версиях при использовании в TOP N предложения [PERCENT] все записи сортируются и затем TOP N записей извлекается. В Visual FoxPro 9.0 эффективность выполнения была улучшена за счёт удаления записей, которые не удовлетворяют требованиям TOP N из процесса сортировки как можно раньше.<br />Оптимизация TOP N выполняется только тогда, когда если SET ENGINEBEHAVIOR установлена в 90.<br />Оптимизация требует, чтобы TOP N возвратила не больше, чем N записей (это не так для Visual FoxPro 8.0 и более ранних версий).<br />TOP N PERCENT не может быть оптимизирована, если весь результирующий набор записей не может быть считан в память сразу.</p>
<a name="_Toc164071732" id="_Toc164071732"></a>
<h2>Улучшенная оптимизация для множественной таблицы с условием OR</h2>
<p>Visual FoxPro 9.0 применяет улучшенную Rushmore оптимизацию при выборке из связанных по условию OR таблиц. Visual FoxPro оптимизирует условия фильтра для таблицы, пока обе стороны условия могут быть оптимизированы. Следующий пример показывает это:<br />CLEAR<br />CREATE CURSOR Test1 (f1 I)<br />FOR i=1 TO 20<br />  INSERT INTO Test1 VALUES (I)<br />NEXT<br />INDEX ON f1 TAG f1<br />CREATE CURSOR Test2 (f2 I)<br />FOR i=1 TO 20<br />  INSERT INTO Test2 VALUES (I)<br />NEXT<br />INDEX ON f2 TAG f2<br />SYS(3054,12)<br />SELECT * from Test1, Test2 WHERE (f1 IN (1,2,3) AND f2 IN (17,18,19)) OR ;<br />  (f2 IN (1,2,3) AND f1 IN (17,18,19)) INTO CURSOR Result<br />SYS(3054,0)<br />В этом сценарии, таблица Test1 может быть оптимизирована Rushmore, используя следующее условие:</p>
<p>( F1 В (1,2,3) ИЛИ f1 В (17,18,19)) и таблица Test2 со следующими условиями:<br />( F2 В (17,18,19) ИЛИ f2 В (1,2,3))</p>
<a name="_Toc164071733" id="_Toc164071733"></a>
<h2>Поддержка для локальных буферизированных данных</h2>
<p>Время от времени может быть полезно использовать SELECT...SQL, чтобы выбрать записи из локального буферизированного курсора, в котором таблица не модифицировалась. Много раз при создании средств управления подобно сеткам, окнам списка, и комбинированным спискам необходимо рассмотреть недавно добавленные записи, которые еще не были сохранены на диске. В настоящее время команды SQL основаны на содержании, которое уже сохранено на диске.<br />Visual FoxPro 9.0 обеспечивает расширения языка, которые позволяют вам определять, основаны ли данные, возвращенные командой SELECT...SQL на буферизированных данных или данных, сохранённых на диске.<br />Команда SELECT...SQL теперь поддерживает предложение WITH...BUFFERING, которое позволяет вам определять, основаны ли извлекаемые данные на буферизированных данных или данных, уже сохранённых на диске. Для подробной информации, см. «<em>Команда SELECT...SQL c предложением WITH</em>».<br />Если Вы не включаете предложение BUFFERING, характер извлекаемых данных определяется установкой команды SET SQLBUFFERING. Для подробной информации, см. «<em>Команда SET SQLBUFFERING</em>».</p>
<a name="_Toc164071734" id="_Toc164071734"></a>
<h2>Расширения других SQL команд</h2>
<p>Следующие разделы описывают расширения, сделанные в командах  INSERT...SQL, UPDATE...SQL и DELETE...SQL Visual FoxPro 9.0.</p>
<a name="_Toc164071735" id="_Toc164071735"></a>
<h3>Предложение UNION в команде INSERT...SQL</h3>
<p>В Visual FoxPro 9.0 предложение UNION теперь поддерживается в команде INSERT...SQL<br />Ниже показан общий синтаксис для предложения UNION.<br />INSERT INTO … SELECT … FROM … [UNION SELECT … [UNION …]]<br />Следующий пример показывает использование предложения UNION в INSERT...SQL.<br />CLOSE DATABASES ALL<br />CREATE CURSOR MyCursor (field1 I,field2 I)<br />CREATE CURSOR MyCursor1 (field1 I,field2 I)<br />CREATE CURSOR MyCursor2 (field1 I,field2 I)<br />INSERT INTO MyCursor1 VALUES (1,1)<br />INSERT INTO MyCursor2 VALUES (2,2)<br />INSERT INTO MyCursor SELECT * FROM MyCursor1 UNION SELECT * FROM MyCursor2<br />SELECT MyCursor<br />LIST</p>
<a name="_Toc164071736" id="_Toc164071736"></a>
<h3>Соотнесенная команда UPDATE...SQL</h3>
<p>Visual FoxPro 9.0 теперь поддерживает соотнесенные модификации в команде UPDATE...SQL.<br />Если в команду UPDATE...SQL включено предложение FROM, то имя после ключевого слова UPDATE определяет адресата для операции модификации. Это может быть имя таблицы, псевдоним или имя файла. Для того, чтобы выбрать выходную таблицу,  используется следующая логика:</p>
<ul>
<li>Если имя в предложении FROM соответствует неявному или явному псевдониму для таблицы, то таблица используется как адресат для операции модификации.</li>
<li>Если имя соответствует псевдониму курсора в текущем сеансе данных, то курсор используется как адресат.</li>
<li>Таблица или файл с тем же самым именем используется как адресат.</li>
</ul>
<p>Команда UPDATE...SQL в предложении FROM имеет тот же самый синтаксис, как предложение FROM в команде SELECT...SQL со следующими ограничениями:</p>
<ul>
<li>Выходная таблица или курсор не может быть включено во внешнем объединении (OUTER JOIN) как вторичная таблица.</li>
<li>Выходной курсор не может быть результом подзапроса.</li>
<li>Все другие объединения могут быть оценены перед соединением выходной таблицы.</li>
</ul>
<p>Ниже показан общий синтаксис для соотнесенной команды UPDATE.<br />UPDATE … SET … FROM … WHERE …<br />Следующий пример показывает соотнесенную модификацию, используя команду UPDATE...SQL.<br />CLOSE DATABASES ALL<br />CREATE CURSOR MyCursor1 (field1 I , field2 I NULL,field3 I NULL)<br />INSERT INTO MyCursor1 VALUES (1,1,0)<br />INSERT INTO MyCursor1 VALUES (2,2,0)<br />INSERT INTO MyCursor1 VALUES (5,5,0)<br />INSERT INTO MyCursor1 VALUES (6,6,0)<br />INSERT INTO MyCursor1 VALUES (7,7,0)<br />INSERT INTO MyCursor1 VALUES (8,8,0)<br />INSERT INTO MyCursor1 VALUES (9,9,0)<br />CREATE CURSOR MyCursor2 (field1 I , field2 I)<br />INSERT INTO MyCursor2 VALUES (1,10)<br />INSERT INTO MyCursor2 VALUES (2,20)<br />INSERT INTO MyCursor2 VALUES (3,30)<br />INSERT INTO MyCursor2 VALUES (4,40)<br />INSERT INTO MyCursor2 VALUES (5,50)<br />INSERT INTO MyCursor2 VALUES (6,60)<br />INSERT INTO MyCursor2 VALUES (7,70)<br />INSERT INTO MyCursor2 VALUES (8,80)<br />CREATE CURSOR MyCursor3 (field1 I , field2 I)<br />INSERT INTO MyCursor3 VALUES (6,600)<br />INSERT INTO MyCursor3 VALUES (7,700)<br />UPDATE MyCursor1 SET MyCursor1.field2=MyCursor2.field2, field3=MyCursor2.field2*10 ;<br />FROM MyCursor2 ;<br />  WHERE MyCursor1.field1&gt;5 AND MyCursor2.field1=MyCursor1.field1<br />SELECT MyCursor1<br />LIST<br />UPDATE MyCursor1 SET MyCursor1.field2=MyCursor3.field2 FROM MyCursor2, MyCursor3  ;<br />  WHERE MyCursor1.field1&gt;5 AND MyCursor2.field1=MyCursor1.field1 AND<br />  myCursor2.field1=MyCursor3.field1<br />SELECT MyCursor1<br />LIST</p>
<a name="_Toc164071737" id="_Toc164071737"></a>
<h3>Соотнесенная команда DELETE...SQL</h3>
<p>Visual FoxPro 9.0 теперь поддерживает соотнесенное удаление в команде DELETE...SQL.<br />Если в предложении FROM указана больше чем одна таблица, требуется имя после ключевого слова DELETE; это имя определяет адресата для операции удаления . Это имя может быть имя таблицы, псевдоним или имя файла. Для выбора целевой таблицы используется следующая логика:</p>
<ul>
<li>Если имя соответствует неявному или явному псевдониму таблицы в предложении FROM, то таблица используется как адресат для операции модификации.</li>
<li>Если имя соответствует псевдониму для курсора в текущем сеансе данных, то курсор используется как адресат.</li>
<li>Таблица или файл с тем же самым именем используется как адресат.</li>
</ul>
<p>Команда DELETE...SQL в предложении FROM имеет тот же самый синтаксис, как предложение FROM в команде SELECT...SQL со следующими ограничениями:</p>
<ul>
<li>Выходная таблица или курсор не может быть включена во внешнее объединение как вторичная таблица.</li>
<li>Выходной курсор не может быть результат подзапроса.</li>
<li>Должна быть возможность оценить все другие объединения перед соединением выходной таблицы.</li>
</ul>
<p>Ниже показан общий синтаксис для соотнесенной команды DELETE.<br />DELETE [alias] FROM alias1 [, alias2 … ] … WHERE …<br />Следующий пример показывает соотнесенное удаление с использованием команды DELETE...SQL.<br />CLOSE DATABASES ALL<br />CREATE CURSOR MyCursor1 (field1 I , field2 I NULL,field3 I NULL)<br />INSERT INTO MyCursor1 VALUES (1,1,0)<br />INSERT INTO MyCursor1 VALUES (2,2,0)<br />INSERT INTO MyCursor1 VALUES (5,5,0)<br />INSERT INTO MyCursor1 VALUES (6,6,0)<br />INSERT INTO MyCursor1 VALUES (7,7,0)<br />INSERT INTO MyCursor1 VALUES (8,8,0)<br />INSERT INTO MyCursor1 VALUES (9,9,0)<br />CREATE CURSOR MyCursor2 (field1 I , field2 I)<br />INSERT INTO MyCursor2 VALUES (1,10)<br />INSERT INTO MyCursor2 VALUES (2,20)<br />INSERT INTO MyCursor2 VALUES (3,30)<br />INSERT INTO MyCursor2 VALUES (4,40)<br />INSERT INTO MyCursor2 VALUES (5,50)<br />INSERT INTO MyCursor2 VALUES (6,60)<br />INSERT INTO MyCursor2 VALUES (7,70)<br />INSERT INTO MyCursor2 VALUES (8,80)<br />CREATE CURSOR MyCursor3 (field1 I , field2 I)<br />INSERT INTO MyCursor3 VALUES (6,600)<br />INSERT INTO MyCursor3 VALUES (7,700)<br />DELETE MyCursor1 FROM MyCursor2  ;<br />  WHERE MyCursor1.field1&gt;5 AND MyCursor2.field1=MyCursor1.field1<br />SELECT MyCursor1<br />LIST<br />RECALL ALL<br />DELETE MyCursor1 FROM MyCursor2, MyCursor3  ;<br />  WHERE MyCursor1.field1&gt;5 AND MyCursor2.field1=MyCursor1.field1 AND<br />  myCursor2.field1=MyCursor3.field1<br />SELECT MyCursor1<br />LIST<br />RECALL ALL<br />DELETE FROM MyCursor1 WHERE MyCursor1.field1 &gt; 5<br />SELECT MyCursor1<br />list<br />RECALL ALL<br />DELETE MyCursor1 from MyCursor1 WHERE MyCursor1.field1 &gt; 5<br />RECALL ALL IN MyCursor1<br />DELETE T1 ;<br />  FROM MyCursor1 T1 JOIN MyCursor2 ON T1.field1&gt;5 AND MyCursor2.field1=T1.field1,<br />  myCursor3  ;<br />  WHERE MyCursor2.field1=MyCursor3.field1<br />RECALL ALL IN MyCursor1</p>
<a name="_Toc164071738" id="_Toc164071738"></a>
<h3>Обновляемые поля в команде UPDATE...SQL</h3>
<p>Число полей, которые могут модифицироваться командой UPDATE...SQL,  больше не ограничивается 128, как в предыдущих версиях Visual FoxPro. Новое ограничение — 255 полей, т.е. равно числу полей, доступных в таблице.</p>
<a name="_Toc164071739" id="_Toc164071739"></a>
<h3>SET ENGINEBEHAVIOR</h3>
<p>Команда SET ENGINEBEHAVIOR имеет в Visual FoxPro 9.0 новую опцию, 90, которая воздействует поведение команды SELECT...SQL для предложения TOP N и агрегатных функций. Для дополнительной информации см. «<em>Команда SET ENGINEBEHAVIOR</em>».</p>
<a name="_Toc164071740" id="_Toc164071740"></a>
<h2>Преобразование типов данных</h2>
<p>Преобразование между типами данных (например, преобразование между полями memo и character) в Visual FoxPro 9.0 было улучшено. Это усовершенствованное преобразование применяется в команде ALTER TABLE...SQL с опцией COLUMN также, как и структурные изменения, сделанные в Конструкторе Таблиц.</p>
<a name="_Toc164071741" id="_Toc164071741"></a>
<h2>Особенности использования команды SELECT… SQL</h2>
<p>При создании запросов и просмотров командами SQL SELECT вы должны учитывать следующие утверждения, соглашения, и ограничения.</p>
<ul>
<li>Определяемые пользователем функции в командах SELECT...SQL</li>
<li>Агрегатные Функции</li>
<li>Правила по именованию столбцов</li>
<li>Операции объединения (UNION)</li>
</ul>
<a name="_Toc164071742" id="_Toc164071742"></a>
<h3>Определяемые пользователем функции в командах SELECT...SQL</h3>
<p>Вы можете определять выражения, содержащие определяемые пользователем функции для Select_Item в утверждениях SQL SELECT. Однако обратите внимание на следующие рекомендации и ограничения при использовании определяемых пользователем функций в утверждениях SQL SELECT:</p>
<ul>
<li>Используйте API и определяемые пользователем функции, написанные на C или ассемблере вместо того, чтобы выполнять манипулирование с большими вычислительными объемами в определяемых пользователем функциях Visual FoxPro. Быстродействие, с которым выполняются определяемые пользователем функции, может ограничивать быстродействие операций, выполняемых с SQL SELECT.</li>
<li>Не предпринимайте ничего относительно ввода-вывода Visual FoxPro или среды таблицы при использовании определяемых пользователем функций в SQL SELECT. Вообще, в этом случае вы, скорее всего, не знаете, какая рабочая область выбрана, какое имя у текущей таблицы, какие имена имеют обрабатываемые полея. Значение этих переменных зависит от точного расположения в процессе оптимизации, в котором вызывается определяемая пользователем функция.</li>
<li>Не изменяйте Visual FoxPro ввод-вывод или среду таблицы в определяемых пользователем функциях, вызваемых в SQL SELECT. Результаты могут быть непредсказуемы.</li>
<li>Используйте список параметров, передаваемых функции, только когда она вызывается как единственый надежный способ передать значения к определяемым пользователем функциям в SQL SELECT.</li>
<li>Вы должны понимать, что "запрещенные" манипуляции могут обеспечивать правильные результаты для одной из версий Visual FoxPro, но не cмогли бы работать в более поздних версиях.</li>
</ul>
<p>Вне этих ограничений, определяемые пользователем функции приемлемы в командах SQL SELECT. Однако помните, что их использование в SQL SELECT способно резко уменьшить эффективность выполнения запроса.</p>
<a name="_Toc164071743" id="_Toc164071743"></a>
<h3>Агрегатные функции</h3>
<p>Вы можете использовать агрегатные функции с Select_Item, которые является полем или выражением, включающим поле, или внутри условия фильтра в предложении HAVING. Однако, Вы не можете вкладывать агрегатные функции одна в другую.<br />В следующай таблице перечислены агрегатные функции, которые вы можете использовать в команде SELECT...SQL.</p>
<table border="1" cellspacing="0" cellpadding="0">

<tr>
<td width="130" valign="top"><br />Агрегатная функция</td>
<td width="489" valign="top">
<p>Назначение</p>
</td>
</tr>
<tr>
<td width="130" valign="top">
<p align="left">AVG()</p>
</td>
<td width="489" valign="top">
<p align="left">Возвращает среднее значение для столбца данных</p>
</td>
</tr>
<tr>
<td width="130" valign="top">
<p align="left">COUNT( ) или CNT( )</p>
</td>
<td width="489" valign="top">
<p align="left">Считает число единиц выбора в столбце. COUNT (*) считает число строк в выводе запроса</p>
</td>
</tr>
<tr>
<td width="130" valign="top">
<p align="left">MIN()</p>
</td>
<td width="489" valign="top">
<p align="left">Возвращает минимальное значение для столбца данных</p>
</td>
</tr>
<tr>
<td width="130" valign="top">
<p align="left">MAX()</p>
</td>
<td width="489" valign="top">
<p align="left">Возвращает максимальное значение для столбца данных</p>
</td>
</tr>
<tr>
<td width="130" valign="top">
<p align="left">SUM()</p>
</td>
<td width="489" valign="top">
<p align="left">Возвращает сумму значений для столбца данных</p>
</td>
</tr>

</table>
<p>Следующий пример создает запрос, который назначает имена столбцам в результирующей выборке в соответствии с описанием:<br />CLEAR ALL<br />CLOSE DATABASES<br />OPEN DATABASE (HOME(2) + 'Data\TestData')<br />SELECT AVG(TAlias1.order_amt), MIN(TAlias1.order_amt) FROM Orders AS TAlias1</p>
<a name="_Toc164071744" id="_Toc164071744"></a>
<h3>Правила присваивания имён столбцам</h3>
<p>Следующие правила применяются, когда вы определяете столбец с предложением AS, чтобы отобразить результаты в отдельном столбце:</p>
<ul>
<li>Если Select_Item - поле с уникальным именем, имя выводимого столбца совпадает с именем поля.</li>
<li>Если больше чем один Select_Item имеют одинаковые имена, то к концу имени выводимого столбца добавляется символ подчеркивания (_) и номер (символ).</li>
</ul>
<p>Например, если команда SELECT SQL определяет, что должны быть отображены поля Cust_ID для двух таблиц, Customer и Orders, в выборке эти столбцы будут иметь имена Cust_ID_a и Cust_Id_b. Следующий пример создает запрос, который отображает имена столбцов как описано:<br />CLEAR ALL<br />CLOSE DATABASES<br />OPEN DATABASE (HOME(2) + 'Data\TestData')<br />SELECT TAlias1.cust_id, TAlias2.cust_id ;<br />   FROM Customer AS TAlias1, Orders AS TAlias2 ;<br />   WHERE TAlias1.cust_id = TAlias2.cust_id<br />При выборке из свободных таблиц, имеющих одинаковые имена полей длиной 10 символов (максимальная длина имени поля для свободных таблиц), в результирующей выборке второе и все последующие имена усекаются и добавляется числовой идентификатор. Например, имя столбца Department появилось бы как Department и Departmen2.</p>
<ul>
<li>Если Select_Item - выражение, и предложение AS не используется, то имя столбца вывода формируется как Exp_1. Имена дополнительных столбцов, определяемых выражениями), формируются как Exp_2, Exp_3, и так далее. Следующий пример создает запрос, который отображает имена столбцов как описано:</li>
</ul>
<p>CLEAR ALL<br />CLOSE DATABASES<br />OPEN DATABASE (HOME(2) + 'Data\TestData')<br />SELECT TAlias1.postalcode+"-1234", TAlias2.postalcode+"-5678" ;<br />   FROM Customer AS TAlias1, Orders AS TAlias2 ;<br />   WHERE TAlias1.cust_id = TAlias2.cust_id</p>
<ul>
<li>Если с Select_Item используется агрегатная функция, типа COUNT(),  выводимый столбец именован как Cnt_FieldName. Если больше чем один Select_Item используются с составными функциями, столбцы вывода именуются в соответствии со следующим соглашением: ИмяАгрегатнойФункции_ИмяПоля; при необходимости имена сокращаются. Следующий пример создает запрос, который отображает имена выводимых столбцов в соответсвии с выше сказанным:</li>
</ul>
<p>CLEAR ALL<br />CLOSE DATABASES<br />OPEN DATABASE (HOME(2) + 'Data\TestData')<br />SELECT COUNT(order_id), SUM(order_net)FROM Orders</p>
<a name="_Toc164071745" id="_Toc164071745"></a>
<h3>Операция объединения (UNION)</h3>
<p>При выполнении операций объединения между командами SELECT...SQL, использующими предложение UNION, необходимо знать и учитывать следующие соображения и ограничения:</p>
<ul>
<li>Вы не можете использовать UNION для объединения подзапросов.</li>
<li>Объединяемые команды SELECT должны иметь то же самое количество столбцов, как в результирующем наборе.</li>
<li>Только конечная (заключительная) команда SELECT может иметь предложение ORDER BY, которое должно обращаться к выводимым столбцам по их номерам. Если предложение ORDER BY включено, то оно воздействует на весь результирующий набор.</li>
<li>Когда два столбца различных типов данных включаются в операции UNION, тип данных с более низким старшинством преобразуется в тип данных с более высоким старшинством.</li>
</ul>
<h4>Преобразование типов данных и старшинство в операциях UNION</h4>
<p>До Visual FoxPro 8.0 вам нужно было выполнять явное преобразование типов данных при выполнении операций UNION в командах  SELECT...SQL над двумя объединяемыми полями различных типов. Теперь Visual FoxPro поддерживает неявное преобразование типа данных для типов данных, которые поддерживают такое преобразование.<br />Явное преобразование типа данных требует, чтобы вы использовали функции преобразования Visual FoxPro, типа CTOD(), в то время как неявные преобразования не требуют, чтобы Вы использовали такие функции преобразования.<br />Когда Visual FoxPro объединяет в операции UNION два столбца с различными типами данных, тип данных с более низким старшинством преобразован в тип данных с более высоким старшинством. Для реквизитов поля, NULL имеет более высокое старшинство над NOT NULL.<br />Следующая таблица показывает все явные и неявные преобразования типа данных, разрешенные для типов данных таблиц Visual FoxPro.</p>
<table border="1" cellspacing="0" cellpadding="0">

<tr>
<td width="154" valign="top"><br />Первый тип данных</td>
<td width="153" valign="top">
<p>Второй тип данных</p>
</td>
<td width="311" valign="top">
<p>Ожидаемый тип данных</p>
</td>
</tr>
<tr>
<td width="154" valign="top">
<p align="left">Character (N) </p>
</td>
<td width="153" valign="top">
<p align="left">Character (X)</p>
</td>
<td width="311" valign="top">
<p align="left">Character (MAX(N,X))</p>
</td>
</tr>
<tr>
<td width="154" valign="top">
<p align="left">Character (N)</p>
</td>
<td width="153" valign="top">
<p align="left">Character Binary (X)</p>
</td>
<td width="311" valign="top">
<p align="left">Character Binary (MAX(N,X))</p>
</td>
</tr>
<tr>
<td width="154" valign="top">
<p align="left">Character (N)</p>
</td>
<td width="153" valign="top">
<p align="left">Memo</p>
</td>
<td width="311" valign="top">
<p align="left">Memo</p>
</td>
</tr>
<tr>
<td width="154" valign="top">
<p align="left">Character Binary (N)</p>
</td>
<td width="153" valign="top">
<p align="left">Character Binary (X)</p>
</td>
<td width="311" valign="top">
<p align="left">Character Binary (MAX(N,X))</p>
</td>
</tr>
<tr>
<td width="154" valign="top">
<p align="left">Character Binary (N)</p>
</td>
<td width="153" valign="top">
<p align="left">Memo</p>
</td>
<td width="311" valign="top">
<p align="left">Memo</p>
</td>
</tr>
<tr>
<td width="154" valign="top">
<p align="left">Date  </p>
</td>
<td width="153" valign="top">
<p align="left">DateTime</p>
</td>
<td width="311" valign="top">
<p align="left">DateTime</p>
</td>
</tr>
<tr>
<td width="154" valign="top">
<p align="left">Double (N)</p>
</td>
<td width="153" valign="top">
<p align="left">Float (X,Y)</p>
</td>
<td width="311" valign="top">
<p align="left">Float (MAX(MAX(8,Y),2))</p>
</td>
</tr>
<tr>
<td width="154" valign="top">
<p align="left">Double (N) </p>
</td>
<td width="153" valign="top">
<p align="left">Integer</p>
</td>
<td width="311" valign="top">
<p align="left">Double (N)</p>
</td>
</tr>
<tr>
<td width="154" valign="top">
<p align="left">Double (N) </p>
</td>
<td width="153" valign="top">
<p align="left">Numeric (X,Y) </p>
</td>
<td width="311" valign="top">
<p align="left">Double (MAX(MAX(8,Y),2))</p>
</td>
</tr>
<tr>
<td width="154" valign="top">
<p align="left">Double (X)   </p>
</td>
<td width="153" valign="top">
<p align="left">Double (Y)</p>
</td>
<td width="311" valign="top">
<p align="left">Double (MAX(X,Y))</p>
</td>
</tr>
<tr>
<td width="154" valign="top">
<p align="left">Float (N,M) </p>
</td>
<td width="153" valign="top">
<p align="left">Double (X) </p>
</td>
<td width="311" valign="top">
<p align="left">Float (20, MAX(M,X))</p>
</td>
</tr>
<tr>
<td width="154" valign="top">
<p align="left">Float (N,M)</p>
</td>
<td width="153" valign="top">
<p align="left">Float (X,Y) </p>
</td>
<td width="311" valign="top">
<p align="left">Float (MAX(N,M), MAX(X,Y))</p>
</td>
</tr>
<tr>
<td width="154" valign="top">
<p align="left">Float (N,M) </p>
</td>
<td width="153" valign="top">
<p align="left">Numeric (X,Y) </p>
</td>
<td width="311" valign="top">
<p align="left">Float (MAX (N,X), MAX(M,Y))</p>
</td>
</tr>
<tr>
<td width="154" valign="top">
<p align="left">Integer</p>
</td>
<td width="153" valign="top">
<p align="left">Currency</p>
</td>
<td width="311" valign="top">
<p align="left">Currency</p>
</td>
</tr>
<tr>
<td width="154" valign="top">
<p align="left">Integer   </p>
</td>
<td width="153" valign="top">
<p align="left">Double (X)</p>
</td>
<td width="311" valign="top">
<p align="left">Double (X)</p>
</td>
</tr>
<tr>
<td width="154" valign="top">
<p align="left">Integer </p>
</td>
<td width="153" valign="top">
<p align="left">Float (X,Y) </p>
</td>
<td width="311" valign="top">
<p align="left">Float (MAX(11,X), Y)</p>
</td>
</tr>
<tr>
<td width="154" valign="top">
<p align="left">Integer </p>
</td>
<td width="153" valign="top">
<p align="left">Numeric (X,Y) </p>
</td>
<td width="311" valign="top">
<p align="left">Numeric (MAX(11,X), Y)</p>
</td>
</tr>
<tr>
<td width="154" valign="top">
<p align="left">Numeric (N,M) </p>
</td>
<td width="153" valign="top">
<p align="left">Double (X) </p>
</td>
<td width="311" valign="top">
<p align="left">Numeric (20, MAX(M,X))</p>
</td>
</tr>
<tr>
<td width="154" valign="top">
<p align="left">Numeric (N,M) </p>
</td>
<td width="153" valign="top">
<p align="left">Float (X,Y) </p>
</td>
<td width="311" valign="top">
<p align="left">Float (MAX(N,X), MAX(M,Y))</p>
</td>
</tr>
<tr>
<td width="154" valign="top">
<p align="left">Numeric (N,M)</p>
</td>
<td width="153" valign="top">
<p align="left">Numeric (X,Y)</p>
</td>
<td width="311" valign="top">
<p align="left">Numeric (MAX(N,X), MAX(M,Y))</p>
</td>
</tr>
<tr>
<td width="154" valign="top">
<p align="left">Varchar (X) </p>
</td>
<td width="153" valign="top">
<p align="left">Character (Y) </p>
</td>
<td width="311" valign="top">
<p align="left">Varchar (MAX(X,Y))</p>
</td>
</tr>
<tr>
<td width="154" valign="top">
<p align="left">Varchar Binary (X) </p>
</td>
<td width="153" valign="top">
<p align="left">Character Binary (Y) </p>
</td>
<td width="311" valign="top">
<p align="left">Varchar Binary (MAX(X,Y))</p>
</td>
</tr>

</table>
<a name="_Toc164071746" id="_Toc164071746"></a>
<h2>Команда SELECT...SQL c предложением WITH</h2>
<p>Предложение WITH позволяет Вам применять одиночную команду к существующим утверждениям SELECT без необходимости изменять эти утверждения.<br />[WITH (BUFFERING = lExpr) ]<br /><strong>Параметры</strong><br />lExpr<br />Логический тип данных. В следующей таблице перечислены значения для lExpr.</p>
<table border="1" cellspacing="0" cellpadding="0">

<tr>
<td width="81" valign="top"><br />lExp</td>
<td width="538" valign="top">
<p>Установка</p>
</td>
</tr>
<tr>
<td width="81" valign="top">
<p align="left">Истина (.T.)</p>
</td>
<td width="538" valign="top">
<p align="left">Данные в команде SQL...SELECT основаны на буферизированных данных, если они доступны.</p>
</td>
</tr>
<tr>
<td width="81" valign="top">
<p align="left">Ложь (.F.)</p>
</td>
<td width="538" valign="top">
<p align="left">(Значение по умолчанию) Данные в команде SQL-SELECT основаны только на тех данных, которые записаны на диске.</p>
</td>
</tr>

</table>
<p>Если вы устанавливаете BUFFERING в истину (.T.), то можете сделать запрос данных из локального буферизированного курсора, который может включать записи, которые модифицировались, но не сохранены на диске. Иначе, результат выборки будет  включать только те записи, которые сохранены на диске.<br />Если курсор использует буферизацию строки, то текущая запись сохраняется до того, как команда выполнена.<br />Если курсор использует буферизацию таблицы, то изменяемая текущая запись сохранена в буфере.<br />Предложение WITH, устанавливающее BUFFERING, поддерживается только на локальных данных Visual FoxPro, и не поддерживается на данных из баз данных внешних компонентов (например, на SQL Server).<br />Если вы устанавливаете BUFFERING в Ложь (.F.), то команда SELECT выбирает данные из курсора на диске (который может быть отличен от того, который находится в буфере). Если Вы не включаете утверждение BUFFERING, то ваши результаты основаны на установке для команды SET SQLBUFFERING. По умолчанию, ваши запросы выполняют выборку данных с диска. Команда SELECT с WITH BUFFERING, установленным в Истину (.T.), отменяет установку SET SQLBUFFERING.<br />Опция WITH BUFFERING эффективна в следующих случаях:</p>
<ul>
<li>Рабочая область не имеет псевдонима, определенного, чтобы поддерживать курсор, на который ссылается команда SELECT.</li>
<li>Курсор не буферизирован.</li>
<li>Курсор действует к как адресат для операций модификации или удаления.</li>
</ul>
<p>Следующий пример демонстрирует простую команду SELECT, ссылающуюся на одиночную таблицу. Чтобы использование предложения WITH было эффективным, должна существовать рабочая область с псевдоним Customers.<br />SELECT * FROM customers WITH (BUFFERING=.T.)<br />Следующий пример показывает, что каждая таблица, указанная в предложении FROM, нуждается в предложении WITH BUFFERING.<br />SET MULTILOCKS ON<br />CREATE TABLE Table1 (Field1 N(10), Field2 N(10))<br />CREATE TABLE Table2 (Field3 N(10), Field4 N(10))<br />CURSORSETPROP("Buffering", 5, "Table1")<br />CURSORSETPROP("Buffering", 5, "Table2")<br />INSERT INTO Table1 VALUES (1, 1)<br />INSERT INTO Table2 VALUES (0, 100)<br />SELECT Table1.*, Table2.* FROM FORCE Table1 ;<br />      JOIN Table2 ON Field1 &gt;= Field3 AND Field2 &gt; 0 AND Field4 &lt; 100<br />REPLACE Field4 WITH 99 IN Table2<br />SELECT Table1.*, Table2.* FROM FORCE Table1 ;<br />      JOIN Table2 ON Field1 &gt;= Field3 AND Field2 &gt; 0 AND Field4 &lt; 100<br />SELECT Table1.*, Table2.* FROM FORCE Table1 WITH (BUFFERING=.T.) ;<br />      JOIN Table2 WITH (BUFFERING=.T.) ;<br />      ON Field1 &gt;= Field3 AND Field2 &gt; 0 AND Field4 &lt; 100</p>
<a name="_Toc164071747" id="_Toc164071747"></a>
<h2>Команда SET SQLBUFFERING</h2>
<p>Определяет, основаны ли данные в SQL - команде SELECT на буферизированных данных или данных, записанных в диск.<br />SET SQLBUFFERING ON | OFF</p>
<p style="text-align: left;">Параметры<br />ON<br />Определяет, что команда SELECT...SQL использует локальные буферизированные данные, если они доступны. Если данные не буферизированы, то выбираются данные с диска.<br />OFF<br />(Значение по умолчанию) Определяет, что команда SELECT...SQL использует данные, сохранённые на диске.<br /><br /><em>(Перевод Вячеслав Клепинин)</em></p>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/visual-foxpro-9-izmeneniya-v-dialekte-sql/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Статьи]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/pravilnaya-sortirovka-kazahskogo-alfavita/</link>
					<title><![CDATA[Правильная сортировка казахского алфавита]]></title>
                    					    <author><![CDATA[dimuhametov]]></author>
                    										    <pubDate>Tue, 22 Nov 2022 07:12:48 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Правильная сортировка казахского алфавита</h1>
													</header>
													<div id="sol_opis">Правильная сортировка казахского алфавита. Возникает ситуация при которой просто необходимо в правильном порядке отобразить буквы казахского алфавита.</div>
<div id="sol_body">
<p>Для всех соотечественников в Казахстане. Возникает ситуация при которой просто необходимо в правильном порядке отобразить буквы казахского алфавита. Для этого необходимо проделать следующее:<br />
Файл kz1251.mem предварительно включить в проект.</p>
<p>При запуске проекта:<br />
SET COLLATE TO 'MACHINE'<br />
public kz1251<br />
Restore from 'kz1251.mem' additive<br />
Пример выборки:</p>
<p><pre class='bbcode'>  SELECT test.fio,SYS(15,kz1251,IIF(ISNULL(test.fio),'',test.fio)) AS 'sort_kz' FROM test ORDER BY sort_kz INTO CURSOR test  
</pre></p>
<p>Да необходимо отметить, что функция SYS(15) работает только со строковыми выражениями. Для других типов полей, необходимо использовать обычную сортировку.</p>
</div>
<div id="sol_avtor">Автор: Dimuhametov</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4750">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 4 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4750">dimuhametov</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="dimuhametov" href="https://foxclub.ru/account/?user=4750">
				<img alt='' src='https://secure.gravatar.com/avatar/d20d63cb86d272d231ef055ce82b5663?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/d20d63cb86d272d231ef055ce82b5663?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 01-11-2008        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/pravilnaya-sortirovka-kazahskogo-alfavita/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/adapter-generatora-otchetov-fast-report-2-47-dlya-visual-foxpro/</link>
					<title><![CDATA[Адаптер генератора отчетов  Fast Report 2.47 для Visual FoxPro]]></title>
                    					    <author><![CDATA[Евгений Банщиков]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:27 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Адаптер генератора отчетов  Fast Report 2.47 для Visual FoxPro</h1>
													</header>
													<div id="sol_opis">Пример использования генератора отчетов Fast Report 2.47 в VFP</div>
<div id="sol_body">Скачать последнюю версию можно здесь : <a href="http://updateapp.narod.ru/tools.html">updateapp.narod.ru/tools.html</a>  <br /> <a href="http://updateapp.narod.ru/tools.html">Загрузить адаптер генератора отчетов  Fast Report 2.47</a>   </p>
<h3>Профессиональный генератор отчетов</h3>
<p> Генераторы  отчетов всегда нужны , а хорошие генераторы нужны в особенности.<br /> Особенно это относится к FoxPro , reporter которого славится своей убогостью.<br /> Когда я впервые познакомился с FastReport , то сразу понял - это именно то, что я давно искал. <br /> Правда была проблема , заключавшаяся в том , что разработчики не позаботились о возможности портирования<br /> своего детища в другие среды программирования ,кроме Delphi. Поэтому мне пришлось обратится к специалисту , котоый  по моему<br /> заказу обернул его в COM сервер. (Спасибо ему большое за отличную работу).<br /> Решение представляет собой законченное приложение "Печать платежных поручений". Генератор отчетов является неотемлемой<br /> его частью и не может распространятся Вами отдельно ,если Вы конечно не являетесь зарегестрированным рользователем FastReport.<br /> Поэтому , если Вы захотите использовать этот репортер в своих приложениях , то необходимо приобрести лицензию на его использование<br /> у разработчиков. <br /> Генератор оформлен в виде Com сервера FrWrap.dll. Описание его , примеры программирования для FoxPro а также пример класса адаптера<br />  лежат в каталоге Source.<br /> Вопросы и замечания можете направлять по адресу al_fa@mail.ru</p>
<p> С уважением ,<br /> Банщиков Евгений    </div>
<div id="sol_avtor">Автор: Банщиков Евгений</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4947">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4947">Евгений Банщиков</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Евгений Банщиков" href="https://foxclub.ru/account/?user=4947">
				<img alt='' src='https://secure.gravatar.com/avatar/d4e4a6c8d5c8843e1223d300618e50ee?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/d4e4a6c8d5c8843e1223d300618e50ee?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 09-04-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/adapter-generatora-otchetov-fast-report-2-47-dlya-visual-foxpro/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/generator-otchetov-v-exel-v-1-2/</link>
					<title><![CDATA[Генератор отчетов в Exel (v 1.2)]]></title>
                    					    <author><![CDATA[Евгений Банщиков]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Генератор отчетов в Exel (v 1.2)</h1>
													</header>
													<div id="sol_opis">Представляю вам генератор отчетов,имеющиий следующие возможности: Создание отчета как программно так и  с использованием шаблона. Неограниченная группировка данных. Вывод итогов как по отчету ,так и по группам. Использование формул c относительными ссылками на имена колонок.Вставка рисунков и диаграмм. Наличие средств ,облегчающих работу c x-tab отчетами . Маленькии размер. Приемлемая скорость</div>
<div id="sol_body">Скачать последнюю версию можно здесь : <a href="http://updateapp.narod.ru/tools.html">updateapp.narod.ru/tools.html</a>  <br /> <a href="http://updateapp.narod.ru/tools.html">Скачать генератор отчетов EReport</a></div>
<div id="sol_avtor">Автор: Банщиков Евгений</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4947">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4947">Евгений Банщиков</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Евгений Банщиков" href="https://foxclub.ru/account/?user=4947">
				<img alt='' src='https://secure.gravatar.com/avatar/d4e4a6c8d5c8843e1223d300618e50ee?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/d4e4a6c8d5c8843e1223d300618e50ee?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 09-04-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/generator-otchetov-v-exel-v-1-2/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/alternativnyj-redaktor-menyu/</link>
					<title><![CDATA[Альтернативный редактор меню]]></title>
                    					    <author><![CDATA[Евгений Банщиков]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:37 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Альтернативный редактор меню</h1>
													</header>
													<div id="sol_opis">Алтернативный редактор меню на  базе  Tree view</div>
<div id="sol_body">Поддержка drag & drop как между элементами одного меню , так и между различными файлами меню ,  возможность задания  опции color ,font и style и многое другое.<br /> Требуется наличие ActiveX : MS Treeview Control 6 и MS Forms 2.0<br /> Для установки скопируйте menudesigner.app в домашнйи каталог ( Home(1) ) и подключите его командой  _menudesigner=Home(1)+'menudesigner.app'<br /> Скачать редактор можно здесь : <a href="http://updateapp.narod.ru/tools.html">updateapp.narod.ru/tools.html</a>  <br /> <a href="http://updateapp.narod.ru/tools.html">Ссылка</a></div>
<div id="sol_avtor">Автор: Евгений Банщиков</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4947">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4947">Евгений Банщиков</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Евгений Банщиков" href="https://foxclub.ru/account/?user=4947">
				<img alt='' src='https://secure.gravatar.com/avatar/d4e4a6c8d5c8843e1223d300618e50ee?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/d4e4a6c8d5c8843e1223d300618e50ee?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 09-04-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/alternativnyj-redaktor-menyu/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/grid-a-lya-excel-analog-ctrl-z-metki-yacheek-obedinenie-yacheek/</link>
					<title><![CDATA[Грид а ля Excel (аналог Ctrl+Z, метки ячеек, объединение ячеек)]]></title>
                    					    <author><![CDATA[Ydin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:37 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Грид а ля Excel (аналог Ctrl+Z, метки ячеек, объединение ячеек)</h1>
													</header>
													<div id="sol_opis">Аналогично Ctrl+Z в Excel и других программах позволяет возвращать ячейкам грида измененные в сеансе значения. Ячейки с измененными значениями помечаются зеленым треугольником в верхнем левом углу. По функциональной клавише F10 можно прикрепить сообщение к ячейке По заданным столбцам можно &quot;объединять&quot; ячейки с одинаковыми значениями</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Ydin</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4809">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4809">Ydin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Ydin" href="https://foxclub.ru/account/?user=4809">
				<img alt='' src='https://secure.gravatar.com/avatar/1d0b9037d3d21551d6994ec6ae0105a6?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1d0b9037d3d21551d6994ec6ae0105a6?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 16-12-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/grid-a-lya-excel-analog-ctrl-z-metki-yacheek-obedinenie-yacheek/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-na-osnove-treeview-s-podderzhkoj-neskolkih-tablicz/</link>
					<title><![CDATA[Класс на основе TreeView с поддержкой нескольких таблиц]]></title>
                    					    <author><![CDATA[Black_Cat]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:37 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс на основе TreeView с поддержкой нескольких таблиц</h1>
													</header>
													<div id="sol_opis">Строит TreeView по нескольким таблицам с указанными связями между ними.</div>
<div id="sol_body">1. Набор дополнительных свойств: ControlSource, csFilters, csKeys, csParents, csShows.</p>
<p>     ControlSource - список таблиц через точку с запятой, соответствующих уровням дерева.</p>
<p>     csFilters - фильтры соответствующих таблиц (ч/з ;), участвуют в WHERE запроса</p>
<p>     csKeys - уникальные ключи таблиц (ч/з ;), обеспечивают связь с детями</p>
<p>     csParents - ключи родителей</p>
<p>     csShows - то, что показывается пользователю</p>
<p> 2. Свойства Nodes и SelectedItem - доступ к соответствующим свойствам внутреннего OLETreeView</p>
<p> 3. Подветки создаются при открытии пользователем ноды.</p>
<p> 4. Группировки и необязательность.</p>
<p> Подробности в файле README.<br /> Предложения, дополнения и непонимания на black___cat@mail.ru (три подчеркивания).</div>
<div id="sol_avtor">Автор: Black_Cat</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="2714">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 15 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=2714">Black_Cat</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Black_Cat" href="https://foxclub.ru/account/?user=2714">
				<img alt='' src='https://secure.gravatar.com/avatar/c3f399a9fe3ac30de5e240835be2f4b2?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c3f399a9fe3ac30de5e240835be2f4b2?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-12-2010        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-na-osnove-treeview-s-podderzhkoj-neskolkih-tablicz/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/generator-otchetov-ms-word/</link>
					<title><![CDATA[Генератор отчетов MS WORD]]></title>
                    					    <author><![CDATA[AlexK]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:15 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Генератор отчетов MS WORD</h1>
													</header>
													<div id="sol_opis">Генератор отчетов в Word. Шаблон отчета разрабатывается в самом Word'е. Очень хорошая замена стандартному фоксовому отчету и программам типа FRX-&gt;DOC. Подробная документация на русском языке внутри архива.</div>
<div id="sol_body">
<h3>Генератор отчетов</h3>
<p> Каждому кто программирует для баз данных приходилось наверняка сталкиваться с программами генерации отчетов. Обычно эти программы строят отчет в своем формате и предоставляют его для просмотра в своем окне просмотра без возможности редактирования и изменения.  </p>
<p> Иногда чтобы быстро получить отчет Вы встаете перед проблемой - какой генератор будет совместим с Вашей программой и как его туда подключить.  </p>
<p> Предлагаемый генератор решит следующие проблемы: <br /> Быстрая и простая разработка отчета непосредственно в MS Word  <br /> Не использует OLE  <br /> Простота языка описания шаблона отчета  <br /> Вызов генератора из любого языка поддерживающего механизм Windows API  <br /> Вызов генератора посредством функций system или WinExec  <br /> Использование любых существующих документов MS Word для шаблонов генератора  <br /> Вывод отчетов в MS Word в виде RTF-файлов с возможностью редактирования и печати  <br /> Вывод отчетов в MS Word из приложений DOS работающих с DBF файлами без перекомпиляции приложений <br /> Минимальные затраты дискового пространсва при установке генератора  <br /> Вывод данных из файлов DBF или из файла произвольных структур подготовленных из Вашей программы </p>
<p> Добавлена поддержка JPEG. Создание шаблона без использования Word на лету. </p>
<p> Обновление:<br /><a href='http://www.foxclub.ru/sol/index.php?act=view&id=230'> На сайте FoxClub</a> <br /><a href='http://genrep.net'> На сайте Genrep</a>        </div>
<div id="sol_avtor">Автор: Куденцов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4764">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 10 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4764">AlexK</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="AlexK" href="https://foxclub.ru/account/?user=4764">
				<img alt='' src='https://secure.gravatar.com/avatar/1fb49e8f115e8786c485b8112a62a69e?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1fb49e8f115e8786c485b8112a62a69e?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 9<i class="rcli fa-calendar-check-o"></i>Регистрация: 11-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/generator-otchetov-ms-word/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/generator-otchetov-genrep/</link>
					<title><![CDATA[Генератор отчетов GenRep]]></title>
                    					    <author><![CDATA[AlexK]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Генератор отчетов GenRep</h1>
													</header>
													<div id="sol_opis">Генератор отчетов GenRep. Обновление Исправленная версия от 25.09.2001</div>
<div id="sol_body">
<h3>Генератор отчетов GenRep</h3>
<p> Обновление генератора отчетов GenRep ( http://generp.ru, http://alkud.by.ru ) </p>
<p> 25.09.2001	Genrep 1.0 (2509) <br /> 1. Добавлена поддержка типов для DBF: Y-currency, B-double, I-integer, T-Datetime <br /> 2. Параметр Isd во внешних вызовах теперь определяется как флаг, и может приобретать следующие значения:	0  – работа в текущей папке (выходной файл создается в текущей папке) <br /> 1  – работа в папке шаблона (выходной файл создается в папке шаблона) <br /> 16 – МS Word после генерации отчета не вызывается <br /> Например в Visual FoxPro: <br /> 	DECLARE Integer RunRep  IN genrep.dll AS Runr String @cName, Integer Isd <br /> 	DECLARE Integer RunDial IN genrep.dll AS Rund String @cName, Integer Isd <br /> =Runr('namefile.sab' , 0+16) <br /> =Runr('namefile.sab' , 1+16) <br /> =Rund('namefile.sab' , 0) <br /> 11.09.2001 <br /> 1. Исправление: Изменена обработка управляющих блоков <br /> 09.09.2001 <br /> 1. Исправление: Исправлена ошибка определения длинны блока [Detal] <br /> 2. Исправление: Изменения в обработке концов строк <br /> 3. Увеличено количество обрабатываемых файлов от 10 до 20     </div>
<div id="sol_avtor">Автор: Куденцов Александр</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4764">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 10 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4764">AlexK</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="AlexK" href="https://foxclub.ru/account/?user=4764">
				<img alt='' src='https://secure.gravatar.com/avatar/1fb49e8f115e8786c485b8112a62a69e?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1fb49e8f115e8786c485b8112a62a69e?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 9<i class="rcli fa-calendar-check-o"></i>Регистрация: 11-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/generator-otchetov-genrep/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/generator-otchetov-genrep-2/</link>
					<title><![CDATA[Генератор отчетов GenRep]]></title>
                    					    <author><![CDATA[AlexK]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Генератор отчетов GenRep</h1>
													</header>
													<div id="sol_opis">Генератор отчетов GenRep. Обновление Исправленная версия от 25.09.2001</div>
<div id="sol_body">
<h3>Генератор отчетов GenRep</h3>
<p> Обновление генератора отчетов GenRep ( http://genrep.ru, http://alkud.by.ru ) </p>
<p> 25.09.2001	Genrep 1.0 (2509) <br /> 1. Добавлена поддержка типов для DBF: Y-currency, B-double, I-integer, T-Datetime <br /> 2. Параметр Isd во внешних вызовах теперь определяется как флаг, и может приобретать следующие значения:	0  – работа в текущей папке (выходной файл создается в текущей папке) <br /> 1  – работа в папке шаблона (выходной файл создается в папке шаблона) <br /> 16 – МS Word после генерации отчета не вызывается <br /> Например в Visual FoxPro: <br /> 	DECLARE Integer RunRep  IN genrep.dll AS Runr String @cName, Integer Isd <br /> 	DECLARE Integer RunDial IN genrep.dll AS Rund String @cName, Integer Isd <br /> =Runr('namefile.sab' , 0+16) <br /> =Runr('namefile.sab' , 1+16) <br /> =Rund('namefile.sab' , 0) <br /> 11.09.2001 <br /> 1. Исправление: Изменена обработка управляющих блоков <br /> 09.09.2001 <br /> 1. Исправление: Исправлена ошибка определения длинны блока [Detal] <br /> 2. Исправление: Изменения в обработке концов строк <br /> 3. Увеличено количество обрабатываемых файлов от 10 до 20     </div>
<div id="sol_avtor">Автор: Куденцов Александр</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4764">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 10 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4764">AlexK</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="AlexK" href="https://foxclub.ru/account/?user=4764">
				<img alt='' src='https://secure.gravatar.com/avatar/1fb49e8f115e8786c485b8112a62a69e?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1fb49e8f115e8786c485b8112a62a69e?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 9<i class="rcli fa-calendar-check-o"></i>Регистрация: 11-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/generator-otchetov-genrep-2/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/generator-otchetov-v-excel-v-2-7/</link>
					<title><![CDATA[Генератор отчетов в Excel  (v 2.7)]]></title>
                    					    <author><![CDATA[Евгений Банщиков]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Генератор отчетов в Excel  (v 2.7)</h1>
													</header>
													<div id="sol_opis">Класс ,для построения отчетов в Microsoft Excel c использованием OLE Automation</div>
<div id="sol_body">Обновления генератора отчетов  ( http://updateapp.narod.ru/tools.html )  <br />                    =================                 <br />                    Новое в вер 2.7 <br />                    ================  </p>
<p> 1. Добавлено свойство  Composit_On_One_Sheet<br /> 2. Добавлен параметр lRest в метод Clear_group  <br /> 3. Добавлен метод Fit_Column<br /> 4. Добавлено свойство IsExcelDemo для поддержки возможности работы с неактивированным excel 2007<br /> 5. Добавлена поддержка интерфейса excel.application для 2007 офиса<br /> 6. Исправлены баги</div>
<div id="sol_avtor">Автор: Банщиков Евгений</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4947">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4947">Евгений Банщиков</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Евгений Банщиков" href="https://foxclub.ru/account/?user=4947">
				<img alt='' src='https://secure.gravatar.com/avatar/d4e4a6c8d5c8843e1223d300618e50ee?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/d4e4a6c8d5c8843e1223d300618e50ee?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 09-04-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/generator-otchetov-v-excel-v-2-7/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/korrektno-rastyagivayushhijsya-grid-pri-resajze-formy/</link>
					<title><![CDATA[Корректно растягивающийся грид при ресайзе формы]]></title>
                    					    <author><![CDATA[V-kont]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:37 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Корректно растягивающийся грид при ресайзе формы</h1>
													</header>
													<div id="sol_opis">Пример, демонстрирующий корректное растягивание при вызове ресайза формы</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: comsel, pioner-v, v-kont</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4392">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 16 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4392">V-kont</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="V-kont" href="https://foxclub.ru/account/?user=4392">
				<img alt='' src='https://secure.gravatar.com/avatar/9a68d52bdafff26c0a422d3eaf55e308?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/9a68d52bdafff26c0a422d3eaf55e308?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-09-2010        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/korrektno-rastyagivayushhijsya-grid-pri-resajze-formy/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/poluchenie-vremeni-vypolneniya-proczedury-zaprosa-i-t-d/</link>
					<title><![CDATA[Получение времени выполнения процедуры/запроса и т.д.]]></title>
                    					    <author><![CDATA[Chemberzhy]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:37 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Получение времени выполнения процедуры/запроса и т.д.</h1>
													</header>
													<div id="sol_opis">Масенькая, когда-то писанная процедурка, позволяет определить количество часов, минут и секуннд, затраченных на выполнение тех или иных задач с возвратом удобного и конфигурируемого под себя формата и стиля</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Chemberzhy</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4815">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4815">Chemberzhy</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Chemberzhy" href="https://foxclub.ru/account/?user=4815">
				<img alt='' src='https://secure.gravatar.com/avatar/302fe7d2e93c47fd84b1a40063e861fc?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/302fe7d2e93c47fd84b1a40063e861fc?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-04-2009        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/poluchenie-vremeni-vypolneniya-proczedury-zaprosa-i-t-d/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/wordbatchedit/</link>
					<title><![CDATA[WordBatchEdit]]></title>
                    					    <author><![CDATA[ry]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:37 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>WordBatchEdit</h1>
													</header>
													<div id="sol_opis">Пакетная обработка документов Word</div>
<div id="sol_body">Недавно пришлось сканировать и обрабатывать большое количество однотипных документов (инструкций по ОТ). Для автоматизации "причесывания" отсканированных текстов сделал простенькую программу. Она позволяет привести оформление всех документов в указанной папке к единому виду, а также при необходимости добавить в начало/конец каждого документа некоторый заранее подготовленный текст.<br /> Пользователь указывает следующие параметры: шрифт, размер шрифта, начертание (только полужирный и курсив), абзацные отступы, отступ первой строки,  межстрочный интервал, поля страницы. Кроме задаваемых явно параметров неявно производится следующая обработка:<br /> - устанавливается размер листа А4;<br /> - устанавливаются отступы колонтитулов 1 см сверху и 1,5 см снизу;<br /> - включается выравнивание абзацев по ширине;<br /> - включается автоматическая расстановка переносов;<br /> - добавляется нумерация страниц внизу справа, кроме первой.<br /> Все обработанные файлы сохраняются в указанной папке как копии, к названию файла добавляется слово "Обработано". Файлы *.docx не обрабатываются.<br /> Программа писалась на скорую руку и толком не тестировалась, отработав несколько раз по назначению. В архиве исходники и exe для VFP9 (без рантайма).</div>
<div id="sol_avtor">Автор: ry</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4763">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 19 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4763">ry</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="ry" href="https://foxclub.ru/account/?user=4763">
				<img alt='' src='https://secure.gravatar.com/avatar/3bc9939fe293be86b372bfb0579355cf?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/3bc9939fe293be86b372bfb0579355cf?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-09-2007        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/wordbatchedit/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/squidmonitor/</link>
					<title><![CDATA[SquidMonitor]]></title>
                    					    <author><![CDATA[Vladimir_Knyr]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:36 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>SquidMonitor</h1>
													</header>
													<div id="sol_opis">Программа для обработки лог файлов прокси сервера Squid</div>
<div id="sol_body">запуск с ключом (squidmonitor.exe /s) вставляется в планировщик для иморта файлов логов<br /> в собственную БД<br /> без ключа - интерактивный режим для визуального просмотра,<br /> настроек и получения отчетов (в HTML)</div>
<div id="sol_avtor">Автор: Vladimir_Knyr</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4754">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4754">Vladimir_Knyr</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Vladimir_Knyr" href="https://foxclub.ru/account/?user=4754">
				<img alt='' src='https://secure.gravatar.com/avatar/7dd8187cfc903829e54ae52b377e8a5a?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7dd8187cfc903829e54ae52b377e8a5a?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 15-12-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/squidmonitor/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/prostejshij-primer-raboty-s-ftp-serverom/</link>
					<title><![CDATA[Простейший пример работы с FTP-сервером]]></title>
                    					    <author><![CDATA[Chemberzhy]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:36 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Простейший пример работы с FTP-сервером</h1>
													</header>
													<div id="sol_opis">Подключение/отключение Интернет, подключение/отключение ФТП, загрузка/выгрузка/удаление/переименование файлов, создание/удаление каталогов на ФТП. Все в простом примере в одной форме, без дополнительных классов посредством использования системной библиотеки WinInet.dll</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Chemberzhy</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4815">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4815">Chemberzhy</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Chemberzhy" href="https://foxclub.ru/account/?user=4815">
				<img alt='' src='https://secure.gravatar.com/avatar/302fe7d2e93c47fd84b1a40063e861fc?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/302fe7d2e93c47fd84b1a40063e861fc?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-04-2009        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/prostejshij-primer-raboty-s-ftp-serverom/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/installyator-runtime-bibliotek-vfp9-sp2-rus/</link>
					<title><![CDATA[Инсталлятор RunTime библиотек VFP9 SP2 RUS]]></title>
                    					    <author><![CDATA[Chemberzhy]]></author>
                    										    <pubDate>Thu, 03 Nov 2022 15:53:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Инсталлятор RunTime библиотек VFP9 SP2 RUS</h1>
													</header>
													<div id="sol_opis">Инсталлятор RunTime библиотек VFP9 SP2 RUS с установкой поледних в папку Program Files/Common Files/Microsoft Shared/VFP и регистрацией. Весь процесс инсталяции идет как скрытый, что удобно для включения данного приложения в собственный инсталяционный пакет установки своих приложений на машине клиента.</div>
<div id="sol_body"> </div>
<div id="sol_avtor">Автор: Chemberzhy</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4815">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4815">Chemberzhy</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Chemberzhy" href="https://foxclub.ru/account/?user=4815">
				<img alt='' src='https://secure.gravatar.com/avatar/302fe7d2e93c47fd84b1a40063e861fc?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/302fe7d2e93c47fd84b1a40063e861fc?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-04-2009        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/installyator-runtime-bibliotek-vfp9-sp2-rus/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Файлы]]></category><category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-dlya-izmeneniya-shiriny-kolonok-mnogokolonochnogo-listbox-a-v-proczesse-vypolneniya/</link>
					<title><![CDATA[Класс для изменения ширины колонок многоколоночного ListBox-а в процессе выполнения]]></title>
                    					    <author><![CDATA[lesalesa]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:36 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс для изменения ширины колонок многоколоночного ListBox-а в процессе выполнения</h1>
													</header>
													<div id="sol_opis">Класс для изменения ширины колонок многоколоночного ListBox-а в процессе выполнения и для создания заголовков колонок ListBox-а, выполненных на основе класса CommandButton с возможностью задания кода обработки события Click для каждого заголовка. В процессе работы класса имеется возможность задания свойств каждому заголовку. Также присутствует возможность фильтрации содержимого ListBox-а по вхождению задаваемых стрингов в каждую из колонок ListBox-а.</div>
<div id="sol_body">Класс для изменения ширины колонок многоколоночного ListBox-а в процессе выполнения и для создания заголовков колонок ListBox-а, выполненных на основе класса CommandButton с возможностью задания кода обработки события Click для каждого заголовка. В процессе работы класса имеется возможность задания свойств каждому заголовку. Также присутствует возможность фильтрации содер- жимого ListBox-а по вхождению задаваемых стрингов в каждую из колонок ListBox-а.  Для использования класса достаточно разместить его на форме ( в том же контейнере, в котором  размещается соответствующий ListBox) и в свойстве ListName указать имя Listbox-а .  Свойства:  ListName         Задает имя используемого ListBox-а (Напр. List3) Дополнительные свойства и методы: is_ribbon  (.T./.F.(Default)) 	Свойство is_ribbon служит для временного изменения ширины колонок при  	нажатой левой кнопке мыши. После ее отпускания ширина колонки вернется 	к исходному значению. Это может быть полезно когда надо лишь увидеть значение 	в столбце, которое не отображается полностью из-за ограниченой ширины колонки. is_header (.T./.F.(Default)) 	Определяет наличие/отсутствие заголовков колонок. 	Не изменяется в RunTime columnsname         Задает имена для заголовков. 	Не изменяется в RunTime 	Представляет собой список имен заголовков, разделенных запятой         Например: Колонка 1,Колонка 2,Колонка 3 headheight 	Высота заголовка в пикселях (По умолчанию - 20) 	Не изменяется в RunTime 	Необходимо учитывать, что заголовок "съедает" часть высоты Listbox-а forecolor_header backcolor_header         Задаются цвета соответственно шрифта и фона заголовков. 	Не изменяется в RunTime         Цвет задается символьной строкой вида: rgb(255,255,255) is_headerplain (.T./.F.(Default)) 	Определяет вид заголовка Plain/3D 	 	Не изменяется в RunTime hwordwrap (.T./.F.(Default))         Многострочный/Однострочный заголовок	 	Не изменяется в RunTime    Дополнительной возможностью класса является возможность фильтрации  содержимого по вхождению задаваемых стрингов в каждую из колонок ListBox-а. Для этого используются следующие свойства: isfilter (.T./.F.(Default))         Определяет использование возможности фильтрации по полям ListBox-а. 	Не изменяется в RunTime filterfontcolor filterfontbold filterfontsize         Задаются характеристики  шрифта в полях фильтра.         Цвет задается символьной строкой вида: rgb(255,255,255)	 filterheight 	Высота поля фильтра в пикселях (По умолчанию - 20) 	Не изменяется в RunTime 	Необходимо учитывать, что поле фильтра "съедает" часть высоты Listbox-а tinterval         Интервал в мс для периодического объединения внешнего фильтра на таблицу с         фильтром класса и для "подстройки" ширины колонок Listbox-а в случае, если         ширины колонок были изменены вне методов класса (сторонней процедурой)  Свойства заголовков могут быть изменены в процессе выполнения программы через свойство соотв.объекта заголовка (класс CommandButton). Соотв.объект возвращается в свойстве OCMD класса после задания номера колонки в свойстве numheader. Например: resizelist2.numheader=2 resizelist2.ocmd.caption="Нов.Колонка 2"  Код обработки события Click на заголовке указывается в методе lClick. При этом свойство numheader содержит номер колонки на заголовке которой был сделан щелчок мышью.          </div>
<div id="sol_avtor">Автор: lesalesa</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3365">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3365">lesalesa</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="lesalesa" href="https://foxclub.ru/account/?user=3365">
				<img alt='' src='https://secure.gravatar.com/avatar/2853c599d2829aabe96088a469dcb3e9?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/2853c599d2829aabe96088a469dcb3e9?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 12-10-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-dlya-izmeneniya-shiriny-kolonok-mnogokolonochnogo-listbox-a-v-proczesse-vypolneniya/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/generator-otchetov-genrep-excel-html/</link>
					<title><![CDATA[Генератор отчетов Genrep (Excel, html)]]></title>
                    					    <author><![CDATA[AlexK]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:36 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Генератор отчетов Genrep (Excel, html)</h1>
													</header>
													<div id="sol_opis">Генератор из dbf,txt,Sql для вывода в Word, Excel, Html, TXT</div>
<div id="sol_body"><img loading="lazy" decoding="async" src="http://genrep.nm.ru/site/graf/excel.jpg" border="0" width="24" height="24"><b>  Genrep mini 2.0 </b></p>
<p> Новые шаблоны:<br /> .sbx - Вывод в <b>Excel</b> файл <br /> .txh - Вывод в <b>html</b> файл</p>
<p> Старые шаблоны:<br /> .sab - шаблон для Word<br /> .txs - Вывод в текстовый файл</p>
<p> В архиве:<br /> reg_file  - зарегистрировать расширения файлов шаблонов<br /> test	- шаблоны создаваемые генераторм <br /> work 	- примеры работающих html, txt, word, Excel шаблонов<br /> sql 	- примеры работы с источниками ADODB  <br /> sсripts- примеры работы Windows Script Host  </p>
<p> Excel на основе xml<br /> Нtml на основе тестового шаблона </p>
<p>Экраны  <a href="http://genrep.nm.ru/site/screens.html">здесь</a> или <a href="http://genrep.ru/screens.html">http://genrep.ru</a>  </p>
<p>21.11.2009: <br />Добавлена работа с источником данных <b>SQL</b> ADODB  ( <a href="http://genrep.net/adodb.html">http://genrep.net/adodb.html</a> )  <br />Добавлены примеры работы с генератором для vbs <b>Windows Script Host</b>  <br />30.11.2009 <br />Исправлена ошибка подключения ADODB <br />12.12.2009 <br />Обновление описания   </div>
<div id="sol_avtor">Автор: AlexK</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4764">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 10 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4764">AlexK</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="AlexK" href="https://foxclub.ru/account/?user=4764">
				<img alt='' src='https://secure.gravatar.com/avatar/1fb49e8f115e8786c485b8112a62a69e?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1fb49e8f115e8786c485b8112a62a69e?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 9<i class="rcli fa-calendar-check-o"></i>Регистрация: 11-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/generator-otchetov-genrep-excel-html/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/nastraivaemyj-grid/</link>
					<title><![CDATA[Настраиваемый Grid.]]></title>
                    					    <author><![CDATA[BSA]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:36 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Настраиваемый Grid.</h1>
													</header>
													<div id="sol_opis">Grid с возможностью настраивания пользователем.</div>
<div id="sol_body">Выкладывал данный класс, в примере с работой с KLADR. </p>
<p> Тоже решил в свое время идея сделать настраиваемый справочник.<br /> И так, что на данный момент имеем:<br /> Для открытия любой таблицы передаем ее в качестве параметра:</p>
<p> Do form fKLS with ‘name_table’</p>
<p> Если данная таблица настраивалась раннее, то откроется в запомненном виде, первоначально открываются все поля. Есть кнопочки для работы со справочником.</p>
<p> Ctrl+F – поиск<br /> Ctrl+G – продолжить поиск</p>
<p> Двойной клик по записи – выбор.</p>
<p> Двойной клик по Header – сортировка по столбцу(если табла открыта эксклюзивно, при отсутствии Order_a предлагает его создать)</p>
<p> Для настройки справочника, необходимо кликнуть на форме с нажатым Alt. Появятся две дополнительные кнопочки, «настроить представление» и «сохранить представление».</p>
<p>  ------- сделал подсветку активной строки; при сортировке выделяется header.caption жирным, раньше красился сам header; если тип данных Date при правом клике открывается календарик; имеется возможность создания своего popup  вроде еще чтото менял...   ------- (31/12/2009) ------- доработал поиск, в прилагаемом примере одно поле связано со справочником, к сожалению подсветку строки пришлось убрать (ужасные тормоза, при значении из стороннего справочника)</div>
<div id="sol_avtor">Автор: BSA</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4540">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4540">BSA</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="BSA" href="https://foxclub.ru/account/?user=4540">
				<img alt='' src='https://secure.gravatar.com/avatar/e33ce180f759a30391c546740c30edb6?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e33ce180f759a30391c546740c30edb6?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 26-05-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/nastraivaemyj-grid/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/dvuhczvetnyj-obemnyj-shrift/</link>
					<title><![CDATA[Двухцветный объемный шрифт]]></title>
                    					    <author><![CDATA[Chemberzhy]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:36 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Двухцветный объемный шрифт</h1>
													</header>
													<div id="sol_opis">В архиве два шрифта (для BackColor и BorderColor), для установки в систему и класс- пример. Можно просто положить на форму в одну точку два прозрачных Label и одному присвоить шрифт Заливки(BackColor), а другому- контура(BorderColor)</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Chemberzhy</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4815">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4815">Chemberzhy</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Chemberzhy" href="https://foxclub.ru/account/?user=4815">
				<img alt='' src='https://secure.gravatar.com/avatar/302fe7d2e93c47fd84b1a40063e861fc?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/302fe7d2e93c47fd84b1a40063e861fc?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-04-2009        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/dvuhczvetnyj-obemnyj-shrift/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/utilita-dlya-polucheniya-kursov-valyut-s-sajta-www-cbr-ru/</link>
					<title><![CDATA[Утилита для получения курсов валют с сайта www.cbr.ru]]></title>
                    					    <author><![CDATA[urfin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:36 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Утилита для получения курсов валют с сайта www.cbr.ru</h1>
													</header>
													<div id="sol_opis">Написана для поддержания работы старой софтины на FPD2.6</div>
<div id="sol_body">[code] * ПОЛУЧЕНИЕ КУРСОВ ВАЛЮТ ЗА ПЕРИОД С САЙТА WWW.CBR.RU * ОПИСАНИЕ : http://www.cbr.ru/scripts/Root.asp?Prtid=SXML * ЗАГРУЗКА : http://www.cbr.ru/scripts/XML_daily.asp?date_req=02/03/2002 * СТРУКТУРА XML ФАЙЛА МОЖЕТ БЫТЬ ИЗМЕНЕНА ЦБ БЕЗ ПРЕДУПРЕЖДЕНИЯ 😉  LPARAMETERS tuBeg AS Variant, tuEnd AS Variant, tuPath AS Variant,; 	tuStub1 AS Variant, tuStub2 AS Variant, tuStub3 AS Variant, tuStub4 AS Variant, tuStub5 AS Variant LOCAL loException AS Exception, ldBeg AS Datetime, ldEnd AS Datetime, ldCur AS Date, lnDay AS Integer,; 	lcAddress AS String, lcXMLFile AS String, lnSuccess AS Integer, lnSum AS Decimal, lcPath AS String #DEFINE APP_NAME	'Загрузка курсов валют с сайта WWW.CBR.RU' #DEFINE CHR_CR		CHR(13) #DEFINE CHR_CR2		CHR(13) + CHR(13) #DEFINE CHR_TAB		CHR(09) lnSuccess = 0 TRY 	ON SHUTDOWN QUIT 	* СДЕЛАЕМ ТЕКУЩИМ СТАРТОВЫЙ КАТАЛОГ 	Application.DefaultFilePath = ADDBS(JUSTPATH(SYS(16, PROGRAM(-1)))) 	tuBeg = TRANSFORM(tuBeg) 	tuEnd = TRANSFORM(tuEnd) 	ldBeg = TTOD(CTOT(LEFT(tuBeg, 4) + '-' + SUBSTR(tuBeg, 5, 2) + '-' + SUBSTR(tuBeg, 7, 2)+'T')) 	ldEnd = TTOD(CTOT(LEFT(tuEnd, 4) + '-' + SUBSTR(tuEnd, 5, 2) + '-' + SUBSTR(tuEnd, 7, 2)+'T')) 	lcPath = IIF(VARTYPE(tuPath) = 'C' AND !EMPTY(tuPath), ADDBS(ALLTRIM(tuPath)), '') 	DO CASE 	CASE PCOUNT() = 0 		MESSAGEBOX('Параметры : даты начала и окончания в виде ГГГГММДД' + CHR_CR2 +; 			'Пример применения : currency.exe ' + DTOS(DATE() - DAY(DATE()) + 1) + ' ' +; 			DTOS(GOMO(DATE() - DAY(DATE()) + 1, 1) - 1), 64, APP_NAME) 	CASE !IsInternetConnected() 		MESSAGEBOX('Компьютер не подключен к интернету', 48, APP_NAME) 	CASE PCOUNT() = 1 		MESSAGEBOX('Не задана дата окончания периода', 48, APP_NAME) 	CASE EMPTY(ldBeg) AND EMPTY(ldEnd) 		MESSAGEBOX('Неверные даты в периоде : ' + tuBeg + ' ' + tuEnd, 48, APP_NAME) 	CASE EMPTY(ldBeg) 		MESSAGEBOX('Неверная дата начала периода : ' + tuBeg, 48, APP_NAME) 	CASE EMPTY(ldEnd) 		MESSAGEBOX('Неверная дата окончания периода : ' + tuEnd, 48, APP_NAME) 	CASE ldBeg > ldEnd 		MESSAGEBOX('Дата начала периода позже даты окончания', 48, APP_NAME) 	CASE !EMPTY(lcPath) AND !DIRECTORY(lcPath) 		MESSAGEBOX('Не найден каталог' + CHR_CR2 + lcPath, 48, APP_NAME) 	OTHERWISE 		IF USED('Currency') 			* ВЫБЕРЕМ АЛИАС 			SELECT Currency 			SET ORDER TO Date 		ELSE 			IF !FILE(lcPath + 'Currency.dbf') 				* СОЗДАДИМ КУРСОР 				CREATE CURSOR Currency (Date D, Code N(3), Quant N(9), Sum N(11,4)) 				INDEX ON Date TAG Date 			ELSE 				* ОТКРОЕМ ТАБЛИЦУ 				USE (lcPath + 'Currency') ORDER Date IN 0 			ENDIF 		ENDIF 		* ЦИКЛ ПО ДАТАМ В ПЕРИОДЕ 		FOR lnDay = 0 TO ldEnd - ldBeg 			* ТЕКУЩАЯ ДАТА 			ldCur = ldBeg + lnDay 			lcAddress = 'http://www.cbr.ru/scripts/XML_daily.asp?date_req=' +; 				TRANSFORM(DAY(ldCur), '@L 99') + '/' +; 				TRANSFORM(MONTH(ldCur), '@L 99') + '/' +; 				TRANSFORM(YEAR(ldCur), '@L 9999') 			lcXMLFile = ADDBS(SYS(2023)) + SYS(2015) + '.TMP' 			* ЗАГРУЗИМ ФАЙЛ И СОХРАНИМ ЕГО ЛОКАЛЬНО 			IF IsFileDownloaded(lcAddress, lcXMLFile) 				SET KEY TO ldCur 				IF XMLTOCURSOR(lcXMLFile, 'Temp', 512) > 0 					IF VARTYPE(Value) = 'C' AND VARTYPE(NumCode) = 'N' AND VARTYPE(Nominal) = 'N' 						* ЦИКЛ ПО ВАЛЮТАМ НА ДАТУ 						* MESSAGEBOX('Загрузка курсов валют за ' + DTOS(ldCur), 64, APP_NAME, 1) 						SCAN 							lnSum = EVAL(CHRTRAN(CHRTRAN(Value, ',', '.'), CHR(160), '')) 							SELECT Currency 							LOCATE FOR Code = Temp.NumCode 							IF FOUND() 								REPLACE Code WITH Temp.NumCode, Quant WITH Temp.Nominal, Sum WITH lnSum 							ELSE 								INSERT INTO Currency (Date, Code, Quant, Sum) VALUES; 									(ldCur, Temp.NumCode, Temp.Nominal, lnSum) 							ENDIF 							lnSuccess = lnSuccess + 1 						ENDSCAN 					ELSE 						MESSAGEBOX('Неверная структура XML курсора с курсами за ' + DTOS(ldCur) +; 							CHR_CR2 + FILETOSTR(lcXMLFile), 64, APP_NAME) 					ENDIF 				ENDIF 				USE 				SELECT Currency 				SET KEY TO 				ERASE (lcXMLFile) 			ELSE 				MESSAGEBOX('Не удалось получить XML файл с курсами валют за ' + DTOS(ldCur), 64, APP_NAME) 			ENDIF 		ENDFOR 		* СОХРАНИМ КУРСОР В FPD DBF 		IF !FILE(lcPath + 'Currency.dbf') 			COPY TO (lcPath + 'Currency') TYPE FOX2X AS 866 			USE Currency EXCLUSIVE 			INDEX ON Code TAG Code 			INDEX ON Date TAG Date DESCENDING 		ENDIF 	ENDCASE CATCH TO loException 	* ВЫДАДИМ СООБЩЕНИЕ ОБ ОШИБКЕ 	DO ShowError WITH loException ENDTRY RETURN lnSuccess  * ПОДКЛЮЧЕН ЛИ КОМПЬЮТЕР К ИНТЕРНЕТУ ? FUNCTION IsInternetConnected LOCAL lnFlags AS Integer DECLARE SHORT InternetGetConnectedState IN WININET LONG @, LONG lnFlags = 0 InternetGetConnectedState(@lnFlags, 0) CLEAR DLLS 'InternetGetConnectedState' RETURN !INLIST(lnFlags, 0, 16, 32, 48)  * УСПЕШНО ЛИ ЗАГРУЖЕН ФАЙЛ ? FUNCTION IsFileDownloaded LPARAMETERS tcSourceFile AS String, tcTargetFile AS String IF !FILE(tcTargetFile) 	DECLARE INTEGER URLDownloadToFile IN URLMON.DLL LONG, STRING, STRING, LONG, LONG 	URLDownloadToFile(0, tcSourceFile, tcTargetFile, 0, 0) 	CLEAR DLLS 'URLDownloadToFile' 	RETURN FILE(tcTargetFile) ENDIF RETURN .F.  * СООБЩЕНИЕ ОБ ОШИБКЕ PROCEDURE ShowError LPARAMETERS toException AS Exception LOCAL lcErrorNo AS String, lcMessage AS String, lcStackLevel AS String,; 	lcProcedure AS String, lcLineNo AS String, lcLineContents AS String TRY 	lcErrorNo = 'Номер ошибки' + CHR_TAB + ': ' + TRANSFORM(toException.ErrorNo) + CHR_CR 	lcMessage = 'Сообщение' + CHR_TAB + ': ' + toException.Message + CHR_CR 	lcStackLevel = 'Уровень стека' + CHR_TAB + ': ' + TRANSFORM(toException.StackLevel) + CHR_CR 	lcProcedure = 'Процедура' + CHR_TAB + ': ' + toException.Procedure + CHR_CR 	lcLineNo = 'Номер строки' + CHR_TAB + ': ' + TRANSFORM(toException.LineNo) 	lcLineContents = IIF(Application.Startmode = 0,; 		CHR_CR + 'Содержимое' + CHR_TAB + ': ' + toException.LineContents, '') 	MESSAGEBOX(lcErrorNo + lcMessage + lcStackLevel + lcProcedure + lcLineNo + lcLineContents, 16, APP_NAME) CATCH 	MESSAGEBOX('Ошибка при попытке вывести сообщение об ошибке', 16, APP_NAME) ENDTRY RETURN  * КУРС USD ЗА ПЕРИОД * http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=01/11/2009&date_req2=30/11/2009&VAL_NM_RQ=R01235 [/code]</div>
<div id="sol_avtor">Автор: urfin</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4641">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 7 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4641">urfin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="urfin" href="https://foxclub.ru/account/?user=4641">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/4641-70x70.png?ver=1757136223' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/4641.png?ver=1757136223 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-08-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/utilita-dlya-polucheniya-kursov-valyut-s-sajta-www-cbr-ru/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/generator-otchetov-genrep-3/</link>
					<title><![CDATA[Генератор отчетов Genrep]]></title>
                    					    <author><![CDATA[AlexK]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:34 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Генератор отчетов Genrep</h1>
													</header>
													<div id="sol_opis">Измененный генератор отчетов для использования c Open Office</div>
<div id="sol_body">Обновление генератора отчетов GenRep ( http://genrep.narod.ru, http://alkud.by.ru ) </p>
<p> 1.Добавлена поддержка работы с Open Office 2.2.1<br /> 2.Исправлена ошибка обработки конца управляющих тегов<br /> 3.Изменен запуск приложения для редактирования и просмотра отчетов<br /> на стандартный через ShellExecute</p>
<p> предыдущая версия:<br /> http://www.foxclub.ru/sol/index.php?act=view&id=126</div>
<div id="sol_avtor">Автор: AlexK</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4764">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 10 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4764">AlexK</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="AlexK" href="https://foxclub.ru/account/?user=4764">
				<img alt='' src='https://secure.gravatar.com/avatar/1fb49e8f115e8786c485b8112a62a69e?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1fb49e8f115e8786c485b8112a62a69e?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 9<i class="rcli fa-calendar-check-o"></i>Регистрация: 11-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/generator-otchetov-genrep-3/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/dbf-create-table-string/</link>
					<title><![CDATA[DBF -&gt; Create Table string]]></title>
                    					    <author><![CDATA[Lwa]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:36 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>DBF -&gt; Create Table string</h1>
													</header>
													<div id="sol_opis">Что программа делает - открывает DBF-таблицу и формирует строку Create Table для FoxPro и MSSQL 2008, плюс формирует программное создание КурсорАдаптера - все эти результаты можно сохранить в log файл.</div>
<div id="sol_body">Когда-то переписывал программу с DBF под MSSQL 2008, быстренько сваял на коленке программку - что бы вручную не описывать структуру при создании когда-то давно вручную созданных таблиц.<br />   Недавно с тоски и печали довел более-менее до ума и выкидываю сдесь, может кому и пригодится.</p>
<p>   Что делает - открывает DBF-таблицу и формирует строку Create Table для FoxPro и MSSQL 2008, плюс формирует программное создание КурсорАдаптера - все эти результаты можно сохранить в log файл.<br />   Типы полей только те, что сам использовал - Character, Memo, Numeric, Date, Datetime, Logical.<br />   Под MSSQL 2008 потому, что в нем появился есть тип поля Date.<br />   Default в полях Date, Datetime всегда NULL, в остальных предпочитал всегда NOT NULL с соответствующими Default.<br />   Constraint примается равным Table_column.<br />   Null, Default, Constraint и Collate можно указывать, можно нет.<br />   Длину Char при преобразовании из Memo и выражение Collate можно изменять.</p>
<p>   Сильно не бейте за такое, будут замечания - если не в лом будет то доделаю по вашей просьбе или выложу исходники.<br />   Здравая критика принимается, просьба понимать, что от коленочного варианта программка далеко не ушла, да и смысла не вижу.</p>
<p>   Сделано на Visual FoxPro 9 SP2, потому Нужны только vfp9r.dll и vfp9rrus.dll</p></div>
<div id="sol_avtor">Автор: Lwa</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4290">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 19 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4290">Lwa</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Lwa" href="https://foxclub.ru/account/?user=4290">
				<img alt='' src='https://secure.gravatar.com/avatar/91e4f1f38b98c90550b5903c79555e8b?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/91e4f1f38b98c90550b5903c79555e8b?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 04-03-2007        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/dbf-create-table-string/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-dlya-vvoda-i-redaktirovaniya-ip-adresa-v-peremennoj-ili-tablicze/</link>
					<title><![CDATA[Класс для ввода и редактирования IP-адреса в переменной или таблице.]]></title>
                    					    <author><![CDATA[Crispy]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:36 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс для ввода и редактирования IP-адреса в переменной или таблице.</h1>
													</header>
													<div id="sol_opis">Позволяет вводить/изменять IP-адрес путем ввода цифр с клавиатуры, либо стрелками вверх-вниз, либо колесиком мышки. Ограничивает ввод 0-255.</div>
<div id="sol_body">Тестировался для ввода/изменения IP-адреса, представляющего собой глобальную переменную или свойство формы, либо же - поле таблицы.<br /> Имя переменной заносится в свойство TAG экземпляра класса. Eсли переменная - свойство формы, то примерно в таком виде: thisform.IP, если же переменная является полем таблицы, тогда как-то так: table1.IP (для текущего алиаса, алиас можно и не указывать), в этом случае кроме занесения в TAG имени поля, необходимо также сделать непустым дополнительно еще и свойство класса Comment, поместив туда произвольные символы, например слово Table. <br /> Т.е. по свойству Comment класс определяет, чем оперирует - обычной переменной, если свойство Comment пустое, или же полем таблицы, если оно непустое.<br /> Переключение с одного числа в адресе IP на следующее можно осуществлять клавишей табуляции или точкой.<br /> Возможна прокрутка каждого числа с помощью стрелок вверх-вниз или колесика мыши в пределах 0-255. <br /> Изменение самой переменной или поля происходит стандартным образом - после нажатия Enter, либо после выхода за пределы последней правой цифры.<br /> Ограничения на версию FoxPro связаны с использованием функции GETWORDNUM().</div>
<div id="sol_avtor">Автор: Crispy</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4819">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4819">Crispy</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Crispy" href="https://foxclub.ru/account/?user=4819">
				<img alt='' src='https://secure.gravatar.com/avatar/48a3902acba9a2d85995b342a89fda7b?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/48a3902acba9a2d85995b342a89fda7b?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 16-05-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-dlya-vvoda-i-redaktirovaniya-ip-adresa-v-peremennoj-ili-tablicze/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/otpravka-sms-soobshhenij-iz-foxa-cherez-sotovyj-telefon-podklyuchennyj-k-com-portu-reinkarnacziya-2009/</link>
					<title><![CDATA[Отправка SMS сообщений из FOXа через сотовый телефон, подключенный к COM порту. Реинкарнация :-)2009]]></title>
                    					    <author><![CDATA[GEO]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:36 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Отправка SMS сообщений из FOXа через сотовый телефон, подключенный к COM порту. Реинкарнация :-)2009</h1>
													</header>
													<div id="sol_opis">Реинкарнация старого набора функций для отправки СМС. Теперь в виде класса, (спасибо неизвестному коллеге), а так же возможность отправлять русские СМС, втом числе длинее 70 знаков, то есть фактически длина сообщения не ограничена.  Сейчас пользоваться этим стало намного удобнее, нужен только абсолютно любой GSM телефон и немного времени. Во вложении пример в виде проекта, из которого все более менее понятно.  Возможно пригодиться кому то.</div>
<div id="sol_body">Когда то (году в 2003-м) я выкладывал решение "Отправка SMS...". Редактирование этого решения сейчас уже мне недоступно, поэтому выложу отдельно, а администратор пусть уже разберется, какое удалить. Год назад трудами коллег с этого сайта набор функций был даже оформлен в класс, который я получил обратно уже из третьих рук,(кто-то создавал приложение для диспетчера такси и понадобилась функция отправки SMS). Класс я дополнил возможностью не только отправлять русские СМС, но и так называемые "длинные" СМС, это когда в сообщении может быть до 254 символов и более.  Сейчас пользоваться этим стало намного удобнее, нужен только абсолютно любой GSM телефон и немного времени. Во вложении пример в виде проекта, из которого все более менее понятно.  Возможно пригодиться кому то.</div>
<div id="sol_avtor">Автор: geo</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3004">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3004">GEO</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="GEO" href="https://foxclub.ru/account/?user=3004">
				<img alt='' src='https://secure.gravatar.com/avatar/c3e83ebf7575f8d5ac8fd93bc31f9603?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c3e83ebf7575f8d5ac8fd93bc31f9603?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-07-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/otpravka-sms-soobshhenij-iz-foxa-cherez-sotovyj-telefon-podklyuchennyj-k-com-portu-reinkarnacziya-2009/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/fajl-win32api_vfpconst-h-soderzhashhij-obyavleniya-konstant-dlya_x000d_ispolzovaniya-v-vyzovah-win32api-funkczij/</link>
					<title><![CDATA[Файл win32api_vfpconst.h содержащий объявления констант для использования в вызовах Win32Api функций.]]></title>
                    					    <author><![CDATA[lesalesa]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:36 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Файл win32api_vfpconst.h содержащий объявления констант для использования в вызовах Win32Api функций.</h1>
													</header>
													<div id="sol_opis">Переведенный в синтаксис VFP файл объявлений констант WINAPI.TXT для MS Visual Basic.</div>
<div id="sol_body">Переведенный в синтаксис VFP файл объявлений констант WINAPI.TXT для<br /> MS Visual Basic.</div>
<div id="sol_avtor">Автор: lesalesa</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3365">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3365">lesalesa</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="lesalesa" href="https://foxclub.ru/account/?user=3365">
				<img alt='' src='https://secure.gravatar.com/avatar/2853c599d2829aabe96088a469dcb3e9?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/2853c599d2829aabe96088a469dcb3e9?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 12-10-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/fajl-win32api_vfpconst-h-soderzhashhij-obyavleniya-konstant-dlya_x000d_ispolzovaniya-v-vyzovah-win32api-funkczij/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/programma-dlya-dokumentaczii-tablicz-v-baze-dannyh-kataloge/</link>
					<title><![CDATA[Программа для документации таблиц в базе данных (каталоге).]]></title>
                    					    <author><![CDATA[lesalesa]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:36 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Программа для документации таблиц в базе данных (каталоге).</h1>
													</header>
													<div id="sol_opis">Приведены исходники программы для вывода в HTM структуры базы данных или таблиц в указанном каталоге. Это исходники соотв.программы, расположенной в разделе Решения-&gt;Распространение программ.    Все немножко устарело, но ,возможно, кому-то пригодится </div>
<div id="sol_body">Приведены исходники программы для вывода в HTM структуры базы данных<br /> или таблиц в указанном каталоге. Это исходники соотв.программы, расположенной в разделе Решения->Распространение программ.<br />    Все немножко устарело, но ,возможно, кому-то пригодится.</div>
<div id="sol_avtor">Автор: lesalesa</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3365">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3365">lesalesa</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="lesalesa" href="https://foxclub.ru/account/?user=3365">
				<img alt='' src='https://secure.gravatar.com/avatar/2853c599d2829aabe96088a469dcb3e9?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/2853c599d2829aabe96088a469dcb3e9?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 12-10-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/programma-dlya-dokumentaczii-tablicz-v-baze-dannyh-kataloge/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Импорт-экспорт]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-dlya-svyazi-s-internet-serverom-vyzov-php-skriptov-s-pomoshhyu-winapi-windows-socket-2/</link>
					<title><![CDATA[Класс для связи с Интернет сервером (вызов PHP &#8211; скриптов) с помощью WinAPI Windows Socket 2]]></title>
                    					    <author><![CDATA[Asws]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:36 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс для связи с Интернет сервером (вызов PHP &#8211; скриптов) с помощью WinAPI Windows Socket 2</h1>
													</header>
													<div id="sol_opis">Десктопное приложение + функционал сервера (посредник -  PHP - скрипты). Вызов PHP-скриптов. Помните об атаках на сервер, если передаваемый скрипту параметр содержит кусок SQL - запроса, например '1 OR 1=1; SELECT * FROM TABLE //' Приведенный параметр содержит условие выборки, которое всегда истинно и делает второй запрос SELECT, после чего комментирует ('//') всю Вашу остальную строку запроса. Нужно проверять принимаемые скриптом параметры на такие значения. Подробнее об атаках см. http://ru.wikipedia.org/wiki/SQL_injection</div>
<div id="sol_body">* Пример шаблона скрипта PHP см. в файле load.php в прикрепленном архиве</p>
<p> [code] cURL='http://www.subdomain.site.ru'	&&	адрес субдомена, где лежат PHP - скрипты cLOAD='load.php'		&&	Скрипт для выборки информации из базы данных cSAVE='save.php'		&&	Скрипт для записи в базу данных cLogin='login'			&&	Логин cPassword='pass'		&&	Пароль nTemp=0 cData=''                        &&      Передаваемый кусок информации (файл например)  O_WS=CREATEOBJECT("CWinSocket")  * см. описание к методу Post как передавать в него параметры (ниже в классе в заголовке метода)  ************************************************************************************************* * ЧТЕНИЕ ДАННЫХ С СЕРВЕРА *************************************************************************************************  if	O_WS.Init()=.F.   O_WS.Disconnect else   O_WS.HostAssign(substr(cURL,8,len(cURL)-7))   if	alltrim(O_WS.IP)0 			lcStr=lcStr+"--"+lcB+crlf+'Content-Disposition: form-data; name="'+substr(cStr,1,lT1)+'"'+crlf+crlf 			lcStr=lcStr+alltrim(substr(cStr,lT1+2,len(cStr)-lT1+1))+crlf+'--'+lcB+'--'+crlf 		else 			lcStr=lcStr+"--"+lcB+crlf+'Content-Disposition: form-data; name="'+cStr+'"'+crlf+crlf 			lcStr=lcStr+pcData+crlf+'--'+lcB+'--'+crlf 		endif 		THIS.snd('Content-Length: '+alltrim(str(len(lcStr)))+crlf) 		THIS.snd(crlf) && End of headers 		THIS.snd(lcStr,.t.) && get a response, too. 	else 		if	!empty(pcData) 			THIS.snd(crlf)			&& End of headers 			THIS.snd(pcData,.t.)	&& get a response, too. 		else 			THIS.snd(crlf,.t.)		&& get a response, too. 		endif 	endif 	lResult = .T.   ELSE 	lResult = .F.   ENDIF   THIS.Disconnect()   This.cString=lcStr ENDFUNC    FUNCTION snd(cData, lResponse)     LOCAL cBuffer, nResult, cResponse     cBuffer = cData && + CrLf     nResult = send(THIS.hSocket, @cBuffer, Len(cBuffer), 0)     IF nResult = SOCKET_ERROR         RETURN .F.     ENDIF     IF Not lResponse         RETURN .T.     ENDIF      LOCAL hEventRead, nWait, cRead     DO WHILE .T.         * creating event, linking it to the socket and wait         hEventRead = WSACreateEvent()         = WSAEventSelect(THIS.hSocket, hEventRead, FD_READ)          * 1000 milliseconds can be not enough         THIS.WaitForRead = WSAWaitForMultipleEvents(1, @hEventRead, 0, THIS.Time_out, 0)         = WSACloseEvent(hEventRead)          IF THIS.WaitForRead  0 && error or timeout             EXIT         ENDIF                  * reading data from connected socket         THIS.cIn = THIS.cIn+THIS.Rd()     ENDDO   RETURN .T.   ENDFUNC    PROTECTED FUNCTION Rd   #DEFINE READ_SIZE 65536		&&	16384     LOCAL cRecv, nRecv, nFlags     cRecv = Repli(Chr(0), READ_SIZE)     nFlags = 0     nRecv = recv(THIS.hSocket, @cRecv, READ_SIZE, nFlags)     RETURN Iif(nRecv																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-hranilishhe-ikonok-i-lyuboj-drugoj-dvoichnoj-informaczii/</link>
					<title><![CDATA[Класс-хранилище иконок и любой другой двоичной информации.]]></title>
                    					    <author><![CDATA[Влад Колосов]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:36 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс-хранилище иконок и любой другой двоичной информации.</h1>
													</header>
													<div id="sol_opis">Демонстрационный пример, показывающий вариант сохранения двоичных данных в свойствах класса, например, сохранение иконок в виду свойств.</div>
<div id="sol_body">После нескольких попыток сохранить двоичные данные в свойстве класса оказалось, что данные сохранядтся лишь до первого двоичного нуля. Видимо, это свзяано с интерпретацией нуля как конца строки, а все свойства в фоксе объявлены как строки на языке С. Потом пришла идея воспользоваться возможностью текстового представления двоичных данных (после работы над почтовой программой). Эта возможность как раз появилась в 9-й версии VFP в виде добавления новых параметров функции STRCONV(). Таким образом, фокс может сохранять данные в base64 кодировке в свойствах и проеобразовывать их обратно в двоичный вид!</div>
<div id="sol_avtor">Автор: Влад Колосов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4894">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4894">Влад Колосов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Влад Колосов" href="https://foxclub.ru/account/?user=4894">
				<img alt='' src='https://secure.gravatar.com/avatar/6d059ca093aa6e3bd9ac83999fb80409?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/6d059ca093aa6e3bd9ac83999fb80409?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 05-05-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-hranilishhe-ikonok-i-lyuboj-drugoj-dvoichnoj-informaczii/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/otchet-v-excel-2/</link>
					<title><![CDATA[Отчет в Excel]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:36 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Отчет в Excel</h1>
													</header>
													<div id="sol_opis">Отчет в Excel</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: AlexW</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/otchet-v-excel-2/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/nabor-utilit-preobrazovaniya-dannyh-i-vyvoda-na-pechat/</link>
					<title><![CDATA[Набор утилит преобразования данных и вывода на печать]]></title>
                    					    <author><![CDATA[zhsoft]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:36 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Набор утилит преобразования данных и вывода на печать</h1>
													</header>
													<div id="sol_opis">Печать dos документов на принтерах не поддерживающих dos печать. Печать любого dos файла *.rep, брошенного в каталог программы. Печать платежных поручений, перед печатью их можно дорабатывать. Печать объявлений о сдачи выручки. Раздел Б по российскому и импортному товару. Преобразование dbf файлов в формат Excel. Конвертации любых dos документов в формат MS Word. Обработка печати картинок системы электронной сертификации. Печать торговых, финансовых и некоторых отчетных документов в графическом формате.</div>
<div id="sol_body">Здесь приведен исходный код готового решения (сборка VFP от 5.0), которое мной используется с dos информационной систеиой. На программу есть инструкция пользователя и программиста. Может быть кому-то это будет полезно!</div>
<div id="sol_avtor">Автор: Андрей</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4513">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 18 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4513">zhsoft</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="zhsoft" href="https://foxclub.ru/account/?user=4513">
				<img alt='' src='https://secure.gravatar.com/avatar/d8aa3d711ab65ce1c61956f969a491e3?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/d8aa3d711ab65ce1c61956f969a491e3?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 21-07-2008        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/nabor-utilit-preobrazovaniya-dannyh-i-vyvoda-na-pechat/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/msgbox-s-vydeleniem-podstrok-czvetom-shriftom/</link>
					<title><![CDATA[Msgbox с выделением подстрок цветом/шрифтом]]></title>
                    					    <author><![CDATA[Андрей Тарасов]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:36 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Msgbox с выделением подстрок цветом/шрифтом</h1>
													</header>
													<div id="sol_opis">Замена стандартной функции messagebox() Отличия: - собственные наборы кнопок (помимо стандартных); - собственные картинки (помимо стандартных); - выделение любых частей сообщения цветом и/или шрифтом; - выравнивание текста влево, по центру, вправо; - возможность реализации многоязычного интерфейса; - возможность приведения внешнего msgbox() к единому стилю приложения.</div>
<div id="sol_body">Описание см. в файлах msgbox.prg, msgbox.h<br /> Запускать файл examples.prg</div>
<div id="sol_avtor">Автор: А.Тарасов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4787">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4787">Андрей Тарасов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Андрей Тарасов" href="https://foxclub.ru/account/?user=4787">
				<img alt='' src='https://secure.gravatar.com/avatar/1ed364b4b8071e80f5c10332d8268ba0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1ed364b4b8071e80f5c10332d8268ba0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 05-02-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/msgbox-s-vydeleniem-podstrok-czvetom-shriftom/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/browse-i-grid-s-nazvaniyami-polej-na-naczionalnom-alfavite-kak-hranit-atributy-kolonok-v-tablicze-i-zadejstvovat-ih/</link>
					<title><![CDATA[BROWSE и GRID с названиями полей на национальном алфавите. Как хранить атрибуты колонок в таблице и задействовать их.]]></title>
                    					    <author><![CDATA[mayil]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:36 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>BROWSE и GRID с названиями полей на национальном алфавите. Как хранить атрибуты колонок в таблице и задействовать их.</h1>
													</header>
													<div id="sol_opis">Полям таблицы можно присваивать пока либо русские, либо внглийские имена. А что делать азербайджанцам, грузинам, армянам. Windows'а на этих языках пока нет. Вот и выкручиваемся...</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: mayil</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4612">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4612">mayil</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="mayil" href="https://foxclub.ru/account/?user=4612">
				<img alt='' src='https://secure.gravatar.com/avatar/1fca62caf621fc2e97be89ef5d07f880?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1fca62caf621fc2e97be89ef5d07f880?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 20-06-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/browse-i-grid-s-nazvaniyami-polej-na-naczionalnom-alfavite-kak-hranit-atributy-kolonok-v-tablicze-i-zadejstvovat-ih/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/preobrazovanie-form-otchetov-menyu-v-1251/</link>
					<title><![CDATA[Преобразование форм, отчетов, меню в 1251]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:35 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Преобразование форм, отчетов, меню в 1251</h1>
													</header>
													<div id="sol_opis">При перекомпиляции на Windows из 2.6 не преобразует автоматом кодовую страницу. Данная прога преобразует кодовую страницу, после чего импортируйте в VFP</div>
<div id="sol_body">fullconv.prg - заполнить пути к каталогам и запустить<br /> проверить все ли ОК<br /> и запустить copyback.prg (также пути нужны 🙂<br /> также функция перевода кодовой страницы.</div>
<div id="sol_avtor">Автор: Black Cat</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/preobrazovanie-form-otchetov-menyu-v-1251/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/preobrazovanie-sistem-schisleniya/</link>
					<title><![CDATA[Преобразование систем счисления]]></title>
                    					    <author><![CDATA[INB]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:35 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Преобразование систем счисления</h1>
													</header>
													<div id="sol_opis">Преобразование систем счисления.</div>
<div id="sol_body">1) Преобразование целого десятичного числа в ЛЮБУЮ комбинационную систему  счисления. Функция - fConvD().</p>
<p> 2) Преобразование целого числа ЛЮБОЙ комбинационной системы счисления в  десятичное. Функция - fConvK().</p>
<p> Программа теста. Описание функций смотрите в PRG.</div>
<div id="sol_avtor">Автор: INB</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4622">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4622">INB</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="INB" href="https://foxclub.ru/account/?user=4622">
				<img alt='' src='https://secure.gravatar.com/avatar/2a82a450b81c3d130113a085aeb2f6c9?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/2a82a450b81c3d130113a085aeb2f6c9?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 27-08-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/preobrazovanie-sistem-schisleniya/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kalendar-na-baze-kontejnera/</link>
					<title><![CDATA[Календарь на базе контейнера]]></title>
                    					    <author><![CDATA[Vedmak]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:35 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Календарь на базе контейнера</h1>
													</header>
													<div id="sol_opis">Очередная замена родному календарю ActiveX.</div>
<div id="sol_body">Как и многие другие попытался заменить ActiveX-ный календарик. У каждого свои причины делать подобное.<br /> Это не полноценное решение, а скорее рассуждение на тему.<br /> Карендарь создан на базе Container </p>
<p> Своиства:<br />     dData - собственно задаваемая дата<br />     nYear,nMonth - рассматриваемый период<br />     cMonth - название рассматриваемого месяца<br /> События:<br />      DoIT() - некий аналог VALID() других слассов,<br />               отрабатывает при DoubleClick() на выбраной дате</p>
<p> Собственно дизаин в данном примере не самоцель, скорее демонстрация функционального скелета.<br /> Заранее извеняюсь, что дни недели и название месяцев по-латышски. Привычка, однако. Но читабельно.<br /> Для выбора года использовал ComboBox источник которого ( aYear[50] ) генерится<br /> исходя из текущего значения nYear (nYear-40...nYear-40+50) ( вот так вот оригинально 🙂 ).<br /> Посетила мысль, что будущее дальше 10 лет нам пока мало интересно, а прошлое позднее<br /> 40 используется для дат рождения и его можно достичь двумя шагами.<br /> Сетка дат не фиксирована и генерится динамически, что позаоляет программно "игратся" с размером <br /> календаря и упрощает вписывание его в форму.</div>
<div id="sol_avtor">Автор: Vedmak</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4802">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4802">Vedmak</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Vedmak" href="https://foxclub.ru/account/?user=4802">
				<img alt='' src='https://secure.gravatar.com/avatar/2f24dfa158cca7f66f73a3abcb2aa239?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/2f24dfa158cca7f66f73a3abcb2aa239?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 30-10-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kalendar-na-baze-kontejnera/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/otchet-v-excel/</link>
					<title><![CDATA[Отчет в Excel]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:35 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Отчет в Excel</h1>
													</header>
													<div id="sol_opis">Простой вывод отчета в Excel. В качестве шаблона - таблица Excel, сохраненная в формате XML. Не использует объектов, работает даже под MS/DOS.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: igorvs</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/otchet-v-excel/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/maple4-report-builder-sozdanie-otchetov-v-html/</link>
					<title><![CDATA[Maple4 Report Builder &#8211; создание отчетов в HTML]]></title>
                    					    <author><![CDATA[maple4]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:35 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Maple4 Report Builder &#8211; создание отчетов в HTML</h1>
													</header>
													<div id="sol_opis">Создание репорта, генерация страниц HTML и вывод на экран (печать на принтер). Кроме основного назначения есть не менее значительные неосновные: Обработка реакции на клик Применение app-приложения для генерации страниц или текста для последующей вставки в Вашу формируемую страницу (т.е. в нужном месте app-приложение вернет необходимый код для отображения отчета) Создание приложений "типа под Web" (запуск приложений, форм с последующим обновлением страницы), когда в качестве основного окна программы (или других окон) выступает не форма Visual FoxPro, а HTML-страница. Создание редактируемых зон в отчетах , т.н. редактируемых примечаний.</div>
<div id="sol_body"><b>Назначение программы:</b><BR> <b>Создание</b> репорта, <b>генерация страниц</b> HTML и <b>вывод</b> на экран (печать на принтер).<BR> <BR> Кроме основного назначения есть не менее значительные неосновные:<BR> Обработка реакции <b>на клик</b><BR> Применение <b>app-приложения</b> для генерации страниц или текста для последующей вставки в Вашу формируемую страницу (т.е. в нужном месте app-приложение вернет необходимый код для отображения отчета)</b><BR> Создание приложений <b>"типа под Web"</b>  (запуск приложений, форм с последующим обновлением страницы), когда в качестве основного окна программы (или других окон) выступает не форма Visual FoxPro, а HTML-страница.</b><BR> Создание <b>редактируемых</b> зон в отчетах , т.н. редактируемых примечаний.<BR> <BR> </p>
<ul>
<li><b>Создание и редактирование</b> отчетов и сценариев (как из <b>exe-</b> так и из <b>app-</b>приложения).</li>
</ul>
<ul>
<li>Редактирования каждого из отчетов и сценариев  в <b>отдельных окнах</b>.</li>
</ul>
<ul>
<li>Создание и открытие репортов и сценариев непосредственно из <b>окон редактирования репорта и сценария</b> (не требуется запуск еще одного app-приложения или выбор в меню exe-приложения).</li>
</ul>
<ul>
<li>Запуск сценария из <b>коммандной строки (или Вашего приложения)</b> или из <b>exe-модуля</b> (в том числе по заранее подготовленному ярлыку).</li>
</ul>
<ul>
<li>Генерация <b>связанных</b> отчетов (<b>один в другом</b>) или нескольких отдельных отчетов <b>в одном</b>.</li>
</ul>
<ul>
<li>Генерация HTML-страниц или кода отчета <b>без отображения</b> (для последующей вставки).</li>
</ul>
<ul>
<li><b>Предпросмотр</b> готовой страницы (то, что Вы видите на экране и то, что будет напечатано - иногда может отличаться друг от друга, для исправления этого нужно соответсвующим образом настроить IE).</li>
</ul>
<ul>
<li><b>Печать</b> HTML-страницы без предпросмотра (и вывода на экран).</li>
</ul>
<ul>
<li><b>Сохранение</b> готовой страницы HTML (в том числе в виде mht, т.е. в виде архива и с включенными файлами графики).</li>
</ul>
<ul>
<li><b>Выполнение</b> открытого скрипта из окна редактирования.</li>
</ul>
<ul>
<li>Возможность <b>выполнения кода</b> перед генерацией HTML и после генерации (со <b>вставкой</b> текстов или других отчетов до и после основного).</li>
</ul>
<ul>
<li>Возможность <b>выполнения кода</b> перед просмотром отчета HTML (при Return .f. отчет не показывается, удобно использовать для ограничения доступа), после просмотра и задание кода обновления отчета (данная возможность необходима при создании <b>псевдоредактируемых</b> отчетов - т.е. таких, где данные редактируются в формах Visual FoxPro, а потом необходимо обновление страницы).</li>
</ul>
<ul>
<li>Возможность задания <b>нескольких</b> хедеров одного типа (например, несколько хедеров Detail или Title).</li>
</ul>
<ul>
<li>Генерация в HTML (в зависимости от условия) <b>различных</b> хедеров или всех (по умолчанию).</li>
</ul>
<ul>
<li>Задание программы или функции <b>обработки клика</b> по значению в отчете.</li>
</ul>
<ul>
<li>Выполнение при генерации <b>внутренних функций RB, функций, программ, форм Вашего приложения или внешних форм и prg-файлов.</b></li>
</ul>
<ul>
<li><b>Интеллектуальный</b> анализатор файлов графики (сбор всех файлов в одном месте, т.е. где бы файл графики не находился, после генерации он будет размещен в подкаталоге reports_maple4_ru_rb текущего каталога, сравнение по размеру файла или по всему содержимому для сокращения повторяющихся файлов и конечного уменьшения файлов HTML с графикой)</li>
</ul>
<ul>
<li><b>Редактор</b> выбора, размещения, и изменения размеров файлов графики (без изменений, с жесткими размерами, с максимальным ограничением по высоте/ширине).</li>
</ul>
<ul>
<li>Схожие принципы разработки отчетов со стандартным редактором.</li>
</ul>
<ul>
<li>Создание редактируемых зон в отчете, редактируемых примечаний.</li>
</ul>
<p>  <BR>Страница загрузки программы <b>(со всеми DLL, ~5 Mb)</b> <BR><a HREF="http://www.maple4.ru/rb/m4rb_download.html" TARGET="_blank">http://www.maple4.ru/rb/m4rb_download.html</A></div>
<div id="sol_avtor">Автор: maple4</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4559">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 18 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4559">maple4</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="maple4" href="https://foxclub.ru/account/?user=4559">
				<img alt='' src='https://secure.gravatar.com/avatar/77a5817701be3d066d820cde74823e66?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/77a5817701be3d066d820cde74823e66?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 26-10-2007        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/maple4-report-builder-sozdanie-otchetov-v-html/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/prosmotr-foto-i-tekstovyh-fajlov-bez-memo-polej/</link>
					<title><![CDATA[Просмотр фото и текстовых файлов без мемо-полей]]></title>
                    					    <author><![CDATA[mayil]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:35 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Просмотр фото и текстовых файлов без мемо-полей</h1>
													</header>
													<div id="sol_opis">Просматривает фото и тексты, "прикрепленные" к записям таблицы, например, сотрудников. Фотографирует с вэб-камеры сотрудников и хранит фотки в папке PHOTO, а тексты в папке TEXT. Просто и легко!</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: mayil</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4612">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4612">mayil</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="mayil" href="https://foxclub.ru/account/?user=4612">
				<img alt='' src='https://secure.gravatar.com/avatar/1fca62caf621fc2e97be89ef5d07f880?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1fca62caf621fc2e97be89ef5d07f880?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 20-06-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/prosmotr-foto-i-tekstovyh-fajlov-bez-memo-polej/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/grid-imeyushhij-sobytiya-dlya-headers/</link>
					<title><![CDATA[Grid, имеющий события для Headers]]></title>
                    					    <author><![CDATA[Vladimir_Knyr]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:35 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Grid, имеющий события для Headers</h1>
													</header>
													<div id="sol_opis">Grid, имеющий события для Headers</div>
<div id="sol_body">1) Подключаем библиотеку к проекту<br /> 2) Используем класс GHGrid</p>
<p> Свойства класса:<br /> 	GHGrid.CopyProperty = .F. / .T.<br /> 	При .T. устанавливает свойства хидера определенные в Дизайнере иначе по умолчанию</p>
<p> Методы класса:<br /> 	GHGrid.Header_......()<br /> 	Называются соответственно событиям Хидера, в которых и описывается код события Хидера</p>
<p> 	Эти собития общие для всех Хидеров таблицы<br /> 	добавлен первый параметр во все методы передается ссылка на объект (Header) - источник события</p>
<p> Кроме того данный грид умеет показывать/прятать вертикальный скроллбар,<br /> взависимости от размера области отображения записей в гриде и их количества</div>
<div id="sol_avtor">Автор: Vladimir_Knyr</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4754">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4754">Vladimir_Knyr</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Vladimir_Knyr" href="https://foxclub.ru/account/?user=4754">
				<img alt='' src='https://secure.gravatar.com/avatar/7dd8187cfc903829e54ae52b377e8a5a?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7dd8187cfc903829e54ae52b377e8a5a?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 15-12-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/grid-imeyushhij-sobytiya-dlya-headers/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/rabota-s-tekstovymi-fajlami/</link>
					<title><![CDATA[Работа с текстовыми файлами]]></title>
                    					    <author><![CDATA[mayil]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:35 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Работа с текстовыми файлами</h1>
													</header>
													<div id="sol_opis">Использование Функций Fcreate(),Fopen(),Fgets(),Fputs(),Fclose(), ... на примере создания словаря Ожегова.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: mayil</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4612">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4612">mayil</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="mayil" href="https://foxclub.ru/account/?user=4612">
				<img alt='' src='https://secure.gravatar.com/avatar/1fca62caf621fc2e97be89ef5d07f880?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1fca62caf621fc2e97be89ef5d07f880?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 20-06-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/rabota-s-tekstovymi-fajlami/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kalendar-versiya-4-pererabotka-s-moego-resheniya-2001-goda/</link>
					<title><![CDATA[Календарь, версия 4 (переработка с моего решения 2001 года)]]></title>
                    					    <author><![CDATA[TAS]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:33 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Календарь, версия 4 (переработка с моего решения 2001 года)</h1>
													</header>
													<div id="sol_opis">Маленький и симпатичный, состоит из поля ввода даты и формы календаря. Вызов календаря осуществляется нажатием пробела или двойным кликом по полю ввода.  Основные параметры:  вся навигация продублирована на клавиатуре; можно задавать ограничения на период; можно задавать ограничение по дню недели; имеется 14 встроенных цветовых схем, а также задавать свою цветовую схему.   Внутри есть форма с примером и небольшая дока.  Новое в версии 4:  Добавлена работа с государственными праздниками.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: TAS</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4728">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4728">TAS</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="TAS" href="https://foxclub.ru/account/?user=4728">
				<img alt='' src='https://secure.gravatar.com/avatar/7004b77ba9803498111fe71a830bd53f?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7004b77ba9803498111fe71a830bd53f?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kalendar-versiya-4-pererabotka-s-moego-resheniya-2001-goda/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/denezhnaya-summa-propisyu-dovolno-korotkij-variant/</link>
					<title><![CDATA[Денежная сумма прописью. Довольно короткий вариант.]]></title>
                    					    <author><![CDATA[Asws]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 17:12:58 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Денежная сумма прописью. Довольно короткий вариант.</h1>
													</header>
													<div id="sol_opis">Сумма прописью. Придумал этот алгоритм после мучений с книжным примером.</div>
<div>[cce_visualfoxpro]</p>
<p> ************************************************************************************************<br />
 *  СУММА ПРОПИСЬЮ	Visual	FoxPro<br />
 *<br />
 * Принимает число от 0 до 999'999'999'999,99<br />
 * Возвращает текстовую строку с суммой в рублях<br />
 *<br />
 * Если число отрицательное, то берет модуль числа.<br />
 * По желании не сложно доработать, чтобы второй параметр указывал тип валюты,<br />
 * и вместо "рублей" и "копеек" подставлять соответствующие слова.<br />
 *<br />
 * Оптимизация по скорости для многократного вызова в цикле не проводилась.<br />
 ************************************************************************************************  </p>
<p>  FUNCTION	Sum_Str<br />
  PARAMETERS	nSum<br />
  LOCAL	cRet,AswCounter,AswS,Asw,Asw1  </p>
<p>  cRet=""<br />
  nSum=iif(empty(nSum),0,abs(nSum))  </p>
<p>  AswS=str(nSum,15,2)<br />
  FOR	AswCounter=1	to	10	STEP	3<br />
  	Asw=substr(AswS,AswCounter,3)<br />
  	if	Asw#space(3)<br />
  		Asw1=""<br />
  		do	case<br />
  			case	substr(Asw,1,1)="1"<br />
  				Asw1="сто "<br />
  			case	substr(Asw,1,1)="2"<br />
  				Asw1="двести "<br />
  			case	substr(Asw,1,1)="3"<br />
  				Asw1="триста "<br />
  			case	substr(Asw,1,1)="4"<br />
  				Asw1="четыреста "<br />
  			case	substr(Asw,1,1)="5"<br />
  				Asw1="пятьсот "<br />
  			case	substr(Asw,1,1)="6"<br />
  				Asw1="шестьсот "<br />
  			case	substr(Asw,1,1)="7"<br />
  				Asw1="семьсот "<br />
  			case	substr(Asw,1,1)="8"<br />
  				Asw1="восемьсот "<br />
  			case	substr(Asw,1,1)="9"<br />
  				Asw1="девятьсот "<br />
  		endcase<br />
  		cRet=cRet+Asw1<br />
  		Asw1=""<br />
  		if	substr(Asw,2,1)="1"<br />
  			do	case<br />
  				case	substr(Asw,3,1)="0"<br />
  					Asw1="десять "<br />
  				case	substr(Asw,3,1)="1"<br />
  					Asw1="одиннадцать "<br />
  				case	substr(Asw,3,1)="2"<br />
  					Asw1="двенадцать "<br />
  				case	substr(Asw,3,1)="3"<br />
  					Asw1="тринадцать "<br />
  				case	substr(Asw,3,1)="4"<br />
  					Asw1="четырнадцать "<br />
  				case	substr(Asw,3,1)="5"<br />
  					Asw1="пятнадцать "<br />
  				case	substr(Asw,3,1)="6"<br />
  					Asw1="шестнадцать "<br />
  				case	substr(Asw,3,1)="7"<br />
  					Asw1="семнадцать "<br />
  				case	substr(Asw,3,1)="8"<br />
  					Asw1="восемнадцать "<br />
  				case	substr(Asw,3,1)="9"<br />
  					Asw1="девятнадцать "<br />
  			endcase<br />
  			cRet=cRet+Asw1<br />
  			do	case<br />
  				case	AswCounter=1<br />
  					cRet=cRet+"миллиардов "<br />
  				case	AswCounter=4<br />
  					cRet=cRet+"миллионов "<br />
  				case	AswCounter=7<br />
  					cRet=cRet+"тысяч "<br />
  				case	AswCounter=10<br />
  					cRet=cRet+"рублей "<br />
  			endcase<br />
  		else<br />
  			do	case<br />
  				case	substr(Asw,2,1)="2"<br />
  					Asw1="двадцать "<br />
  				case	substr(Asw,2,1)="3"<br />
  					Asw1="тридцать "<br />
  				case	substr(Asw,2,1)="4"<br />
  					Asw1="сорок "<br />
  				case	substr(Asw,2,1)="5"<br />
  					Asw1="пятьдесят "<br />
  				case	substr(Asw,2,1)="6"<br />
  					Asw1="шестьдесят "<br />
  				case	substr(Asw,2,1)="7"<br />
  					Asw1="семьдесят "<br />
  				case	substr(Asw,2,1)="8"<br />
  					Asw1="восемьдесят "<br />
  				case	substr(Asw,2,1)="9"<br />
  					Asw1="девяносто "<br />
  			endcase<br />
  			cRet=cRet+Asw1<br />
  			Asw1=""<br />
  			do	case<br />
  				case	substr(Asw,1,3)="000"<br />
  					Asw1=iif(AswCounter=10,"рублей ","")<br />
  				case	substr(Asw,3,1)="0"	.and.	substr(Asw,1,3)#"000"<br />
  					Asw1=iif(AswCounter=7,"тысяч ",		;<br />
  					 iif(AswCounter=1,"миллиардов ",iif(AswCounter=4,"миллионов ","рублей ")))<br />
  				case	substr(Asw,3,1)="1"<br />
  					Asw1=iif(AswCounter=7,"одна тысяча ",	;<br />
  					 "один "+iif(AswCounter=1,"миллиард ",iif(AswCounter=4,"миллион ","рубль ")))<br />
  				case	substr(Asw,3,1)="2"<br />
  					Asw1=iif(AswCounter=7,"две тысячи ",	;<br />
  					 "два "+iif(AswCounter=1,"миллиарда ",iif(AswCounter=4,"миллиона ","рубля ")))<br />
  				case	substr(Asw,3,1)="3"<br />
  					Asw1=iif(AswCounter=7,"три тысячи ",	;<br />
  					 "три "+iif(AswCounter=1,"миллиарда ",iif(AswCounter=4,"миллиона ","рубля ")))<br />
  				case	substr(Asw,3,1)="4"<br />
  					Asw1=iif(AswCounter=7,"четыре тысячи ",	;<br />
  					 "четыре "+iif(AswCounter=1,"миллиарда ",iif(AswCounter=4,"миллиона ","рубля ")))<br />
  				case	substr(Asw,3,1)="5"<br />
  					Asw1=iif(AswCounter=7,"пять тысяч ",	;<br />
  					 "пять "+iif(AswCounter=1,"миллиардов ",iif(AswCounter=4,"миллионов ","рублей ")))<br />
  				case	substr(Asw,3,1)="6"<br />
  					Asw1=iif(AswCounter=7,"шесть тысяч ",	;<br />
  					 "шесть "+iif(AswCounter=1,"миллиардов ",iif(AswCounter=4,"миллионов ","рублей ")))<br />
  				case	substr(Asw,3,1)="7"<br />
  					Asw1=iif(AswCounter=7,"семь тысяч ",	;<br />
  					 "семь "+iif(AswCounter=1,"миллиардов ",iif(AswCounter=4,"миллионов ","рублей ")))<br />
  				case	substr(Asw,3,1)="8"<br />
  					Asw1=iif(AswCounter=7,"восемь тысяч ",	;<br />
  					 "восемь "+iif(AswCounter=1,"миллиардов ",iif(AswCounter=4,"миллионов ","рублей ")))<br />
  				case	substr(Asw,3,1)="9"<br />
  					Asw1=iif(AswCounter=7,"девять тысяч ",	;<br />
  					 "девять "+iif(AswCounter=1,"миллиардов ",iif(AswCounter=4,"миллионов ","рублей ")))<br />
  			endcase<br />
  			cRet=cRet+Asw1<br />
  		endif<br />
  	endif<br />
  ENDFOR<br />
  AswS=substr(AswS,14,2)  </p>
<p>  if	substr(AswS,1,1)="1"	.or.	substr(AswS,2,1)="0"<br />
  	cRet=cRet+AswS+" копеек"<br />
  else<br />
  	do	case<br />
  		case	substr(AswS,2,1)>"4"<br />
  			cRet=cRet+AswS+" копеек"<br />
  		case	substr(AswS,2,1)="1"<br />
  			cRet=cRet+AswS+" копейка"<br />
  		case	substr(AswS,2,1)>"1"	.and.	substr(AswS,2,1)																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/textbox-listboxcombo-box-s-horoshim-mehanizmom-poiska-i-filtraczii-dannyh/</link>
					<title><![CDATA[textbox+listbox=combo box с хорошим механизмом поиска и фильтрации данных]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:35 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>textbox+listbox=combo box с хорошим механизмом поиска и фильтрации данных</h1>
													</header>
													<div id="sol_opis">Элемент чем то похож на combo box(маленькая смесь Textbox и Listbox), но с хорошом механизмом поиска и фильтрациии.</div>
<div id="sol_body">Создал класс, который чем то напоминает combo box, о сделан из смеси Textbox и Listbox, только с более современными механизмами поиска, просьба не судить строго только учусь, а дать совет по его модификации и усовершенствованию. Он пока вроде меня во всем устраивает, вот только не могу решить одну проблему - так как класс это у меня контейнер, там есть два элемента Texbox и Listbox, которые находятся один под другим соответственно и их ширина равна ширине контейнера, но есть ситуации, когда нужно чтобы Listbox был шире, чем Textbox и при таких ситуациях приходится увеличивать сам контейнер, но получается не красиво - видно что это конейнер и Textbox короче, как добится его прозрачности????<br /> В общем просьба ознакомится с элеметном быстрого поиска, который похож на combo box, но здесь есть красивый механизм отсортировки и фильтрации даных.<br /> Можно вводить через пробел до 20-ти значений фильтрации и поиска, в данном примере поиск происходит по 3-м критериям одновременнно - номер карточки клиента, ФИО и процент скидки.<br /> Например ввод в поле поиска "10 Андр ЕВИЧ" - осуществит нам поиск всех клиентов, у кого либо процент скидки 10, или в номере карточки встречается 10 и где есть комбинации символов "Андр ", и "ЕВИЧ".<br /> Уважительная просьба к тем, у кого есть мысли по поводу облегчения кода или усовершенствованию элемента, а так же видимости всех элементов класса писать на johngorn@yandex.ru, либо стучаться в аську 178531536, ну и конечно же на www.sql.ru, либо сюда!!!<br /> Далее будут приложены три снимка с той проблемой с которой я обратитлся и сам проект данного элемента.</div>
<div id="sol_avtor">Автор: johngorn</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/textbox-listboxcombo-box-s-horoshim-mehanizmom-poiska-i-filtraczii-dannyh/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/pereimenovatel-klassov/</link>
					<title><![CDATA[Переименователь классов]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:35 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Переименователь классов</h1>
													</header>
													<div id="sol_opis">Инструмент для переименования классов и библиотек vcx</div>
<div id="sol_body">Инструмент для переименования классов и библиотек vcx.</p>
<p> Возможности:<br /> — Переименование классов с исправлением ссылок в связанных классах во всех библиотеках в пределах выбранной папки;<br /> — Переименование библиотек с аналогичным исправлением ссылок на их классы;<br /> — Перенос классов из одной библиотеки в другую с коррекцией ссылок.</p>
<p> При переименовании классов в Class Browser, наблюдались случаи порчи больших библиотек. В инструменте есть функция, позволяющая исправить такие библиотеки.</p>
<p> Будьте осторожны. Делайте резервные копии перед использованием.</p></div>
<div id="sol_avtor">Автор: bishop</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/pereimenovatel-klassov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-na-vfp-7-0-ispolzuyushhij-commandgroup-pageframe-i-grid/</link>
					<title><![CDATA[Класс на VFP 7.0, использующий Commandgroup, PageFrame и Grid.]]></title>
                    					    <author><![CDATA[smi2008]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:35 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс на VFP 7.0, использующий Commandgroup, PageFrame и Grid.</h1>
													</header>
													<div id="sol_opis">В mail.prg задаются в массивах: 1)иконки и подсказки на кнопках, 2)процедуры, соответствующих этим кнопкам 3) названия закладок и имена соответствующих им таблиц. В таблице SERVswitch.dbf задаются имена колонок таблиц, заголовков столбцов грида и т.д., подаваемых в грид. Все остальное выполняет класс LIZO</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: smi2008</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="480">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 18 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=480">smi2008</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="smi2008" href="https://foxclub.ru/account/?user=480">
				<img alt='' src='https://secure.gravatar.com/avatar/473975d3ce33e44174ecaf85927e9dc8?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/473975d3ce33e44174ecaf85927e9dc8?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-01-2008        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-na-vfp-7-0-ispolzuyushhij-commandgroup-pageframe-i-grid/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/element-upravleniya-graficheskij-redaktor-vfp9-winapi/</link>
					<title><![CDATA[Элемент управления &#8211; Графический редактор (VFP9+WinAPI)]]></title>
                    					    <author><![CDATA[SoccerStudio]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:35 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Элемент управления &#8211; Графический редактор (VFP9+WinAPI)</h1>
													</header>
													<div id="sol_opis">Полноценный графический редактор на VFP9+WinAPI, сделанный в виде обычного элемента управления.</div>
<div id="sol_body">Графический редактор, оформленный как обычный элемент фокса. Написан на VFP9 + WinApi. Элемент воспроизводит почти все функции MS Paint (кроме практически не используемых функций ластика, распылителя и сдвига картинки). Элемент позволяет рисовать множество различных видов контуров. Элемент позволяет форматировать различные фрагменты вводимого текста различным образом благодаря использованию RichEdit класса. Наконец, элемент позволяет применять различные эффекты, связанные с изменением цветовой гаммы изображения. Дополнительно элемент может загружать картинки из переменных и сохранять их в переменные. Если же Вам подобный функционал покажется недостаточным, то, как говорится, Adobe Photoshop Вам в руки. 🙂 Хотя, отдельные вещи можно при желании и доработать напильником.</div>
<div id="sol_avtor">Автор: SoccerStudio</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4798">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 19 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4798">SoccerStudio</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="SoccerStudio" href="https://foxclub.ru/account/?user=4798">
				<img alt='' src='https://secure.gravatar.com/avatar/773cf755ff77e13cfbf36d9ef31c8ea3?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/773cf755ff77e13cfbf36d9ef31c8ea3?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-11-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/element-upravleniya-graficheskij-redaktor-vfp9-winapi/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Графика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-dlya-raboty-s-rastrami-s-ispolzovaniem-gdiplus/</link>
					<title><![CDATA[Класс для работы с растрами с использованием GdiPlus]]></title>
                    					    <author><![CDATA[SoccerStudio]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:35 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс для работы с растрами с использованием GdiPlus</h1>
													</header>
													<div id="sol_opis">Простой класс для работы с растрами с использованием GdiPlus. Позволяет создавать растры и производить манипуляции с ними без знаний внутренностей GdiPlus. Обновленная версия, добавлены новые методы, в частности, для изменения цветовой гаммы изображений.</div>
<div id="sol_body">Данный класс позволяет создавать и обрабатывать растры без знания Gdi+. В этой версии класса исправлены замеченные недочеты, а также добавлено значительное количество новых методов, в частности, достаточно много методов для изменения цветовой гаммы изображения.  Некоторые из методов используют прямое обращение к памяти. С помощью VFP это вполне можно делать, однако этот процесс довольно медленный. Поэтому дополнительно я написал небольшую библиотеку на C, которая ускоряет этот процесс на порядки. Исходный код этой сишной библиотеки прилагаю. Когда и как нужно подключать библиотеку, видно из описаний и примеров к соответствующим методам. Впрочем, можно работать и без нее, если медленная скорость приемлема.</div>
<div id="sol_avtor">Автор: SoccerStudio</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4798">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 19 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4798">SoccerStudio</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="SoccerStudio" href="https://foxclub.ru/account/?user=4798">
				<img alt='' src='https://secure.gravatar.com/avatar/773cf755ff77e13cfbf36d9ef31c8ea3?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/773cf755ff77e13cfbf36d9ef31c8ea3?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-11-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-dlya-raboty-s-rastrami-s-ispolzovaniem-gdiplus/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Графика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/funkcziya-dlya-generaczii-bmp-fajla-s-fonovym-risunkom-zadavaemym-cherez-parametry/</link>
					<title><![CDATA[Функция для генерации BMP файла с фоновым рисунком, задаваемым через параметры.]]></title>
                    					    <author><![CDATA[TAS]]></author>
                    										    <pubDate>Mon, 31 Aug 2020 19:45:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Функция для генерации BMP файла с фоновым рисунком, задаваемым через параметры.</h1>
													</header>
													<div id="sol_opis">Рисует 6 типов фона: 1-горизонтальный градиент; 2-вертикальный градиент; 3-вертикальные линии; 4-горизонтальные линии; 5-шахматка; 6-сетка. (Выкладывалась ранее на форуме, решил и сюда добавить.)FUNCTION BUILDBMP(nWidth, nHeight, nVids, nParam1, nParam2, nParam3)	 && @ by TAS (tascold@mail.ru) - 2006 г.  </p>
<pre><pre class='bbcode'> *--------------------------------------------------------------------------------------------        
  * возвращает BMP картинку    
  * nWidth	- Ширина    
  * nHeight	- Высота    
  * nVids		- 1-горизонтальный,2-вертикальный градиент; 3-вертикальные,4-горизонтальные линии; 5-шахматка; 6-сетка;    
  * nParam1	- Основной цвет    
  * nParam2	- для 1,2 - % разности цвета для построения градиента; для остальных - дополнительный цвет (не обязательный параметер).    
  * nParam3	- для 3,4,5,6 - размер ячейки (не обязательный параметер)    
  *--------------------------------------------------------------------------------------------        
  * =STRTOFILE(BuildBMP(100,20,2,RGB(160,0,160),50),'knback.bmp')    
  *--------------------------------------------------------------------------------------------        
  * Одно замечание - данная функция для формирования небольших файлов, не рекомендуется создавать     
  * градиент для фона экрана 800х600 пикселей (вы его конечно получите, но после ненужной паузы в     
  * пару - тройку секунд) - лучше сделать 1х600 и растянуть!    
  *--------------------------------------------------------------------------------------------        
    LOCAL i, j, cBMP, cColArray	    
      	IF m.nWidth*m.nHeight=m.nParam3/2,m.nParam1,m.nParam2),IIF(MOD(m.j,m.nParam3)>=m.nParam3/2,m.nParam2,m.nParam1)))    
    	   		ENDFOR    
    			cColArray = m.cColArray + REPLICATE(CHR(0),MOD(m.nWidth,4))	&& Width must be divisible by 4      
    		ENDFOR      
    	CASE INLIST(m.nVids,6)				&& Сетка    
    		IF TYPE("nParam2")#"N"    
    			nParam2=RGB(255,255,255)	&& по умолчанию второй цвет - белый    
    		ENDIF    
    		IF TYPE("nParam3")#"N"    
    			nParam3=4					&& по умолчанию размер ячейки    
    		ENDIF    
    		nParam3=IIF(BETWEEN(m.nParam3,2,1000),m.nParam3,5)	&& размер ячейки    
    		FOR j = m.nHeight-1 TO 0 STEP -1      
    			FOR i = 0 TO m.nWidth-1    
    				cColArray=m.cColArray+GetBinaryColor(IIF(MOD(m.i,m.nParam3)=0 OR MOD(m.j,m.nParam3)=0,m.nParam1,m.nParam2))    
    	   		ENDFOR    
    			cColArray = m.cColArray + REPLICATE(CHR(0),MOD(m.nWidth,4))	&& Width must be divisible by 4      
    		ENDFOR      
    	ENDCASE    
      	cBMP = m.cBMP + m.cColArray      
    RETURN m.cBMP	&& возвращается готовая BMP картинка    
  *--------------------------------------------------------------------------------------------        
    FUNCTION GetBMPInfoHeader(tnWidth, tnHeight)	&& вызывается из BuildBMP    
    LOCAL cHeader, cZero      
    	cZero = NumToDWord(0)      
    	cHeader = NumToDWord(40) + NumToDWord(m.tnWidth) + NumToDWord(m.tnHeight)      
    	cHeader = m.cHeader + NumToWord(1) + NumToWord(24) + m.cZero + m.cZero      
    	cHeader = m.cHeader + NumToDWord(3780) + NumToDWord(3780) + m.cZero + m.cZero      
    RETURN m.cHeader      
  *--------------------------------------------------------------------------------------------        
    FUNCTION GetBinaryColor(tnColor)	&& вызывается из BuildBMP    
    RETURN SUBSTR(BINTOC(MAX(m.tnColor,0) - 2147483648),2)      
  *--------------------------------------------------------------------------------------------        
    FUNCTION NumToDWord(tnVal)	&& вызывается из BuildBMP    
    LOCAL cBin    
      	cBin = BINTOC(m.tnVal - 2147483648)      
    RETURN SUBSTR(m.cBin,4,1) + SUBSTR(m.cBin,3,1) + SUBSTR(m.cBin,2,1) + SUBSTR(m.cBin,1,1)      
  *--------------------------------------------------------------------------------------------    
    FUNCTION NumToWord(tnVal)	&& вызывается из BuildBMP    
    LOCAL cBin    
      	cBin = BINTOC(m.tnVal - 32768, 2)      
    RETURN SUBSTR(m.cBin,2,1) + SUBSTR(m.cBin,1,1)  
</pre></pre>
</p></div>
<div id="sol_avtor">Автор: TAS</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4728">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4728">TAS</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="TAS" href="https://foxclub.ru/account/?user=4728">
				<img alt='' src='https://secure.gravatar.com/avatar/7004b77ba9803498111fe71a830bd53f?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7004b77ba9803498111fe71a830bd53f?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/funkcziya-dlya-generaczii-bmp-fajla-s-fonovym-risunkom-zadavaemym-cherez-parametry/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Графика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/summa-propisyu-skloneniya-82-uh-valyut/</link>
					<title><![CDATA[Сумма прописью + склонения 82-ух валют]]></title>
                    					    <author><![CDATA[bodrox]]></author>
                    										    <pubDate>Wed, 23 Nov 2022 07:25:39 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Сумма прописью + склонения 82-ух валют</h1>
													</header>
													<div id="sol_opis">Выдаёт не только сумму прописью, но и правильно просклонённое наименование валюты, одной из 82 набитых в прогу.</div>
<div id="sol_body">
<p>Добавить ещё валюту - не проблема. Единственно, в ней не моя часть где генерируется сумма прописью, правда, там изменения тоже есть мои. Каментов накидал тама где необходимо :).</p>
<pre><pre class='bbcode'>  ************************************************************************************************************  
  FUNCTION SUM_WITH_CURRENCY_SPR  
  PARAMETERS SUMMA, CODE, LOWER, MODE  
 *Выдает сумму прописью в формате "сумма_прописью_целая_часть валюта дробная_часть/сумма_целая_часть"  
 *SUMMA - сумма числом (тип NUMERIC(15,2))  
 *CODE - код валюты (тип CHAR(3))  
 *LOWER - первая буква с маленькой буквы или нет (тип LOGICAL)  
 *MODE - режим (тип не задан) - резерв   
    
 ************************************************************************************************************   
</pre></pre>
</div>
<div id="sol_avtor">Автор: bodrox</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4170">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 19 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4170">bodrox</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="bodrox" href="https://foxclub.ru/account/?user=4170">
				<img alt='' src='https://secure.gravatar.com/avatar/fca0c2099ed5e331377a585c262bd106?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/fca0c2099ed5e331377a585c262bd106?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 13-04-2007        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/summa-propisyu-skloneniya-82-uh-valyut/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/piton-no-uzhe-na-fokse/</link>
					<title><![CDATA[Питон, но уже на Фоксе!]]></title>
                    					    <author><![CDATA[mayil]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:35 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Питон, но уже на Фоксе!</h1>
													</header>
													<div id="sol_opis">Питон - он и есть питон!</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: mayil</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4612">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4612">mayil</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="mayil" href="https://foxclub.ru/account/?user=4612">
				<img alt='' src='https://secure.gravatar.com/avatar/1fca62caf621fc2e97be89ef5d07f880?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1fca62caf621fc2e97be89ef5d07f880?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 20-06-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/piton-no-uzhe-na-fokse/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Игры]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/denezhnaya-summa-propisyu/</link>
					<title><![CDATA[Денежная сумма прописью]]></title>
                    					    <author><![CDATA[alexd]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:35 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Денежная сумма прописью</h1>
													</header>
													<div id="sol_opis">Выдает прописью сумму (руб/коп) до 999 999 999 999.99. Сразу оговорюсь, алгоритм не мой, но более короткого я не встречал. Авось кому пригодится.</div>
<div id="sol_body">[code] nSumm = 999999999999.99 *!*	@ 1,1 get nSumm *!*	READ CLEAR @ 2,1 say(Speeling(nSumm))  FUNCTION Speeling PARAMETER nSumma PRIVATE cSumma   * k - копейки   cSumma = TRANSFORM(M.nSumma,'9,9,,9,,,,,,9,9,,9,,,,,9,9,,9,,,,9,9,,9,,,.99')+'k'   * t - тысячи; m - миллионы; M - миллиарды   cSumma = STRTRAN(M.cSumma, ',,,,,,', 'eM')   cSumma = STRTRAN(M.cSumma, ',,,,,',  'em')   cSumma = STRTRAN(M.cSumma, ',,,,',   'et')    * e - единицы; d - десятки; c - сотни   cSumma = STRTRAN(M.cSumma, ',,,', 'e')   cSumma = STRTRAN(M.cSumma, ',,',  'd')   cSumma = STRTRAN(M.cSumma, ',',   'c')    cSumma = STRTRAN(M.cSumma, '0c0d0et', '')   cSumma = STRTRAN(M.cSumma, '0c0d0em', '')   cSumma = STRTRAN(M.cSumma, '0c0d0eM', '')    cSumma = STRTRAN(M.cSumma, '0c', '')   cSumma = STRTRAN(M.cSumma, '1c', 'сто ')   cSumma = STRTRAN(M.cSumma, '2c', 'двести ')   cSumma = STRTRAN(M.cSumma, '3c', 'триста ')   cSumma = STRTRAN(M.cSumma, '4c', 'четыреста ')   cSumma = STRTRAN(M.cSumma, '5c', 'пятьсот ')   cSumma = STRTRAN(M.cSumma, '6c', 'шестьсот ')   cSumma = STRTRAN(M.cSumma, '7c', 'семьсот ')   cSumma = STRTRAN(M.cSumma, '8c', 'восемьсот ')   cSumma = STRTRAN(M.cSumma, '9c', 'девятьсот ')    cSumma = STRTRAN(M.cSumma, '1d0e', 'десять ')   cSumma = STRTRAN(M.cSumma, '1d1e', 'одиннадцать ')   cSumma = STRTRAN(M.cSumma, '1d2e', 'двенадцать ')   cSumma = STRTRAN(M.cSumma, '1d3e', 'тринадцать ')   cSumma = STRTRAN(M.cSumma, '1d4e', 'четырнадцать ')   cSumma = STRTRAN(M.cSumma, '1d5e', 'пятнадцать ')   cSumma = STRTRAN(M.cSumma, '1d6e', 'шестнадцать ')   cSumma = STRTRAN(M.cSumma, '1d7e', 'семьнадцать ')   cSumma = STRTRAN(M.cSumma, '1d8e', 'восемнадцать ')   cSumma = STRTRAN(M.cSumma, '1d9e', 'девятнадцать ')    cSumma = STRTRAN(M.cSumma, '0d', '')   cSumma = STRTRAN(M.cSumma, '2d', 'двадцать ')   cSumma = STRTRAN(M.cSumma, '3d', 'тридцать ')   cSumma = STRTRAN(M.cSumma, '4d', 'сорок ')   cSumma = STRTRAN(M.cSumma, '5d', 'пятьдесят ')   cSumma = STRTRAN(M.cSumma, '6d', 'шестьдесят ')   cSumma = STRTRAN(M.cSumma, '7d', 'семьдесят ')   cSumma = STRTRAN(M.cSumma, '8d', 'восемьдесят ')   cSumma = STRTRAN(M.cSumma, '9d', 'девяносто ')    cSumma = STRTRAN(M.cSumma, '0e', '')   cSumma = STRTRAN(M.cSumma, '5e', 'пять ')   cSumma = STRTRAN(M.cSumma, '6e', 'шесть ')   cSumma = STRTRAN(M.cSumma, '7e', 'семь ')   cSumma = STRTRAN(M.cSumma, '8e', 'восемь ')   cSumma = STRTRAN(M.cSumma, '9e', 'девять ')    cSumma = STRTRAN(M.cSumma, '1e.', 'один рубль ')   cSumma = STRTRAN(M.cSumma, '2e.', 'два рубля ')   cSumma = STRTRAN(M.cSumma, '3e.', 'три рубля ')   cSumma = STRTRAN(M.cSumma, '4e.', 'четыре рубля ')   cSumma = STRTRAN(M.cSumma, '1et', 'одна тысяча ')   cSumma = STRTRAN(M.cSumma, '2et', 'две тысячи ')   cSumma = STRTRAN(M.cSumma, '3et', 'три тысячи ')   cSumma = STRTRAN(M.cSumma, '4et', 'четыре тысячи ')   cSumma = STRTRAN(M.cSumma, '1em', 'один миллион ')   cSumma = STRTRAN(M.cSumma, '2em', 'два миллиона ')   cSumma = STRTRAN(M.cSumma, '3em', 'три миллиона ')   cSumma = STRTRAN(M.cSumma, '4em', 'четыре миллиона ')   cSumma = STRTRAN(M.cSumma, '1eM', 'один миллиард ')   cSumma = STRTRAN(M.cSumma, '2eM', 'два миллиарда ')   cSumma = STRTRAN(M.cSumma, '3eM', 'три миллиарда ')   cSumma = STRTRAN(M.cSumma, '4eM', 'четыре миллиарда ')    cSumma = STRTRAN(M.cSumma, '11k', '11 копеек')   cSumma = STRTRAN(M.cSumma, '12k', '12 копеек')   cSumma = STRTRAN(M.cSumma, '13k', '13 копеек')   cSumma = STRTRAN(M.cSumma, '14k', '14 копеек')   cSumma = STRTRAN(M.cSumma, '1k', '1 копейка')   cSumma = STRTRAN(M.cSumma, '2k', '2 копейки')   cSumma = STRTRAN(M.cSumma, '3k', '3 копейки')   cSumma = STRTRAN(M.cSumma, '4k', '4 копейки')    cSumma = STRTRAN(M.cSumma, '.', 'рублей ')   cSumma = STRTRAN(M.cSumma, 't', 'тысяч ')   cSumma = STRTRAN(M.cSumma, 'm', 'миллионов ')   cSumma = STRTRAN(M.cSumma, 'M', 'миллиардов ')   cSumma = STRTRAN(M.cSumma, 'k', ' копеек')   m.cSumma=allt(IIF(M.nSumma < 10**12, M.cSumma, ALLTRIM(STR(M.nSumma,20,2))))   m.cSumma=upper(left(m.cSumma,1))+lower(substr(m.cSumma,2))  RETURN m.cSumma [/code]</div>
<div id="sol_avtor">Автор: alexd</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4303">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 19 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4303">alexd</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="alexd" href="https://foxclub.ru/account/?user=4303">
				<img alt='' src='https://secure.gravatar.com/avatar/c97daad16dc9354e2bc37c32984b421d?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c97daad16dc9354e2bc37c32984b421d?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 30-04-2007        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/denezhnaya-summa-propisyu/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/denezhnaya-summa-propisyu-ukr/</link>
					<title><![CDATA[Денежная сумма прописью (укр)]]></title>
                    					    <author><![CDATA[Sribna]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:35 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Денежная сумма прописью (укр)</h1>
													</header>
													<div id="sol_opis">Тоже не претендуя на авторство, выкладываю украинский вариант:</div>
<div id="sol_body">[code] FUNCTION Speeling PARAMETER nSumma PRIVATE cSumma  IF nSumma=0   RETURN 'нуль гривень 00 копійок' ENDIF    * k - копейки    cSumma = TRANSFORM(M.nSumma,'9,9,,9,,,,,,9,9,,9,,,,,9,9,,9,,,,9,9,,9,,,.99')+'k'   * t - тысячи; m - милионы; M - миллиарды   cSumma = STRTRAN(M.cSumma, ',,,,,,', 'eM')   cSumma = STRTRAN(M.cSumma, ',,,,,',  'em')   cSumma = STRTRAN(M.cSumma, ',,,,',   'et')   * e - единицы; d - десятки; c - сотни   cSumma = STRTRAN(M.cSumma, ',,,', 'e')   cSumma = STRTRAN(M.cSumma, ',,',  'd')   cSumma = STRTRAN(M.cSumma, ',',   'c')    cSumma = STRTRAN(M.cSumma, '0c0d0et', '')   cSumma = STRTRAN(M.cSumma, '0c0d0em', '')   cSumma = STRTRAN(M.cSumma, '0c0d0eM', '')    cSumma = STRTRAN(M.cSumma, '0c', '')   cSumma = STRTRAN(M.cSumma, '1c', 'сто ')   cSumma = STRTRAN(M.cSumma, '2c', 'двісті ')   cSumma = STRTRAN(M.cSumma, '3c', 'триста ')   cSumma = STRTRAN(M.cSumma, '4c', 'чотириста ')   cSumma = STRTRAN(M.cSumma, '5c', "п'ятсот ")   cSumma = STRTRAN(M.cSumma, '6c', 'шістсот ')   cSumma = STRTRAN(M.cSumma, '7c', 'сімсот ')   cSumma = STRTRAN(M.cSumma, '8c', 'вісімсот ')   cSumma = STRTRAN(M.cSumma, '9c', "дев'ятьсот ")    cSumma = STRTRAN(M.cSumma, '1d0e', 'десять ')   cSumma = STRTRAN(M.cSumma, '1d1e', 'одинадцять ')   cSumma = STRTRAN(M.cSumma, '1d2e', 'дванадцять ')   cSumma = STRTRAN(M.cSumma, '1d3e', 'тринадцять ')   cSumma = STRTRAN(M.cSumma, '1d4e', 'чотирнадцять ')   cSumma = STRTRAN(M.cSumma, '1d5e', "п'ятнадцять ")   cSumma = STRTRAN(M.cSumma, '1d6e', 'шістнадцять ')   cSumma = STRTRAN(M.cSumma, '1d7e', 'сімнадцять ')   cSumma = STRTRAN(M.cSumma, '1d8e', 'вісімнадцять ')   cSumma = STRTRAN(M.cSumma, '1d9e', "дев'ятнадцять ")    cSumma = STRTRAN(M.cSumma, '0d', '')   cSumma = STRTRAN(M.cSumma, '2d', 'двадцять ')   cSumma = STRTRAN(M.cSumma, '3d', 'тридцять ')   cSumma = STRTRAN(M.cSumma, '4d', 'сорок ')   cSumma = STRTRAN(M.cSumma, '5d', "п'ятдесят ")   cSumma = STRTRAN(M.cSumma, '6d', 'шістдесят ')   cSumma = STRTRAN(M.cSumma, '7d', 'сімдесят ')   cSumma = STRTRAN(M.cSumma, '8d', 'вісімдесят ')   cSumma = STRTRAN(M.cSumma, '9d', "дев'яносто ")    cSumma = STRTRAN(M.cSumma, '0e', '')   cSumma = STRTRAN(M.cSumma, '5e', "п'ять ")   cSumma = STRTRAN(M.cSumma, '6e', 'шість ')   cSumma = STRTRAN(M.cSumma, '7e', 'сім ')   cSumma = STRTRAN(M.cSumma, '8e', 'вісім ')   cSumma = STRTRAN(M.cSumma, '9e', "дев'ять ")    cSumma = STRTRAN(M.cSumma, '1e.', 'одна гривня ')   cSumma = STRTRAN(M.cSumma, '2e.', 'дві гривні ')   cSumma = STRTRAN(M.cSumma, '3e.', 'три гривні ')   cSumma = STRTRAN(M.cSumma, '4e.', 'чотири гривні ')   cSumma = STRTRAN(M.cSumma, '1et', 'одна тисяча ')   cSumma = STRTRAN(M.cSumma, '2et', 'дві тисячі ')   cSumma = STRTRAN(M.cSumma, '3et', 'три тисячі ')   cSumma = STRTRAN(M.cSumma, '4et', 'чотири тисячі ')   cSumma = STRTRAN(M.cSumma, '1em', 'один мільйон ')   cSumma = STRTRAN(M.cSumma, '2em', 'два мільйони ')   cSumma = STRTRAN(M.cSumma, '3em', 'три мільйони ')   cSumma = STRTRAN(M.cSumma, '4em', 'чотири мільйони ')   cSumma = STRTRAN(M.cSumma, '1eM', 'один мільярд ')   cSumma = STRTRAN(M.cSumma, '2eM', 'два мільярди ')   cSumma = STRTRAN(M.cSumma, '3eM', 'три мільярди')   cSumma = STRTRAN(M.cSumma, '4eM', 'чотири мільярди ')    cSumma = STRTRAN(M.cSumma, '11k', '11 копійок')   cSumma = STRTRAN(M.cSumma, '12k', '12 копійок')   cSumma = STRTRAN(M.cSumma, '13k', '13 копійок')   cSumma = STRTRAN(M.cSumma, '14k', '14 копійок')   cSumma = STRTRAN(M.cSumma, '1k', '1 копійка')   cSumma = STRTRAN(M.cSumma, '2k', '2 копійки')   cSumma = STRTRAN(M.cSumma, '3k', '3 копійки')   cSumma = STRTRAN(M.cSumma, '4k', '4 копійки')    cSumma = STRTRAN(M.cSumma, '.', 'гривень ')   cSumma = STRTRAN(M.cSumma, 't', 'тисяч ')   cSumma = STRTRAN(M.cSumma, 'm', 'мільйонів ')   cSumma = STRTRAN(M.cSumma, 'M', 'мільярдів ')   cSumma = STRTRAN(M.cSumma, 'k', ' копійок')   m.cSumma=allt(IIF(M.nSumma < 10**12, M.cSumma, ALLTRIM(STR(M.nSumma,20,2))))   m.cSumma=lower(left(m.cSumma,1))+lower(substr(m.cSumma,2))  RETURN m.cSumma [/code]</div>
<div id="sol_avtor">Автор: Sribna</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4551">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4551">Sribna</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Sribna" href="https://foxclub.ru/account/?user=4551">
				<img alt='' src='https://secure.gravatar.com/avatar/80253d409d13457f743b9305e7904118?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/80253d409d13457f743b9305e7904118?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 01-08-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/denezhnaya-summa-propisyu-ukr/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/orakul/</link>
					<title><![CDATA[Оракул]]></title>
                    					    <author><![CDATA[mayil]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:35 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Оракул</h1>
													</header>
													<div id="sol_opis">Простейшая игра-забава.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: mayil</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4612">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4612">mayil</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="mayil" href="https://foxclub.ru/account/?user=4612">
				<img alt='' src='https://secure.gravatar.com/avatar/1fca62caf621fc2e97be89ef5d07f880?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1fca62caf621fc2e97be89ef5d07f880?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 20-06-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/orakul/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Игры]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/polzovatelskie-funkczii-foxpro-napisannye-na-c-vmeste-ishodnym-kodom/</link>
					<title><![CDATA[Пользовательские функции FoxPro, написанные на C, вместе исходным кодом.]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 20:49:21 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Пользовательские функции FoxPro, написанные на C, вместе исходным кодом.</h1>
													</header>
													<div id="sol_opis">В библиотеку входят функции общего назначения, функции для работы с массивами. В файл архива входят : 1) St_Denis.fll библиотека для VFP 8.0 и ниже 2) St_Denis.fll библиотека для VFP 9.0 3) St_Denis.plb библиотека для FoxPro 2.6 for DOS 4) St_Denis.c исходный текст библиотеки 5) St_Denis_Russian.chm подробное описание функций библиотеки, с примерами их использования, дополнительные материалы, среди которых пошаговое описание того, как компилировать библиотеку в Visual Studio .NET 2005 (2003). 6) St_Denis.prg реализация некоторых функций библиотеки на FoxPro. 7) test_perf.prg тесты, позволяющие наглядно получить преставление о быстродействии некоторых функций библиотеки, сравнение быстродействия функций библиотеки со встроенными функциями и командами FoxPro. 8) mkeywords.prg построение таблицы ключевых слов из memo поля.</div>
<div id="sol_body">
<p>Дамы и Господа,</p>
<p>Я хотел бы предложить вам следующие пользовательские функции FoxPro</p>
<p>Функции для работы со словами<br />
GETALLWORDS() помещает в глобальный массив все слова из строки или memo поля, похожа на встроенную функцию ALINES()<br />
WORDTRAN() возвращает строку символов, полученную из первой строки, в которой одно или несколько вхождений первого слова будут заменены вторым словом<br />
GETNUMWORD() возвращает порядковый номер заданного слова в строке<br />
GETOCCURSWORD() подсчитывает количество вхождений слова в строке<br />
GETATWORD() выполняет поиск позиции, с которой n-е вхождение слова начинается в строке и возвращает номер позиции<br />
GETRATWORD() выполняет поиск позиции, с которой n-е вхождение слова начинается в строке и возвращает номер позиции, но в отличии от GETATWORD() осуществляет поиск справа</p>
<p>Функции для работы с массивами<br />
ARRAYSUM() возвращает сумму числовых элементов заданного столбца массива<br />
ARRAYAVG() возвращает среднее значение числовых элементов заданного столбца массива<br />
ARRAYMIN() возвращает минимальное значение элементов заданного столбца массива<br />
ARRAYMAX() возвращает максимальное значение элементов заданного столбца массива<br />
ARRAYCNT() возвращает количество числовых элементов заданного столбца массива<br />
ASCANQUICK() аналогична встроенной функции ASCAN(), за исключением того, что осуществляет бинарный поиск по столбцу в заранее отсортированном массиве<br />
VITESCAN() осуществляет бинарный поиск по столбцу в отсортированном массиве</p>
<p>Прочие функции<br />
NPRECISION() возвращает количество знаков после десятичной точки в числовом выражении<br />
FIELDNUM() возвращает порядковый номер поля в таблице по имени поля<br />
DANSLISTE() определяет находится ли число в списке значений типа «1,5,13-18»<br />
INCREMENT() увеличивает переменную на 1 и возвращает результат<br />
STRFILTER() удаляет все символы из первой строки, за исключением символов, содержащихся во второй строке<br />
REVERSE() возвращает строку в обратном порядке<br />
VST_DENIS() версия библиотеки</p>
<p>IFOR() «непосредственный» FOR цикл<br />
IWHILE() «непосредственный» WHILE цикл<br />
ICASE() «непосредственный» CASE условный переход<br />
IEXECCASE() «непосредственный» CASE условный переход, с выполнением одной или нескольких команд после условий<br />
IEXECIF() «непосредственный» IF условный переход, с выполнением одной или нескольких команд после условий<br />
EXECUTE() выполняет строку команд, разделенных символом “;”, подобно макроподстановке<br />
Вышеприведенные функции можно реализовать с использованием встроенной функции EXECSCRIPT().</p>
<p>Функции конвертации арабских чисел в римские и наоборот<br />
ARABTOROMAN() преобразует обычное число в римское число (от 1 до 3999)<br />
ROMANTOARAB() преобразует римское число в обычное число (от I до MMMCMXCIX)</p>
<p>Более 25 000 человек во всем мире уже загрузили мои функции, надеюсь, что и данные функции будут полезными и для Вас.</p>
<p>Вышеупомянутые функции имеются для следующих версий FoxPro (VFP 9.0, 8.0, 7.0 и т.д., FoxPro 2.6 for DOS и Windows). Файл библиотеки с версией для Visual FoxPro имеет расширение имени файла fll, для FoxPro 2.6 for DOS расширение имени файла plb.<br />
Поместите библиотеку в один из тех каталогов, в котором FoxPro осуществляет поиск файлов, либо в команде укажите полный путь к библиотеке.<br />
Для использования данных функций выполните следующую команду :<br />
set library to St_Denis additive<br />
либо<br />
set library to &lt;путь к библиотеке&gt;St_Denis additive<br />
Для удаления данных функции из памяти выполните следующую команду :<br />
release library St_Denis<br />
либо<br />
release library &lt;путь к библиотеке&gt;St_Denis</p>
<p>Библиотека St_Denis скомпилирована в Visual Studio 6.0 , поскольку у части пользователей, не имеющих на своих компьютерах .NET Framework, при загрузке библиотек, скомпилированных в Visual Studio .NET 2003 или в Visual Studio .NET 2005, появлялось сообщение об ошибке «Library file "name" is invalid».</p>
<p>С целью получения более полной информации относительно русской версии вышеописанных функций, пожалуйста,<br />
зайдите на http://nikiforov.developpez.com/foxpro/russe/ ,<br />
Вы можете загрузить русскую версию данной библиотеки по адресу<br />
ftp://ftp-developpez.com/nikiforov/udfs/st_denis_russian.zip .</p>
<p>В файл архива входят :<br />
1) St_Denis.fll библиотека для VFP 9.0<br />
2) St_Denis.fll библиотека для VFP 8.0 и ниже<br />
3) St_Denis.fll библиотека для FoxPro 2.6 for Windows<br />
4) St_Denis.plb библиотека для FoxPro 2.6 for DOS<br />
5) St_Denis.c исходный текст библиотеки<br />
6) St_Denis_Russian.chm подробное описание функций библиотеки, с примерами их использования, дополнительные материалы, среди которых пошаговое описание того, как компилировать библиотеку в<br />
Visual Studio .NET 2005 (2003).<br />
7) St_Denis.prg реализация некоторых функций библиотеки на FoxPro.<br />
8) test_perf.prg тесты, позволяющие наглядно получить преставление о быстродействии некоторых функций библиотеки, сравнение быстродействия функций библиотеки со встроенными функциями и командами FoxPro.<br />
9) mkeywords.prg пример построения таблицы из ключевых слов, содержащихся в заданном memo поле заданной таблицы.</p>
<p>С наилучшими пожеланиями,<br />
Игорь Никифоров</p>
</div>
<div id="sol_avtor">Автор: Igor2004</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/polzovatelskie-funkczii-foxpro-napisannye-na-c-vmeste-ishodnym-kodom/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/proverka-kontrolnoj-czifry-nalogovyj-i-identifikaczionnye-kody-ukraina/</link>
					<title><![CDATA[Проверка контрольной цифры-Налоговый и идентификационные коды Украина]]></title>
                    					    <author><![CDATA[_=AlexiS=_]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:34 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Проверка контрольной цифры-Налоговый и идентификационные коды Украина</h1>
													</header>
													<div id="sol_opis">Проверка контрольной цифры-Налоговый и идентификационные коды Украина</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: _=AlexiS=_</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1093">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1093">_=AlexiS=_</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="_=AlexiS=_" href="https://foxclub.ru/account/?user=1093">
				<img alt='' src='https://secure.gravatar.com/avatar/b6d99ca464d0da79ff57cdc192b49261?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/b6d99ca464d0da79ff57cdc192b49261?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-07-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/proverka-kontrolnoj-czifry-nalogovyj-i-identifikaczionnye-kody-ukraina/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-vyvoda-otcheta-vfp-v-dokument-rtf/</link>
					<title><![CDATA[Класс вывода отчета VFP в документ RTF.]]></title>
                    					    <author><![CDATA[Влад Колосов]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:34 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс вывода отчета VFP в документ RTF.</h1>
													</header>
													<div id="sol_opis">Класс с примером и документацией, предназначен для вывода наиболее типичных отчетов в документ RTF. Сделан на базе ReportListener. Проверена совместимость документа RTF с OpenOffice и MS Office. Самодостаточный, т.е. не использует OLE автоматизацию. Версия фокса 9.0</div>
<div id="sol_body">В документацию не вошло, но  хочу предупредить, что шрифт Courier New отображается шире в RTF по сравнению с фоксовыми отчетами. Некоторые меры по компенсации этого приняты, но длинные строки будут шире, чем ожидалось.<BR> Версия 1.01:   Добавлен признак ландшафтного поворота. Для полей учтена возможность наличия перевода строки в выводимых данных.</div>
<div id="sol_avtor">Автор: Влад Колосов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4894">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4894">Влад Колосов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Влад Колосов" href="https://foxclub.ru/account/?user=4894">
				<img alt='' src='https://secure.gravatar.com/avatar/6d059ca093aa6e3bd9ac83999fb80409?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/6d059ca093aa6e3bd9ac83999fb80409?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 05-05-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-vyvoda-otcheta-vfp-v-dokument-rtf/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/scrollbars-na-api/</link>
					<title><![CDATA[ScrollBars на API]]></title>
                    					    <author><![CDATA[SoccerStudio]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:35 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>ScrollBars на API</h1>
													</header>
													<div id="sol_opis">Как-то до этого получалось обходиться без этого, а тут вдруг понадобилось.  С удивлением обнаружил, что в решениях Клуба такая достаточно несложная вещь почему-то отсутствует. Пришлось быстренько изваять самому. Короче, обычная виндовая полоса прокрутки на API. Естественно, с поддержкой тем. В общем, ничего особенного.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: SoccerStudio</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4798">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 19 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4798">SoccerStudio</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="SoccerStudio" href="https://foxclub.ru/account/?user=4798">
				<img alt='' src='https://secure.gravatar.com/avatar/773cf755ff77e13cfbf36d9ef31c8ea3?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/773cf755ff77e13cfbf36d9ef31c8ea3?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-11-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/scrollbars-na-api/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/pereklyuchatel-vkladok/</link>
					<title><![CDATA[Переключатель вкладок]]></title>
                    					    <author><![CDATA[SoccerStudio]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:35 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Переключатель вкладок</h1>
													</header>
													<div id="sol_opis">Переключатель вкладок на основе класса для работы с растрами с помощью GdiPlus.</div>
<div id="sol_body">Собственно, давно уже хотелось иметь что-то подобное без использования ActiveX-компонентов. Для подобных целей наш любимый Визуальный Лис предлагает только элементы PageFrame и OptionGroup, однако эти элементы имеют, на мой взгляд, весьма ограниченные возможности настройки их внешнего вида. Отсюда это решение.<br /> Помимо непосредственного практического применения, данное решение может рассматриваться как пример самостоятельного создания собственных элементов на VFP с использованием GdiPlus.</div>
<div id="sol_avtor">Автор: SoccerStudio</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4798">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 19 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4798">SoccerStudio</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="SoccerStudio" href="https://foxclub.ru/account/?user=4798">
				<img alt='' src='https://secure.gravatar.com/avatar/773cf755ff77e13cfbf36d9ef31c8ea3?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/773cf755ff77e13cfbf36d9ef31c8ea3?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-11-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/pereklyuchatel-vkladok/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Графика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/petrovich-grid-aka-grid-ot-petrovich-dobavlena-forma-filtraczii-po-tablicze-shift-f7/</link>
					<title><![CDATA[Petrovich Grid (AKA Grid от Petrovich). Добавлена форма фильтрации по таблице (Shift+F7)]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Petrovich Grid (AKA Grid от Petrovich). Добавлена форма фильтрации по таблице (Shift+F7)</h1>
													</header>
													<div id="sol_opis">Сортировка, поиск, фильтрация, множественный выбор и т.д. Добавлена форма фильтрации по таблице (Shift+F7). Добавлена возможность вставки CheckBox.</div>
<div id="sol_body">Грид - "положи на форму и работай".<br /> Возможности:<br /> 1. Сортировать по колонке: F5 / Одинарный щелчок мышкой по заголовку<br /> 2. Фильтрация<br /> 	Форма фильтра по колонке: F6<br /> 	Быстрый фильтр по колонке: Shift + F6<br />         Фильтр по таблице: Shift + F7<br /> 	Отмена фильтра по колонке: Ctrl + F6 / Shift + Одинарный щелчок мышкой по заголовку / Щелчок правой кнопкой мышки по заголовку<br /> 	Отмена всех фильтров: Shift + F10 / Двойной щелчок мышкой по пустой таблице<br /> 3. Поиск по колонке: F7 / Двойной щелчок мышкой по заголовку<br /> 4. Пометка записей в таблице<br /> 	Пометить текущую запись: Ins / Shift + стрелка вверх(вниз)<br /> 	Пометить все записи: F11<br /> 	Снять пометку со всех записей: F12<br /> 4. Переместится на первую запись: Ctrl + Home<br /> 5. Переместится на последнюю запись: Ctrl + End<br /> 6. Изменить заголовок колонки: Ctrl + щелчок мышкой по заголовку<br /> 7. Изменить видимость колонок:	Ctrl + F12<br /> 8. Изменить порядок колонок: Alt + щелчок мышкой по заголовку<br /> 9. Копировать данные в буфер обмена: Ctrl + F5<br /> Grid является визуальным компонентом с переопределенными элементами Header и Column<br /> Для автоматической расскраски грида необходимо установить свойство DefaultColoring в .T.<br /> Для возможности множественного выбора необходимо установить свойство IsMultiselect в .T. Для вставки CheckBox в колонку используется процедура Grid.SetCheckBoxToColumn(oColumn)</div>
<div id="sol_avtor">Автор: petrovich</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/petrovich-grid-aka-grid-ot-petrovich-dobavlena-forma-filtraczii-po-tablicze-shift-f7/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/proverka-kontrolnoj-czifry-nalogovyj-i-identifikaczionnye-kody-rossiya/</link>
					<title><![CDATA[Проверка контрольной цифры &#8211; Налоговый и идентификационные коды Россия]]></title>
                    					    <author><![CDATA[_=AlexiS=_]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:34 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Проверка контрольной цифры &#8211; Налоговый и идентификационные коды Россия</h1>
													</header>
													<div id="sol_opis">Проверка контрольной цифры - Налоговый и идентификационные коды Россия</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: _=AlexiS=_</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1093">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1093">_=AlexiS=_</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="_=AlexiS=_" href="https://foxclub.ru/account/?user=1093">
				<img alt='' src='https://secure.gravatar.com/avatar/b6d99ca464d0da79ff57cdc192b49261?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/b6d99ca464d0da79ff57cdc192b49261?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-07-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/proverka-kontrolnoj-czifry-nalogovyj-i-identifikaczionnye-kody-rossiya/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/maple4-site-creator-sistema-upravleniya-kontentom/</link>
					<title><![CDATA[Maple4 Site Creator &#8211; Система управления контентом]]></title>
                    					    <author><![CDATA[tpr]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:34 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Maple4 Site Creator &#8211; Система управления контентом</h1>
													</header>
													<div id="sol_opis">Создание, Ведение, Публикация сайта. Управление контетном сайта. Использование языка Visual FoxPro, редактируемый функциональный код. НЕ ТРЕБУЕТСЯ платный хостинг для публикации!</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: tpr</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3054">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 18 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3054">tpr</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="tpr" href="https://foxclub.ru/account/?user=3054">
				<img alt='' src='https://secure.gravatar.com/avatar/734cebc6331a2b13a06159a826e25c13?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/734cebc6331a2b13a06159a826e25c13?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-10-2007        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/maple4-site-creator-sistema-upravleniya-kontentom/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/programma-postroitel-dereva-iz-menyu-proekta/</link>
					<title><![CDATA[Программа-построитель дерева из меню проекта]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:34 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Программа-построитель дерева из меню проекта</h1>
													</header>
													<div id="sol_opis">Программа берет файл *.MPR меню проекта, и заносит его структуру в таблицу. Эта таблица пригодна для прорисовки дерева в treeview контроле, что идет с примерами. На этой основе у меня работают права доступа к пунктам меню программы, тоесть назначение прав из работающего приложения.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: koskgb</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/programma-postroitel-dereva-iz-menyu-proekta/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kvadratoboyazn/</link>
					<title><![CDATA[Квадратобоязнь]]></title>
                    					    <author><![CDATA[mayil]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:34 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Квадратобоязнь</h1>
													</header>
													<div id="sol_opis">Два игрока ставят на поля шахматной доски поочередно каждый фишки своего цвета. Проигрывает тот, у кого после очередного своего хода какие-либо четыре фишки образовали квадрат. Квадраты могут располагаться и "косо"- стороны не параллельны краям доски.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: mayil</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4612">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4612">mayil</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="mayil" href="https://foxclub.ru/account/?user=4612">
				<img alt='' src='https://secure.gravatar.com/avatar/1fca62caf621fc2e97be89ef5d07f880?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1fca62caf621fc2e97be89ef5d07f880?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 20-06-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kvadratoboyazn/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Игры]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-pozvolyayushhij-vypolnyat-v-tekstovyh-fajlah-poisk-slov-slovosochetanij-s-razlichnymi-slovoformami/</link>
					<title><![CDATA[Класс, позволяющий выполнять в текстовых файлах поиск слов (словосочетаний) с различными словоформами]]></title>
                    					    <author><![CDATA[Вячеслав Клепинин]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:34 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс, позволяющий выполнять в текстовых файлах поиск слов (словосочетаний) с различными словоформами</h1>
													</header>
													<div id="sol_opis">Если Вы работаете с текстами, то этот класс может Вам пригодиться. Мне он понадобился для того, чтобы автоматически привязывать текстовые статьи к тематике (заданному списку тем).</div>
<div id="sol_body">Класс ConvertText:<br /> - выполняет форматирование текста (удаляет или заменяет "нечитаемые" символы, склеивет переносы слов, удаляет пустые абзацы в тексте<br /> - ищет в тексте слова (словосочетания) по заданным словоформам.<br /> В прилагаемом ZIP-файле вы найдёте:<br /> - класс ConvertText.prg<br /> - подробное описание (в формате pdf)<br /> - демонстрационный проект.</div>
<div id="sol_avtor">Автор: Вячеслав Клепинин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4913">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4913">Вячеслав Клепинин</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Вячеслав Клепинин" href="https://foxclub.ru/account/?user=4913">
				<img alt='' src='https://secure.gravatar.com/avatar/11287ca5ef54419c4cf1193225c53073?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/11287ca5ef54419c4cf1193225c53073?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 26-03-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-pozvolyayushhij-vypolnyat-v-tekstovyh-fajlah-poisk-slov-slovosochetanij-s-razlichnymi-slovoformami/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/scroll-bar/</link>
					<title><![CDATA[SCROLL BAR]]></title>
                    					    <author><![CDATA[TAS]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:34 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>SCROLL BAR</h1>
													</header>
													<div id="sol_opis">SCROLL BAR - он и в Африке SCROLL BAR. Из вкусностей - поддержка клавиатуры и дополнительная функциональность при разработке меню на его основе.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: TAS</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4728">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4728">TAS</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="TAS" href="https://foxclub.ru/account/?user=4728">
				<img alt='' src='https://secure.gravatar.com/avatar/7004b77ba9803498111fe71a830bd53f?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7004b77ba9803498111fe71a830bd53f?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/scroll-bar/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/menedzher-reshenij/</link>
					<title><![CDATA[Менеджер решений]]></title>
                    					    <author><![CDATA[s66]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:34 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Менеджер решений</h1>
													</header>
													<div id="sol_opis">По просьбам трудящихся выкладываю свой менеждер решений, предназначен для облегчения жизни... Сохраняет процедуры и функции, часто используемые при создании программ, тестирует их код. Система поиска решений. Для примера оставил несколько решений из форума. Для VFP 9.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: s66</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4715">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 19 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4715">s66</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="s66" href="https://foxclub.ru/account/?user=4715">
				<img alt='' src='https://secure.gravatar.com/avatar/3c29c7df126720fdc5daa7a6310e60d4?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/3c29c7df126720fdc5daa7a6310e60d4?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 09-02-2007        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/menedzher-reshenij/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/primer-sozdaniya-novogo-stilya-spiska-v-orenoffice-writer-dlya-formirovaniya-prikazov-so-slozhnoj-ierarhiej/</link>
					<title><![CDATA[Пример создания нового стиля списка в OреnOffice Writer для формирования приказов со сложной иерархией]]></title>
                    					    <author><![CDATA[rvc44]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:34 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Пример создания нового стиля списка в OреnOffice Writer для формирования приказов со сложной иерархией</h1>
													</header>
													<div id="sol_opis">Пример создания собственного стиля списка в OреnOffice Writer для формирования приказов с иерархическими многоуровневыми списками со сложной нумерацией позиций приказа, например 1, 1.1, 1.1.1, 1.1.2 и т.д.</div>
<div id="sol_body">По многочисленным просьбам коллег по форуму я все-таки нашел в себе силы опубликовать и второй пример из серии<br /> автоматизации OpenOffice.org из VFP. Он посвящен программе Writer. Напомню, что первый пример был посвящен Calc<br /> и его можно загрузить отсюда:<br /> "Пример автоматизации OpenOffice.org 2.2+ с программной записью и выполнением макроса на языке StarBasic"<br /> [url]http://www.foxclub.ru/sol/index.php?act=view&id=590[/url]<br /> Благодарю Всевышнего, что он дал мне силы это сделать.</p>
<p> Отмечу сразу, что в новом примере нет даже упоминаний о том как работать с таблицами Writer/Word, т.к. автор<br /> убежден, что вместо того, чтобы работать с "кривыми" таблицами во Writer/Word, лучше это делать в специально<br /> "заточенных" под работу с таблицами программах Calc/Excel. Поэтому всех любителей "кривых таблиц" отсылаю сразу<br /> к замечательному бесплатному учебнику по программированию макросов OO со множеством работающих примеров:<br /> [url]www.fameg.edu.br/documentos/apostilas_broffice/programando_broo.odt[/url]<br /> Самую последнюю версию которого можно взять здесь: [url]http://br.geocities.com/noelsonalves/[/url]</p>
<p> Этот же пример демонстрирует общий подход, как можно преодолевать ЛЮБЫЕ ограничения VFP в вопросах автоматизации офисного пакета программ OpenOffice.org 2.2+ на примере создания и заполнения реального многоуровнего приказа в<br /> программе Writer (бесплатный и совместимый с ним аналог MS Word).<br /> В примере также показаны приемы по созданию собственного стиля СПИСКА на основе базового стиля документа и<br /> его использование, а также показаны 2 различных способа вставки и внедрения графического объекта (изображения<br /> герба для приказа) в документ Writer/MS Word, посредством возможностей, предоставляемых OpenOffice.org 2.2+.<br /> Сохранение итогового документа (Order.doc) производится в примере для простоты в корень диска C: в формате<br /> документа Microsoft Word, т.е. после создания и сохранения документ легко открывается последним!</p>
<p> Известно, что существуют определенного рода ряд проблем при автоматизации OO из VFP и некоторых других языков.<br /> Прежде всего это несовместимость на уровне типов массивов: "массивы массивов" против многомерных массивов в VFP.<br /> Идея, которую я хотел бы передать в этом решении заключается в том, что с этим можно бороться и весьма успешно,<br /> даже разными способами! Основная игра в примере ведется на том, что код, который якобы не может работать из VFP,<br /> но тем не менее отлично работает в родном макросе OO на StarBasic<br /> (в примере это строка кода: oNumRules.replaceByIndex(lJ-1, oRule))<br /> помещается в макрос, который создается программно с нуля, затем этот макрос сохраняется на диск вместе с<br /> документом, после чего сразу же программно вызывается на исполнение, делая всю черную работу, с которой<br /> в VFP потенциально могут возникнуть проблемы. Приведенный пример, впоследствии, был решен другим способом -<br /> средствами чистого VFP, но сначала пришлось немного помучаться. Оказывается, чтобы OO лучше понимал типы<br /> передаваемых от разных языков программирования данных - приходится прибегать к подаче дополнительных<br /> инструкций для Automation Bridge ("мостика автоматизации") ОО с явным указанием или уточнением типов.<br /> Для продвинутых экспериментаторов, замечу сразу, что в конструкции вида<br /> [code]<br /> oTarget.setDataArray( oTarget.getDataArray() )<br /> [/code]<br /> это не поможет. Это как раз тот случай, когда автоматизацию можно сделать ТОЛЬКО через макрос!<br /> Сама по себе, отдельно взятая конструкция setDataArray() прекрасно работает из VFP, для чего требуется<br /> только транспонирование массива, что, собственно, первым и показал Юдин Саша в форуме FoxClub.</p>
<p> Как говорила моя любимая школьная учительница физики - каждая задача имеет минимум 2 решения.<br /> Поэтому, оказалось, что и здесь возможно другое решение на "чистом" VFP, например VFP9 SP1.<br /> В итоге, для того, чтобы не связываться с созданием и исполнением макроса (но здесь интересна сама технология),<br /> достаточно в примере включить закомментированный блок и всего лишь заменить указанную строку:<br /> [code]<br /> *-- При автоматизации OpenOffice следующий код работать не будет, поэтому используем его аналог:<br /> *-- Перезапишем старое значение свойства:<br /> * oNumRules.replaceByIndex(lJ-1, oRule)<br /> [/code]<br /> на следующую и все будет работать на чистом VFP:<br /> [code]<br /> *-- Перезапишем старое значение свойства:<br /> *-- (с) rvc, 27.07.07 17:32<br /> *-- Действуем согласно Developer's Guide,<br /> *-- главы Professional Uno > Automation Bridge > Type Mappings > Mapping of a sequence<br /> *-- Делаем UNO Wrapper по способу, описанному Bernard Marcelly, France Mon Jun 25, 2007 3:59 am:<br /> *-- http://www.oooforum.org/forum/viewtopic.phtml?t=58792<br /> *-- http://www.oooforum.org/forum/viewtopic.phtml?p=239563 "Problem with Numbering Paragraphs in Delphi"<br /> ooServiceManager = OOoGetServiceManager()<br /> unoWrap = ooServiceManager.Bridge_GetValueObject()  && unoWrap = OOLoadProperties<br /> unoWrap.set('[]com.sun.star.beans.PropertyValue', @oRule)  && Здесь передавать по ссылке ОБЯЗАТЕЛЬНО!<br /> oNumRules.replaceByIndex(lJ-1, unoWrap)  && Здесь можно передавать по ссылке, а можно и нет!<br /> [/code]<br /> Также, во втором способе, необходимо удалить весь код, относящийся к созданию и запуску на выполнение макроса,<br /> что упростит и уменьшит код. Но способ выбирайте сами - кому какой нравится. Работают с VFP оба!</p>
<p> В заключение, хочу отметить, что для нормальной работы примера вам необходимо:<br /> 1. Иметь библиотеку для работы VFP с OO libOOo.prg, которая неоднократно приводилась на форуме этого сайта.<br />    Для ее загрузки (у кого нет) воспользуйтесь поиском по сайту.<br /> 2. Из прилагаемого примера извлечь изображение герба для приказа (файл Gerb.bmp) и разместить его в корне диска C:</p>
<p> Желаю успехов в освоении автоматизации OpenOffice.<br /> Отдельная благодарность автора to Bernard Marcelly, который не раз помогал выкручиваться<br /> из очень тяжелых, почти неразрешимых ситуаций, которых, как оказалось - не бывает!<br /> --<br /> С уважением,<br /> Кольцов Роман Васильевич aka rvc</div>
<div id="sol_avtor">Автор: Роман Кольцов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4767">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4767">rvc44</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="rvc44" href="https://foxclub.ru/account/?user=4767">
				<img alt='' src='https://secure.gravatar.com/avatar/e89cde72d5f4d3df33e6d628fb2c4289?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e89cde72d5f4d3df33e6d628fb2c4289?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 06-12-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/primer-sozdaniya-novogo-stilya-spiska-v-orenoffice-writer-dlya-formirovaniya-prikazov-so-slozhnoj-ierarhiej/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/defoxiii-zashhita-ot-dekompilyaczii-i-sozdanie-prilozhenij-s-vozmozhnostyu-registraczii/</link>
					<title><![CDATA[DeFoxIII &#8211; Защита от декомпиляции и создание приложений с возможностью регистрации]]></title>
                    					    <author><![CDATA[leonid]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:34 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>DeFoxIII &#8211; Защита от декомпиляции и создание приложений с возможностью регистрации</h1>
													</header>
													<div id="sol_opis">В архиве (~2 Mb) содержится полный набор файлов DeFoxIII: четыре рабочих файла для запуска с разными рантаймами 6 - 9, хелпы в формате Word на русском и английском языках, обфускатор (нужен рантайм от VFP6) и проект примера простого приложения, которое может работать как в демо-версии, так и регистрированной. Независимо от того, под каким рантаймом DeFoxIII запускается, он может обрабатывать ехе-файлы всех версий VFP6SP5 - VFP9SP1.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: leonid</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4774">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4774">leonid</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="leonid" href="https://foxclub.ru/account/?user=4774">
				<img alt='' src='https://secure.gravatar.com/avatar/7cd2dd8f551560b97aa412c8cd44bafe?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7cd2dd8f551560b97aa412c8cd44bafe?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 03-02-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/defoxiii-zashhita-ot-dekompilyaczii-i-sozdanie-prilozhenij-s-vozmozhnostyu-registraczii/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/eksport-dbf-na-mssql/</link>
					<title><![CDATA[Экспорт DBF на MSSQL]]></title>
                    					    <author><![CDATA[Влад Колосов]]></author>
                    										    <pubDate>Tue, 13 Dec 2022 04:38:13 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Экспорт DBF на MSSQL</h1>
													</header>
													<div id="sol_opis">Предоставлена библиотека и пример её использования для быстрой загрузки таблицы на MSSQL сервер.<br />
Описание в архиве. Можно использовать как в составе своего приложения, так и построить отдельное.<br />
Версия фокса 9.0. Сами классы загрузки должны работать и под младшими версиями фокса.</div>
<div id="sol_body">11.08.2007 в классе up_xml использована временная процедура вместо постоянной, что устраняет потенциальную возможность оставления "мусора" после аварийного останова. Исправлены мелкие ошибки. 24.08.2007 исправлена ошибка из-за которой при использовании класса up_xml не выполнялся режим "дописать".</div>
<div id="sol_avtor">Автор: Влад Колосов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4894">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4894">Влад Колосов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Влад Колосов" href="https://foxclub.ru/account/?user=4894">
				<img alt='' src='https://secure.gravatar.com/avatar/6d059ca093aa6e3bd9ac83999fb80409?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/6d059ca093aa6e3bd9ac83999fb80409?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 05-05-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/eksport-dbf-na-mssql/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Импорт-экспорт]]></category><category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/tajmer-blokirovki-ili-prostoya-prilozheniya/</link>
					<title><![CDATA[Таймер блокировки или простоя приложения.]]></title>
                    					    <author><![CDATA[INB]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:34 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Таймер блокировки или простоя приложения.</h1>
													</header>
													<div id="sol_opis">Таймер блокировки или простоя приложения.  Отслеживает простой VFP приложения, в течение указанного времени, и выполняет указанное действие. Таймер в приложении должен быть ОДИН, иначе они перекрывают друг друга и ON KEY LABEL MOUSE. Команда в ON KEY LABEL MOUSE продолжает выполняться, только в случае ОДНОГО таймера. Для окон, не принадлежащих приложению, простой (события мыши и клавиатуры, приводящие к сбросу) не отслеживается (ются).</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: INB</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4622">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4622">INB</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="INB" href="https://foxclub.ru/account/?user=4622">
				<img alt='' src='https://secure.gravatar.com/avatar/2a82a450b81c3d130113a085aeb2f6c9?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/2a82a450b81c3d130113a085aeb2f6c9?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 27-08-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/tajmer-blokirovki-ili-prostoya-prilozheniya/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/resize-kolonok-grida-versiya-1-1/</link>
					<title><![CDATA[Resize колонок Grid&#8217;a (версия 1.1)]]></title>
                    					    <author><![CDATA[kexby]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:33 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Resize колонок Grid&#8217;a (версия 1.1)</h1>
													</header>
													<div id="sol_opis">Класс предназначен для автоматического изменения ширины колонок в Grid'e при его Resize.</div>
<div id="sol_body">Идея создания этого класса пришла из 1С, уж больно понравились тамошние таблички ;-).<br /> Для приминения класса необходимо выполнить всего три пункта:<br /> - добавить класс в свой проект;<br /> - поместить его на форму;<br /> - заполнить свойство c именем "grid".</p>
<p> Свойства класса:<br /> - grid: ссылка на грид, тип символьный (пример: This.Parent.Grid1 или ='ThisForm.Grid2' или ThisForm.Grid3).<br /> - enabled: активирует(.T.)/деактивирует(.F.) действие класса на Grid, тип логический.<br /> - proporcional: .T.-ширина колонок изменяется пропорцинально их первоначальным размерам; .F.-ширина колонок изменяется равномерно.<br /> - SaveUserConfig(добавлено в новой версии): .T.-сохранять размер колонок, настроеных пользователем; .F.-не сохранять.</p>
<p> При изменении размеров колонок учитываются значения их свойств Resizable и Visible, а также свойств самого Grid'a(ScrollBars, RecordMark, DeleteMark и т.д.).</p>
<p> В архив с классом вложена форма-пример.</p>
</div>
<div id="sol_avtor">Автор: kexby</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4216">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4216">kexby</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="kexby" href="https://foxclub.ru/account/?user=4216">
				<img alt='' src='https://secure.gravatar.com/avatar/0b3d9f544a0329185ded0fb4d060c1e8?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/0b3d9f544a0329185ded0fb4d060c1e8?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 19-12-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/resize-kolonok-grida-versiya-1-1/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/funkczii-obhoda-dereva-papok/</link>
					<title><![CDATA[Функции обхода дерева папок]]></title>
                    					    <author><![CDATA[INB]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:33 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Функции обхода дерева папок</h1>
													</header>
													<div id="sol_opis">Обход папок и подпапок в обычном и отсортированном порядке - по имени, размеру, дате(без времени). Включены функции для VFP 8.X и VFP 3.X (подойдет для FP 2.0).</div>
<div id="sol_body">Обновления: 18.04.2007; 19.04.2007; 05.08.2007.<br /> Информацию об обновлениях смотрите ниже.</p>
<p> Простой пример использования:</p>
<p> cDir = "Ваша папка"               && Сканируемая папка<br /> cDirCur = fDirScan(cDir, cDir)    && Подпапка в cDir (папка cDir не возвращается функцией обхода)</p>
<p> DO WHILE !EMPTY(cDirCur)</p>
<p>    * ваша обработка подпапки...</p>
<p>    * получение подпапки<br />    cDirCur = fDirScan(cDirCur, cDir)<br /> ENDDO</p>
<p> Сложный пример использования:</p>
<p> cDirStart = "Ваша папка"    && Стартовая папка, должна располагатся "выше" (смотрите сортировка)<br /> cDirEnd   = "Ваша папка"    && Конечная папка,  должна располагатся "ниже" (папка cDirEnd c подпапками возвращается функцией обхода)<br /> cDirCur   = fDirScan(cDirStart, cDirEnd, "N")    && Подпапка в cDirStart или след.папка после cDirStart, Сортировка по имени</p>
<p> DO WHILE !EMPTY(cDirCur)</p>
<p>    * ваша обработка папки ...</p>
<p>    * получение папки или подпапки<br />    cDirCur = fDirScan(cDirCur, cDirEnd, "N")<br /> ENDDO</p>
<p> Список подпапок - удаление папки</p>
<p> DIME adr[1], aff(1)   && массив папок, файлы</p>
<p> <i>* получение списка в массив</i><br /> nDirs = fDirSL(@adr, "Папка")</p>
<p> * удаление c nDirs по 1 (иначе ошибки)<br /> FOR nDir = nDirs TO 1 STEP -1<br />     * удаление файлов<br />     nFiles = ADIR(aff, adr(nDir) + "*.*", "HS")<br />     FOR nFile = 1 TO nFiles<br />         DELETE FILE (adr(nDir) + aff(nFile, 1))<br />     ENDFOR<br />     * удаление папки<br />     RD (adr(nDir))<br /> ENDFOR</p>
<p> Обновление: 18.04.2007.<br /> 1.Добавлен ReadMe.txt.<br /> 2.Исправлен z_DirTest.prg:<br />   1) добавлены проверки и комментарии;<br />   2) исключена ошибка в fDirSFP3();<br />   3) протестировано в VFP и FP 2.0.</p>
<p> Обновление: 19.04.2007.<br /> 1.ReadMe.txt.<br /> 2.z_DirTest.prg:<br />   1) исключена возможная ошибочная ситуация в fDirSFP3();<br />   2) добавлена функция обхода только подпапок в указанной папке - fDirSub() для VFP 8.0, и fDirSubD() для VFP 3.0 и FoxPro 2.0;<br />   3) протестировано в VFP и FP 2.0.</p>
<p> Обновление: 05.08.2007.<br /> 1.Обновлен ReadMe.txt.<br /> 2.Изменен z_DirTest.prg:<br />   1) добавна функции fDirL(), fDirSL();<br />   2) протестировано в VFP 8.X.<br /> 3.Добавлен z_DirTest3.prg:<br />   1) добавна функции fDirL(), fDirSL();<br />   2) протестировано в VFP 3.0 и FP 2.0.</p>
</div>
<div id="sol_avtor">Автор: INB</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4622">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4622">INB</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="INB" href="https://foxclub.ru/account/?user=4622">
				<img alt='' src='https://secure.gravatar.com/avatar/2a82a450b81c3d130113a085aeb2f6c9?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/2a82a450b81c3d130113a085aeb2f6c9?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 27-08-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/funkczii-obhoda-dereva-papok/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/scroller-1-2/</link>
					<title><![CDATA[Scroller (1.2)]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Scroller (1.2)</h1>
													</header>
													<div id="sol_opis">Класс для скроллинга контейнера на форме. Можно использовать в дизайнере. Поддерживает многослойность, скроллинг колесом мыши, автоскроллирование на активный элемент.</div>
<div id="sol_body">Scroller 1.2- класс для скроллинга контейнера на форме.</p>
<p> Можно использовать в дизайнере.<br /> Поддерживает многослойность (несколько контейнеров для скроллинга), скроллинг колесом мыши, автоскроллирование на активный элемент.</p>
<p> Внимание!<br /> Используется ActiveX: Microsoft Flat Scrollbar Control 6.0 (SP4)<br /> Находится в файле mscomct2.ocx</div>
<div id="sol_avtor">Автор: Prototype</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/scroller-1-2/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/primer-ispolzovaniya-formy-tipa-as-top-level-form/</link>
					<title><![CDATA[Пример использования формы типа As Top-Level Form]]></title>
                    					    <author><![CDATA[s66]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:34 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Пример использования формы типа As Top-Level Form</h1>
													</header>
													<div id="sol_opis">Пример демонстрирует возможности использования Top-Level Form и работы с окнами In Top-Level Form. Для примера включен эффект открытия дочернего окна с лева на право.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: s66</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4715">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 19 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4715">s66</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="s66" href="https://foxclub.ru/account/?user=4715">
				<img alt='' src='https://secure.gravatar.com/avatar/3c29c7df126720fdc5daa7a6310e60d4?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/3c29c7df126720fdc5daa7a6310e60d4?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 09-02-2007        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/primer-ispolzovaniya-formy-tipa-as-top-level-form/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/rabota-s-crystal-reports-9/</link>
					<title><![CDATA[Работа с Crystal Reports 9]]></title>
                    					    <author><![CDATA[lo-pata]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:34 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Работа с Crystal Reports 9</h1>
													</header>
													<div id="sol_opis">Доработанное решение №508. Работать с классом по прежнему просто, но добавлены дополнительные методы + параметры вызова + исправлена неточность + возможность выбора принтера.</div>
<div id="sol_body">Проблемы старого класса: <br /> 1. Если использовать для работы с MS SQL - нет вопросов,<br />  в самом отчете устанавливатся свойства подключения и все работает. <br />  А вот если работать с локальными таблицами - вытаскивать данные в файлы fox2x, <br />  то тут уж лучше указывать полные пути к этим самым таблицам. Поэтому в класс <br />  добавлены методы установки путей к таблицам отчета oCR.addtable и путей к <br />  таблицам подотчетов oCR.addsubtable.</p>
<p> 2. Все начинается с создания объекта класса:<br />  oCR=CREATEOBJECT('CrystalRuntime.Application'). Я долго не мог понять, <br />  почему это  при помощи этого класса именно отчеты для CR9 не хотят работать. <br />  При этом отчеты для CR8.5 работают на ура. А все просто: если у вас на <br />  машине стоит не одна версия CR, а несколько, то в реестре запись <br /> 'CrystalRuntime.Application' связывается с той версией CR, которая была <br />  установлена раньше всех. Так у меня создавался класс CR8.5, который не <br />  понимал отчетов, сделанных в CR9, о чем громко и кричал. Проблема решается <br />  добавлением номера версии CR через точку:'CrystalRuntime.Application.9'.<br />  При таком вызове мы гарантированно получим экземпляр CR9.</p>
<p> 3. У меня всегда в начаде программы создается класс приложения. В этом классе<br />  задается иконка приложения. И вот когда ты вызываешь на просмотр отчет - <br />  у него в левом углу стандартная фоксовая иконка и надпись "Отчет". <br />  Ну не очень как-то смотрится. Поэтому в класс добавлены необязательные параметры.<br />  Первый задает текст в заголовке окна, второй - иконку. </p>
<p>  4. Последние изменения: Очень меня смущала такая весчь в вьювере для CR9, как отсутсвие возможности выбора и настройки принтера.  Сделать на форме отдельную кнопку для этого? Не проблема. Только проблема в том, что эта единственная кнопка для выбора принтера на форме смотрится как 5-е колесо у телеги. Поэтому сделал свою менюшку для управления просмотром. Те, для кого не критично отсутствие кнопки выбора принтера - могут пользоваться родными контролами. Для этого  нужно как и раньше oCR=CREATEOBJECT('myCR9','Отчет №1','d:print.gif'). Те, кто хотят видеть кнопку - добавьте после файла с иконкой .t. (типа ShowControls) oCR=CREATEOBJECT('myCR9','Отчет №1','d:print.gif', .t.).    Конкретно этот класс сделан на 9-ке. Но раньше он же использовался на 6-ке для работы с CR. <br /> [code]<br /> SET CLASSLIB TO crystalrep9 ADDITIVE<br /> PUBLIC oCR	</p>
<p> &&	первый параметр - текст шапки окна просмотра, второй - файл иконки, <br /> третий - показывать новые контролы или родные<br />  oCR=CREATEOBJECT('myCR9','Отчет №1','d:print.gif',.t.)</p>
<p> &&	теперь устанавливаем параметры отчета<br /> &&	в первом случае, если мы сами передаем параметр для самого CR<br /> oCR.addparam('CompanyName','Иванов Лтд.')</p>
<p> &&	второй случай - если передаем значение для процедуры MS SQL<br /> oCR.addparam('@Number','33')</p>
<p> &&	первый параметр - номер таблицы в отчете, второй - полное название файла<br /> &&	с данными с полным путем к нему<br /> oCR.addtable(1,oApp.TempPath+'crrOrder1.dbf')</p>
<p> &&	первый параметр - название подотчета, второй - номер таблицы в подотчете,<br /> &&	третий - полное название файла с данными с полным путем к нему<br /> oCR.addsubtable('22',1,oApp.RepPath+'crrOrder2.dbf')</p>
<p> oCR.previewreport('d:repReport.rpt')<br /> [/code]</div>
<div id="sol_avtor">Автор: lo-pata</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="2903">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=2903">lo-pata</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="lo-pata" href="https://foxclub.ru/account/?user=2903">
				<img alt='' src='https://secure.gravatar.com/avatar/71c45f037785b7a68a7892b02e30d5c0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/71c45f037785b7a68a7892b02e30d5c0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 08-02-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/rabota-s-crystal-reports-9/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/primer-avtomatizaczii-openoffice-org-2-2-s-programmnoj-zapisyu-i-vypolneniem-makrosa-na-yazyke-starbasic-ne-vba/</link>
					<title><![CDATA[Пример автоматизации OpenOffice.org 2.2+ с программной записью и выполнением макроса на языке StarBasic (не VBA!)]]></title>
                    					    <author><![CDATA[rvc44]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:34 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Пример автоматизации OpenOffice.org 2.2+ с программной записью и выполнением макроса на языке StarBasic (не VBA!)</h1>
													</header>
													<div id="sol_opis">Последнее время все больше и больше возрастает интерес к  автоматизации OpenOffice.org Calc и Writer, а доступных  русскоязычных источников по этой теме пока катострофически не  хватает. Не хватает, к сожалению времени, чтобы расписать все  подробно и по-русски, но очень надеюсь, что данный пример и его части пригодятся тем, кто решил заняться автоматизацией OpenOffice.org из VFP.</div>
<div id="sol_body">Данный пример включает в себя демонстрацию максимально большого количества из известных на данный момент<br /> приемов для автоматизации OpenOffice.org Calc из VFP, накопленных из разнообразных источников в Internet и разработанных мною самостоятельно путем тяжелых проб и ошибок. Главный источник - англоязычная документация<br /> по API OpenOffice.org. Так, что те кто еще не знает английский - вперед! Я учил в школе Deutsch...</p>
<p> Вы должны понимать, что при автоматизации можно обращаться к свойствам и методам создаваемых объектов, но<br /> невозможно напрямую (без создания макросов на языке StarBasic) из VFP обращаться к функциям и командам языка<br /> StarBasic. Например, в VFP вместо команды createUnoService("...") необходимо использовать<br /> аналогичный ему вызов из библиотеки libOOo.prg, который называется OOoServiceManager_CreateInstance("..."),<br /> если Вы планируете использовать данную библиотеку. К сожалению, эту библиотеку уже очень давно написал<br /> Danny Brewer, и исправлять теперь названия в ней уже нет никакого смысла, т.к. исправив название этой функции<br /> можно получить несовместимость с другими существующими примерами автоматизации OOo из VFP.<br /> Лучше всего дополнять ее новыми функциями и публиковать свои дополнения. </p>
<p> Для демонстрации примера, подключите к проекту библиотеку libOOo.prg, содержащую ВСЕ необходимые функции<br /> для работы ЭТОГО примера (если она отличается от имеющейся у Вас, то замените свою на прилагаемую здесь),<br /> а также подключите и запускайте vfpcalcexample2.prg из прилагаемого архива.<br /> Все комментарии внутри программы (см. исходный текст vfpcalcexample2.prg)</div>
<div id="sol_avtor">Автор: Кольцов Роман Васильевич</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4767">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4767">rvc44</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="rvc44" href="https://foxclub.ru/account/?user=4767">
				<img alt='' src='https://secure.gravatar.com/avatar/e89cde72d5f4d3df33e6d628fb2c4289?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e89cde72d5f4d3df33e6d628fb2c4289?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 06-12-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/primer-avtomatizaczii-openoffice-org-2-2-s-programmnoj-zapisyu-i-vypolneniem-makrosa-na-yazyke-starbasic-ne-vba/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/smena-kodovoj-straniczy-fajlov-foxpro/</link>
					<title><![CDATA[Смена кодовой страницы файлов foxpro]]></title>
                    					    <author><![CDATA[aga]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:34 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Смена кодовой страницы файлов foxpro</h1>
													</header>
													<div id="sol_opis">Еще одна утилитка для смены кодовой страницы у файлов foxpro Взята из журнала FoxTalk лет 10 назад и немножко мной поправлена</div>
<div id="sol_body">Смена кодовой страницы у файлов foxpro (dbf, scx, vcx, mnx, frx)<br /> Я взял из CPZero и оставил только 3 CP: 866, 1251, 0.<br /> Можно обработать как весь каталог так и отдельный файл<br /> Нужно бы добавить еще обработку подкаталогов, пробуйте.</div>
<div id="sol_avtor">Автор: foxtalk + aga</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4621">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4621">aga</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="aga" href="https://foxclub.ru/account/?user=4621">
				<img alt='' src='https://secure.gravatar.com/avatar/7996b34d7a5bc4230bc67ca9bf7576fd?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7996b34d7a5bc4230bc67ca9bf7576fd?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 09-10-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/smena-kodovoj-straniczy-fajlov-foxpro/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/glyadelka-mem-fajlov/</link>
					<title><![CDATA[Гляделка Мем файлов]]></title>
                    					    <author><![CDATA[s66]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:34 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Гляделка Мем файлов</h1>
													</header>
													<div id="sol_opis">Не судите строго, но набосал утилитку за пару часов. Просто мне самому стало интересно сделать программку для просмотра и редактирования мем файлов. Специально использовал только базовые классы Фокса. Что получилось... оцените................ может кому и пригодится.....Для VFP 9! Если кому интересно, скину исходник для любой версии фокса ....</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: s66</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4715">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 19 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4715">s66</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="s66" href="https://foxclub.ru/account/?user=4715">
				<img alt='' src='https://secure.gravatar.com/avatar/3c29c7df126720fdc5daa7a6310e60d4?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/3c29c7df126720fdc5daa7a6310e60d4?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 09-02-2007        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/glyadelka-mem-fajlov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-upravleniya-miganiem-okna-programmy-knopki-v-paneli-zadach/</link>
					<title><![CDATA[Класс управления миганием окна программы (кнопки в панели задач)]]></title>
                    					    <author><![CDATA[Влад Колосов]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:30 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс управления миганием окна программы (кнопки в панели задач)</h1>
													</header>
													<div id="sol_opis">Хорошо иметь индикацию о завершении задания программой, находящейся в свернутом виде! Поместите объект FlashWind на форму и в нужный момент вызывайте метод Flash(1). Настройка режимов мигания и скорости.</div>
<div id="sol_body">13.06.2007 добавлена проверка на Top-Level Form, при отсутствии входного парамера принимается значение "включить".</div>
<div id="sol_avtor">Автор: Влад Колосов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4894">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4894">Влад Колосов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Влад Колосов" href="https://foxclub.ru/account/?user=4894">
				<img alt='' src='https://secure.gravatar.com/avatar/6d059ca093aa6e3bd9ac83999fb80409?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/6d059ca093aa6e3bd9ac83999fb80409?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 05-05-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-upravleniya-miganiem-okna-programmy-knopki-v-paneli-zadach/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/menyushka-na-trivyushke/</link>
					<title><![CDATA[Менюшка на тривьюшке]]></title>
                    					    <author><![CDATA[Коляныч]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:34 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Менюшка на тривьюшке</h1>
													</header>
													<div id="sol_opis">Собственно без претензий на новаторство - делал для своего удобства, может кому сгодится.  Идею запихнуть дерево в ДБФ увидел в книге Клепинина (еще раз низкий поклон ВСЕМ авторам!), а еще в FPD26 в своих задачах обновляемые меню  хранил в DBF. Так получился "меню -конструктор ".   Что это дает? Имея тиражируемый программный продукт,(в моем случае бухгалтерские приложе-ния), сталкиваюсь с необходимостью специфических  частных доработок на разных предприятиях (а особенно по SQL-запросам).  Теперь много чего можно лепить тут-же за столом заказчика. С примером не мудрил - просто взял живой, а иконки накидал "от потолка".   Выслушаю любые пожелания, или подрисуйте что-нибудь сами.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Коляныч</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4988">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4988">Коляныч</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Коляныч" href="https://foxclub.ru/account/?user=4988">
				<img alt='' src='https://secure.gravatar.com/avatar/6ce596cf4f9a06f950c673212dcc1f0c?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/6ce596cf4f9a06f950c673212dcc1f0c?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 18-12-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/menyushka-na-trivyushke/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/alternativa-vypadayushhego-spiska-komboboksa/</link>
					<title><![CDATA[Альтернатива выпадающего списка комбобокса]]></title>
                    					    <author><![CDATA[Ydin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:34 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Альтернатива выпадающего списка комбобокса</h1>
													</header>
													<div id="sol_opis">Выпадающий список комбобокса не всегда удовлетворяет пользователя. Форма поиска является альтернативой выпадающего списка. В моем решении я оставляю стандартную реакцию комбобокса по нажатию мышью в левой части. По нажатию на правой части (значек &quot;вниз&quot;) вызывается форма поиска. Вызвать форму можно для массива, т.е. не обязательно из комбо.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Ydin</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4809">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4809">Ydin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Ydin" href="https://foxclub.ru/account/?user=4809">
				<img alt='' src='https://secure.gravatar.com/avatar/1d0b9037d3d21551d6994ec6ae0105a6?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1d0b9037d3d21551d6994ec6ae0105a6?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 16-12-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/alternativa-vypadayushhego-spiska-komboboksa/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/proshhajte-glyuchnye-textboxy/</link>
					<title><![CDATA[Прощайте, глючные Textboxы!]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Mon, 21 Nov 2022 10:48:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Прощайте, глючные Textboxы!</h1>
													</header>
													<div id="sol_opis">Поведение стандартного контрола Textbox при перемещении по нему влево-вправо, при удалении символов, при нажатии Home и End - может довести пользователя до белого каления (ИМХО). Предложенный код в методе <em>KeyPress</em> заставляет данный контрол работать правильнее.</div>
<div id="sol_body">
<pre><pre class='bbcode'>    
  Lparameters nkeycode, nshiftaltctrl  
  Do Case  
    
  Case nkeycode=19 And nshiftaltctrl=0  
  	Nodefault  
  	If This.SelStart&gt;0  
  		DoDefault(nkeycode, nshiftaltctrl)  
  	Else  
  		If This.SelLength&gt;0  
  			This.SelLength=0  
  		Endif  
  	Endif  
    
  Case nkeycode=4 And nshiftaltctrl=0  
  	Nodefault  
  	If This.SelLength&gt;0  
  		This.SelStart=This.SelStart+This.SelLength  
  	Else  
  		If This.SelStart=This.MaxLength-1  
  			This.SelStart=This.MaxLength  
  		Else  
  			If This.SelStart#This.MaxLength  
  				DoDefault(nkeycode, nshiftaltctrl)  
  			Endif  
  		Endif  
  	Endif  
    
  Case Inlist(nkeycode,1,6) And (nshiftaltctrl=0)  
 *** Эти команды кажутся бессмысленными, однако убирают глючное перескакивание курсора при нажатии клавиши {End} или {Home} ***  
  	Nodefault  
  	DoDefault(nkeycode, nshiftaltctrl)  
    
  Case nkeycode=127  
  	Nodefault  
  	If This.SelStart&gt;0  
  		DoDefault(nkeycode, nshiftaltctrl)  
  	Else  
  		If This.SelLength&gt;0  
  			This.SelText=''  
  		Endif  
  	Endif  
  Endcase  
    
</pre>
</pre>
</div>
<div id="sol_avtor">Автор: Er0p</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/proshhajte-glyuchnye-textboxy/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/sozdanie-stroki-vida-create-table-na-osnove-sushhestvuyushhej-tabliczy/</link>
					<title><![CDATA[Создание строки вида CREATE TABLE &#8230; на основе существующей таблицы.]]></title>
                    					    <author><![CDATA[Влад Колосов]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:30 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Создание строки вида CREATE TABLE &#8230; на основе существующей таблицы.</h1>
													</header>
													<div id="sol_opis">Программа помещает строку создания таблицы в буфер обмена, позволяет извлечь максимум выгоды из визуального проектирования таблиц.   Часто бывает необходимо после разработки приложения и отладки вставить в свою программу коды создания таблиц. Например, в случае, когда приложение поставляется без готовых таблиц или таблицы утеряны, необходимо их создать заново. Дабы избежать утомительного ручного труда можно просто запустить эту программку.</div>
<div id="sol_body">Обновление - если у таблицы есть индекс .cdx, то формируется выражение создания таблицы со строками создания тэгов.</div>
<div id="sol_avtor">Автор: Владислав Колосов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4894">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4894">Влад Колосов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Влад Колосов" href="https://foxclub.ru/account/?user=4894">
				<img alt='' src='https://secure.gravatar.com/avatar/6d059ca093aa6e3bd9ac83999fb80409?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/6d059ca093aa6e3bd9ac83999fb80409?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 05-05-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/sozdanie-stroki-vida-create-table-na-osnove-sushhestvuyushhej-tabliczy/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/knopka-s-vypadayushhim-menyu/</link>
					<title><![CDATA[Кнопка с &#8220;выпадающим&#8221; меню]]></title>
                    					    <author><![CDATA[Deil]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:33 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Кнопка с &#8220;выпадающим&#8221; меню</h1>
													</header>
													<div id="sol_opis">Класс кнопки на базе кнопок... 🙂 Попытка реализации кнопки (наподобие эксплореровкой "назад") с "выпадающей" менюшкой.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Deil</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4430">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4430">Deil</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Deil" href="https://foxclub.ru/account/?user=4430">
				<img alt='' src='https://secure.gravatar.com/avatar/9cd77c5be15801be7524a5731f42a12f?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/9cd77c5be15801be7524a5731f42a12f?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 16-05-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/knopka-s-vypadayushhim-menyu/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/tajna-voprositelnogo-znaka/</link>
					<title><![CDATA[Тайна вопросительного знака]]></title>
                    					    <author><![CDATA[Владимир Журавлев]]></author>
                    										    <pubDate>Mon, 23 Feb 2026 18:45:35 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Тайна вопросительного знака</h1>
													</header>
													<p>Заранее прошу прощения у ассов клиент-сервер. Им совсем незачем читать эти заметки и ругать меня за изложение тривиальных вещей.<br />
Безусловно этот материал для начинающих делать клиент-сервер. Ну не сразу же в конце концов человек становиться ассом.</p>
<p>Когда то нужно с чего то начинать.<br />
Возможно я не совсем знаком с нашим уровнем знаний, но лично для меня тайна вопросительного знака стала своего рода откровением около двух с половиной лет назад. А когда я ее осознал, то стал ее применять и налево и направо и сэкономил кучу времени и кода.</p>
<p>Написание клиент -сервер из Фокса требует двух вещей - знание Фокса и знание сервера. Но наш Российский заказчик , впрочем как и зарубежный, бывает очень не стабилен. Вот говорит он тебе- я твердо решил взять сервером Интербейс. И если что имеешь против - гуляй дальше-программистов навалом.<br />
Вот сидишь ты , сидишь, мучаешься с кодом, и наконец, некоторый успех. Вроде научился плавать и ждешь от босса или клиента хоть маленькой похвалы. ( на материальные вознаграждения только слабая надежда.) И тут это гражданин(ка) или контора вдруг и говорит , мы решили -Оракл. ( а ты их сам умолял и просил до этого про это) И все -код-коту под хвост. Только ты освоился с Оракл, а они как капризная девица говорят- мы твердо решили -MS SQL.<br />
Ну вот, посколько у нас в стране любой даже самый захудалый заказчик или клиент очень редок, ты на все соглашаешья и молча учишь все это подряд. В такой ситуевине нужно все, что только можно сделать менее зависимым от сервера ( хотя реальной инвариатности кода все равно нет) и все , что только можно засунуть в классы библиотек, работающих с серверами. Тогда любой выворот уже и не страшен.<br />
Так вот огромную роль в этой самой инвариантности кода играет вопросительный знак. Кое что про него найдете в ссылках :<br />
<a href="http://support.microsoft.com/subbort/kb/articles/q156/6/31.asp?LNG=ENG&amp;AS=PER" rel="nofollow">http://support.microsoft.com/subbort/kb/articles/q156/6/31.asp?LNG=ENG&amp;AS=PER</a><br />
<a href="http://support.microsoft.com/support/kb/articles/q157/5/25.asp?LNG=ENG&amp;AS=PER" rel="nofollow">http://support.microsoft.com/support/kb/articles/q157/5/25.asp?LNG=ENG&amp;AS=PER</a></p>
<p>К большому сожалению во всех этих ссылках есть примеры с <strong>вопросительным знаком</strong> для команд сервера типа </p>
<p><pre class='bbcode'>  SELECT * from mytable where mytable.pid=?m.pid.  
</pre></p>
<p>Однако простая проверка показывает, что вопросительный знак работает и в других командах. Будь моя воля, я как всякий ленивый программист поставил бы памятник тому разработчику, кто придумал и реализовал этот самый вопросительный знак.<br />
Ну а теперь поближе к нашим баранам. Что это нам дает .<br />
Как скажем послать на Оракл ( другие сервера или куда подальше ) обычную переменную с полем типа дата , на MS SQL переменную с парой двойных одинарных или обратных апострофов, вообще целый файл с текстом, в котором вообще не известно какие спец символы и кавычки есть в бинарное поле Оракл. Техника , которую обычно советуют-замена одних кавычек на другие , что ломает текст. Ну всем известно, что есть функция SQLEXEC с командой сервера, а команда -это текстовая строка. Ну думаем мы-сделаем эту строку на Фоксе и все дела .<br />
Пусть мы имеем фоксовскую переменную <i>vfpdateofbirth</i> типа дата и хотим ее присвоить дню рождения работника на сервере Оракл . Напишем следующую переменную типа текст и пошлем ее на Оракл<br />
<pre class='bbcode'>  <br />  
  m.sql='insert into demo.employee (dateofbirth) values('+dtoc(vfpdateofbirth)+')'  &amp;&amp;- Переменная хоть куда - весь текст с чем надо. Посылаем на сервер<br />  
  =sqlexec(con,m.sql)<br />  
    
</pre><br />
И:.<br />
Оракл посылает нас к чертовой бабушке. Открываем справочник по Оракл и обнаруживаем, что данный сервер жутко чувствителен к формату Нужно еще знать Оракловскую функцию <i>to_date</i> и кучу ее правильных форматов,не всякий из которых годиться для Фокс переменной. То есть нужно написать что то вроде<br />
<pre class='bbcode'>  <br />  
  Cdt=dtoc(vfpdateofbirth)   
</pre></p>
<p><code>(to_date('"+cdt+"','DD.MM.YYYY'))". А то может быть и to_date('"+cdt+"',"DD.MM.YYYY HH24.MM.SS').</code><br />
если фоксовская переменная типа дэйттайм.<br />
Дальше-больше , для Интербейс нужно знать функцию преобразования типов cast , для MS SQL функцию convert. Так или иначе, все это все равно узнаешь, но ей богу это мнговато для такого старого маразматика , как я. Но вопросительный знак сам делает всю работу дез всяких таких функций. Перепишем нашу первую команду так<br />
<pre class='bbcode'>  <br />  
  m.sql='insert into demo.employee (dateofbirth) values (?dtoc(vfpdateofbirth)'<br />  
  =sqlexec(con,m.sql)  
</pre></p>
<p>Посылаем на любой сервер- и все хорошо.<br />
Есть правда несколько несколько небольших тонкостей на разных серверах. Скажем если послать пустую дату на MS SQL SERVER , он вместо нее запишет дату начала века ( зависит от текущих серверных установок). Следует заменить ее на NULL<br />
Проблема с апострофами для вопросительного знака не существует<br />
<pre class='bbcode'>  <br />  
  m.sql0='insert into table (fieldname) values ('m.sql2=")"<br />  
  m.sql=' "" '+" '' "+ . . . .! Сколько хочешь любых одиночных и парных апострофов<br />  
  m.sqlr=m.sql0+'?m.sql'+msql2<br />  
  sqlexec(con,.mqlr)  
</pre><br />
Переменная m.sqlr может быть даже содержанием файла, в котором бох знает что лежит . Вот фрагмент одной моей программы , где Фоксовые переменные разного типа посылаются на разные типы полей в MS SQL server<br />
<pre class='bbcode'>  <br />  
  aa='insert into 'thisform.port('Karti')<br />  
  SELECT karti<br />  
  rc=recc()<br />  
  j=0<br />  
  GO top<br />  
  bb+aa+'documents(documentcodeid,controltime,dateofcreation,outgono,incomno,corrdate,soprovno,contents, execdate,documenttypeid,soprovnodate,folder,correspondent) values('DO while not eof('karti')<br />  
  j=j+1<br />  
  select karti<br />  
  kd=0<br />  
  IF seek(int(val(kodd)),'docc','numcode')<br />  
  kd=docc.documentcodeid<br />  
  ELSE<br />  
  kd=0<br />  
  ENDIF<br />  
  sod=sodd+''+sodd1+''+sodd2+''+sodd3<br />  
  dl+iif(isdigit(delo),delo,'00')<br />  
 *** Решение проблемы пустой даты, чтобы не было 01.01.1900 01.01.2000<br />  
  srokt=iif(empty(sroki),null,sroki)<br />  
  datpt+iif(empty(datp),null,datp)<br />  
  soprdatt+iif(empty(soprdat),null,soprdat)<br />  
  datot=iif(empty(dato),null,dato)<br />  
  dap1t=iif(empty(dap1),null,dap1)<br />  
  select karti<br />  
  cc=bb+"?kd,?srokt,?datpt,?isn,?vxn,?datot,?soprnom,?sod,?dap1t,1,?sorpdatt,?dl,?korr1)"<br />  
  IF sqlexec(con,cc)&gt;0<br />  
  ELSE<br />  
  thisform.write_error("karti",line())<br />  
 *messagebox(str(recno(karti)))<br />  
  ENDIF  
</pre><br />
<br />
Все переменные с вопросительным знаком -это переменные Фокса.</p>
<p>Владимир Журавлев</p>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4803">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4803">Владимир Журавлев</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Владимир Журавлев" href="https://foxclub.ru/account/?user=4803">
				<img alt='' src='https://secure.gravatar.com/avatar/fade0b88081aac265adcec71eabb56f4?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/fade0b88081aac265adcec71eabb56f4?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 26-03-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/tajna-voprositelnogo-znaka/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Статьи]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/intellisense-v-prilozheniyah/</link>
					<title><![CDATA[IntelliSense в приложениях]]></title>
                    					    <author><![CDATA[Влад Колосов]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:33 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>IntelliSense в приложениях</h1>
													</header>
													<div id="sol_opis">Вы сможете редактировать программы (PRG) в формах приложения, если воспользуетесь этим простым примером. Вся мощь IntelliSense будет в распоряжении пользователя - подсветка синтаксиса, автозавершение, подсказки. Более того, вы сможете написать свой словарь для любого языка программирования! Разрабатывалось в VFP 9.0</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Влад Колосов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4894">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4894">Влад Колосов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Влад Колосов" href="https://foxclub.ru/account/?user=4894">
				<img alt='' src='https://secure.gravatar.com/avatar/6d059ca093aa6e3bd9ac83999fb80409?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/6d059ca093aa6e3bd9ac83999fb80409?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 05-05-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/intellisense-v-prilozheniyah/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/rabota-s-fajlami-po-ftp/</link>
					<title><![CDATA[Работа с файлами по FTP]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:33 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Работа с файлами по FTP</h1>
													</header>
													<div id="sol_opis">Копирование, перемещение файлов с/на FTP сервер. Ведение логов, развитая система фильтров, например фильтр left(file_name,2)=&quot;i_&quot; and (file_ext=&quot;html&quot; or file_ext=&quot;htm&quot;) or full_file_name='index.zip'   файлы начинаются с &quot;i_&quot; и расширение равно (&quot;htm&quot; или &quot;html&quot;)  ИЛИ ПОЛНОЕ ИМЯ ФАЙЛА=&quot;index.zip&quot; применение функций FoxPro в фильтрах, ОПТИМИЗИРОВАННАЯ работа с FTP-серверами При помощи трех специальных флагов (flag1,flag2,flag3) можно дополнительно управлять фильтрами для работы с файлами. Пример left(file_name,2)=&quot;i_&quot; and (file_ext=&quot;html&quot; or file_ext=&quot;htm&quot;) or file_ext=&quot;xml&quot; and flag1 Без установленного флага (flag1) - работа только с файлами, названия которых начинаются с &quot;i_&quot; и расширение равно (&quot;htm&quot; или &quot;html&quot;) С флагом - дополнительно к предыдущим файлам будут отбираться файлы с расширением &quot;xml&quot; Исходники программы  </div>
<div id="sol_body">Запускать необходимо форму a_wiz_ftp ! Краткая теория :<br /> Есть несколько FTP Serverov, которые нужно работать с некоторой периодичностью.<br /> Для работы с каждым сервером прописываются :</p>
<p> ftp server, например ftp.narod.ru<br /> login<br /> пароль</p>
<p> C этим сервером при помощи некоторых правил я могу работать, например, скопировать файлы с локального диска на сервер, переместить или скопировать файлы с сервера на локальный диск.<br /> При помощи FC можно явно задать с какими файлами работать (например, скопировать index.html), или просто указать каталог отправки и передачи.<br /> Мало того, при помощи фильтра я могу работать только с теми файлами, которые мне нужны, например, <br /> фильтр left(file_name,2)="i_" отберет только файлы, названия которых (первые две позиции) начинаются с "i_"<br /> фильтр left(file_name,2)="i_" and file_ext="html" сделает тоже самое, НО отберет только файлы с расширением "html"<br /> фильтр left(file_name,2)="i_" and (file_ext="html" or file_ext="htm") or full_file_name='index.zip' <br />  файлы начинаются с "i_" и расширение равно ("htm" или "html")  ИЛИ ПОЛНОЕ ИМЯ ФАЙЛА="index.zip"<br /> Можно работать (составлять фильтр) со следующими параметрами:<br /> file_name - имя файла без расширения<br /> full_file_name - полное имя файла (с точкой и расширением)<br /> file_ext - расширение файла<br /> file_size - размер файла в байтах<br /> file_date - дата файла (вида ДД/ММ/ГГГГ), формат - DATE<br /> file_date_time -  дата_время файла (вида ДД/ММ/ГГГГ ЧЧ:ММ:СС), формат - DATETIME<br /> file_size>50000 - выбор файлов, размер которых больше 50000 байт<br /> file_date=date() - выбор файлов, дата которых совпадает с текущей датой <br /> file_date_time>ctot('01/06/2006 12:45:59') - выбор файлов с датой больше 01/06/2006 и временем больше 12:45:59</p>
<p> left(file_name,3)="TAG" and file_ext="DBG" and file_datedate()<br /> file_name="KCT"+alltr(str(year(date())))+iif(month(date())																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/igrushka-dlya-obucheniya-chteniyu/</link>
					<title><![CDATA[Игрушка для обучения чтению]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Tue, 01 Sep 2020 13:58:44 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
															<figure>
									<img width="610" height="896" src="https://foxclub.ru/wp-content/uploads/2007/04/book_large.jpg" class="attachment-large size-large wp-post-image" alt="" decoding="async" loading="lazy" />								</figure>
														<h1>Игрушка для обучения чтению</h1>
													</header>
													<div id="sol_opis">Выражаю свою благодарность добрым людям Dmas и Hel!Riser, которые помогли мне своими советами на форуме Foxpro Club при написании этой программы. А также Владимиру Максимову и многим другим, чьи статьи и комментарии на форуме помогали усваивать FoxPro, что теперь дает возможность мне на старости лет зарабатывать на хлеб, иногда с маслом ;о) Эта игрушка сделана для моего внука в самом начале Третьего тысячелетия в качестве моей учебной задачи (я тогда начинал на VFP6), так что программа вполне эпохальна :о) Внук уже давно учится в школе, поэтому можно считать, что опытную эксплуатацию программа успешно прошла. А теперь растет внучка, и пришлось вспомнить об игрушке, а заодно выложить её на всеобщее обозрение.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: gaff.ko</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/igrushka-dlya-obucheniya-chteniyu/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Игры]]></category><enclosure url="https://foxclub.ru/wp-content/uploads/2007/04/book_large.jpg" type="image/jpeg" />				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/derevo-po-slovaryu-svyazannogo-otnosheniem-samo-na-sebya/</link>
					<title><![CDATA[Дерево по словарю, связанного отношением само-на-себя]]></title>
                    					    <author><![CDATA[Hel!Riser]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:16 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Дерево по словарю, связанного отношением само-на-себя</h1>
													</header>
													<div id="sol_opis">Данный класс представляет данные в древовидной структуре (исп. TreeView) таблицу, со структурой связи сама-на-себя. В классе присутствует как компонент чистого отображения, так и поиск по дереву. ЗЫ добавлена поддержка ИД-полей с числовым типом и заточена работа от 6.0 до 9.0 версий Фокса  ЗЫЫ багофикс найденный flaxby. Непрально показывалось число найденных узлов + кой ч:е найденое не показывалось при определенных условиях</div>
<div id="sol_body">
<h3>Дерево по словарю, связанного отношением само-на-себя</h3>
<p> В архиве содержится краткое описание класса, таблица и форма с примером пользования.   </div>
<div id="sol_avtor">Автор: Hel!Riser</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4814">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4814">Hel!Riser</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Hel!Riser" href="https://foxclub.ru/account/?user=4814">
				<img alt='' src='https://secure.gravatar.com/avatar/e2a29a43d5cd1efb980fa624551c4b00?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e2a29a43d5cd1efb980fa624551c4b00?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 11-03-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/derevo-po-slovaryu-svyazannogo-otnosheniem-samo-na-sebya/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/primer-odnoformennoj-programmy/</link>
					<title><![CDATA[Пример одноформенной программы.]]></title>
                    					    <author><![CDATA[Влад Колосов]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:33 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Пример одноформенной программы.</h1>
													</header>
													<div id="sol_opis">Некоторые программисты при создании простого приложения (одна-две формы) стараются подавить вывод главного окна VFP и подменяют его формой в режиме Top-Level. Тут же начинаются вопросы - как мне показать меню, как мне показать статус-строку, как избавиться от деактивирования, как создать панель инструментов. Все проблемы отпадают, если НЕ отказываться от главного окна _screen. Пример показывает, как можно получить одноформенный интерфейс со всеми преимуществами главного окна. Версия VFP 9.0</div>
<div id="sol_body">Исправлено - пересмотрен код с тем, чтобы программа более соответствовала принципам ООП.</div>
<div id="sol_avtor">Автор: Влад Колосов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4894">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4894">Влад Колосов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Влад Колосов" href="https://foxclub.ru/account/?user=4894">
				<img alt='' src='https://secure.gravatar.com/avatar/6d059ca093aa6e3bd9ac83999fb80409?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/6d059ca093aa6e3bd9ac83999fb80409?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 05-05-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/primer-odnoformennoj-programmy/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/sklonenie-fio-v-datelnom-padezhe-dlya-doverennostej-pochtovyh-perevodov-i-prochee-versiya-2-1/</link>
					<title><![CDATA[Склонение ФИО в дательном падеже (для доверенностей, почтовых переводов и прочее). Версия 2.1]]></title>
                    					    <author><![CDATA[rvc44]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:33 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Склонение ФИО в дательном падеже (для доверенностей, почтовых переводов и прочее). Версия 2.1</h1>
													</header>
													<div id="sol_opis">Данная задача впервые возникла у меня еще 02.12.1998 при написании модуля на интерпретаторе, написанном на Clipper (лишенном конструкции CASE), для формирования доверенностей. Позже задача всплыла уже на VFP для формирования имени получателя в дательном падеже в бланке почтового перевода. Благодаря ценным замечаниям waw и жы-шы 28.02.2007 г. создана исправленная версия 2.1</div>
<div id="sol_body">
<p>Что нового в версии 2.1 от 28.02.2007 г.:<br />
1. Добавлена обработка грузинских (на "ИА","ИЯ") и некоторых французских фамилий-исключений<br />
2. Особо обрабатывается склонение женских грузинских фамилий типа "ОкуджаВА" (по окончанию не отличается от русской)<br />
3. Переписана обработка фамилий на "ОК" и "ЕК"<br />
4. Список последних букв, встречающихся в типичных мужских именах существенно расширен практически до всех согласных<br />
5. Расширен список № 1 иностранных фамилий, оканчивающихся на согласный звук, дополняющихся буквой "У" у мужчин,<br />
однако он пока еще не полный</p>
<p>Что нового в версии 2.0 от 26.02.2007 г.:<br />
1. Добавлена обработка мужских имен на "ья" (Илья)<br />
2. Добавлена обработка мужского имени "Лев"<br />
3. Более тщательно переписана обработка фамилий, заканчивающихся на "ец". Рассмотрены разные случаи...<br />
4. Более четко анализируются фамилии на "ий" (-ому, -ему) и "ая" (-ой, -ей)<br />
5. Исправлено склонение фамилии на -ия у мужчин и запрещено у женщин<br />
6. Фамилии на -уа больше не склоняются<br />
7. Особо обрабатываются фамилии исключения типа Бокий (-ию)<br />
8. Повторяющиеся коды обработки мужского и женского имен помечены в виде отдельных блоков-процедур</p>
<p>Предупреждаю сразу - я не лингвист и рядом даже не стоял. Тем не менее рецензия грамотного лингвиста, включающая все советы и замечания по данной процедуре, была бы здесь очень желательна и уместна. Поэтому, ввиду отсутствия рецензии лингвиста на данном этапе, прошу вас за найденные ошибки сильно меня не ругать и не пинать, но все ваши ценные замечания с благодарностью приму! Хочу отметить, что приведенная ниже моя разработка, не смотря на все ее очевидные недостатки и достоинства, тем не менее, с 1998 года успешно работает и по сей день. Если не затруднит, то помогите советом по ее улучшению и сообщениями о найденных багах!</p>
<p>Теперь о том, что в коде не хватает:<br />
1. Грамотная обработка встречающихся в России, но не русских по происхождению имен с "ОГЛЫ", "АТА" и т.п.<br />
2. Перечень разнообразных имен и фамилии, а также разных "исключений" из правил формировался в основном<br />
на базе телефонного справочника г.Тамбова. А Тамбов город маленький (всего 300 тыс. жителей), поэтому<br />
наверняка вы придумаете еще пару редких склоняемых фамилий, которые для задачи склонения просьба огласить<br />
ниже в комментариях для народного обсуждения...<br />
3. Можно и нужно переписать функцию с использованием конструкции DO CASE и избавиться от многочисленных "IF"</p>
<pre class="bbcode">      
  * Процедура GetDativ склонения ФИО получателя в дательном падеже (кому?).    
  * Версия 2.1 исправленная. Обсуждение проекта также здесь: <a href="http://gramota.ru/forum/read.php?f=7&amp;i=1217&amp;t=1217" target="_blank" rel="nofollow noopener noreferrer"><u>gramota.ru</u></a>    
  * Приведенный код может содержать ошибки, но Вы можете свободно использовать его на свой страх и риск.    
  * Тестирование продолжается. Присылайте и пишите свои отзывы и замечания. Спасибо всем откликнувшимся!    
  * Полезные ссылки:    
  * Особенности склонения фамилий и личных имен <a href="http://spravka.gramota.ru/surnames.html" target="_blank" rel="nofollow noopener noreferrer"><u>spravka.gramota.ru</u></a> Отсюда взяты правила!    
  * Склонение личных имен в русском языке <a href="http://www.nazovite.ru/sklonenie" target="_blank" rel="nofollow noopener noreferrer"><u>www.nazovite.ru</u></a>    
  * Cловари русского языка для скачивания <a href="http://dicts.alphanet.org.ua/" target="_blank" rel="nofollow noopener noreferrer"><u>dicts.alphanet.org.ua</u></a>    
  * По последней ссылке можно скачать в т.ч. словарь фамилий familii.exe 2,160,669 байт (7 миллионов фамилий)    
  * Книга: "Склонение фамилий и личных имен в русском литературном языке."    
  * Автор: Калакуцкая Л.П., Издание: М. ; Наука 1984г, Страниц: 221    
  * Книга: "Современные русские фамилии."    
  * Автор: Суперанская А.В., Суслова А.В. Издание: М. ; Наука 1981г, Страниц: 176    
  * На с. 120-122 последнего издания приводятся русские фамилии на "ой", "ий", "ый", без показателя (суффикса) "ск", как в фамилии КрамСКой)    
        
    LPARAM lFIO    
    LOCAL Fam, Ima, Otc, ManLstLt, WmnLstLt, ManFamEnd, IiFamEnd, WmnFamEnd, ;    
    	  Jud1FamEnd, Jud2FamEnd, Jud3FamEnd, FranceFam, LstLtIma, LstTwoIma, ;    
    	  LstLtFam, LstTwoFam, LstTwoOtc, Processed, Sex, lDefisPos    
        
    Fam = SubStr(lFIO,1,At(" ",lFIO)-1) &amp;&amp; Фамилия, Имя, Отчетво    
    Ima = AfterAtNum(" ",lFIO,1)        &amp;&amp; потребуются для процедуры склонения    
    Ima = SubStr(Ima,1,At(" ",Ima)-1)   &amp;&amp; их в дательном падеже (кому?)    
    Otc = AfterAtNum(" ",lFIO,2)    
        
  * Список всех гласных букв русского алфавита (требуются для проверки букв, стоящих перед окончаниями сложных фамилий)    
    Vowels    = 'АЕЁИОУЭЫЮЯ'    
  * Список шипящих букв, необходимых для правильного склонения фамилий, заканчивающихся на эта буква + "ИЙ" или "АЯ"    
    Hissing   = 'ЧШЩ'    
  * Список последних букв, встречающихся в типичных мужских именах    
  * ГлеБ,СлаВ,ОлеГ,ЭдуарД(АльфреД),ГилядЖ,ЧингиЗ,МарК,МихаиЛ,ВадиМ,ИваН,ЮсуП,ВиктоР,БориС(ФеликС),ФилареТ(МараТ),ИосиФ,АристарХ    
    ManLstLt  = 'БВГДЖЗКЛМНПРСТФХ'    
  * Список последних букв, встречающихся в типичных женских именах    
    WmnLstLt  = 'АЯЬ'  &amp;&amp; МаринА, АнастасиЯ, ИЯ (исключение), ЛюбовЬ    
  * Список окончаний мужских славянских (русских) фамилий. На -ов фамилии отцовы, на -ин фамилии мамины.    
    ManFamEnd = 'ЕВ ЁВ ИН ОВ ЫН'    
  * Список окончаний мужских славянских (русских) фамилий, заканчивающихся на 'Й'    
  * Чисто русские фамилии без "-ск-": БлагОЙ,ТолстОЙ,БоровОЙ,БереговОЙ,ЛановОЙ,БроневОЙ,ДикИЙ,ГладкИЙ,ЛучшИЙ,ПоперечнЫЙ,...    
  * Существует ряд воспринимаемых неоднозначно фамилии ТопчИЙ, ПобожИЙ, БокИЙ, РудОЙ и т.п.,    
  * как имеющих окончания "-ий","-ой", и склоняющихся как прилагательные (ТопчИЙ-&gt;ТопчЕМУ /жен.ТопчЕЙ/)    
  * или как с нулевым окончанием и склонением по образцу существительных (ТопчИЙ-&gt;ТопчИЮ /жен.ТопчИЙ/)    
    IiFamEnd  = 'ИЙ ОЙ ЫЙ'  &amp;&amp; ГорькИЙ (ЖириновскИЙ), ДонскОЙ (МеньшОЙ, РябОЙ), ПоперечнЫЙ (СытЫЙ)    
  * Список окончаний женских славянских фамилий    
    WmnFamEnd = 'АЯ ВА НА'  &amp;&amp; ПодольскАЯ, РубиноВА, КлепиниНА    
  * СПИСОК N 1 ИНОСТРАННЫХ ФАМИЛИЙ, ОКАНЧИВАЮЩИХСЯ НА СОГЛАСНЫЙ ЗВУК, ДОПОЛНЯЮЩИХСЯ БУКВОЙ "У" У МУЖЧИН    
  * БессарАБ,КостопрАВ,КимчАГ,ТихолАЗ,СобчАК(КолчАК,ПастернАК),ХейердАЛ,КипермАН(НеждАН),НовАР,НикитАС,БАХ,КАЦ,    
  * ВагнЕР(ГомЕР),СервантЕС,АврЕХ,СаркИЗ,ТютюннИК(ТаможеннИК),КИМ,ЭдИП,СабонИС,СмИТ,ЛифшИЦ,МаслиевИЧ,ЭЙН,ВоЛК,МаксвеЛЛ,    
  * БраМС,ЛантиНГ,ГельфаНД,СаркисьяНЦ,МорОЗ,НиксОН(КлинтОН),РуссОС,кОХ,РезерфоРД,ОленбеРГ,НаймаРК,ЭйнгоРН,ПреСС,ЭрнСТ,МокрозУБ,    
  * ЦингаУЗ,ШевчУК,СтУЛ,ЦикУН,МацкявичУС,БУШ,ЛинколЬН,ТизенголЬТ,ПелЬШ,БаландЮК,КЮН,ТретьЯК,ШамоЯН,МотЯС (пока 54 штуки)    
    Jud1FamEnd = 'АБ АВ АГ АЗ АК АЛ АН АР АС АХ АЦ ЕР ЕС ЕХ ИЗ ИК ИМ ИП ИС ИТ ИЦ ИЧ ЙН ЛК ЛЛ МС НГ НД НЦ ' +;    
    			 'ОЗ ОН ОС ОХ РД РГ РК РН СС СТ УБ УЗ УК УЛ УН УС УШ ЬН ЬТ ЬШ ЮК ЮН ЯК ЯН ЯС'    
  * СПИСОК СКЛОНЯЕМЫХ НЕ РУССКИХ ФАМИЛИЙ N 2, заканчивающихся на гласные звуки А-&gt;Е и Я-&gt;Е, с предшествующей согласной    
  * за исключением указанных ниже несклоняемых фамилий французского происхождения. Например:    
  * ДзюБА,ГулыГА(МаГА,искл.ДеГА),НегоДА,ДюДЯ,ГамалЕЯ,ГлинКА(ДейнеКА,искл.ЛюКА),ИгЛА,,ЗозуЛЯ,КайМА(КарМА),КуралеНЯ,    
  * МазеПА(искл.ПетиПА),ГализдРА(искл.ГамарРА),ОпРЯ,ТупоТА,ВаренуХА,ЛисиЦА,ОлеША    
    Jud2FamEnd = 'БА ГА ДА ДЯ ЕЯ КА ЛА ЛЯ МА НЯ ПА РА РЯ ТА ХА ЦА ША'  &amp;&amp; ... все на "А" и "Я" (здесь можно не пополнять)    
  * СПИСОК НЕ РУССКИХ ФАМИЛИЙ N 3 (фамилии, заканчивающиеся на "А[Й]"-&gt;"Ю", "[Ь]"-&gt;"Ю" и "У[Й]"-&gt;"Ю" у мужчин)      
  * МаклАЙ,ЛебеДЬ,ДруЗЬ,КоваЛЬ(ВрубеЛЬ,ГогоЛЬ,РозентаЛЬ,ЧерчилЛЬ),ОболоНЬ,ХемингуЭЙ,ХалУЙ    
    Jud3FamEnd = 'АЙ ДЬ ЕЙ ЗЬ ЛЬ НЬ ЭЙ УЙ'  &amp;&amp; ...  ЕЙ (кроме ВоробЕЙ, СоловЕЙ), а на "Ь" - любые (здесь можно не пополнять)    
  * Несклоняемые фамилии французского происхождения: ДеГА, ЛюКА, ДюМА (ТоМА, ФерМА), ПетиПА и ГамарРА и др.     
    FranceFam = 'ДЕГА ЛЮКА ДЮМА ТОМА ФЕРМА ПЕТИПА ГАМАРРА ЗОЛЯ ТРУАЙА' + Space(1)    
        
  * Для проведения анализа при склонении нам потребуются:    
    LstLtIma  = Upper(Right(Ima,1))  &amp;&amp; Последняя буква имени    
    LstTwoIma = Upper(Right(Ima,2))  &amp;&amp; Последние две буквы имени    
    LstLtFam  = Upper(Right(Fam,1))  &amp;&amp; Последняя буква фамилии    
    LstTwoFam = Upper(Right(Fam,2))  &amp;&amp; Последние две буквы фамилии    
    LstTwoOtc = Upper(Right(Otc,2))  &amp;&amp; Последние две буквы отчества    
    Processed = 0  &amp;&amp; Признак того, что фамилия и имя еще не обработаны    
    Sex = "?"  &amp;&amp; Пол: "М" - мужской, "Ж" - женский, "?" - не определен достоверно.    
        
  * Синтаксический разбор мужских и женских отчеств    
  * И одновременная попытка определения пола человека    
  * Также однозначно просклоняем отчество. Здесь нет трудностей.    
    If LstTwoOtc=="ИЧ" &amp;&amp;Если отчество заканчивается на буквы "ИЧ"    
    	Otc = Proper(Otc)+"у"  &amp;&amp; Upper(Left(Otc,1))+Lower(SubStr(Otc,2,Len(Otc)-1))+"у" (даже Савельичу!)    
    	Sex = "М"    
    EndIf    
    If Upper(Right(Otc,1))=="А" &amp;&amp; Если отчество заканчивается на букву "А"    
    	Otc = Upper(Left(Otc,1))+Lower(SubStr(Otc,2,Len(Otc)-2))+"е"    
    	Sex = "Ж"    
    EndIf    
    If Sex=="?"    
   	* "оглы" (для мужчин) и "кызы" (для женщин) не склоняются и могут писаться    
   	* как через черточку, так и отдельно от первой части отчества (однозначно определяют пол),    
   	* то есть ФИО может состоять из 4 слов.    
    	If At("ОГЛЫ", Upper(lFIO))    
    		Sex = "М"    
    	Else    
    		If At("КЫЗЫ", Upper(lFIO))    
    			Sex = "Ж"    
    		EndIf    
    	EndIf    
    EndIf    
  * Кто знает как правильно обрабатывать "ОГЛЫ", допишите свой код здесь ...    
        
  * Синтаксический разбор мужских фамилий и имен    
  * Если фамилия заканчивается на "ЕВ","ЁВ","ИН","ОВ","ЫН","ИЙ","ОЙ","ЫЙ"    
    If At(LstTwoFam, ManFamEnd)&lt;&gt;0 OR At(LstTwoFam, IiFamEnd)&lt;&gt;0    
    	If Sex=="М"  &amp;&amp; Если обрабатывается мужчина    
    		Processed = 1 &amp;&amp; Признак того, что фамилия и имя уже обработаны    
   		* Обработка мужской фамилии, заканчавающихся на "Й" весьма разнообразен и полон исключений    
   		* ПодольскИЙ, ВИЙ, ОкИЙ, БокИЙ, ЭдипИЙ, ЛенскИЙ, ВислоБокИЙ, СинеокИЙ, ГлубокИЙ, ТолстОЙ, СытЫЙ, ВиднЫЙ    
    		If At(LstTwoFam, IiFamEnd)&lt;&gt;0    
   			* Подобрано эмпирически, что фамилии на "ИЙ" длиной от 1 до 6, должны склоняться как исключение "БокИЙ"    
   			* Причем не помогает анализ предшествующей гласной. Так [БокИЙ] -&gt; [БокИЮ], но [ВислоБокИЙ] -&gt; [ВислоБокОМУ]    
   			* Предполагаем, что короткой фамилии ЭнскИЙ не существует, иначе она будет у нас склоняться неверно!    
        
   			* ПРАВИЛО РУССКОГО ЯЗЫКА: Фамилии с формальным показателем (суффиксом) -ск- (ДостоевСКий) склоняются    
   			* в мужском и женском роде и во множественном числе как прилагательные.    
    			If (LstTwoFam == "ИЙ") AND Len(Fam) &lt; 6  &amp;&amp; ВИЙ, ОкИЙ, БокИЙ  ([ИЙ]-&gt;[ИЮ])    
    				Fam = Upper(Left(Fam,1))+Lower(SubStr(Fam,2,Len(Fam)-2))+"ю"    
    			Else    
   				* Необходимо обработать также случай [ИЙ]-&gt;[ЕМУ], помимо наиболее распространенного [ИЙ]-&gt;[ОМУ].    
   				* Например [ПодьячИЙ]-&gt;[ПодьячЕМУ], [ЛучшИЙ]-&gt;[ЛучшЕМУ], [СмотрящИЙ]-&gt;[СмотрящЕМУ]    
    				If At(Upper(SubStr(Fam,Len(Fam)-2,1)), Hissing)&lt;&gt;0    
    					Fam = Upper(Left(Fam,1))+Lower(SubStr(Fam,2,Len(Fam)-3))+"ему"    
    				Else    
    					Fam = Upper(Left(Fam,1))+Lower(SubStr(Fam,2,Len(Fam)-3))+"ому"    
    				EndIf    
    			EndIf    
    		Else  &amp;&amp; Все типично русские мужские фамилии склоняются по этой строке:    
    			Fam = Proper(Fam)+"у"    
    		EndIf    
   		************************************    
   		* Процедура обработки мужского имени    
    		If At(LstLtIma, ManLstLt)&lt;&gt;0    
    			DO Case    
    				Case Upper(Ima) == "ЛЕВ"   &amp;&amp; Если Лев, то "ЕВ"-&gt;"ЬВУ"    
    					Ima = Upper(Left(Ima,1))+"ьву"    
    				Case LstTwoIma == "ЕЛ"     &amp;&amp; Если ПавЕЛ, то убираем коренную гласную "Е" ("ЕЛ"-&gt;"ЛУ")    
    					Ima = Upper(Left(Ima,1))+Lower(SubStr(Ima,2,Len(Ima)-3))+"лу"    
    				Otherwise    
    					Ima = Proper(Ima)+"у"  &amp;&amp; Upper(Left(Ima,1))+Lower(SubStr(Ima,2,Len(Ima)-1))+"у" &amp;&amp; ИваН    
    			EndCase    
    		Else    
    			DO Case    
    				Case (LstLtIma=="А") OR (LstLtIma=="Я")  &amp;&amp; НикитА, КузьмА, ЛукА, ФомА, СаввА, ИлиЯ, ИльЯ    
    					Ima = Upper(Left(Ima,1))+Lower(SubStr(Ima,2,Len(Ima)-2))+"е"    
   				* АлексеЙ,АнатолиЙ,АндреЙ,АркадиЙ,АрсениЙ,АртемиЙ,ВалериЙ,ВасилиЙ,ВиталиЙ,ГеннадиЙ,ГеоргиЙ,ГригориЙ,ДмитриЙ,    
   				* ЕвгениЙ,ЗиновиЙ,ИннокентиЙ,ЛаврентиЙ,МатвеЙ,МефодиЙ,МоисеЙ,НиколаЙ,СергеЙ,ТимофеЙ,ФеодосиЙ,ЮлиЙ,ЮриЙ    
   				* ГаделЬ,ГэмилЬ,ДжалилЬ,РафаэлЬ,ИгорЬ,КамилЬ,НаилЬ,ЛазарЬ,РавилЬ,РаилЬ,РасилЬ,ФаилЬ,ХалилЬ,ШамилЬ,ЭмилЬ,ЯлилЬ,ЯмилЬ    
    				Case (LstLtIma=="Й") OR (LstLtIma=="Ь")    
    					Ima = Upper(Left(Ima,1))+Lower(SubStr(Ima,2,Len(Ima)-2))+"ю"    
    			EndCase    
    		EndIf    
   		************************************    
    	EndIf  &amp;&amp; Sex=="М"    
    EndIf    
        
  * Синтаксический разбор женских фамилий и имен    
    If At(LstTwoFam, WmnFamEnd)&lt;&gt;0  &amp;&amp; Если фамил. зак-тся на "АЯ","ВА","НА",проверим посл.букву имени    
    	If Sex=="Ж"  &amp;&amp; Если обрабатывается женщина    
    		Processed = 1  &amp;&amp; Признак того, что фамилия и имя уже обработаны    
   		* Обработка женской фамилии    
    		If LstTwoFam=="АЯ"  &amp;&amp; Касат[АЯ-&gt;ОЙ], Гурцк[АЯ-&gt;ОЙ] но Лучш[АЯ-&gt;ЕЙ] и Цхак[АЯ-&gt;АЯ]    
   			* Необходимо обработать также случай [АЯ]-&gt;[ЕЙ], помимо наиболее распространенного [АЯ]-&gt;[ОЙ].    
   			* Например [ПодьячАЯ]-&gt;[ПодьячЕЙ], [ЛучшАЯ]-&gt;[ЛучшЕЙ], [СмотрящАЯ]-&gt;[СмотрящЕЙ]    
    			If At(Upper(SubStr(Fam,Len(Fam)-2,1)), Hissing)&lt;&gt;0    
    				Fam = Upper(Left(Fam,1))+Lower(SubStr(Fam,2,Len(Fam)-3))+"ей"    
    			Else    
    				If NOT(Upper(Right(Fam,4))=="АКАЯ")  &amp;&amp; Грузинская фамилия типа "Цхакая"    
    					Fam = Upper(Left(Fam,1))+Lower(SubStr(Fam,2,Len(Fam)-3))+"ой"    
    				EndIf    
    			EndIf    
    		Else  &amp;&amp; Самый массовый случай русских женских фамилий, например, КольцоВ[А-&gt;ОЙ]    
   			* Но сюда могут "закрасться" грузинские женские фамилии, типа "Окуджава", проверим дополнительно!    
    			If Upper(Right(Fam,3))=="АВА"    
    				Fam = Upper(Left(Fam,1))+Lower(SubStr(Fam,2,Len(Fam)-2))+"е"    
    			Else    
    				Fam = Upper(Left(Fam,1))+Lower(SubStr(Fam,2,Len(Fam)-2))+"ой"    
    			EndIf    
    		EndI    
   		*************************************************************    
   		* Процедура обработки женского склоняемого имени,    
   		* т.е. не такого как несклоняемые имена: Жаклин, Каринэ, Нелли и т.п.    
    		If At(LstLtIma, WmnLstLt)&lt;&gt;0  &amp;&amp; Если имя зак-тся на "А","Я" или "Ь"    
    			If Upper(Right(Ima,2))=="ИЯ"  &amp;&amp; Имя оканчивается на -ия,    
    				If Upper(Ima)=="ИЯ"    
   					* Мою супругу зовут "Ия" (в переводе с греч."Фиалка"). Это "особый" случай!    
    					Ima = "Ие"    
    				Else    
   					* Если имя не Ия, то -ия заменяется на -ии, например, [ЛилИЯ]-&gt;[ЛилИИ]    
    					Ima = Upper(Left(Ima,1))+Lower(SubStr(Ima,2,Len(Ima)-3))+"ии"    
    				EndIf    
    			Else    
    				If LstLtIma&lt;&gt;"Ь"  &amp;&amp; СветланА, ДарьЯ    
    					Ima = Upper(Left(Ima,1))+Lower(SubStr(Ima,2,Len(Ima)-2))+"е"    
    				Else  &amp;&amp; ЛюбовЬ, НинелЬ    
    					Ima = Upper(Left(Ima,1))+Lower(SubStr(Ima,2,Len(Ima)-2))+"и"    
    				EndIf    
    			EndIf    
    		EndIf    
   		*************************************************************    
    	EndIf  &amp;&amp; Sex=="Ж"    
    EndIf    
        
  * Синтаксический разбор украинских и некоторых других фамилий и имен на 3-ем проходе    
    If Processed==0  &amp;&amp; Если фамилия и имя еще не обработаны    
   	* Вполне достоверно утверждение с сайта <a href="http://community.livejournal.com/ru_programming/478385.html#comments" target="_blank" rel="nofollow noopener noreferrer"><u>community.livejournal.com</u></a>,    
   	* что женские фамилии, оканчивающиеся на согласный звук и мягкий знак не склоняются, а фамилии,    
   	* оканчивающиеся на гласный звук склоняются не зависимо от пола, с учетом следующих двух правил:    
        
   	* ПРАВИЛО 1: Все фамилии, пишущиеся с е, э, и, ы, у, ю на конце, могут быть только несклоняемыми.    
   	* Таковы фамилии: ДоДЕ, МавроДИ(КеннеДИ,ГанДИ), АмаДУ, ОрджоникидЗЕ, ШабрИЕ, МеЙЕ, НасоновсКИ,    
   	* ЧаушесКУ, НобиЛЕ(КараджаЛЕ,ТарЛЕ), ЛюлЛИ(ШелЛИ,РуставеЛИ), НеедЛЫ, КаМЮ, АртмаНЕ,     
   	* АхвледиаНИ(МодильяНИ,ЧабукиаНИ), ЛаНУ, КорНЮ, НавОИ, ШОУ, ЛансеРЕ, ХараРИ(ГретРИ), НеРУ,    
   	* МегРЭ, МюсСЕ, ДебюсСИ(ГолсуорСИ), ГёТЕ(ОрбакайТЕ), ДжусойТЫ, МанЦУ, ГрамШИ, БоссЮЭ, ФурЬЕ,...    
        
   	* ПРАВИЛО 2: Все фамилии, оканчивающиеся на а, которому предшествуют гласные звуки (чаще всего у или и), несклоняемы:    
   	* Галуа, Моруа, Делакруа, Моравиа, Эриа, Эредиа, Гулиа.    
        
   	* ПРАВИЛО 3: Несклоняемы фамилии французского происхождения с ударением на конце: ЗоЛЯ, ТруаЙА.     
   	* Все прочие фамилии на "-я" склоняемы; таковы ГоловНЯ, ЗозуЛЯ, СырокомЛЯ, ГамалЕЯ, ГоЙЯ, ШенгелАЯ,    
   	* ДанелИЯ, БерИЯ, БакерИЯ, ИверИЯ.     
   	* Грузинские фамилии оказываются склоняемыми или несклоняемыми в зависимости от того, в каком виде    
   	* конкретная фамилия заимствована русским языком: фамилии на -ия склоняемы (Данелия), на -иа - несклоняемы (Гулиа).    
        
   	* Нерусский список N2 (Jud2FamEnd) фамилий, заканчивающихся на гласные звуки "А", "Я" с предшествующей согласной,    
   	* кроме исключений, состоящих из фамилий французского происхождения (FranceFam), таких как ФерМА и т.п.    
        
    	If ((LstLtFam=="А" AND LstTwoFam&lt;&gt;"ИА" AND LstTwoFam&lt;&gt;"УА") OR LstLtFam=="Я") AND ;    
    		LstLtFam&lt;&gt;"Е" AND LstLtFam&lt;&gt;"Э" AND LstLtFam&lt;&gt;"И" AND LstLtFam&lt;&gt;"Ы" AND LstLtFam&lt;&gt;"У" AND LstLtFam&lt;&gt;"Ю" AND ;    
    		At(Upper(Fam)+Space(1), FranceFam)=0    
        
    		If LstTwoFam=="ИЯ"  &amp;&amp; Склоняем грузинские фамилии на "ИЯ". Нам это разрешает делать правило!    
    			Fam = Upper(Left(Fam,1))+Lower(SubStr(Fam,2,Len(Fam)-2))+"и"    
    		Else  &amp;&amp; Склоняем остальные склоняемые фамилии, заканчивающиеся на гласную из списка Jud2FamEnd    
    			Fam = Upper(Left(Fam,1))+Lower(SubStr(Fam,2,Len(Fam)-2))+"е"    
    		EndIf    
    	EndIf    
    	DO Case    
    		Case Sex=="М"  &amp;&amp; Обрабатываем мужчину    
    			&amp;&amp; Нерусский список N1 (Jud1FamEnd)    
    			If At(LstTwoFam, Jud1FamEnd)&lt;&gt;0    
    				Fam = Proper(Fam)+"у"  &amp;&amp; Upper(Left(Fam,1))+Lower(SubStr(Fam,2,Len(Fam)-1))+"у"    
    			EndIf    
    			&amp;&amp; Нерусский список N3 (Jud3FamEnd)    
    			If Upper(Fam)=="СОЛОВЕЙ" OR Upper(Fam)=="ВОРОБЕЙ"  &amp;&amp; СОЛОВЕЙ, ВОРОБЕЙ (исключение)    
    				Fam = Upper(Left(Fam,1))+Lower(SubStr(Fam,2,Len(Fam)-3))+"ью"    
    			Else    
    				&amp;&amp; Список Jud3FamEnd ++    
    				If LstTwoFam=="АЙ" OR LstTwoFam=="ЕЙ" OR LstTwoFam=="УЙ" OR LstTwoFam=="ЭЙ" OR LstLtFam=="Ь"    
    					Fam = Upper(Left(Fam,1))+Lower(SubStr(Fam,2,Len(Fam)-2))+"ю"    
    				EndIf    
    			EndIf    
    			If LstTwoFam=="ЕЦ"    
   			    * Необходимо определять согласная или гласная буква находится перед "ЕЦ"    
   			    * МогилеВец, БоРец, КоБец (подвид 1 с предшествующим согласным звуком) [ЕЦ]-&gt;[ЦУ],    
   			    * БОец, КоломИец (подвид 2 с предшествующим гласным звуком /Vowels/)   [ЕЦ]-&gt;[ЙЦУ]    
    				If At(Upper(SubStr(Fam,Len(Fam)-2,1)), Vowels)=0    
    					Fam = Upper(Left(Fam,1))+Lower(SubStr(Fam,2,Len(Fam)-3))+"цу"    
    				Else    
    					Fam = Upper(Left(Fam,1))+Lower(SubStr(Fam,2,Len(Fam)-3))+"йцу"    
    				EndIf    
    			EndIf    
   			* КлюченОК,КовалЕнОК,МАзОК,МазурЕнОК,МазУрОК,МакарЕнОК,МакеЕнОК,МалашОнОК,МаскОлОК [ОК-&gt;КУ]    
   			* БаЙрОК[+У],БайЧтОК[+У],БлОК[+У],КоЛеОК[+У],КоЛтОК[+У],КосТлОК[+У],МаЛоОК[+У],ТененШтОК[+У],ТеСмОК[+У]    
   			* КоРшОК (МакАшОК, МалАшОК, ТерЕшОК, ТимОшОК) [ОК-&gt;КУ] (перед ОК стоит шипящая Ш)    
    			If LstTwoFam=="ОК"    
   				* "ОК" склоняем только у мужчин. Могут быть 2 случая:    
   				* 1 случай: КлюченОК [ОК-&gt;КУ]    
   				* 2 случай: БлОК [ОК-&gt;ОКУ]    
   				* Подмеченная закономерность (попробуйте опровергнуть - вряд ли удастся!):    
   				* Если 3-я с конца буква фамилии на "ОК" есть буква "Ш" или 4-я с конца буква гласная, то [ОК-&gt;КУ]    
    				If Len(Fam)&gt;3 AND (Upper(SubStr(Fam,Len(Fam)-3,1))=="Ш" OR ;    
    								   At(Upper(SubStr(Fam,Len(Fam)-4,1)), Vowels)&lt;&gt;0)    
    					Fam = Upper(Left(Fam,1))+Lower(SubStr(Fam,2,Len(Fam)-3))+"ку"    
    				Else  &amp;&amp; [ОК-&gt;ОКУ]    
    					Fam = Proper(Fam)+"у"    
    				EndIf    
    			EndIf    
   			* "ЕК" склоняем только у мужчин.    
   			* ЗДЕСЬ МЕНЯ ТЕРЗАЮТ СИЛЬНЫЕ СОМНЕНИЯ, НО ВЕСЬМА ПОХОЖЕ НА ТО, ЧТО ВЕЗДЕ ДЕЛАТЬ НУЖНО ИМЕННО ТАК:    
   			* КраснОщЕК[+У],КрЯчЕК[+У]. (?) ВанИчЕК[+У],ВасИлЕК[+У],КрЮчЕК[+У],МалЫшЕК[+У] (?)    
    			If LstTwoFam=="ЕК"    
    				Fam = Proper(Fam)+"у"    
    			EndIf    
   			************************************    
   			* Процедура обработки мужского имени    
    			If At(LstLtIma, ManLstLt)&lt;&gt;0    
    				DO Case    
    					Case Upper(Ima) == "ЛЕВ"   &amp;&amp; Если Лев, то "ЕВ"-&gt;"ЬВУ"    
    						Ima = Upper(Left(Ima,1))+"ьву"    
    					Case LstTwoIma == "ЕЛ"     &amp;&amp; Если ПавЕЛ, то убираем коренную гласную "Е" ("ЕЛ"-&gt;"ЛУ")    
    						Ima = Upper(Left(Ima,1))+Lower(SubStr(Ima,2,Len(Ima)-3))+"лу"    
    					Otherwise    
    						Ima = Proper(Ima)+"у"  &amp;&amp; Upper(Left(Ima,1))+Lower(SubStr(Ima,2,Len(Ima)-1))+"у" &amp;&amp; ИваН    
    				EndCase    
    			Else    
    				DO Case    
    					Case (LstLtIma=="А") OR (LstLtIma=="Я")  &amp;&amp; НикитА, КузьмА, ЛукА, СаввА, ИлиЯ, ИльЯ    
    						Ima = Upper(Left(Ima,1))+Lower(SubStr(Ima,2,Len(Ima)-2))+"е"    
   					* АлексеЙ,АнатолиЙ,АндреЙ,АркадиЙ,АрсениЙ,АртемиЙ,ВалериЙ,ВасилиЙ,ВиталиЙ,ГеннадиЙ,ГеоргиЙ,ГригориЙ,ДмитриЙ,    
   					* ЕвгениЙ,ЗиновиЙ,ИннокентиЙ,ЛаврентиЙ,МатвеЙ,МефодиЙ,МоисеЙ,НиколаЙ,СергеЙ,ТимофеЙ,ФеодосиЙ,ЮлиЙ,ЮриЙ    
   					* ГаделЬ,ГэмилЬ,ДжалилЬ,РафаэлЬ,ИгорЬ,КамилЬ,НаилЬ,ЛазарЬ,РавилЬ,РаилЬ,РасилЬ,ФаилЬ,ХалилЬ,ШамилЬ,ЭмилЬ,ЯлилЬ,ЯмилЬ    
    					Case (LstLtIma=="Й") OR (LstLtIma=="Ь")    
    						Ima = Upper(Left(Ima,1))+Lower(SubStr(Ima,2,Len(Ima)-2))+"ю"    
    				EndCase    
    			EndIf    
   			************************************    
    		Case Sex=="Ж"  &amp;&amp; Обрабатываем женщину    
   			* Не русскую женскую фамилию склонять не надо    
   			*************************************************************    
   			* Процедура обработки женского склоняемого имени,    
   			* т.е. не такого как несклоняемые имена: Жаклин, Каринэ, Нелли и т.п.    
    			If At(LstLtIma, WmnLstLt)&lt;&gt;0  &amp;&amp; Если имя зак-тся на "А","Я" или "Ь"    
    				If Upper(Right(Ima,2))=="ИЯ"  &amp;&amp; Имя оканчивается на -ия (ЛилИЯ),    
    					If Upper(Ima)=="ИЯ"    
   						* Мою супругу зовут "Ия" (в переводе с греч."Фиалка"). Это "особый" случай!    
    						Ima = "Ие"    
    					Else    
   						* Если имя не Ия, то -ия заменяется на -ии, например, [ЛилИЯ]-&gt;[ЛилИИ]    
    						Ima = Upper(Left(Ima,1))+Lower(SubStr(Ima,2,Len(Ima)-3))+"ии"    
    					EndIf    
    				Else    
    					If LstLtIma&lt;&gt;"Ь"  &amp;&amp; СветланА, ДарьЯ    
    						Ima = Upper(Left(Ima,1))+Lower(SubStr(Ima,2,Len(Ima)-2))+"е"    
    					Else  &amp;&amp; ЛюбовЬ, НинелЬ    
    						Ima = Upper(Left(Ima,1))+Lower(SubStr(Ima,2,Len(Ima)-2))+"и"    
    					EndIf    
    				EndIf    
    			EndIf    
   			*************************************************************    
    	EndCase    
    EndIf  &amp;&amp; Если фамилия и имя еще не обработаны    
        
  * Обработка фамилий пишущихся через дефис (Миклухо-Маклай, Кох-Татаренко, ...)    
    lDefisPos = At("-", Fam)    
    If lDefisPos &gt; 1    
    	Fam = Left(Fam, lDefisPos) + ;    
    		  Upper(SubStr(Fam, lDefisPos+1,1)) + ;    
    		  Right(Fam, Len(Fam)-lDefisPos-1)    
    EndIf    
        
  * Формируем фамилию, имя и отчество в дательном падеже    
    Return AllT(Fam + Space(1) + Ima + Space(1) + Otc)    
      
  Внутри используется вызов функции AfterAtNum, возвращающей остаток строки после искомого вхождения подстроки, которая была в Clipper, но отсутствует в VFP. Я переписал ее для VFP и привожу ниже. В принципе, по желанию, ее можно заменить замечательными VFP-функциями GetWordCount и GetWordNum  
      
   * AFTERATNUM(,,&lt;[nCounter]&gt;,&lt;[nIgnore]&gt;<img decoding="async" src="http://forum.foxclub.ru/mods/smileys/images/wink.gif" /> --&gt; cAfterString      
   * Возвращает остаток строки после искомого вхождения подстроки.      
   * cSearchFor - символьный параметр , задающий искомую подстроку.      
   * cString    - символьный параметр , задающий обрабатываемую подстроку.      
   * nCounter   - числовой параметр , задающий номер искомого вхождения cSearchFor в cString.      
   * nCounter=0 - осуществляется поиск последнего вхождения.      
   * nIgnore    - числовой параметр , задающий количество символов с начала строки cString,      
   *              исключаемых из поиска.      
   * nIgnore=0 при отсутствии исключения символов из поиска.      
            
      LPARAM cSearchFor, cString, nCounter, nIgnore      
      LOCAL cAfterString, ch, cw      
            
      if empty(nCounter)      
        nCounter = 0          &amp;&amp; поиск последнего вхождения      
      endif      
            
      if empty(nIgnore)      
        nIgnore = 0           &amp;&amp; отсутствие исключения символов из поиска      
      endif      
            
      ch = 0      
      if nIgnore&lt;&gt;0           &amp;&amp; если не игнорировать первые символы      
        ch = 1      
        str = right(cString,len(cString)-nIgnore)      
      endif      
      if nCounter&lt;&gt;0          &amp;&amp; если искать вхождение номер nCounter      
        do while nCounter&lt;&gt;0      
          cw = at(cSearchFor,cString)      
          ch = cw      
          nCounter = nCounter-1      
          if nCounter&gt;0      
            ch = cw      
            cString = right(cString,len(cString)-len(cSearchFor)-ch+1)      
          endif      
        enddo      
        if ch&lt;&gt;0      
          cString = right(cString,len(cString)-len(cSearchFor)-ch+1)      
          cAfterString = cString      
        else      
          cString = ''      
          cAfterString = cString      
        endif      
      else                    &amp;&amp; nCounter==0 - поиск последнего вхождения      
        cw = at(cSearchFor,cString)      
        ch = cw      
        if ch = 0      
          cString = ''      
        endif      
        do while ch&lt;&gt;0      
          cString = right(cString,len(cString)-len(cSearchFor)-ch+1)      
          cw = at(cSearchFor,cString)      
          ch = cw      
        enddo      
        cAfterString = cString      
      endif      
            
      Return cAfterString</pre>
</div>
<div id="sol_avtor">Автор: rvc44</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4767">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4767">rvc44</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="rvc44" href="https://foxclub.ru/account/?user=4767">
				<img alt='' src='https://secure.gravatar.com/avatar/e89cde72d5f4d3df33e6d628fb2c4289?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e89cde72d5f4d3df33e6d628fb2c4289?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 06-12-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/sklonenie-fio-v-datelnom-padezhe-dlya-doverennostej-pochtovyh-perevodov-i-prochee-versiya-2-1/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/rusifikator-ide-visual-foxpro-9-0-sp2/</link>
					<title><![CDATA[Русификатор IDE Visual Foxpro 9.0 SP2]]></title>
                    					    <author><![CDATA[oav]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:33 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Русификатор IDE Visual Foxpro 9.0 SP2</h1>
													</header>
													<div id="sol_opis">Русский интерфейс меню разработчика SP2 VFP9.0 Для тех, кто скачал очередной релиз Senda Feb 2007</div>
<div id="sol_body">Ссылка на страницу в конференции http://forum.foxclub.ru/read.php?29,257423</div>
<div id="sol_avtor">Автор: oav</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="2231">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=2231">oav</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="oav" href="https://foxclub.ru/account/?user=2231">
				<img alt='' src='https://secure.gravatar.com/avatar/2bf221c24ed1192fc472a264e4a86527?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/2bf221c24ed1192fc472a264e4a86527?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 27-05-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/rusifikator-ide-visual-foxpro-9-0-sp2/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/programma-dlya-raboty-s-ms-agent/</link>
					<title><![CDATA[Программа для работы с MS Agent]]></title>
                    					    <author><![CDATA[s66]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:33 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Программа для работы с MS Agent</h1>
													</header>
													<div id="sol_opis">Демонстрационная версия программы для создания VFP, VBS, HTML скриптов с использованием технологии MS Agent. Программа демонстрирует возможности речевых движков Digalo Rus и TTS 3000. Содержит краткий справочник по MS Agent и много разного.... Для VFP 9!!!!</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: s66</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4715">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 19 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4715">s66</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="s66" href="https://foxclub.ru/account/?user=4715">
				<img alt='' src='https://secure.gravatar.com/avatar/3c29c7df126720fdc5daa7a6310e60d4?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/3c29c7df126720fdc5daa7a6310e60d4?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 09-02-2007        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/programma-dlya-raboty-s-ms-agent/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/priem-peredacha-s-proverkoj-nalichiya-fajlov-po-ftp/</link>
					<title><![CDATA[Прием/передача (с проверкой наличия) файлов по FTP.]]></title>
                    					    <author><![CDATA[Mouse_White]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:33 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Прием/передача (с проверкой наличия) файлов по FTP.</h1>
													</header>
													<div id="sol_opis">По многочисленным просьбам выкладываю откорректированное решение, взятое с этого же форума.  Позволяет проверять наличие файлов по маске в указанном каталоге на FTP, скачивать и закачивать файлы на FTP.</div>
<div id="sol_body">Автора, к сожалению, не помню, так что заранее прошу извинить.<br /> Данное решение не зависит от set comp on/off.<br /> Позволяет проверять наличие файлов по маске в указанном каталоге на FTP, скачивать и закачивать файлы на FTP.</div>
<div id="sol_avtor">Автор: Mouse_White</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4515">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4515">Mouse_White</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Mouse_White" href="https://foxclub.ru/account/?user=4515">
				<img alt='' src='https://secure.gravatar.com/avatar/ba14654d128374a6bc693208b108d003?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ba14654d128374a6bc693208b108d003?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-05-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/priem-peredacha-s-proverkoj-nalichiya-fajlov-po-ftp/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/toolbar-iz-kotoroj-proishodit-zapusk-programm_x000d_-winword-exe_x000d_-excel-exe_x000d_-calc-exe_x000d_-kalendar-ezhednevnik_x000d_/</link>
					<title><![CDATA[ToolBar из которой происходит запуск программ: winword.exe, excel.exe, calc.exe, Календарь/Ежедневник]]></title>
                    					    <author><![CDATA[oav]]></author>
                    										    <pubDate>Wed, 16 Sep 2020 16:15:38 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>ToolBar из которой происходит запуск программ: winword.exe, excel.exe, calc.exe, Календарь/Ежедневник</h1>
													</header>
													<div id="sol_opis">Запуск Word, Excel, Calc, Календарь/Ежедневник из панельки ToolBar</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: oav</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="2231">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=2231">oav</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="oav" href="https://foxclub.ru/account/?user=2231">
				<img alt='' src='https://secure.gravatar.com/avatar/2bf221c24ed1192fc472a264e4a86527?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/2bf221c24ed1192fc472a264e4a86527?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 27-05-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/toolbar-iz-kotoroj-proishodit-zapusk-programm_x000d_-winword-exe_x000d_-excel-exe_x000d_-calc-exe_x000d_-kalendar-ezhednevnik_x000d_/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/funkczii-dlya-proverki-ustanovleno-li-wordexcel-na-kompyutere-polzovatelya/</link>
					<title><![CDATA[Функции для проверки установлено ли (word,excel, &#8230;) на компьютере пользователя]]></title>
                    					    <author><![CDATA[oav]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:33 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Функции для проверки установлено ли (word,excel, &#8230;) на компьютере пользователя</h1>
													</header>
													<div id="sol_opis">написаны для скрытия кнопок в тоолбаре при его инициализации если программа отсутствует</div>
<div id="sol_body">&& Функции для проверки - установлено ли (word,excel, ...) на компьютере пользователя<br /> && написано для скрытия кнопок в тоолбаре при его инициализации если программа отсутствует.<br /> && 16-01-2007 Автор: Омеличев А.В. написаны по материалам конференции www.foxclub.ru<br /> && если будут комментарии, то напишите свои отзывы</p>
<p> [code] SET TALK OFF CLEAR  ? 'WordExists() = ' ?? WordExists() ? 'ExcelExists() = ' ?? ExcelExists() ? 'OfficeReg("Word") = ' ?? OfficeReg("Word") ? 'OfficeReg("EXCEL") = ' ?? OfficeReg("EXCEL") ? 'OfficeReg("aCCeSS") = ' ?? OfficeReg("aCCeSS") ? 'OfficeReg("publisher") = ' ?? OfficeReg("publisher") ? 'OfficeReg("poWerPOint") = ' ?? OfficeReg("poWerPOint") ? ? 'OfficeReg("MyProg") = ' ?? OfficeReg("MyProg") ?? ' - ошибка, заданый параметр lcOfficeType не входит в число искомых' ? ? 'OfficeReg(1234) = ' ?? OfficeReg(1234) ?? ' - ошибка, заданый параметр lcOfficeType не текст' ? ? 'Перечень ошибок возвращаемых функцией OfficeReg()' ? 'RETURN -1 - ошибка, заданый параметр lcOfficeType не текст' ? ? 'RETURN -2 - ошибка, заданый параметр lcOfficeType не входит в число искомых' ? ? 'RETURN -3 - ошибка OLE или в реестре нет ключа для заданного параметра' ? '                   на компьютере пользователя данная программа не установлена' ? ? 'RETURN 0  - в реестре ключ найден, но используется программа не Microsoft Office' ? ? 'RETURN 1  - Ок. ключ реестре найден и используется программа Microsoft Office'   FUNCTION WordExists PRIVATE poReg1, poReg2,poShell TRY 	poShell = CreateObject("WScript.Shell") 	poReg1  = poShell.RegRead("HKEY_CLASSES_ROOT.doc") 	poReg2  = poShell.RegRead("HKEY_CLASSES_ROOT.docContent Type") CATCH 	EXIT ENDTRY IF (VARTYPE(poReg1) = "C" .AND. !ISNULL(poReg1)) .AND.;    (VARTYPE(poReg2) = "C" .AND. !ISNULL(poReg2)) 	RETURN IIF(("WORD" $ UPPER(poReg1)) .AND.; 	           ("WORD" $ UPPER(poReg2)),.T.,.F.) ELSE 	RETURN .F. ENDIF ENDFUNC  FUNCTION ExcelExists PRIVATE poReg1, poReg2, poShell TRY 	poShell = CreateObject("WScript.Shell") 	poReg1  = poShell.RegRead("HKEY_CLASSES_ROOT.xls") 	poReg2  = poShell.RegRead("HKEY_CLASSES_ROOT.xlsContent Type") CATCH 	EXIT ENDTRY IF (VARTYPE(poReg1) = "C" .AND. !ISNULL(poReg1)) .AND.;    (VARTYPE(poReg2) = "C" .AND. !ISNULL(poReg2)) 	RETURN IIF(("EXCEL" $ UPPER(poReg1)) .AND.; 	           ("EXCEL" $ UPPER(poReg2)),.T.,.F.) ELSE 	RETURN .F. ENDIF ENDFUNC  FUNCTION OfficeReg PARAMETERS lcOfficeType PRIVATE poReg1, poReg2, poShell, pcExtension IF VARTYPE(lcOfficeType) = "C" .AND. !ISNULL(lcOfficeType) 	lcOfficeType = UPPER(ALLTRIM(lcOfficeType)) 	DO CASE 		CASE lcOfficeType == "WORD" 			pcExtension = "doc" 		CASE lcOfficeType == "EXCEL" 			pcExtension = "xls" 		CASE lcOfficeType == "ACCESS" 			pcExtension = "mdb" 		CASE lcOfficeType == "POWERPOINT" 			pcExtension = "ppt" 		CASE lcOfficeType == "PUBLISHER" 			pcExtension = "pub" 	OTHERWISE 		RETURN -2 && ошибка, заданый параметр lcOfficeType не входит в число искомых 	ENDCASE 	TRY 		poShell = CreateObject("WScript.Shell") 		poReg1  = poShell.RegRead("HKEY_CLASSES_ROOT.&pcExtension") 		poReg2  = poShell.RegRead("HKEY_CLASSES_ROOT.&pcExtensionContent Type") 	CATCH 		EXIT 	ENDTRY 	IF (VARTYPE(poReg1) = "C" .AND. !ISNULL(poReg1)) .AND.; 	   (VARTYPE(poReg2) = "C" .AND. !ISNULL(poReg2)) 		RETURN IIF((lcOfficeType $ UPPER(poReg1)) .AND.; 		           (lcOfficeType $ UPPER(poReg2)),1,0) 	ELSE 		RETURN -3 && ошибка OLE или в реестре нет ключа для заданного параметра                   && на компьютере пользователя данная программа не установлена'		 	ENDIF ELSE 	RETURN -1 && ошибка, заданый параметр lcOfficeType не текст ENDIF ENDFUNC  [/code]</p></div>
<div id="sol_avtor">Автор: oav</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="2231">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=2231">oav</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="oav" href="https://foxclub.ru/account/?user=2231">
				<img alt='' src='https://secure.gravatar.com/avatar/2bf221c24ed1192fc472a264e4a86527?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/2bf221c24ed1192fc472a264e4a86527?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 27-05-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/funkczii-dlya-proverki-ustanovleno-li-wordexcel-na-kompyutere-polzovatelya/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kross-zapros-shahmatnyj-otchyot/</link>
					<title><![CDATA[Кросс-запрос (&#8220;шахматный&#8221; отчёт)]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:33 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Кросс-запрос (&#8220;шахматный&#8221; отчёт)</h1>
													</header>
													<div id="sol_opis">"Потыркавшись" немного с кросс-запросами в foxpro, я не разобрался в них, и предпочёл написать свой алгоритм. В представленном примере из 2-х столбцов (Kol и MagZametka), а также трёх вариантов записей('Магазин Огонек', 'Магазин Белочка', 'Магазин Стрелочка') генерируются 2х3=6 столбцов. Удобно для экспорта в Excel, просмотра в Reportе, и т.п.  В "девятке" работает, в "шестёрке" ругается на ascan, в других не проверял...  Вполне возможно, я заново "изобретаю велосипед", но красивого решения не знаю...</div>
<div id="sol_body">DO exmaple_make_chesstable</p>
<p> procedure  exmaple_make_chesstable</p>
<p> 	local crossfields_to_multiple,cross_count_to_multiple</p>
<p> 	CREATE CURSOR _Before(Tovar_id n(5), Tovar_n c(40), Marka c(10), Magaz c(20), kol n(8), MagZametka c(40))<br /> 	INSERT INTO _before VALUES (1, 'Шоколад', 'горьк.', 'Магазин Огонек', 5, 'скоро испортится')<br /> 	INSERT INTO _before VALUES (1, 'Шоколад', 'горьк.', 'Магазин Белочка', 10, 'только привезли')<br /> 	INSERT INTO _before VALUES (1, 'Шоколад', 'горьк.', 'Магазин Стрелочка', 3, 'быстро кончается')<br /> 	INSERT INTO _before VALUES (3, 'Поросенок', 'пряничн.', 'Магазин Огонек', 2, 'срок хранения 3 дня')<br /> 	INSERT INTO _before VALUES (3, 'Поросенок', 'пряничн.', 'Магазин Стрелочка', 70, 'надо ещё подвезти "девочек"')<br /> 	INSERT INTO _before VALUES (2, 'Шоколад', 'сладк.', 'Магазин Огонек', 15, 'отложили на Новый год')<br /> 	INSERT INTO _before VALUES (2, 'Шоколад', 'сладк.', 'Магазин Белочка', 4, '—')<br /> 	INSERT INTO _before VALUES (2, 'Шоколад', 'сладк.', 'Магазин Стрелочка', 3, 'не пользуется спросом')<br /> 	INSERT INTO _before VALUES (4, 'Сливочные колбаски', '—', 'Магазин Белочка', 4, 'очень калорийны')<br /> 	INSERT INTO _before VALUES (5, 'Желе', 'Plaza', 'Магазин Белочка', 20, '—')<br /> 	INSERT INTO _before VALUES (5, 'Желе', 'Plaza', 'Магазин Стрелочка', 22, 'Для руководства, (с коноплей)')</p>
<p> 	browse last	nowait</p>
<p> 	cross_count_to_multiple=2 && Количество полей которые исчезнут, но раздробятся на несколько<br /> 	dimension crossfields_to_multiple[cross_count_to_multiple,3]<br /> 	crossfields_to_multiple[1,1]='Kol'<br /> 	crossfields_to_multiple[1,2]='_kol'<br /> 	crossfields_to_multiple[1,3]='0'<br /> 	crossfields_to_multiple[2,1]='MagZametka'<br /> 	crossfields_to_multiple[2,2]='_zam'<br /> 	crossfields_to_multiple[2,3]='"     "'</p>
<p> 	DO make_chesstable_from_duplicate_records WITH crossfields_to_multiple,'_Before','Magaz','Mag_','Tovar_id','_After'<br /> 	* Параметры: crossfields_to_multiple - массив с названиями полей, которые сами исчезнут, <br /> 	* но раздробятся на поля вида: Prefix_1_FieldA, Prefix_1_FieldB, ..., Prefix_2_FieldA, Prefix_2_FieldB, ...,<br /> 	* ...., Prefix_N_FieldA, Prefix_N_FieldB, ... ;<br /> 	* 1-й столбец - имя поля, которое исчезнет, но раздробится на несколько,<br /> 	* 2-й столбец - постфикс("напоминалка" - из каких полей создавались столбцы),<br /> 	* 3-й столбец - пустые значения, если нет данных,<br /> 	*<br /> 	* далее (здесь через точку с запятой): Исходная таблица ;<br /> 	* поле, определяющее N возможных вариантов - от его distinct значений зависит количество FieldA, FieldB, ... FieldZ ;<br /> 	* префикс результирующего поля ("напоминалка" - из значений какого поля создавались столбцы) ;<br /> 	* уникальный индекс записи результирующей таблицы, долен быть обязательно ;<br /> 	* алиас результирующей таблицы</p>
<p> 	browse last	nowait<br /> endproc</p>
<p> procedure make_chesstable_from_duplicate_records</p>
<p> 	LPARAMETERS crossfields_to_multiple,cross_sourcetable,crosscolumns_field,cross_prefix, ;<br /> 		cross_uniqueindex,cross_lastoutput_alias</p>
<p> 	local n,m,p,i,j,k,l, ;<br /> 		cross_strucfields,cross_cur_fieldnames,crossfields_list,crossfields_list_enum, ;<br /> 		cross_output_alias,cross_ordercondition,cross_unique_alias</p>
<p> 	cross_unique_alias=SYS(2015)</p>
<p> 	free_alias(cross_unique_alias)<br /> 	select distinct &cross_sourcetable..&crosscolumns_field from &cross_sourcetable ;<br /> 		into cursor &cross_unique_alias</p>
<p> 	if alen(crossfields_to_multiple,1)*reccount(cross_unique_alias)>240<br /> 		messagebox('Превышен лимит столбцов',16,'')<br /> 	else<br /> 		SELECT(cross_unique_alias)<br /> 		n=0<br /> 		scan<br /> 			n=n+1<br /> 			cross_cur_aliasname=cross_unique_alias+'_'+alltrim(str(n))<br /> 			free_alias(cross_cur_aliasname)</p>
<p> 			select * from &cross_sourcetable ;<br /> 				where &cross_sourcetable..&crosscolumns_field=&cross_unique_alias..&crosscolumns_field ;<br /> 				into cursor &cross_cur_aliasname<br /> 		endscan</p>
<p> 		p=0<br /> 		dimension cross_strucfields[1]<br /> 		m=afields(cross_strucfields,(cross_sourcetable))<br /> 		for i=1 to m<br /> 			if (ascan(crossfields_to_multiple,cross_strucfields[i,1],1,alen(crossfields_to_multiple,1),1,7)=0) and ;<br /> 					(upper(crosscolumns_field)#upper(cross_strucfields[i,1]))<br /> 				p=p+1<br /> 				dimension crossfields_list[p]<br /> 				crossfields_list[p]=cross_strucfields[i,1]<br /> 			endif<br /> 		next</p>
<p> 		dimension cross_cur_fieldnames[ALEN(crossfields_to_multiple,1)]<br /> 		for i=1 to ALEN(crossfields_to_multiple,1)<br /> 			cross_cur_fieldnames[i]=crossfields_to_multiple[i,1]<br /> 		next</p>
<p> 		cross_cur_aliasname1=cross_unique_alias+'_1'<br /> 		for i=2 to n<br /> 			cross_cur_aliasname2=cross_unique_alias+'_'+alltrim(str(i))<br /> 			crossfields_list_enum=''<br /> 			for j=1 to p<br /> 				crossfields_list_enum=crossfields_list_enum+ ;<br /> 					'IIf(ISNULL('+cross_cur_aliasname1+'.'+crossfields_list[j]+'),'+ ;<br /> 					+cross_cur_aliasname2+'.'+crossfields_list[j]+','+ ;<br /> 					cross_cur_aliasname1+'.'+crossfields_list[j]+') as '+ ;<br /> 					crossfields_list[j]+','<br /> 			next</p>
<p> 			for k=1 to ALEN(crossfields_to_multiple,1)</p>
<p> 				for l=1 to n<br /> 					if l>i<br /> 						crossfields_list_enum=crossfields_list_enum+ ;<br /> 							crossfields_to_multiple[k,3]+' as '+cross_prefix+alltrim(str(l))+crossfields_to_multiple[k,2]+','<br /> 					endif<br /> 					if l																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/performancecounter-i-threadtime/</link>
					<title><![CDATA[PerformanceCounter и ThreadTime]]></title>
                    					    <author><![CDATA[AlGU]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:33 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>PerformanceCounter и ThreadTime</h1>
													</header>
													<div id="sol_opis">Имерение времени исполнения кода с высокой степенью точности измерени времени потока</div>
<div id="sol_body">Библиотека Timers содеожит два класса PerfomanceCounter и ThreadTime.</p>
<p> PerfomanceCounter для высокоточного измерения коротких по времени операций<br /> 	или для замены функции seconds() на более точную, а<br /> ThreadTime для измерения времени исполнения данного потока.</div>
<div id="sol_avtor">Автор: AlGU</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4282">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4282">AlGU</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="AlGU" href="https://foxclub.ru/account/?user=4282">
				<img alt='' src='https://secure.gravatar.com/avatar/853e1c465a6ac4f1a0b3ca5aca4c29d5?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/853e1c465a6ac4f1a0b3ca5aca4c29d5?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-01-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/performancecounter-i-threadtime/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/svorachivanie-okna-foxpro-v-trej/</link>
					<title><![CDATA[Сворачивание окна FoxPro в Трэй]]></title>
                    					    <author><![CDATA[serpikva]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:33 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Сворачивание окна FoxPro в Трэй</h1>
													</header>
													<div id="sol_opis">При нажатии на кнопку "Свернуть-Минимизировать", окно Фокспро исчезает, а в трэе появляется иконка. При клике на иконке в трэе окно востанавливается а иконка исчезает. Использует библиотечку systray.dll! Автор библиотеки Sidorov Leonid за что ему огромное спасибо!!!</div>
<div id="sol_body">[code] PUBLIC oHandler DECLARE INTEGER _turnwindow IN systray.DLL;  INTEGER HWND, INTEGER mode, STRING apps, STRING ico  _SCREEN.ADDPROPERTY('prev_wstate',_SCREEN.WINDOWSTATE)  oHandler=NEWOBJECT("myhandler") BINDEVENT(_SCREEN,"Resize",oHandler,"myresize")    DEFINE CLASS myhandler AS CUSTOM    **********   PROCEDURE myRESIZE    IF _SCREEN.WINDOWSTATE = 1     _SCREEN.WINDOWSTATE = _SCREEN.prev_wstate     = _turnwindow(_VFP.HWND, 1, _SCREEN.CAPTION ,[])     = _turnwindow(_VFP.HWND, 0, _SCREEN.CAPTION,[face01.ico])    ELSE     _SCREEN.prev_wstate = _SCREEN.WINDOWSTATE    ENDIF   ENDPROC  ENDDEFINE [/code]</div>
<div id="sol_avtor">Автор: serpikva</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3820">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3820">serpikva</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="serpikva" href="https://foxclub.ru/account/?user=3820">
				<img alt='' src='https://secure.gravatar.com/avatar/0e9ca460556287d1dd12ed3e3c249271?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/0e9ca460556287d1dd12ed3e3c249271?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 09-07-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/svorachivanie-okna-foxpro-v-trej/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/poluchenie-servisnyh-soobshhenij-ot-mssql-server-posredstvom-ado/</link>
					<title><![CDATA[Получение сервисных сообщений от MSSQL Server посредством ADO]]></title>
                    					    <author><![CDATA[Ganordi]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:33 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Получение сервисных сообщений от MSSQL Server посредством ADO</h1>
													</header>
													<div id="sol_opis">Пример иллюстрирует возможность получения сервисных сообщений от MSSQL Server.Для наглядности использования данной возможности рассмотрен процесс визуализации BACKUP происходящего на сервере с помощью класса прогрессбар</div>
<div id="sol_body">Пример иллюстрирует возможность получения сервисных сообщений от MSSQL Server.Для наглядности использования данной возможности рассмотрен процесс визуализации BACKUP происходящего на сервере с помощью класса прогрессбар(переработанного варианта из примеров прилагающихся к фоксу)из VFP<br /> Для тестирования необходимо прописать свои параметры сервера в Sample.prg в частности строки:<br /> _lcServer       = "MYSERVERNAME"	&& имя сервера<br /> _lcBase         = "MYBASENAME"		&& имя БД на сервере<br /> _lcUser         = "USERNAME"		&& имя пользователя<br /> _lcPass         = "USERPASSWORD"	&& пароль доступа пользователя</p>
<p> _lcPathToFile   = "D:MYBASENAME.bak"   && имя архивной копии БД (вместо MYBASENAME -  <br />                                         && имя БД)<br /> Само собой разумеется,пользователь должен иметь соответствующие права на сервере<br /> Авторы:Цингауз Алексей(MSFT)<br />        Ганорский Дмитрий<br />        Гринько Сергей<br /> Тестировалась на VFP 9SP1;MSSQL Server 2005 Express;MSSQL Server 2000</div>
<div id="sol_avtor">Автор: Ganordi</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4312">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4312">Ganordi</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Ganordi" href="https://foxclub.ru/account/?user=4312">
				<img alt='' src='https://secure.gravatar.com/avatar/4881ca84eb4a9caeba4612e8cc987a01?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4881ca84eb4a9caeba4612e8cc987a01?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 01-01-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/poluchenie-servisnyh-soobshhenij-ot-mssql-server-posredstvom-ado/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/izmenenie-kodovoj-straniczy/</link>
					<title><![CDATA[Изменение кодовой страницы]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Sun, 30 Aug 2020 19:01:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Изменение кодовой страницы</h1>
													</header>
													<div id="sol_opis">Несколько измененная версия утилиты cpzero.prg. Добавлен графический интерфейс с возможностью просмотра и изменения кодовой страницы файлов определенного типа в выбранном каталоге.</div>
<div id="sol_body">
<h3>Изменение кодовой страницы</h3>
<p>Форма была разработана, когда пришлось переконвертировать большое количество файлов из одной кодовой страницы в другую. Файлы были разных форматов и лежали в разных каталогах.<br />
Вот и получилось, то что получилось<br />
<img loading="lazy" decoding="async" class="alignnone size-medium wp-image-4768" src="https://foxclub.ru/wp-content/uploads/2006/11/cpzero-300x204.jpg" alt="" width="300" height="204" srcset="https://foxclub.ru/wp-content/uploads/2006/11/cpzero-300x204.jpg 300w, https://foxclub.ru/wp-content/uploads/2006/11/cpzero.jpg 395w" sizes="(max-width: 300px) 100vw, 300px" /></p>
</div>
<div id="sol_avtor">Автор: Yuri Abramenkov</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/izmenenie-kodovoj-straniczy/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kopirovanie-svojstv-i-metodov-odnogo-obekta-na-drugoj/</link>
					<title><![CDATA[Копирование свойств и методов одного объекта на другой]]></title>
                    					    <author><![CDATA[Vladimir_Knyr]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Копирование свойств и методов одного объекта на другой</h1>
													</header>
													<div id="sol_opis">это типа Кисточки(копировать по образцу) в Екселе</div>
<div id="sol_body">Обновлено данное решение на сколько я меня хватило фантазии пр итестировании все работает краткое описание внутри архива</div>
<div id="sol_avtor">Автор: Vladimir_Knyr</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4754">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4754">Vladimir_Knyr</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Vladimir_Knyr" href="https://foxclub.ru/account/?user=4754">
				<img alt='' src='https://secure.gravatar.com/avatar/7dd8187cfc903829e54ae52b377e8a5a?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7dd8187cfc903829e54ae52b377e8a5a?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 15-12-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kopirovanie-svojstv-i-metodov-odnogo-obekta-na-drugoj/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/zamena-standartnogo-browse-dlya-fox-for-dos/</link>
					<title><![CDATA[Замена стандартного Browse для FOX for DOS]]></title>
                    					    <author><![CDATA[Yura_kiev]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Замена стандартного Browse для FOX for DOS</h1>
													</header>
													<div id="sol_opis">Функция для замены стандартной команды Browse для FOX v.2.0-2.6 В ней задаются реакции на кнопки ENTER, ESC, INS, DEL, F4, ALT+F4</div>
<div id="sol_body">Может кому и сгодится.<br /> Функция для замены стандартной команды Browse для FOX v.2.0-2.6<br /> Файлы для примера primer.prg и otp.dbf<br /> Сама функция -menudbf.prg <br /> В ней задаются реакции на кнопки ENTER, ESC, INS, DEL, F4, ALT+F4<br /> Когдато была написана для программы зарплата.</div>
<div id="sol_avtor">Автор: Yura_kiev</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4397">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4397">Yura_kiev</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Yura_kiev" href="https://foxclub.ru/account/?user=4397">
				<img alt='' src='https://secure.gravatar.com/avatar/1e772f4301c65eaee4993d41023156e4?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1e772f4301c65eaee4993d41023156e4?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 09-02-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/zamena-standartnogo-browse-dlya-fox-for-dos/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/snova-toolbar-dlya-bystrogo-dostupa-k-oknam/</link>
					<title><![CDATA[Снова toolbar для быстрого доступа к окнам.]]></title>
                    					    <author><![CDATA[baser]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Снова toolbar для быстрого доступа к окнам.</h1>
													</header>
													<div id="sol_opis">Всплывающий, без постоянно тикающего таймера.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: baser</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1114">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1114">baser</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="baser" href="https://foxclub.ru/account/?user=1114">
				<img alt='' src='https://secure.gravatar.com/avatar/a9569b8fe2c49450a5c833472a227dd2?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/a9569b8fe2c49450a5c833472a227dd2?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 07-10-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/snova-toolbar-dlya-bystrogo-dostupa-k-oknam/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/winbar/</link>
					<title><![CDATA[Winbar]]></title>
                    					    <author><![CDATA[Canab]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Winbar</h1>
													</header>
													<div id="sol_opis">Еще один toolbar для быстрого доступа к окнам.</div>
<div id="sol_body">Запуск: do pathwinbar.prg</div>
<div id="sol_avtor">Автор: Canab</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4160">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4160">Canab</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Canab" href="https://foxclub.ru/account/?user=4160">
				<img alt='' src='https://secure.gravatar.com/avatar/2df5c58ba2cb5c3ca639474dfc9af806?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/2df5c58ba2cb5c3ca639474dfc9af806?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 27-09-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/winbar/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/otpravka-soobshhenij-cherez-smtp-server-kotoryj-trebuet-avtorizaczii-polzovatelya/</link>
					<title><![CDATA[Отправка сообщений через SMTP сервер, который требует авторизации пользователя]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Отправка сообщений через SMTP сервер, который требует авторизации пользователя</h1>
													</header>
													<div id="sol_opis">Отправка сообщений через SMTP сервер, требующий авторизации пользователя на любое количество ящиков. Как то To:,Cc: и Bcc:. Поддерживается любое количество вложенных файлов (аттачей). В архиве лежит форма для вызова mailer.prg, который собственно и является классом для работы с SMTP. Пример использования можно посмотреть в форме и в классе. Спамеры, пример писался не для вас 🙂  Пока поддерживается только PLAIN, LOGIN и CRAM-MD5 авторизация. Может кто знает как корректно реализовать DIGEST-MD5 авторизацию? Помощь в этом приветствуется.  При написании использовался VFP 9 с использованием специфики этой версии.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Константин Мельников</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/otpravka-soobshhenij-cherez-smtp-server-kotoryj-trebuet-avtorizaczii-polzovatelya/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/udalennoe-vypolnenie-fox-skriptov-s-upravleniem-cherez-e-mail/</link>
					<title><![CDATA[Удаленное выполнение Fox-скриптов с управлением через e-mail.]]></title>
                    					    <author><![CDATA[Влад Колосов]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Удаленное выполнение Fox-скриптов с управлением через e-mail.</h1>
													</header>
													<div id="sol_opis">Программа &quot;Remote Control by eMail&quot; (дистанционное управление через электронную почту) предназначена для выполнения заранее сохраненных программ-скриптов. Запуск этих скриптов осуществляется путем отсылки письма определенного содержания на определенный адрес. Программа может выполнять любые скрипты, допустимые в языке Visual FoxPro.     Область применения программы ограничивается только возможностью скриптов VFP. Например, ее можно использовать для компиляции и создания дистрибутивов для обновлений пользовательских версий с использованием системы Visual Source Safe, для чего изначально и предназначалась программа. Также поддерживается прием - отсылка файлов.     Программа использует ActiveX mswinsock.ocx, почтовый клиент - встроенный.     Более подробно в архиве.    Обновление: Версия 1.0.1     Изменен метод base64enc с целью увеличения производительности.     Исправлена ошибка из-за которой события журнала с кодом 0 за прошлые сутки не удалялись.     Исправлен просмотр журнала - теперь отображаются включения-выключения.     Добавлена индикация версии программы.     Небольшие изменения алгоритма разбора писем.  Версия 1.0.2     Исправлена ошибка в base64enc.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Влад Колосов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4894">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4894">Влад Колосов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Влад Колосов" href="https://foxclub.ru/account/?user=4894">
				<img alt='' src='https://secure.gravatar.com/avatar/6d059ca093aa6e3bd9ac83999fb80409?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/6d059ca093aa6e3bd9ac83999fb80409?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 05-05-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/udalennoe-vypolnenie-fox-skriptov-s-upravleniem-cherez-e-mail/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/nastoyashhij-tooltip-sozdavaemyj-pri-pomoshhi-winapi/</link>
					<title><![CDATA[Настоящий tooltip, создаваемый при помощи winAPI.]]></title>
                    					    <author><![CDATA[Влад Колосов]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Настоящий tooltip, создаваемый при помощи winAPI.</h1>
													</header>
													<div id="sol_opis">Класс на базе таймера, создан на основе примера Вадима Пирожкова. Пример использования входит в архив. Позволяет настроить некоторые параметры - в виде баллона-прямоугольника, время показа, цвет фона-шрифта, закрываемость (при включенных темах), позиция отростка для баллона. Привязан к координатам объекта-контрола (Tool). Недостаток - не исчезает при перемещении объекта. Проверено на VFP 7.0 и выше.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Влад Колосов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4894">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4894">Влад Колосов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Влад Колосов" href="https://foxclub.ru/account/?user=4894">
				<img alt='' src='https://secure.gravatar.com/avatar/6d059ca093aa6e3bd9ac83999fb80409?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/6d059ca093aa6e3bd9ac83999fb80409?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 05-05-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/nastoyashhij-tooltip-sozdavaemyj-pri-pomoshhi-winapi/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/generacziya-prg-fajla-s-funkcziyami-i-proczedurami-proverki-bazy-dannyh-na-osnove-shablona-kontejnera-bazy/</link>
					<title><![CDATA[Генерация PRG-файла с функциями и процедурами проверки базы данных на основе шаблона контейнера базы]]></title>
                    					    <author><![CDATA[ama68]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Генерация PRG-файла с функциями и процедурами проверки базы данных на основе шаблона контейнера базы</h1>
													</header>
													<div id="sol_opis">Суть проги заключается в том, что на основании имеющегося шаблона контейнера базы данных она формирует PRG-файл, который преобразует все рабочие базы данных:  1. Добавляет/удаляет/модифицирует поля таблиц, входящих в рабочиие базы;  2. Восстанавливает индексы таблиц рабочих баз данных при некорректном выходе из приложения;  3. Добавляет новые (в соответствии с шаблоном) таблицы;  4. Добавляет/модифицирует представления и связи;  5. Модифицирует индексы  и т.д. </div>
<div id="sol_body">Суть проги заключается в том, что на основании имеющегося шаблона контейнера базы данных она формирует PRG-файл, который преобразует все рабочие базы данных: <br /> 1. Добавляет/удаляет/модифицирует поля таблиц, входящих в рабочиие базы; <br /> 2. Восстанавливает индексы таблиц рабочих баз данных при некорректном выходе из приложения; <br /> 3. Добавляет новые (в соответствии с шаблоном) таблицы; <br /> 4. Добавляет/модифицирует представления и связи; <br /> 5. Модифицирует индексы <br /> и т.д. </p>
<p> Я делаю следующим образом: <br /> - создаю новую базу данных для любого своего приложения <br /> - запускаю эту программу <br /> - включаю полученный PRG-файл в проект <br /> - включаю 3 файла контейнера базы данных в дистрибутив приложения <br /> - у клиента создаются уже рабочие базы данных со всеми необходимыми таблицами, представлениями, индексными файлами. </p>
<p> В случае, если что-либо изменяется в программе, и это влечет за собой изменение структур таблиц, вношу изменения у себя в шаблонную базу данных и заново формирую этот PRG-файл. На машину клиента устанавливается обновление приложения. При первом запуске его рабочие базы данных клиента модифицируются автоматически. <br /> Чтобы не таскать EXE-файл, я эту прогу включаю в APP-файл. </p>
<p> Необходимо: </p>
<p> 1. В главном модуле приложения определить символьные переменные <br /> cpCapMain (название приложения) и cVersion (версия); <br /> 2. В тексте проги найти следующий код <br />  Add Object Image1 As Image With ; <br />  Height = 126,; <br />  Left = 22,; <br />  Name = 'Image1',; <br />  Picture = 'c:workallasp_bmpsoft.bmp',; <br />  Top = 24,; <br />  Width = 126 <br /> и переопределить картинку</p>
<p> Основной вызов - функция fOk_Pr_Base (). В сгенерированном PRG-файле в самом начале приводится описание возвращаемых ею значений</p></div>
<div id="sol_avtor">Автор: Абразовский Михаил</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4800">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4800">ama68</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="ama68" href="https://foxclub.ru/account/?user=4800">
				<img alt='' src='https://secure.gravatar.com/avatar/3f1566a373d8f90f2e963b08dad50002?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/3f1566a373d8f90f2e963b08dad50002?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 27-04-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/generacziya-prg-fajla-s-funkcziyami-i-proczedurami-proverki-bazy-dannyh-na-osnove-shablona-kontejnera-bazy/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ustanovka-kodovoj-straniczy-dbf-fajlov/</link>
					<title><![CDATA[Установка кодовой страницы DBF-файлов]]></title>
                    					    <author><![CDATA[Foxtrot]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Установка кодовой страницы DBF-файлов</h1>
													</header>
													<div id="sol_opis">Если требуется установить кодовую страницу у всех файлов в одной папке, то эта программа как раз для того и служит. А также может работать просто в режиме открытия файлов без переустановки кодовой страницы, данная фишка нужна в случае если мы имеем файл-сервер и не хотим чтобы каконить пользователь случайно не удалил какойнить файл, ну скажем из проводника Windows. Может принимать параметры с командной строки: codepage.exe c:папка_в_которой_хранятся_мои_таблицы 866 ЗЫ: VFP8SP1</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Канат Джумадылов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4782">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4782">Foxtrot</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Foxtrot" href="https://foxclub.ru/account/?user=4782">
				<img alt='' src='https://secure.gravatar.com/avatar/14af643bd13aa7e300bf3487d9a2cdc5?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/14af643bd13aa7e300bf3487d9a2cdc5?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-04-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ustanovka-kodovoj-straniczy-dbf-fajlov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/alternativa-beautfy-app/</link>
					<title><![CDATA[Альтернатива beautfy.app]]></title>
                    					    <author><![CDATA[piva]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Альтернатива beautfy.app</h1>
													</header>
													<div id="sol_opis">Использует его движок и добавляет форматирование заголовков процедур и классов. Может вызываться по горячей клавише, вместо beautify.app и из командной строки. Для работы необходимы FDKEYWRD.DBF и FD3.FLL в папке WIZARDS фокса, если их нет - то теряется форматирование ка кэто делает beautify.app. Настройка свойствами класса - комментарии в нем  </div>
<div id="sol_body">Сергей Сизов внес некоторые изменения касающиеся параметров методов, процедур и фукнций, а так же исправил код в более оптимальный 🙂  В архиве теперь лежать 2 файла  Bear8.prg для версии VFP7,8 (на VFP6 не проверялся) Bear9.prg для версии VFP9</div>
<div id="sol_avtor">Автор: Пирожков Вадим</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4821">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4821">piva</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="piva" href="https://foxclub.ru/account/?user=4821">
				<img alt='' src='https://secure.gravatar.com/avatar/0a76ea08e616d2f8a939412913fbb096?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/0a76ea08e616d2f8a939412913fbb096?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-03-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/alternativa-beautfy-app/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/classasform/</link>
					<title><![CDATA[ClassAsForm]]></title>
                    					    <author><![CDATA[Vladimir_Knyr]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>ClassAsForm</h1>
													</header>
													<div id="sol_opis">утилита для записи класса на основе FORM из библиотеки VCX в форму - наследницу SCX</div>
<div id="sol_body">[code] * утилита для записи класса на основе FORM из библиотеки VCX в форму - наследницу SCX procedure ClassAsForm #define		YES			6 #define		MsgTitle	'Tool ClassAsForm' local old_safety , i , classcount 	m.old_safety = set('safety') && запрос на подтверждение 	set safety off				 && не нужен do while messagebox('Наследовать форму от класса ?',4+32+4096,MsgTitle) = YES 	if agetclass(AClasses) && Выбираем Класс FORM из библиотеки AClasses[1] - Библиотека ; AClasses[2] - Класс 		* получили массив инфо о классах библы aClass1[1] - ObjName ; aClass1[2] - BaseClass 		m.classcount = avcxclasses(aClass1,AClasses[1]) 		m.i = ascan(aClass1,AClasses[2],1,m.classcount,1,9) 		if m.i > 0 and upper(aClass1[m.i,2]) == 'FORM' && могем из класса сделать форму наследник ? 			create form (AClasses[2]) as (AClasses[2]) from (AClasses[1]) nowait save && открыли конструктор форм с нашим классом 				sys(1500,'_MFI_SAVAS','_MSM_FILE') && сохранили класс как форму 			release windows 'Form Designer - ' + AClasses[2] + '.scx' && и закрыли конструктор 		else 			messagebox('Базовый класс должен быть FORM.',48+4096,MsgTitle,3000) 		endif 	endif enddo set safety &old_safety && восстановили запрос на подтверждение, какой он был до нашего вмешательства return [/code]</div>
<div id="sol_avtor">Автор: Vladimir_Knyr</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4754">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4754">Vladimir_Knyr</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Vladimir_Knyr" href="https://foxclub.ru/account/?user=4754">
				<img alt='' src='https://secure.gravatar.com/avatar/7dd8187cfc903829e54ae52b377e8a5a?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7dd8187cfc903829e54ae52b377e8a5a?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 15-12-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/classasform/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/rusifikator-ide-visual-foxpro-9-0-sp1/</link>
					<title><![CDATA[Руссификатор IDE Visual Foxpro 9.0 SP1]]></title>
                    					    <author><![CDATA[oav]]></author>
                    										    <pubDate>Fri, 04 Nov 2022 07:44:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Руссификатор IDE Visual Foxpro 9.0 SP1</h1>
													</header>
													<div id="sol_body">Русификатор IDE оболочки меню разработчика Visual Foxpro 9.0 SP1<br />
Представляет собой DLL файл который копируется в каталог с программой. Описание вложено в архив.<br />
Автор: oav</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="2231">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=2231">oav</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="oav" href="https://foxclub.ru/account/?user=2231">
				<img alt='' src='https://secure.gravatar.com/avatar/2bf221c24ed1192fc472a264e4a86527?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/2bf221c24ed1192fc472a264e4a86527?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 27-05-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/rusifikator-ide-visual-foxpro-9-0-sp1/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Файлы]]></category><category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kalendar-dlya-vfp9/</link>
					<title><![CDATA[Календарь для VFP9]]></title>
                    					    <author><![CDATA[Sergey Konoplev]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:27 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Календарь для VFP9</h1>
													</header>
													<div id="sol_opis">    Решил потестировать в VFP 9 новые свойства, в том числе MousePointer Grid'а, и это вылилось в очередной &quot;Календарь&quot;;)</div>
<div id="sol_body">
<h3>Календарь для VFP9</h3>
<p>    Поместите строку типа set classlib to DatePicker [additive] в метод Load формы, на которую помещен класс DateBox_DP.    Библиотека DatePicker содержит четыре класса, один из которых - DateBox_DP - помещается на рабочую форму, а остальные используются по мере необходимости. Для субклассирования колонок в модуле Class_Prg.prg определяется класс Column_2.</p>
<p>    Дату можно ввести вручную, уменьшить и увеличить на одни сутки клавишами "минус" и "плюс" или колесом мышки, а можно нажать на кнопку "Календарь" и выбрать дату из одноименной формы.</p>
<p>    Форма "Календарь" деактивирует вызывающую форму до тех пор, пока Вы не нажмете кнопки "Выбрать", "Отменить", "Закрыть", не выберите в ControlBox'е пункт меню "Закрыть", не сделаете двойной клик на любом числе календаря или не нажмете клавишу Esc.</p>
<p>    Для деактивации/активации меню применяется глобальная переменная glModalModeMainMenu.</p>
<p>    В форме "Календарь" для смены месяца и года можно использовать как кнопки ComboBox'а и Spinner'а, так и колесо мышки.     </p></div>
<div id="sol_avtor">Автор: Sergey Konoplev</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4366">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4366">Sergey Konoplev</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Sergey Konoplev" href="https://foxclub.ru/account/?user=4366">
				<img alt='' src='https://secure.gravatar.com/avatar/a5151b2fbc0d71de0f0b4496b3471cfa?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/a5151b2fbc0d71de0f0b4496b3471cfa?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-02-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kalendar-dlya-vfp9/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ispolzovanie-struktur-v-funkcziyah-windows-api/</link>
					<title><![CDATA[Использование структур в функциях Windows API]]></title>
                    					    <author><![CDATA[rvc44]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Использование структур в функциях Windows API</h1>
													</header>
													<div id="sol_opis">На примере работы с CheckBox'ами в элементе управления Windows TreeView продемонстрировано использование новых возможностей VFP 9 для работы со структурами Windows API практически любой сложности, используемыми для передачи и возврата параметров в/из Win API-функций.</div>
<div id="sol_body">Здесь приводится адаптированный и переведенный с Visual Basic на Visual FoxPro 9 код<br /> из статьи Брэда Мартинеса (Brad Martinez) "SetWindowLong: Add TreeView<br /> Check Boxes via API", опубликованной на сайте <br /> http://vbnet.mvps.org/index.html?code/comctl/tvcheckbox.htm.<br /> В примере показан способ работы со структурами Windows API любой сложности лишь средствами<br /> встроенными в Visual FoxPro 9, без использования дополнительных классов и FLL.</p>
<p> Продемонстрировано использование новых возможностей VFP 9, описанных в главе 14<br /> "Language Improvemens" на стр. 312 книги "What's New In Nine"<br /> издательства Hentzenwerke, доступной на сайте Microsoft online,<br /> а так же описанных в разделе "Формирование структур в Visual FoxPro" <br /> статьи Вячеслава Клепинина "Введение в Windows API", размещенной на сайте:<br /> http://www.codenet.ru/db/vfp/winapi/<br /> (если данный сайт недоступен, то воспользовавшись поиском Google можно<br /> получить ссылку на кэшированную сервисом Google копию данной страницы)</p>
<p> Для определения WinAPI структур в примере НЕ ИСПОЛЬЗУЕТСЯ подключаемый к<br /> проекту Struct.vcx с сайта: http://kodu.neti.ee/~juri4/examples/struct.zip<br /> (195,892 байта), т.к. класс struct требует Convert.FLL, а загромождать<br /> проект дополнительными, да еще и чужими файлами FLL желание отсутствует!<br /> К тому же библиотека Convert.FLL содержит только некоторые конверсионные<br /> функции необходимые для преобразования числовых величин в бинарные строки,<br /> как это требуется для функций API. А в версии VFP9, движок это прекрасно<br /> выполняет сам (см. описание измененных функций CTOBIN и BINTOC)!</p>
<p> В примере так же НЕ ИСПОЛЬЗУЕТСЯ класс rAPIdStructure, описанный в статье<br /> Emanuele Cerlini "A way to work with Visual FoxPro and API Structures",<br /> являющийся адаптером для API-структур, со времен VFP7 и далее,<br /> ознакомиться с которым можно по ссылке:<br /> http://www.foxitaly.com/ecerlini/struttureapi_en.html</p>
<p> Перевод, адаптацию статьи под VFP и написание кода VFP9 выполнил:<br /> Кольцов Роман Васильевич<br /> mailto: Roman.Koltsov@gmail.com<br /> tel: +7 4752 751645 (home)<br /> fax: +7 4752 713406 (work)<br /> ICQ: 44612299</div>
<div id="sol_avtor">Автор: Кольцов Роман Васильевич</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4767">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4767">rvc44</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="rvc44" href="https://foxclub.ru/account/?user=4767">
				<img alt='' src='https://secure.gravatar.com/avatar/e89cde72d5f4d3df33e6d628fb2c4289?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e89cde72d5f4d3df33e6d628fb2c4289?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 06-12-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ispolzovanie-struktur-v-funkcziyah-windows-api/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/organizacziya-peretaskivaniya-v-cttree-ot-dbi-technologies-inc/</link>
					<title><![CDATA[Организация перетаскивания в ctTree от DBI Technologies Inc.]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Wed, 03 Dec 2025 05:21:53 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Организация перетаскивания в ctTree от DBI Technologies Inc.</h1>
													</header>
													<div id="sol_opis">Давно и успешно использую ctTree от DBI Technologies Inc. В настоящем решении реализовано перетаскивание мышкой узлов и веток в дереве. Решение не имеет привязки к базе данных, а лишь иллюстрирует способ. Решение не лишено недостатков, а посему убедительная посьба - рассматривать его только как возможный путь реализации метода Drag &amp; Drop. Все свойства ctTree - по умолчанию, кроме трех картинок: PictureClose, PictureLeaf, PictureOpen, которые заданы через вкладку "Picture" свойств ctTree Control 6.0. Сама компонента ctTree лежит в папке DBI. Просто запустите форму на выполнение. Разумеется ctTree.ocx должен быть зарегистрирован. Visual FoxPro 9.0, на других не тестировал. Успехов.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Алексей Сасин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/organizacziya-peretaskivaniya-v-cttree-ot-dbi-technologies-inc/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kak-prochitat-znachenie-polya-so-svojstvom-identity/</link>
					<title><![CDATA[Как прочитать значение поля со свойством IDENTITY]]></title>
                    					    <author><![CDATA[Владимир Максимов]]></author>
                    										    <pubDate>Sat, 19 Nov 2022 17:54:56 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Как прочитать значение поля со свойством IDENTITY</h1>
													</header>
													<h3> </h3>
<p><a href="#WhatIsIdentity">Что такое IDENTITY</a><br />
<a href="#DefectAsPrimary">Недостаток использования полей со свойством IDENTITY как первичного ключа</a><br />
<a href="#ValueInNewRecord">Как определить значение поля со свойством IDENTITY в новой записи</a><br />
<a href="#WorkInFoxPro">Как работать с полями со свойством IDENTITY в FoxPro</a><br />
      <a href="#PassThrough">Прямое использование Pass-Through технологии через функцию SQLEXEC()</a><br />
      <a href="#RemoteView">Использование Remote View</a><br />
      <a href="#CursorAdapter">Использование Cursor Adapter</a></p>
<h4><a name="WhatIsIdentity"></a>Что такое IDENTITY</h4>
<p>IDENTITY - это не тип данных. Это некоторое дополнительное свойство, ограничение, накладываемое на целочисленные типы данных в MS SQL сервере. Т.е. это свойство может быть применено к полям следующего типа: <b>tinyint</b>, <b>smallint</b>, <b>int</b>, <b>bigint</b>, <b>decimal(p,0)</b>, или <b>numeric(p,0)</b></p>
<p>Аналогом этого свойства в FoxPro является тип данных Integer-AutoIncrement. Только не надо считать, что Integer-AutoIncrement это и есть поле со свойством Identity. Вовсе нет. Это именно аналог. В основном они похожи, но имеют ряд отличий. В данной статье речь пойдет о свойстве IDENTITY в MS SQL сервере.</p>
<p>Поля со свойством IDENTITY обладают следующими особенностями:</p>
<ul>
<li>В одной таблице допустимо существование только одного поля со свойством IDENTITY</li>
<li>Поле со свойством IDENTITY нельзя редактировать. Они имеет свойство "только для чтения".</li>
<li>Значение полю со свойством IDENTITY присваивается автоматически в момент создания новой записи.</li>
</ul>
<p>Есть еще некоторые особенности, но они уже являются следствием перечисленных особенностей</p>
<p>Новое значение - это последнее использованное значение плюс некоторая фиксированная величина. Обратите внимание, новое значение опирается не на максимальное значение в существующих записях, а на последнее использованное значение. Это значит, что записи с последним использованным значением физически может не существовать, тем не менее, это значение будет использовано.</p>
<p>Другими словами, в последовательности значений поля со свойством IDENTITY вполне допустимы "дыры". Список значение вовсе не непрерывный</p>
<p>Как правило, в качестве шага приращения указывают 1, но это может быть и любое целое число. В том числе и отрицательное.</p>
<p>В связи с такими особенностями полей со свойством IDENTITY такие поля часто используют в качестве первичных ключей. Другими словами, в качестве полей, по значению которых всегда можно однозначно идентифицировать запись таблицы.</p>
<p>Следует иметь в виду, что свойство IDENTITY никак не контролирует уникальность данных. Например, если изначально поле имело тип INTEGER, и в него были введены ряд значений. А затем была изменена структура таблицы, и на данное поле было наложено свойство IDENTITY, то новые записи вполне могут иметь те же данные, что уже были введены ранее в эту таблицу. Поэтому, если поле со свойством IDENTITY используется в качестве первичного ключа, то на это поле следует наложить дополнительное ограничение по уникальности.</p>
<p>&nbsp;</p>
<h4><a name="DefectAsPrimary"></a>Недостаток использования полей со свойством IDENTITY как первичного ключа</h4>
<p>Однако, несмотря на явные достоинства использования полей со свойством IDENTITY в качестве первичного ключа, они имеют и серьезный недостаток.</p>
<hr />
<p><b>Значение полей со свойством IDENTITY невозможно узнать до того, как запись будет физически создана.</b></p>
<hr />
<p>Ну и что? Какие проблемы-то? Создадим запись и узнаем ее новое значение.</p>
<p>Проблема заключается в том, что для того, чтобы узнать значение поля какой-либо записи эту запись надо сначала найти. А поиск записи как раз и осуществляется по значению первичного ключа. Того самого, значение которого необходимо определить. Замкнутый круг: чтобы прочитать значение это значение надо знать!</p>
<p>Структура хранения данных в MS SQL сервере принципиально отличается от структуры хранения данных в DBF-файлах. В нем нет таких понятий как "физический номер записи", "следующая запись", "последняя запись" и т.п. Т.е. невозможно перейти к "последней записи" чтобы прочитать значение ее первичного ключа.</p>
<p>Более того, хотя новое значение поля со свойством IDENTITY всегда больше любого из существующих значений (если шаг приращения - положительное число), но определить это новое значение, просто вычислив максимальное из существующих значений, тоже нельзя. Нет, само максимальное значение, разумеется, будет получено. Просто нет никакой гарантии, что полученное значение - это значение именно той записи, которая и была создана.</p>
<p>Дело тут в том, что, как правило, MS SQL сервер используется в многопользовательских приложениях. Это значит, что сразу несколько пользователей, одновременно, могут создавать новые записи. Получается, что один пользователь создал новую запись, затем начал вычислять максимальное значение и в этот момент другой пользователь также создал новую запись. В результате, первый пользователь в качестве максимального значения получит значение записи созданной вторым пользователем.</p>
<p>Так что же, отказаться от использования полей со свойством IDENTITY в качестве первичного ключа? Вовсе нет. Все-таки существуют способы определения значения поля со свойством IDENTITY у новой записи.</p>
<p>&nbsp;</p>
<h4><a name="ValueInNewRecord"></a>Как определить значение поля со свойством IDENTITY в новой записи</h4>
<p>Собственно, есть три принципиальные стратегии определения значения поля со свойством IDENTITY в новой, только что созданной, записи</p>
<ul>
<li>Значение, возвращаемое системной переменной @@IDENTITY</li>
<li>Значение, возвращаемое функцией SCOPE_IDENTITY()</li>
<li>Нахождение новой записи по значению других полей</li>
</ul>
<p>Теперь рассмотрим более подробно достоинства и недостатки каждой стратегии</p>
<p>&nbsp;</p>
<h5>Значение, возвращаемое системной переменной @@IDENTITY</h5>
<p>В MS SQL сервере есть ряд системных переменных, значение которых изменяется автоматически при наступлении определенных событий. В частности, значение системной переменной @@IDENTITY автоматически устанавливается равным значению поля со свойством IDENTITY последней созданной записи в текущем соединении. Т.е. создание новых записей в другом соединении (другим пользователем) никак не повлияет на ее значение в данном соединении.</p>
<p>Ну, так вот оно, решение. Просто после создания новой записи читаем значение системной переменной @@IDENTITY и имеем искомое значение.</p>
<p>В целом, верно. Проблема только в том, что системная переменная @@IDENTITY меняет свое значение при создании записи в <u>любой</u> таблице.</p>
<p>На практике, это означает, что если на таблицу установлен триггер на вставку, в теле которого дается команда INSERT на создание записи в другой таблице, которая, в свою очередь, также имеет поле со свойством IDENTITY, то системная переменная @@IDENTITY получит значение поля из этой второй таблицы.</p>
<p>Другими словами, опираться на значение системной переменной @@IDENTITY можно, но, помня о том, что эта переменная не привязана к значению поля одной таблицы.</p>
<p>&nbsp;</p>
<h5>Значение, возвращаемое функцией SCOPE_IDENTITY()</h5>
<p>В версии MS SQL 2000 была введена системная функция SCOPE_IDENTITY(). Эта функция также возвращает значение поля со свойством IDENTITY последней созданной записи, но созданной в пределах текущего SCOPE.</p>
<p>Адекватно перевести термин SCOPE на русский язык достаточно сложно. Но, приблизительно, можно сказать так: SCOPE - это одна процедура или функция. Другими словами, SCOPE_IDENTITY() вернет значение поля со свойством IDENTITY последней записи созданной в пределах той процедуры, где эта функция была вызвана.</p>
<p>Триггер - это уже другой SCOPE (другая функция), поэтому он никак не повлияет на значение возвращаемое SCOPE_IDENTITY().</p>
<p>Даже если два пользователя одновременно вызвали одну и ту же процедуру, но каждый вызвал процедуру в своем SCOPE. Т.е. опять-таки нет конфликта.</p>
<p>К недостаткам этой функции относится то, что ее следует вызывать в пределах того SCOPE, где и была создана новая запись интересующей нас таблицы. А это не всегда возможно.</p>
<p>Другими словами, для корректного использования SCOPE_IDENTITY() необходимо всегда следить за областью действия SCOPE. Зачастую, создавая специальные процедуры.</p>
<p>&nbsp;</p>
<h5>Нахождение новой записи по значению других полей</h5>
<p>Если помните, то основная проблема с определением значения поля со свойством IDENTITY заключается в том, что данное поле используется в качестве первичного ключа. Т.е. по его значению как раз и находят нужную запись.</p>
<p>Однако, зачастую, таблицы имеют поле или набор полей, по которым также можно однозначно определить запись. Например, если речь идет о справочнике, то, разумеется, справочник имеет поле "Название". Также очевидно, что это поле должно быть уникально в пределах справочника. Иначе просто теряется смысл использования самого справочника. Зачем вводить в справочник записи с одинаковым значением?</p>
<p>Почему же не использовать в качестве первичного ключа это самое "Название"? Зачем вообще нужно поле со свойством IDENTITY? Это тема отдельного разговора. Вкратце, "Название" - это для пользователя (внешние данные), а IDENTITY - это для обеспечения ссылочной целостности базы данных (внутренние данные).</p>
<p>Значение поля со свойством IDENTITY в новой записи не известно. Но значение поля "Название" в этой новой записи вполне известно. Пользователь сам же его и ввел! Значит, после создания новой записи можно найти эту новую запись по значению поля "Название" и прочитать значение поля со свойством IDENTITY.</p>
<p>Проблема только в том, что далеко не всегда существует такое поле или набор полей для однозначной идентификации записи. Это, кстати, одна из причин ввода, так называемых, суррогатных ключей. Тех самых полей со свойством IDENTITY.</p>
<p>Если, тем не менее, Вы решите использовать эту стратегию для поиска новой записи, то обязательно наложите на поле "Название" (или выбранный Вами набор полей) ограничение по уникальности. Т.е., чтобы случайно не оказалось двух записей с одинаковым значением в этом поле.</p>
<p>&nbsp;</p>
<h4><a name="WorkInFoxPro"></a>Как работать с полями со свойством IDENTITY в FoxPro</h4>
<p>С теоретической частью закончили, теперь "попробуем со всем этим добром взлететь". Т.е. определимся, как же воспользоваться всеми этими знаниями в FoxPro. Еще раз уточним задачу, которую необходимо решить.</p>
<p>Добавляется запись в таблицу MS SQL сервера имеющую поле со свойством IDENTITY. Необходимо сразу после создания новой записи получить значение поля со свойством IDENTITY на стороне FoxPro.</p>
<p>У FoxPro есть три принципиальные возможности организации работы с MS SQL сервером</p>
<ul>
<li>Прямое использование Pass-Through технологии через функцию SQLEXEC()</li>
<li>Использование Remote View</li>
<li>Использование Cursor Adapter</li>
</ul>
<p>Тут следует остановиться на том, какое именно событие собственно создает запись на MS SQL сервер. Ну, с Pass-Trough все ясно. Это собственно прямая команда серверу создать новую запись. А вот с Remote View и Cursor Adapter несколько иначе.</p>
<p>Результатом работы как Remote View, так и Cursor Adapter является курсор. Т.е. некая временная таблица, физически расположенная на машине клиента. По умолчанию, этот курсор автоматически открывается в режиме оптимистической буферизации строк (3) и может быть переключен только в режим оптимистической буферизации таблиц (5). Переключиться в режим пессимистической буферизации или отключить буферизацию совсем для этого курсора невозможно</p>
<p>Следовательно, новая запись сначала физически будет создана именно на клиентской машине в этом самом курсоре. Точнее, в буфере этого курсора. Физическое создание записи на MS SQL сервере произойдет только после сброса буфера.</p>
<p>Для строковой буферизации сброс буфера может произойти автоматически при выполнении одного из следующих действий:</p>
<ul>
<li>Переход (или попытка перехода) на другую запись</li>
<li>Закрытие курсора</li>
<li>Переключение в режим табличной буферизации</li>
<li>По команде TableUpdate()</li>
</ul>
<p>Для табличной буферизации сброс буфера может произойти только по команде TableUpdate() и никак иначе.</p>
<p>Никакие другие действия и операции ни с Remote View, ни с Cursor Adapter не приведут к созданию новой записи на MS SQL сервере. Если при выполнении какой-либо операции оказалось, что на MS SQL сервере создалась новая запись, это означает, что курсор находился в режиме строковой буферизации, и произошло одно из событий вызвавших автоматический сброс буфера.</p>
<p>Например, такое может произойти по команде Requery() для Remote View. Но это вовсе не означает, что команда Requery() сбрасывает буфер. Вовсе нет. Просто одним из условий выполнения команды Requery() является закрытие ранее существовавшего курсора. А вот это событие как раз и вызовет автоматический сброс буфера, если курсор находится в режиме строковой буферизации.</p>
<p>Чтобы избежать подобных недоразумений, переключайте курсор в режим табличной буферизации (5). В этом случае Вы всегда сможете контролировать процесс сброса буфера.</p>
<p>Однако следует понимать, что даже если Вы установите режим табличной буферизации, измените несколько записей в Remote View или Cursor Adapter, а потом дадите команду TableUpdate() все равно сброс буфера будет происходить по одной записи за раз. Т.е. на сервер будет послана не одна команда, например, на модификацию, а набор команд по модификации каждой записи в отдельности.</p>
<p>Применительно к операциям создания новой записи из этого следует вывод, что во всех событиях объекта Cursor Adapter <b>всегда</b> происходит вставка только одной записи за раз.</p>
<p>&nbsp;</p>
<h5><a name="PassThrough"></a>Прямое использование Pass-Through технологии через функцию SQLEXEC()</h5>
<p>При таком способе работы программист как бы напрямую работает с MS SQL сервером. Сам формирует все команды, отсылаемые на сервер, получает результат, и сам же его обрабатывает. В этом случае не составляет никакого труда послать дополнительный запрос серверу на значение функции SCOPE_IDENTITY</p>
<hr />
<pre><pre class='bbcode'>   LOCAL lcNewValue, lnResut  
  lcNewValue = "Новое значение"  
  lnResut = SQLExec(m.lnConnectHandle,"INSERT INTO MyTab (Field1) VALUES (?m.lcNewValue)")  
  IF m.lnResut&gt;0  
  	SQLExec(m.lnConnectHandle,"SELECT NewIdent=SCOPE_IDENTITY()","NewIdent")  
  	?NewIdent.NewIdent  
  ELSE  
  	LOCAL laError(1)  
  	=AERROR(laError)  
 	* Анализ массива laError для уточнения причины ошибки  
  ENDIF  
     
</pre></pre>
<hr />
<p>В данном примере m.lnConnectHandle - это число, номер соединения с MS SQL сервером, которое настраивается раньше. MyTab - это таблица, которая имеет поле со свойством IDENTITY.</p>
<p>После выполнения второго запроса в результирующем курсоре NewIdent в поле NewIdent первой записи и получим искомое значение. В данном синтаксисе и команда вставки и вызов функции SCOPE_IDENTITY() происходят в одном SCOPE. Поэтому, получаем нужное значение.</p>
<p>&nbsp;</p>
<h4><a name="RemoteView"></a>Использование Remote View</h4>
<p>Remote View - это некая "надстройка" над технологией Pass-Through. По сути, при создании новой записи выполняется та же команда INSERT INTO. Однако проблема в том, что даже если прочитать номер соединения, в котором работает Remote View, а потом выполнить запрос для определения значения, возвращаемого SCOPE_IDENTITY(), то получим NULL, поскольку в этом случае команда вставки и SCOPE_IDENTITY() выполняются в разных SCOPE. Следовательно, остается только два способа определения значения поля со свойством IDENTITY.</p>
<hr />
<pre><pre class='bbcode'>  * Определение значения системной переменной @@IDENTITY  
  LOCAL lnConnectHandle  
  lnConnectHandle = CursorGetProp("ConnectHandle","MyRemoteView")  
  SQLExec(m.lnConnectHandle,"SELECT NewIdent=@@IDENTITY","NewIdent")  
  ?NewIdent.NewIdent  
    
 * Определение по значению другого поля  
  LOCAL lnConnectHandle, lcNickName  
  lnConnectHandle = CursorGetProp("ConnectHandle","MyRemoteView")  
  lcNickName = MyRemoteView.NickName  
  SQLExec(m.lnConnectHandle,"SELECT TabId FROM MyTab WHERE NickName=?lcNickName","NewIdent")  
  ?NewIdent.TabId  
    
</pre> </pre>
<hr />
<p>В обоих примерах MyRemoteView - это имя Вашего Remote View. NickName - это имя поля в Remote View по значению которого выполняется поиск новой записи, а TabID - это то самое поле со свойством IDENTITY значение которого и надо определить</p>
<p>Предполагается, что создание новой записи уже произошло. Либо явно была дана команда TableUpdate(), либо Remote View находится в режиме строковой буферизации, и была попытка перехода на другую запись.</p>
<p>А почему во втором случае не было использовано, казалось бы, более очевидное решение поиска после Requery()? Что-то вроде</p>
<hr />
<pre><pre class='bbcode'>   =REQUERY("MyRemoteView")  
  SELECT MyRemoteView  
  LOCATE FOR NickName = "Новое значение"  
  ?MyRemoteView.TabID  
    
</pre> </pre>
<hr />
<p>На это есть несколько причин.</p>
<p>Во-первых, Requery() предполагает выполнение запроса заново. Т.е. предполагается, что произошел сброс буфера всех записей Remote View. Но ведь это может быть не так. Например, сбрасывают буфер по одной записи за раз в цикле.</p>
<p>Во-вторых, обычно Remote View содержит в себе дополнительные условия отбора записей, и только что созданная запись может вообще не попасть в условия отбора. Т.е. после Requery() запись, хотя и будет физически создана на сервере, но в самом Remote View отображена не будет.</p>
<p>&nbsp;</p>
<h4><a name="CursorAdapter"></a>Использование Cursor Adapter</h4>
<p>Объект Cursor Adapter был введен в FoxPro, начиная с версии Visual FoxPro 8. Он призван облегчить работу с удаленными данными при выполнении некоторых стандартных операций. В частности, операции создания новой записи. Через Cursor Adapter можно реализовать все три варианта получения значения поля со свойством IDENTITY в новой записи.</p>
<p>&nbsp;</p>
<h4>Значение, возвращаемое системной переменной @@IDENTITY</h4>
<p>После того, как будет выполнен сброс буфера и произойдет физическая создание новой записи на MS SQL сервере, в объекте Cursor Adapter сработает событие AfterInsert. Вот в нем как раз и надо выполнить дополнительный запрос на сервер и прочитать значение системной переменной @@IDENTITY</p>
<hr />
<pre><pre class='bbcode'>   PROCEDURE AfterInsert  
  LPARAMETERS cFldState, lForce, cInsertCmd, lResult  
  IF lResult=.T. &amp;&amp; вставка произошла успешно. Надо получить значение ID  
  	LOCAL currentArea  
  	currentArea=SELECT()  
    
  	TRY  
  		IF 1=SQLEXEC(this.DataSource,"SELECT NewIdent=@@IDENTITY","NewIdent")  
  			REPLACE TabId WITH NewIdent.NewIdent IN (This.Alias)  
  			USE IN IDRes  
  		ELSE  
  			LOCAL laError(1)  
  			=AERROR(laError)  
 			* Анализ массива laError для уточнения причины ошибки  
  		ENDIF  
  	FINALLY  
  		SELECT (currentArea)  
  	ENDTRY  
  ENDIF  
  ENDPROC  
    
    
</pre> </pre>
<hr />
<p>Думаю, код достаточно понятный и не нуждается в пояснениях. После успешного создания новой записи на сервере при помощи SQLExec() для того же самого соединения определили значение @@IDENTITY и записали это значение в текущую запись курсора в ключевое поле.</p>
<p>В версии Visual FoxPro 9 в объект Cursor Adapter было добавлено свойство <b>InsertCmdRefreshCmd</b>. Это команда, которая посылается на сервер только после успешной вставки новой записи. Т.е. здесь нет необходимости убеждаться в самом факте создания новой записи.</p>
<p>В паре с другим новым свойством <b>InsertCmdRefreshFieldList</b> можно выполнить обновление, опираясь на значение системной переменной @@IDENTITY проще. Для этого всего лишь надо сделать следующие настройки объекта CursorAdapter</p>
<hr />
<pre><pre class='bbcode'>   CursorAdapter.InsertCmdRefreshCmd       = "SELECT @@IDENTITY"  
  CursorAdapter.InsertCmdRefreshFieldList = "TabId"  
    
</pre> </pre>
<hr />
<p>Здесь TabId - это не имя поля со свойством IDENTITY в таблице собственно на MS SQL сервере, а имя поля курсора, полученного на стороне клиента в котором и отображается содержимое поля со свойством IDENTITY. Как правило, эти имена совпадают, но, в общем случае, могут и отличаться. Более подробно о свойстве <b>InsertCmdRefreshFieldList</b> читайте ниже. В разделе, посвященном нахождению новой записи по значению других полей.</p>
<p>&nbsp;</p>
<h4>Значение, возвращаемое функцией SCOPE_IDENTITY()</h4>
<p>Здесь все несколько сложнее. Дело в том, что действовать, так же как и в случае определения системной переменной @@IDENTITY нельзя. SQLExec() и Cursor Adapter работают в разных SCOPE. Поэтому при подобном подходе SCOPE_IDENTITY() всегда будет возвращать NULL. Чтобы преодолеть это противоречие используют специальные процедуры.</p>
<p>Для начала, надо создать на самом MS SQL сервере вот такую хранимую процедуру</p>
<hr />
<pre><pre class='bbcode'>   CREATE PROCEDURE Get_ValueInt  
  		@ValueIn Int,  
  		@ValueOut Int OUTPUT  
  AS  
  SET NOCOUNT ON  
  SELECT @ValueOut=@ValueIn  
    
</pre> </pre>
<hr />
<p>Как видите, цель данной процедуры просто присвоить значение входного параметра выходному параметру. Теперь можно использовать эту процедуру для определения значения SCOPE_IDENTITY() в Cursor Adapter. Для этого в событии <b>BeforeInsert</b> делается такая подмена</p>
<hr />
<pre><pre class='bbcode'>   PROCEDURE BeforeInsert  
  LPARAMETERS cFldState, lForce, cInsertCmd  
  cInsertCmd = cInsertCmd + ;  
  		"; DECLARE @id int" + ;  
  		"; SELECT @id=SCOPE_IDENTITY()" + ;  
  		"; EXEC Get_ValueInt @id, ?@MyTab.TabId"  
  ENDPROC  
    
</pre> </pre>
<hr />
<p>Только следует иметь в виду, что в данной подмене MyTab - это уже не имя таблицы на MS SQL сервере, а имя курсора создаваемого у клиента. Точнее, то имя, которое записано в свойстве Alias собственно Cursor Adapter. Соответственно, "TabId" - это имя поля курсора, созданного у клиента и содержащего значение поля со свойством IDENTITY</p>
<p>В данном случае, по сути, формируется динамическая хранимая процедура. Т.е. не просто одна команда INSERT, а последовательность команд. Команды отделяются друг от друга символом точки с запятой, хотя это вовсе не обязательно. Достаточно отделять команды друг от друга простым пробелом.</p>
<p>&nbsp;</p>
<h4>Нахождение новой записи по значению других полей</h4>
<p>Если у Вас Visual FoxPro 8, то Вам остается использовать метод аналогичный методу, примененному для поиска значения системной переменной @@IDENTITY. Т.е. в методе AfterInsert объекта Cursor Adapter выполнить дополнительный запрос через SQLExec()</p>
<p>Начиная с версии Visual FoxPro 9, в объекте Cursor Adapter появились дополнительные свойства, позволяющие автоматизировать эту процедуру без написания дополнительного кода</p>
<p><b>InsertCmdRefreshFieldList</b> - список полей, значение которых будет обновлено после Insert<br />
<b>InsertCmdRefreshKeyFieldList</b> - поле, или набор НЕ ключевых полей также однозначно идентифицирующих запись, по которым и будет осуществлен поиск новой записи</p>
<p>Следует отметить, что в этих свойствах указываются не имена полей таблицы собственно MS SQL сервера, а соответствующие им имена полей курсора, полученного на стороне клиента. Применительно к тому же примеру это будет примерно так:</p>
<hr />
<pre><pre class='bbcode'>   InsertCmdRefreshFieldList 	= "TabID"  
  InsertCmdRefreshKeyFieldList 	= "NickName"  
    
</pre> </pre>
<hr />
<p>Другими словами, опираясь на значение поля NickName, будет найдена запись в таблице на MS SQL сервере и прочитано значение поля TabID, после чего это значение будет записано в новую запись на стороне клиента.</p>
<p>&nbsp;</p>
<p>Более подробно как обсуждение данной темы, так и примеры использования Вы можете посмотреть здесь</p>
<p><a href="http://forum.foxclub.ru/read.php?29,144340,144340#msg-144340">CursorAdapter: Авто-рефреш полей во время TABLEUPDATE</a><br />
<a href="http://forum.foxclub.ru/read.php?29,184077,191045">Как автомат-ки получать автоинкриментное поле SQL сервера в КА</a><br />
<a href="http://forum.foxclub.ru/read.php?29,195224,page=1">CursorAdapter, событие AfterInsert и поле сервера типа IDENTITY</a></p>
<p>Владимир Максимов<br />
Последнее обновление: 01.05.06</p>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4899">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4899">Владимир Максимов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Владимир Максимов" href="https://foxclub.ru/account/?user=4899">
				<img alt='' src='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 65<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kak-prochitat-znachenie-polya-so-svojstvom-identity/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Статьи]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/sqldataclasses-nabor-klassov-uproshhayushhih-rabotu-so-skvoznymi-zaprosami-pass-through-k-sql-subd/</link>
					<title><![CDATA[SqlDataClasses &#8211; набор классов, упрощающих работу со сквозными запросами (pass-through) к SQL СУБД.]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>SqlDataClasses &#8211; набор классов, упрощающих работу со сквозными запросами (pass-through) к SQL СУБД.</h1>
													</header>
													<div id="sol_opis">SqlDataClasses – набор классов, упрощающих работу со сквозными запросами (pass-through) к SQL СУБД. Представляют собой обертку для выполнения команд сквозных запросов, позволяющих сочетать их мощь c удобством работы, аналогичном  работе с удаленными представлениями (Remote Views)  с некоторыми дополнительными возможностями. В какой-то мере являются аналогом класса CursorAdapter, но в отличие от него, могут использоваться в версиях VFP ниже 8.0. Аналогично удаленным представлениям, на стороне клиента работа с данными сводится к операциям с локальным буферизированным курсором, полученным с SQL-сервера. Все изменения в курсоре могут автоматически или принудительно переданы на SQL-сервер с помощью модифицирующих SQL-выражений, записанных в специальных свойствах. Все выражения независимы друг от друга и могут содержать любые корректные для конкретного SQL-сервера команды (выборки, вызовы процедур и т.п.)</div>
<div id="sol_body">Библиотека содержит в себе следующие классы:<br /> Sql_DataSource – основной класс, обертка над SQL pass-through. Получает данные в буферизированный курсор, оправляет изменения на SQL СУБД. Имеет набор свойств, методов и событий, связанных с выполнением этих задач;<br /> Sql_Grid – класс Grid’а, упрощающий отображение данных пересоздаваемого курсора, созданного классом Sql_Data_Source (можно использовать любой другой при выполнении некоторых условий).<br /> Может использоваться также как обычный GRID  источников данных, требующих закрытия/открытия источника данных (в обычном GRID'е после переоткрытия данные будут не видны) - методы Save_DS (применяется перед закрытием) и Rest_DS (применяется после переоткрытия источника данных).<br /> Также содержит возможность подсветки строки. Подсветка производится любым объектом, производным от базового класса Shape и расположенным в том же родительском контейнере, что и объект, производный от класса Sql_Grid. Для ссылка на такой объект используется свойство HltShape.;<br /> Hlt_Shape – класс строки подсветки для Sql_Grid (может использоваться для версий ниже 8.0);<br /> Hlt_Text – класс textbox’а для лучшего использования строки подсветки, производной от класса Hlt_Shape.</p>
<p> Кратко о возможностях:<br /> Класс SqlDataSource имеет 5 свойств для автоматических операций с данными, содержащих SQL-выражения: <br /> ·	SqlInitSelect - строка SQL-выражения для инициализации курсора, <br /> ·	SqlSelect - строка SQL-выражения  для получения/обновления данных в курсоре (это же выражение будет использовано для инициализации курсора, если свойство SqlInitSelect не заполнено),<br /> ·	SqlInsert - строка SQL-выражения, передаваемого на сервер  для новых строк из курсора,<br /> ·	SqlUpdate - строка SQL-выражения, передаваемого на сервер  для измененных строк в курсоре,<br /> ·	SqlDelete - строка SQL-выражения, передаваемого на сервер  для удаленных строк в курсоре<br /> ·	SqlRefresh - строка SQL-выражения  для обновления строки курсора данными с SQL-сервера после передачи обновлений на сервер,<br /> ·	упрощенная запись параметров-полей курсора в SQL-выражениях;<br /> ·	автоматическое открытие буферизированного курсора;<br /> ·	автоматическое закрытие курсора при уничтожении объекта;<br /> ·	автоматическое или принудительное обновление данных на сервере (будет исполнено для всех измененных, добавленных или удаленных строк);<br /> ·	автоматическая посылка подтверждения (Commit) после посылки обновления данных;<br /> ·	метод, исполняющие любые SQL-выражения - аналог SqlExec с выдачей ошибок;<br /> ·	свойство-признак измененности данных в курсоре -SqlModified;<br /> ·	предупреждение о наличии не сохраненных данных в курсоре при уничтожении объекта (проверку можно вызвать принудительно);<br /> ·	и др.</p>
<p> Подробное описание в файле SqlDataClasses.RTF</p></div>
<div id="sol_avtor">Автор: Алексей Кирпичев</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/sqldataclasses-nabor-klassov-uproshhayushhih-rabotu-so-skvoznymi-zaprosami-pass-through-k-sql-subd/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/dbf-fixer/</link>
					<title><![CDATA[Dbf fixer]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Dbf fixer</h1>
													</header>
													<div id="sol_opis">очередной исправитель структуры заголовка</div>
<div id="sol_body">соответственно библиотеки от 7 требуются<br /> проверяет как отдельные файлы так и все файлы в каталоге</div>
<div id="sol_avtor">Автор: самсонон</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/dbf-fixer/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/poisk-v-proekte/</link>
					<title><![CDATA[Поиск в проекте]]></title>
                    					    <author><![CDATA[piva]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Поиск в проекте</h1>
													</header>
													<div id="sol_opis">Поиск подстроки во всех файлах включенных в проект. В утилиту можно передавать имя файла проекта и искомую строрку, но можно этого и не делать, она все спросит сама. В утилите используется прямой вызов MS ListView так что если у вас нету лицензии, я не виноват.  Вызов файла где найдена строка, двойной клик на строке. Попытался перевести ее на английский, но такой перевод ...</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Пирожков Вадим</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4821">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4821">piva</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="piva" href="https://foxclub.ru/account/?user=4821">
				<img alt='' src='https://secure.gravatar.com/avatar/0a76ea08e616d2f8a939412913fbb096?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/0a76ea08e616d2f8a939412913fbb096?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-03-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/poisk-v-proekte/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/pechat-tekstovyh-fajlov-v-dos-kodirovke/</link>
					<title><![CDATA[Печать текстовых файлов в DOS-кодировке]]></title>
                    					    <author><![CDATA[Snick]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Печать текстовых файлов в DOS-кодировке</h1>
													</header>
													<div id="sol_opis">Еще один вариант. Над интерфейсом не мучался - сделал как в решении http://www.foxclub.ru/sol/index.php?act=view&id=187 Но меня этот вариант больше устраивает. EXE-файл сделан под VFP6SP5. Исходники работают и под VFP9SP1.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Николай</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4805">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4805">Snick</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Snick" href="https://foxclub.ru/account/?user=4805">
				<img alt='' src='https://secure.gravatar.com/avatar/7c5bd7c2580d7054e2c4e778b66c3021?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7c5bd7c2580d7054e2c4e778b66c3021?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 21-05-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/pechat-tekstovyh-fajlov-v-dos-kodirovke/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/novyj-rabochij-primer-podderzhki-ierarhii-mshflexgrid-i-true-db-grid/</link>
					<title><![CDATA[Новый рабочий пример поддержки иерархии MSHFlexGrid и True DB Grid]]></title>
                    					    <author><![CDATA[rvc44]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Новый рабочий пример поддержки иерархии MSHFlexGrid и True DB Grid</h1>
													</header>
													<div id="sol_opis">По просьбам коллег привожу рабочий пример и screenshot к программе, а не отдельный кусок кода. Создайте пустой проект, добавьте в него форму a_mshfg и запустите ее на выполнение. Внимательно см. все комментарии в методе Init формы, особенно в конце, а так же содержимое файла readme.txt и ссылку в нем (!)</div>
<div id="sol_body">Содержимое программы внутри вложенного файла.</div>
<div id="sol_avtor">Автор: Кольцов Роман Васильевич</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4767">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4767">rvc44</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="rvc44" href="https://foxclub.ru/account/?user=4767">
				<img alt='' src='https://secure.gravatar.com/avatar/e89cde72d5f4d3df33e6d628fb2c4289?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e89cde72d5f4d3df33e6d628fb2c4289?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 06-12-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/novyj-rabochij-primer-podderzhki-ierarhii-mshflexgrid-i-true-db-grid/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/primer-ispolzovaniya-ierarhicheskih-vozmozhnostej-mshflexgrid-i-true-db-grid/</link>
					<title><![CDATA[Пример использования иерархических возможностей MSHFlexGrid и True DB Grid]]></title>
                    					    <author><![CDATA[rvc44]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Пример использования иерархических возможностей MSHFlexGrid и True DB Grid</h1>
													</header>
													<div id="sol_opis">В приведенном примере продемонстрирована возможность использования в Microsoft Visual FoxPro иерархических возможностей ActiveX-контролов Microsoft Hierarchical FlexGrid и Component One True DB Grid</div>
<div id="sol_body">*** Пример использования в Microsoft Visual FoxPro иерархических возможностей <br /> *** ActiveX Microsoft Hierarchical FlexGrid и Component One True DB Grid<br /> *** (c) Кольцов Роман Васильевич aka rvc44, 2003<br /> *** mailto: Roman.Koltsov  gmail.com</p>
<p> *** В примере используется OLE-автоматизация Microsoft Access, поэтому<br /> *** для успешной работы необходим не очеь старый Microsoft Access (лучше 2003)<br /> *** Кто знает, как создать иерархический рекордсет без Access, велкам!</p>
<p> *** Перед использованием добавьте на вкладке User DNS в Пуск -> Настройка -><br /> *** ПанельУправления -> Администрирование -> Источники данных (ODBC)<br /> *** новый источник данных с именем netar, драйвером Microsoft Access Driver (*.mdb)<br /> *** и базой данных C:Tempnetar.mdb. Для настройки DNS можно создать и <br /> *** сохранить пустой файл произвольного типа с именем "netar.mdb", т.к.<br /> *** в дальнейшем программа его все равно удаляет и создает новый!<br /> *** Кто знает, как настроить DNS программно, велкам!</p>
<p> *** Внимание! Важная особенность, описанная в одной из конференций.<br /> *** Hierarchical FlexGrid как и TreeView работает с Twip'ами, поэтому<br /> *** при расчете ширины ячеек нужно учитывать Twip'ы<br /> *** и в качестве параметров для метода HitTest, при реализации<br /> *** Drag&Drop нужно передавать координаты в Twip'ах.</p>
<p> #define cnLOG_PIXELS_X 88<br /> #define cnLOG_PIXELS_Y 90 <br /> #define cnTWIPS_PER_INCH 1440 <br /> * 1440 твипов на дюйм<br /> #define flexAlignLeftCenter 1<br /> #define flexAlignCenterTop 3<br /> #define flexAlignCenterCenter 4</p>
<p> *** Возможные значений параметра type в методе CreateField<br /> #define dbBoolean 1     && Логический<br /> #define dbByte 2  	&& Числовой (байт)<br /> #define dbInteger 3     && Числовой (целое)<br /> #define dbLong 4	&& Числовой (длинное целое)<br /> #define dbCurrency 5    && Денежный<br /> #define dbSingle 6      && Числовой (одинароне с плавающей точкой)<br /> #define dbDouble 7      && Числовой (двойное с плавающей точкой)<br /> #define dbDate 8        && Дата/время<br /> #define dbBinary 9<br /> #define dbText 10       && Текстовый<br /> #define dbLongBinary 11 && Поле объекта OLE<br /> #define dbMemo 12 	&& Поле МЕМО<br /> #define dbGUID 15 	&& Числовой (код репликации)<br /> #define dbDecimal 20	&& Числовое (действительное)</p>
<p> *** Возможные значений параметра в методе Quit<br /> #define acQuitPrompt 0<br /> #define acQuitSaveAll 1<br /> #define acQuitSaveNone 2</p>
<p> *** Метод Init формы Visual FoxPro, на которой размещены ActiveX компоненты:<br /> *** сверху True DB Grid и снизу MSHFlexGrid (для сравнения их возможностей)<br /> LPARAM pUpForm  * Вызывающая форма верхнего уровня<br /> LOCAL sw As Long</p>
<p> This.UpForm=pUpForm</p>
<p> ************* Создаем базу данных netar.mdb с двумя таблицами Goods и Categs ***********<br /> * Непосредственно для создания таблиц используется метод CreateTableDef<br /> * tabledef = database.CreateTableDef ([name], [attributes], [sourcetablename], [connect])<br /> * Для создания полей таблицы используется объект Field и метод CreateField<br /> * field = tabledef.CreateField ([name], [type], [size])<br /> * После того, как таблица будет описана и в ней созданы необходимые поля,<br /> * ее нужно будет добавить в базу данных. Для добавления таблицы в базу данных<br /> * используется метод Append<br /> * Для создания новой таблицы неоходимо определить новый объект TableDef<br /> * (Table Definition - описание таблицы).<br /> * Объект TableDef содержит всю необходимую информацию для определения таблицы БД.<br /> *****************************************************************************************</p>
<p> oAcc=CREATEOBJECT("Access.Application")<br /> WAIT WINDOW NOWAIT "Запуск Access..."<br /> * Hide the instance of Microsoft Access.<br /> * Microsoft Knowledge Base Article - 167659<br /> sw = ShowWindow(oAcc.hWndAccessApp, 2)</p>
<p> * Созданим БД Access "Нетарифные меры регулирования ВЭД" для анализа ГТД<br /> cMDB="C:tempnetar.mdb"  && ThisForm.MDBFullPath<br /> IF FILE("&cMDB.")<br /> 	delete file &cMDB.<br /> ENDIF<br /> oAcc.Visible = .F.<br /> oAcc.NewCurrentDatabase(cMDB)<br /> oMDB=oAcc.CurrentDB</p>
<p> * Создадим таблицу Goods базы данных netar.mdb<br /> oTbl=oMDB.CreateTableDef("Goods")<br /> oTbl.Fields.Append(oTbl.CreateField("Direction", dbText, 5))  && .Append(oFld)<br /> oTbl.Fields.Append(oTbl.CreateField("Sync", dbText, 30))  && Invisible<br /> oTbl.Fields.Append(oTbl.CreateField("GTD", dbText, 23))<br /> oTbl.Fields.Append(oTbl.CreateField("G022", dbText, 254))<br /> oTbl.Fields.Append(oTbl.CreateField("G33", dbText, 10))<br /> oTbl.Fields.Append(oTbl.CreateField("G31_1", dbText, 254))<br /> oTbl.Fields.Append(oTbl.CreateField("G38", dbDouble))<br /> oTbl.Fields.Append(oTbl.CreateField("G46", dbDouble))<br /> oMDB.TableDefs.Append(oTbl)</p>
<p> * Создадим таблицу Categs базы данных netar.mdb<br /> oTbl=oMDB.CreateTableDef("Categs")<br /> oTbl.Fields.Append(oTbl.CreateField("G32", dbDouble))<br /> oTbl.Fields.Append(oTbl.CreateField("G441", dbText, 4))<br /> oTbl.Fields.Append(oTbl.CreateField("Sync", dbText, 30))  && Invisible<br /> oTbl.Fields.Append(oTbl.CreateField("G442", dbText, 254))<br /> oTbl.Fields.Append(oTbl.CreateField("G443", dbText, 254))<br /> oMDB.TableDefs.Append(oTbl)</p>
<p> * Для "иерархии" имеем 2 курсора CurDclHead и CurDclCmpr.<br /> * (их содержимое не привожу по соображениям госбезопасности 😉 )<br /> * Перегоним их в 2 иерархических рекордсета<br /> * Синхронизация между рекордсетами будет осуществляться по полю Sync<br /> * Все поля в соответствующих курсорах и рекордсетах одноименные</p>
<p> * Конвертация "вручную" курсора1 в рекордсет1 с соответствующими полями<br /> oRS=oMDB.OpenRecordSet("Goods")<br /> SELECT CurDclCmpr  && CurDclHead соответствующий курсор<br /> SCAN<br /> 	oRS.AddNew<br /> 	FOR j = 0 TO oRS.Fields.Count-1<br /> 		cFName=oRs.Fields(j).Name<br /> 		vValue=EVALUATE(cFName)<br /> 		oRs.Fields(j).Value=vValue<br /> 	ENDFOR<br /> 	oRS.Update<br /> 	oRS.MoveFirst<br /> ENDSCAN<br /> oRS.Close</p>
<p> * Конвертация "вручную" курсора2 в рекордсет2 с соответствующими полями<br /> oRS=oMDB.OpenRecordSet("Categs")<br /> SELECT CurDclHead<br /> SCAN<br /> 	oRS.AddNew<br /> 	FOR j = 0 TO oRS.Fields.Count-1<br /> 		cFName=oRs.Fields(j).Name<br /> 		vValue=EVALUATE(cFName)<br /> 		oRs.Fields(j).Value=vValue<br /> 	ENDFOR<br /> 	oRS.Update<br /> 	oRS.MoveFirst<br /> ENDSCAN<br /> oRS.Close<br /> USE IN CurDclHead</p>
<p> oMDB.Close<br /> oAcc.Quit(acQuitSaveAll)<br /> RELEASE oAcc<br /> WAIT CLEAR</p>
<p> * Демонстрация использования иерархических рекордсетов<br /> * Используется MSDataShape провайдер для создания иерархического<br /> * рекордсета из таблиц Goods и Categs базы данных C:tempnetar.mdb</p>
<p> oConnection = CREATEOBJECT("ADODB.Connection")<br /> oRecordSet = CREATEOBJECT("ADODB.Recordset")</p>
<p> WITH oConnection<br />    .Provider="MSDataShape"<br />    .OPEN("DSN=NETAR")  && NETAR настроена на C:tempnetar.mdb<br /> ENDWITH</p>
<p> oRecordSet.ActiveConnection = oConnection<br /> oRecordSet.OPEN ("SHAPE {SELECT * FROM Goods}  AS Cmn2 " + ;<br /> 			     "APPEND ({SELECT * FROM Categs}  AS Cmn2A RELATE " + ;<br /> 				 "Sync TO Sync) AS Cmn2A")</p>
<p> * Начиняем Component One True DB Grid:<br /> With ThisForm.TDBGrid1<br /> 	.DataSource = oRecordSet<br /> 	.ExtendRightColumn = .T.<br /> 	.ReBind<br /> 	.Columns(0).Caption = "Тип ГТД"<br /> 	.Columns(0).Width = 117  && 78<br /> 	.Columns(1).Caption = "ГТД"<br /> 	.Columns(1).Width = 215  && 143<br /> 	.Columns(2).Visible = .F.  && Номер товара<br /> 	.Columns(3).Caption = "Код товара"<br /> 	.Columns(3).Width = 100  && 68<br /> 	.Columns(4).Caption = "Вес нетто"<br /> 	.Columns(4).Width = 95  && 63<br /> 	.Columns(5).Caption = "Статистич. стоимость"<br /> 	.Columns(5).Width = 110  && 78<br /> 	.Columns(6).Caption = "Наименование товара"<br /> 	.Columns(7).Caption = "Отправитель / Получатель"<br /> 	.Columns(8).Visible = .F.  && ГТД<br /> 	.Columns(9).Caption = "№ товара в ГТД"<br /> 	.Columns(10).Caption = "Код документа"<br /> 	.Columns(11).Caption = "№ документа"<br /> 	.Columns(12).Caption = "Дата выдачи документа"<br /> EndWith</p>
<p> With ThisForm<br /> 	* Начиняем Microsoft Hierarchical FlexGrid (для сравнения!):<br /> 	* Можно реализовать более красивую начинку по желанию (поэлементо)<br /> 	.MSHFlexGrid.DataSource = oRecordSet</p>
<p> 	.Width = 553<br /> 	.Resize()<br /> 	.Visible=.t.<br /> EndWith</p>
<p> * Отмеченные недостатки MSHFlexGrid, по сравнению с True DB Grid:<br /> * - отсутствие поддержки работы с прокруткой колесиком мыши;<br /> * - отсутствие встроенного механизма поддержки печати;<br /> * - если не "замораживать" левый столбец, то вызов вручную методов Expand<br /> *   и Collapse (щелчки на "+" и "-" в строках грида) доступен только в<br /> *   первом столбце грида и, как следствие, недоступен при прокрутке вправо.<br /> * - Символы "+" и "-" для разворачивания "иерархии" маленького размера<br /> * В остальном эти два грида практически идентичны. Выбор за вами...</div>
<div id="sol_avtor">Автор: Кольцов Роман Васильевич</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4767">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4767">rvc44</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="rvc44" href="https://foxclub.ru/account/?user=4767">
				<img alt='' src='https://secure.gravatar.com/avatar/e89cde72d5f4d3df33e6d628fb2c4289?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e89cde72d5f4d3df33e6d628fb2c4289?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 06-12-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/primer-ispolzovaniya-ierarhicheskih-vozmozhnostej-mshflexgrid-i-true-db-grid/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/nestandartnyj-progressbar/</link>
					<title><![CDATA[Нестандартный прогрессбар]]></title>
                    					    <author><![CDATA[Aries]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:25 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Нестандартный прогрессбар</h1>
													</header>
													<div id="sol_opis">Этот активИкс нужен только для нестандартных подходов, я имею ввиду, когда в обычный прогресс бар нельзя загнать промежуточные данные, а пользователю надо показать что машина двигается.</div>
<div id="sol_body">
<h3>Нестандартный прогрессбар</h3>
<p> Однажды, мне надо было, в программе, написать довольно большую<br /> выборку данных, порядка 6 селектов, идущих один за другим,<br /> далее сканирование по нескольким таблицам и снова парочка селектов.<br /> Это все дело затягивалось на минут эдак от 5-8. Возник вопрос,<br /> как показать пользователю, что машина работает, а не висит.<br /> Команды SET TALK ON и прочее не подходило, так как мне нужен был<br /> общий прогресс бар, показывающий начало работы и конец,<br /> а стандартный прогресс бар не подходил, так как я не мог вычислить<br /> время начала и время конца операции. Да и вообще получить какие ни будь промежуточные данные. <br /> Я попытался решить проблему разными путями, но дело в том,<br /> что Фокс работает в одном потоке, и при выборке, индексации,<br /> он просто забирает все на себя. При этом все остальные процессы замирают,<br /> ждут, когда закончится основной процесс.<br /> Что бы это обойти я создал новый проект. В котором создал класс формы,<br /> в свойствах которого выставил OLE Public. Скомпилировал в EXE файл, <br /> в DDL-ку нельзя иначе он будет работать в том же потоке что и основная программа,<br /> а значит, просто умрет.</p>
<p> Теперь как это все работает<br /> Перво-наперво надо зарегистрировать активИкс.<br /> Для этого надо дать такую команду:<br />   Progressbar.exe /regserver <br /> И все!<br /> Теперь как это дело запустить:<br /> Допустим, есть форма в ней есть пропети oWin<br /> THISFORM.oWin=CreateObject("MyProgres.oCat") &&В данном случае будет ходить кот (тоже прикольно)<br /> *THISFORM.oWin=CreateObject("MyProgres.oPrg") &&в данном случае будет обычный прогресс бар<br /> THISFORM.oWin.Start("Идет формирование...")<br /> ***<br /> здесь могут идти ваши выборки, циклы итд<br /> ***<br /> THISFORM.oWin.Stop("Формирование окончено!")</p>
<p> Этот активИкс нужен только для нестандартных подходов, я имею ввиду,<br /> когда в обычный прогресс бар нельзя загнать промежуточные данные,<br /> а пользователю надо показать что машина двигается.<br /> В проекте есть форма Form1, запустите ее и нажмите кнопку операции,<br /> увидите, как это все работает. Только не забудьте, все таки перво-наперво<br /> зарегистрировать активИкс, как описано выше.</p>
<p> Замечу что этот прогресс бар нужен только для нестандартного<br /> показателя выполнения, в остальных случаях рекомендуется<br /> пользоваться стандартными способоми.</p>
<p> Это дело написано на 8 Фоксе. Работает на 6-ке и 8-ке.<br /> (перекомпилировать под 8-ку не надо)      </div>
<div id="sol_avtor">Автор: Aries</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4794">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4794">Aries</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Aries" href="https://foxclub.ru/account/?user=4794">
				<img alt='' src='https://secure.gravatar.com/avatar/41cb07f73054c6ace4bc67d9d56f5947?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/41cb07f73054c6ace4bc67d9d56f5947?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-12-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/nestandartnyj-progressbar/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/sozdanie-arhiva-proekta/</link>
					<title><![CDATA[Создание архива проекта]]></title>
                    					    <author><![CDATA[Foxtrot]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Создание архива проекта</h1>
													</header>
													<div id="sol_opis">Резервное копирование никто не отменял, а по сему данное решение.</div>
<div id="sol_body">Программа принимает название файла Вашего проекта или придется выбрать|не выбрать ручками и согласно его списка формирует BAT-файл, после чего запускает. В данном примере используется архиватор RAR и путь к нему прописан в системе, хотя мона использовать любой другой и указать к нему конкретный путь.</div>
<div id="sol_avtor">Автор: Джумадылов Канат</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4782">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4782">Foxtrot</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Foxtrot" href="https://foxclub.ru/account/?user=4782">
				<img alt='' src='https://secure.gravatar.com/avatar/14af643bd13aa7e300bf3487d9a2cdc5?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/14af643bd13aa7e300bf3487d9a2cdc5?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-04-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/sozdanie-arhiva-proekta/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/resizer/</link>
					<title><![CDATA[resizer]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:32 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>resizer</h1>
													</header>
													<div id="sol_opis">данный класс позволяет менять любые свойства (типа нумерик) объектов, лежащих на форме, при изменении размеров формы. для настройки используется специальная форма</div>
<div id="sol_body">данный класс позволяет менять любые свойства (типа нумерик) объектов, лежащих на форме, при изменении размеров формы. для настройки используется специальная форма<br /> писалось на шестерке, но думаю быдет и в других версиях.<br /> есть пример использования и описание работы в файле readme.txt																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/proczedura-proverki-nalichiya-include-fajla-u-scx-vcx-proekta/</link>
					<title><![CDATA[Процедура проверки наличия include-файла у SCX/VCX проекта]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Процедура проверки наличия include-файла у SCX/VCX проекта</h1>
													</header>
													<div id="sol_opis">Сканирует активный проект на предмет наличия у форм/классов *.h файла определений и выводит отчет.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: H.I.A.</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/proczedura-proverki-nalichiya-include-fajla-u-scx-vcx-proekta/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/vfp-i-lotus-notes/</link>
					<title><![CDATA[VFP и Lotus Notes]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>VFP и Lotus Notes</h1>
													</header>
													<div id="sol_opis">Работа из VFP c Lotus Notes: чтение почтовых сообщений, извлечение вложений, удаление обработанных сообщений, отправка почтовых сообщений с вложениями.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Георгий</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/vfp-i-lotus-notes/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-pozvolyaet-peretaskivat-myshkoj-lyubye-obekty/</link>
					<title><![CDATA[класс позволяет перетаскивать мышкой любые объекты]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>класс позволяет перетаскивать мышкой любые объекты</h1>
													</header>
													<div id="sol_opis">данный класс позволяет перетаскивать мышкой любые объекты. есть примеры работы с классом.</div>
<div id="sol_body">также есть примеры по созданию классов scroll и splite баров с его использованием.<br /> писался под vfp6.0 sp5, но при написании использовались только стандартные возможности, так что думаю будет работать и в других версиях vfp.</div>
<div id="sol_avtor">Автор: Виктор</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-pozvolyaet-peretaskivat-myshkoj-lyubye-obekty/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ispolzovanie-odbc-api/</link>
					<title><![CDATA[Использование ODBC-API]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Использование ODBC-API</h1>
													</header>
													<div id="sol_opis">Монитор - ODBC</div>
<div id="sol_body">Как это получилось...<br /> Возникла проблема: автоматизировать описание DSN-источников данных,<br /> для неплохо продвинутых пользователей (а такие появляютя все чаще и чаще)<br /> ...дальше...больше - попробовал сделать "а-ля" Monitor-ODBC</p>
<p> 1) используются функции ODBC-API (odbc32.dll, dbccp32.dll)<br /> 2) все остальное...- как угодно для разработчика VFP<br /> 3) сделано под версией: VFP9.SP1<br /> 4) будут-ли вопросы...</p>
<p> *--------------------------------------------------------------<br /> источник информации:<br /> Microsoft Data Access SDK Version 2.8<br /> http://www.microsoft.com/msdownload/platformsdk/setuplauncher.asp</p>
<p> *--------------------------------------------------------------<br /> Best Regards, ShmSoft, 03.2006, shmsoft@mail.ru</div>
<div id="sol_avtor">Автор: Андрей Шморин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ispolzovanie-odbc-api/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/prilipayushhee-okno/</link>
					<title><![CDATA[&#8220;Прилипающее&#8221; окно]]></title>
                    					    <author><![CDATA[piva]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>&#8220;Прилипающее&#8221; окно</h1>
													</header>
													<div id="sol_opis">Следствие темы "Прилипающее" окно на форуме. Это больше пример чем решение.</div>
<div id="sol_body">При нажатии кнопки мыша - выичлсяется видимася часть рабочего стола с учетом размера и положения TaskBar потом при таскании окна оно "прилипает" к границам рабочего стола по типу WinAMP</div>
<div id="sol_avtor">Автор: Пирожков Вадим</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4821">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4821">piva</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="piva" href="https://foxclub.ru/account/?user=4821">
				<img alt='' src='https://secure.gravatar.com/avatar/0a76ea08e616d2f8a939412913fbb096?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/0a76ea08e616d2f8a939412913fbb096?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-03-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/prilipayushhee-okno/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/prelbrazovanie-chisla-denezhnoj-summy-v-tekstovuyu-stroku/</link>
					<title><![CDATA[Прелбразование числа денежной суммы в текстовую строку]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Прелбразование числа денежной суммы в текстовую строку</h1>
													</header>
													<div id="sol_opis">Преобразует число , например  3207004.59 в текстовую строку вида "три миллиона двести семь тысяч четыре гри. 59 коп." ... На авторство не претендую, основу взял из книжки по ФОКСу и довёл до реально-работающей версии...</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Евгений</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/prelbrazovanie-chisla-denezhnoj-summy-v-tekstovuyu-stroku/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/makropodstanovka/</link>
					<title><![CDATA[Макроподстановка]]></title>
                    					    <author><![CDATA[Владимир Максимов]]></author>
                    										    <pubDate>Sat, 14 Jan 2023 18:13:38 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Макроподстановка</h1>
													</header>
													<p><a href="#title"><u>Макроподстановка</u></a><br />
<a href="#parameter"><u>Формирование параметра команды в случае, если синтаксис FoxPro не предполагает его наличия</u></a><br />
<a href="#ifendif"><u>Использование условных операторов</u></a><br />
<a href="#ifendif"><u>Ветвление кода</u></a><br />
<a href="#namedexp"><u>Выражение имени. Скобки</u></a><br />
<a href="#namecreate"><u>Формирование имени объекта</u></a><br />
<a href="#getpem"><u>Функция GetPem()</u></a><br />
<a href="#collection"><u>Коллекции объектов</u></a><br />
<a href="#setall"><u>Метод SetAll()</u></a><br />
<a href="#createvalue"><u>Формирование значения или выражения для его вычисления</u></a><br />
<a href="#createstring"><u>Формирование символьных строк</u></a><br />
<a href="#addsubstr"><u>Сложение и вычитание символьных строк</u></a><br />
<a href="#textmerge"><u>Функция TextMerge()</u></a><br />
<a href="#textendtext"><u>Текстовые скобки Text…EndText</u></a><br />
<a href="#evaluate"><u>Функция Evaluate()</u></a><br />
<a href="#createcmd"><u>Формирование команды</u></a><br />
<a href="#usedmacro"><u>Использование макроподстановки</u></a><br />
<a href="#features"><u>Особенности использования макроподстановки</u></a><br />
<a href="#reset"><u>Восстановление исходных настроек среды</u></a><br />
<a href="#setfilter"><u>Настройка SET FILTER</u></a><br />
<a href="#selectsql"><u>Формирование команды Select-SQL</u></a><br />
<a href="#others"><u>Другие команды и функции, связанные с макроподстановкой</u></a><br />
<a href="#execscript"><u>Макроподстановка нескольких строк кода.<br />
Функция ExecScript()</u></a><br />
<a href="#vfp"><u>Методы системного объекта _VFP</u></a><br />
<a href="#vfpeval"><u>Метод _VFP.Eval()</u></a><br />
<a href="#vfpdocmd"><u>Метод _VFP.DoCmd()</u></a><br />
<a href="#vfpsetvar"><u>Метод _VFP.SetVar()</u></a></p>
<blockquote>
<p>Макроподстановка – это одна из тех вещей, которые достаточно просто понять на практике, но довольно сложно дать определение «словами».</p>
</blockquote>
<p>Типичные примеры использования макроподстановки выглядят примерно так</p>
<div class="bbcode">
<pre class="bbcode">  * Макроподстановка в SQL-запросах  
  Local lcFieldList, lcWhere  
  lcFieldList = 'Field1, Field2, Field3'  
  lcWhere = 'FieldId = 1'  
  select &amp;lcFieldList from MyTab where &amp;lcWhere  
    
 * Макроподстановка в выражениях  
  Local lcCommand  
  lcCommand = 'lnVar = 1+2'  
  &amp;lcCommand  
  ?' lnVar = ', lnVar  
</pre>
</div>
<pre class="bbcode">  
 * Макроподстановка в SQL-запросах  
  Local lcFieldList, lcWhere  
  lcFieldList = 'Field1, Field2, Field3'  
  lcWhere = 'FieldId = 1'  
  select &amp;lcFieldList from MyTab where &amp;lcWhere  
    
 * Макроподстановка в выражениях  
  Local lcCommand  
  lcCommand = 'lnVar = 1+2'  
  &amp;lcCommand  
  ?' lnVar = ', lnVar</pre>
<p>С точки зрения FoxPro в процессе выполнения данных примеров код примет вид</p>
<pre class="bbcode">  
 * Макроподстановка в SQL-запросах  
  select Field1, Field2, Field3 from MyTab where FieldId = 1  
    
 * Макроподстановка в выражениях  
  lnVar = 1+2  
  ?' lnVar = ', lnVar</pre>
<p style="text-align: justify;">Т.е. в процессе выполнения произойдет замена ссылки (переменной) на собственно значение. Понятно, что значение переменной может формироваться динамически, в зависимости от ряда условий или диалога с пользователем. Причем формироваться не на этапе компиляции программы, а непосредственно в процессе исполнения. Тогда определение макроподстановки можно выразить примерно такими словами</p>
<div>
<h3><strong>Определение</strong></h3>
</div>
<blockquote class="bbcode">
<div><b>Макроподстановка – это средство исполнения кода, окончательный синтаксис которого формируется в процессе его исполнения.</b></div>
</blockquote>
<p>Другими словами, на этапе написания кода заранее неизвестно, какой именно код будет исполняться. Это уточняется в процессе исполнения. За это свойство макроподстановки его очень любят новички, поскольку они всегда склонны писать некие «универсальные» (на все случаи жизни) алгоритмы. Однако опытные программисты относятся к макроподстановкам более сдержано. Как правило, по следующему принципу</p>
<div>
<h3><strong>Применение</strong></h3>
</div>
<blockquote class="bbcode">
<div><b>Если существует альтернатива использованию макроподстановки без серьезного ущерба коду (по скорости, «читабельности», объему и т.п.), то лучше использовать эту альтернативу. По возможности, макроподстановку лучше не использовать. </b></div>
</blockquote>
<p style="text-align: justify;">Почему, собственно? Пожалуй, здесь подойдет такая аналогия. Представьте себе, что Вы решили купить какую-нибудь «мелочевку», ну, там, салфетки или карандаш. В общем, то, что стоит «копейки». Будете ли Вы расплачиваться крупной купюрой в несколько тысяч? Ну, можно, конечно, только Вы рискуете получить на сдачу мешок железной мелочи, который еще непонятно куда девать. А если все-таки решите пересчитать всю эту мелочь, может оказаться, что Вас обсчитали. Не обязательно по злому умыслу, просто попробуйте точно пересчитать такую гору мелочи.</p>
<p style="text-align: justify;">Т.е. макроподстановка, зачастую, это «слишком много». Инструмент, не адекватный поставленной задаче. Нет, она, конечно, задачу решает, но затрачивает на ее решение избыточное количество ресурсов, при этом повышая риск возникновения ошибки. Опытный программист, по возможности, старается платить за «покупку» ровно столько, сколько она стоит, чтобы не ждать сдачи и не заниматься ее пересчетом. Т.е. использовать инструмент, который специально создан для решения конкретной задачи.</p>
<p style="text-align: justify;">Данная статья как раз и посвящена тому, какие есть альтернативы макроподстановке, а также что и в каких случаях лучше использовать.</p>
<p style="text-align: justify;">Для новичков проблемой является тот факт, что макроподстановка – это универсальный инструмент, ну, как «газовый (разводной) ключ». А ее альтернативы – это довольно большой набор «комплекта ключей». Т.е. альтернативны макроподстановке – это узкоспециализированные инструменты, приспособленные для решения довольно ограниченного круга задач. Новичку проще таскать с собой (изучить) один инструмент, чем несколько.</p>
<p style="text-align: justify;">Следует отдавать себе отчет в том, что хотя, как правило, при помощи макроподстановки делается вставка некоего фрагмента команды, но, с точки зрения FoxPro, формируется вся команда целиком. По вполне понятной причине. Заранее просто невозможно сказать, какие именно опции (части) формируемой команды включены в макроподстановку. С другой стороны, альтернативы макроподстановки как раз интерпретируются FoxPro именно как части команд. Некие «параметры».</p>
<p style="text-align: justify;">Чтобы как-то структурировать все дальнейшие объяснения, стоит выделить наиболее типичные случаи использования макроподстановки</p>
<p>Как правило, макроподстановки используют в следующих случаях</p>
<ol>
<li>Формирование параметра команды в случае, если синтаксис FoxPro не предполагает его наличия</li>
<li>Формирование имени объекта</li>
<li>Формирование значения или выражения для его вычисления</li>
<li>Формирование команды</li>
</ol>
<p>Вот и посмотрим, какие есть альтернативы при решении данных задач <a name="parameter"></a></p>
<h2>Формирование параметра команды в случае, если синтаксис FoxPro не предполагает его наличия</h2>
<p>В синтаксисе FoxPro многие команды не предполагают наличие параметра, хотя это часто необходимо. Типичные случаи - это все команды SET, все команды работы с файлами (USE, MODIFY, COPY, APPEND и т.п.) и ряд других случаев. В зависимости от того, о какой команде и каком «параметре» идет речь, существуют различные альтернативы макроподстановке. <a name="ifendif"></a></p>
<h2>Использование условных операторов. Ветвление кода</h2>
<p>Довольно часто в программном коде возникает необходимость установки или восстановления некоторых глобальных настроек в заранее заданное значение. Однако большинство команд настроек не предусматривают указания параметра. Там просто ставится конкретное значение. Например, ON или OFF. Как же поступить, если надо задать конкретное, заранее известное значение? Команды SET в подавляющем большинстве случаев имеют всего два возможных значения. Как правило, это значения ON или OFF. Поэтому вместо макроподстановки можно использовать оператор IF. Примерно так</p>
<pre class="bbcode">  
  lcNeedValue = 'OFF'	&amp;&amp; Значение, которое должна иметь настройка  
 * Сравниваем текущее значение настройки с тем, которое необходимо  
  IF SET('DELETED') &lt;&gt; lcNeedValue  
  	SET DELETED OFF  
  ENDIF</pre>
<p>Как видите, все просто. Если текущее значение настройки отлично от того, которое нужно, то просто делаете эту настройку без макроподстановки. <a name="namedexp"></a></p>
<h2>Выражение имени. Скобки</h2>
<p>Во многих случаях требуется сформировать имя чего-либо в качестве «параметра», когда команда FoxPro не предусматривает наличия параметра. Типичные случаи подобных ситуаций – это команды USE, COPY TO, REPLACE. Для данных ситуаций существует, так называемое, «выражение имени». Это обычные круглые скобки. Их использование выглядит следующим образом</p>
<pre class="bbcode">  
 * <b>Имя файла</b>  
  lcFileName = getFile()  
  USE (m.lcFileName) IN 0  
  lcFileSave = putFile()  
  COPY TO (m.lcFileSave)  
    
 * <b>Имя поля</b>  
  lcFieldName = 'MyField'  
  select MyTable  
  REPLACE (m.lcFieldName) WITH 2  
    
 * <b>Имя переменной</b>  
  lcVariableName = 'MyVariable'  
 * Команда не может начинаться с круглой скобки. Будет сообщение о синтаксической ошибке  
 * (m. lcVariableName) = 1  
 * Однако можно использовать команду STORE  
  STORE 1 TO (m. lcVariableName)</pre>
<p>Выражение имени (круглые скобки) можно рассматривать как некий усеченный вариант макроподстановки, но такой, который в результате своей работы формирует имя чего-либо. Отсюда и название «выражение имени». Т.е. выражение, формирующее имя. Чем выражение имени лучше «обычной» макроподстановки? Основное преимущество – <b>это более высокая определенность кода.</b> Во-первых, очевидно, что за выражением имени «скрывается» одно значение. Один «параметр» команды. При использовании макроподстановки – это далеко не очевидно. Ведь макроподстановка может включать в себя еще набор каких-либо дополнительных опций команды. Для выражения имени это просто исключено. Во-вторых, очевидно, что за выражением имени «скрывается» именно имя чего-либо, а не какая-либо опция команды. Что, опять же, не очевидно для макроподстановки. Есть еще некоторые дополнительные преимущества использования выражения имени. Но это уже из разряда приятных дополнений.</p>
<ol>
<li>Нечувствительность к пробелам в имени</li>
<li>Несколько более высокая скорость работы</li>
</ol>
<p>Подробнее про пробелы в именах можно почитать здесь <a href="http://forum.foxclub.ru/read.php?32,177182,186122#msg-186122" target="_blank" rel="nofollow noopener noreferrer"><u>Как работать с путями доступа и именами файлов, содержащих пробелы</u></a> Однако следует понимать, что выражение имени можно использовать только в том случае, если формируемый «параметр» состоит только и исключительно из имени. Например,</p>
<pre class="bbcode">LOCATE FOR MyField = 1</pre>
<p>Здесь «параметром» является выражение «MyField=1», но никак не имя. Поэтому использовать здесь выражение имени просто невозможно. У данной команды нет «параметра» «имя», а применить выражение имени, к части «параметра» (только для имени поля) – невозможно. <a name="namecreate"></a></p>
<h2>Формирование имени объекта</h2>
<p>Зачастую, возникает необходимость сформировать имя объекта, но не для какой-либо команды, а для получения доступа к свойствам и методам нужного объекта. Другими словами, получить ссылку на объект, имя которого будет сформировано динамически. Как правило, речь идет о каких-либо объектах на форме. Например, об определенном столбце Grid или определенном объекте TextBox. <a name="getpem"></a></p>
<h3>Функция GetPem()</h3>
<p>Данная функция идеальный вариант замены макроподстановки в случае, если Вам надо получить ссылку на какой-либо конкретный (одиночный) объект по его имени.</p>
<pre class="bbcode">  
 * <b>Ссылка на объект TextBox лежащий на форме</b>  
  lcObjectName = 'TextBox' + '1'  
  loObject = GetPem(ThisForm, m.lcObjectName)  
  ?loObject.ReadOnly  
    
 * <b>Ссылка на объект Column, лежащий в Grid1</b>  
  lcObjectName = 'Column' + '1'  
  loObject = GetPem(ThisForm.Grid1, m.lcObjectName)  
  ?loObject.ReadOnly</pre>
<p>Однако в случае перебора многих объектов это не очень-то удобно. Но для этого случая есть другие варианты <a name="collection"></a></p>
<h3>Коллекции объектов</h3>
<p>Дело в том, что каждый объект-контейнер FoxPro содержит в себе две специальные коллекции вложенных объектов. В обязательном порядке будет существовать коллекция с именем «Objects» и еще одна коллекция, имя которой будет зависеть от типа объекта-контейнера:</p>
<ul>
<li>Controls (Form, Control, Container, Page, Column)</li>
<li>Columns (Grid)</li>
<li>Pages (PageFrame),</li>
<li>Buttons (CommandGroup или OptionGroup)Как следствие, можно организовать перебор объектов в коллекции. Либо просто по номерам, используя цикл FOR…ENDFOR, либо циклом FOR EACH. Например, перебрать все объекты Column в Grid можно следующими способами
<pre class="bbcode">  
 * <b>Перебор по физическому номеру столбца в коллекции</b>  
  FOR m.lnI = 1 TO ThisForm.Grid1.ColumnCount  
  	loColumn = ThisForm.Grid1.Columns[m.lnI]  
  	?m.lnI, ' Name= ', loColumn.Name  
  ENDFOR  
    
 * <b>Перебор всех объектов определенного типа</b>  
  FOR EACH loColumn IN ThisForm.Grid1.Columns  
  	?'Name= ', loColumn.Name  
  ENDFOR</pre>
<blockquote class="bbcode">
<div><strong>Замечание</strong> Следует иметь в виду, что порядковый номер столбца в коллекции столбцов Grid, в общем случае, не имеет никакого отношения к имени столбца. Т.е. тот факт, что по умолчанию столбец с номером 1 имеет имя 'Column1', вовсе не означает, что после определенных модификаций с Grid тот же самый столбец сохранит тот же самый порядковый номер. Аналогичное замечание относится и ко всем другим однотипным элементам специализированных контейнеров. Page в контейнере PageFrame или Buttons в CommandGroup.</div>
</blockquote>
<p><a name="setall"></a></p>
<h3>Метод SetAll()</h3>
<p>Довольно часто совсем не нужно знать конкретное имя объекта. Нужно просто установить значение определенного свойства для всех объектов нужного типа в объекте-контейнере. Ну, например, установить для всех объектов TextBox на форме значение ReadOnly=.F. можно следующим способом</p>
<pre class="bbcode">ThisForm.SetAll('ReadOnly', .F., 'TextBox')</pre>
<p>Установить для всех объектов Column в Grid свойство DynamicBackColor таким образом, чтобы цвет фона записей чередовался с белого на зеленый</p>
<pre class="bbcode">ThisForm.Grid1.SetAll("DynamicBackColor", "IIF(MOD(RECNO( ), 2)=0, RGB(255,255,255), RGB(0,255,0))", "Column")</pre>
<p>Метод SetAll позволяет просто отказаться от ручного перебора объектов и, как следствие, от необходимости указания имен конкретных объектов. Хотя, конечно, если надо установить значение свойства по принципу «все, кроме», то без перебора все-равно не обойтись. Впрочем, если эти самые «кроме» созданы на базе другого класса, то можно и без перебора. Но это уже детали реализации. <a name="createvalue"></a></p>
<h2>Формирование значения или выражения для его вычисления</h2>
<p>Наиболее типичный пример данной задачи – это формирования символьной строки с неким сообщением. Как правило, текст этого сообщения формируется из фрагментов, которые могут находиться в разных полях и переменных. Впрочем, бывает необходимо формировать не только текстовые строки. <a name="createstring"></a></p>
<h3>Формирование символьных строк</h3>
<p>С этой задачей сталкивались практически все. Существует довольно большое количество вариантов ее решения. Строго говоря, как правило, никому в голову не приходит формировать текстовую строку через макроподстановку, просто потому, что есть очевидные и более простые способы. Однако макроподстановка просто невозможна без предварительного формирования символьной строки. Именно поэтому способам формирования символьных строк в данной статье посвящено относительно много места. Как некоему предварительному этапу макроподстановки или ее аналогов. <a name="addsubstr"></a></p>
<h4>Сложение и вычитание символьных строк</h4>
<p>Символьные строки в FoxPro можно складывать и вычитать.</p>
<pre class="bbcode">lcString = 'Начало строки ' + ' окончание строки'</pre>
<p>Результат этой операции будет простое «сложение» или конкатенация символьных строк. Т.е. к концу первой строки будет добавлена вторая строка «как есть». В результате получим</p>
<pre>lcString = 'Начало строки  окончание строки'</pre>
<p>Символьные строки можно еще и «вычитать»</p>
<pre>lcString = 'Начало строки ' - ' окончание строки'</pre>
<p>Результат этой операции будет «сложение» или конкатенация символьных строк, однако все концевые пробелы каждого «слагаемого» будут перенесены в конец итоговой строки. Т.е. в результате получим</p>
<pre class="bbcode">lcString = 'Начало строки окончание строки '</pre>
<p>Операцией вычитания редко пользуются, поскольку большинство складываемых строк обычно не имеют ведущих пробелов. Как следствие, при выполнении операции вычитания символьных строк начало второй части просто сольется с окончанием первой. Между ними не окажется пробела. Естественно, в качестве слагаемого можно использовать не только символьные константы, но и поля таблиц. Единственное ограничение заключается в том, что значение поля должно быть преобразовано в символьный тип данных. В большинстве случаев с этим с успехом справляется функция TransForm()</p>
<pre class="bbcode">lcString = 'Значение поля Field1 = ' + TransForm(MyTable.Field1)</pre>
<p>Однако есть много других функций для преобразования в символьный тип данных: STR(), DTOC(), TTOC(), CAST() <a name="textmerge"></a></p>
<h4>Функция TextMerge()</h4>
<p>Явное преобразование содержимого поля в символьный тип данных, конечно, хорошо, но удобнее пользоваться для этой цели функцией TextMerge()</p>
<pre class="bbcode">lcString = TextMerge('Значение поля Field1 = &lt;&lt;MyTable.Field1&gt;&gt;')</pre>
<p>Т.е. здесь прямо внутри символьной строки в окружении специальных символов пишется имя поля и функция TextMegre() автоматически преобразовывает его содержимое в символьный тип данных, вставляя этот текст вместо имени поля <a name="textendtext"></a></p>
<h4>Текстовые скобки Text…EndText</h4>
<p>В случае если необходимо написать большой текст, занимающий несколько строк, то удобнее пользоваться текстовыми скобками Text…EndText. Все, что находится внутри них, воспринимается как обычный текст, а не программный код</p>
<pre class="bbcode">  
  TEXT TO lcText TEXTMERGE NOSHOW  
  Значение поля Field1 = &lt;&lt;MyTable.Field1&gt;&gt;  
  Значение поля Field2 = &lt;&lt;MyTable.Field2&gt;&gt;  
  Значение поля Field3 = &lt;&lt;MyTable.Field3&gt;&gt;  
  ENDTEXT  
    
 * Смотрим, что получилось  
  ?lcText</pre>
<p>Как видите, нет необходимости в дополнительных кавычках и как-либо формировать перенос строк. Вы пишите текст так, как будто вы его пишите в текстовом редакторе. Ну, а специальные «скобки» в сочетании с опцией TEXTMERGE позволяют вставлять в текст содержимое полей таблицы. <a name="evaluate"></a></p>
<h3>Функция Evaluate()</h3>
<p>Иногда надо не просто сформировать текстовую строку, но вычислить некое значение любого типа. В этом случае лучше использовать функцию Evaluate()</p>
<pre class="bbcode">  
  select MyTab  
  lcExpression = 'Field1+2'  
  ?Evaluate(m.lcExpression)  
  lcFieldName = 'Field1'  
  replace (lcFieldName) with Evaluate(m.lcExpression)</pre>
<p><a name="createcmd"></a></p>
<h2>Формирование команды</h2>
<p>В большинстве случаев, это как раз та ситуация, когда нет альтернативы использования макроподстановки. В простейшем случае, это выглядит так.</p>
<pre class="bbcode">  
  lcComand = 'lnVar = 1 + 2'  
  &amp;lcComand  
  ?'Значение переменной lnVar=', lnVar</pre>
<p>Однако в данном случае следует серьезно подумать о необходимости использования подобной макроподстановки. Слишком уж «не прозрачным» становится код. Совершенно не понятно, что скрывается за макроподстановкой. Может быть, имеет смысл разбить макроподстановку на две части?</p>
<pre class="bbcode">  
  lcVarName = 'lnVar'  
  lcExpression = '1+2'  
  STORE Evaluate(lcExpression) TO (lcVarName)  
  ?'Значение переменной lnVar=', lnVar</pre>
<p>На практике, разумеется, в качестве команды выступают боле сложные команды. Обычно это команды Select-SQL. Но об этом чуть ниже. <a name="usedmacro"></a></p>
<h2>Использование макроподстановки</h2>
<p>Несмотря на все приведенные ранее примеры, тем не менее, есть ситуации, когда без макроподстановки просто не обойтись. Не то, чтобы это было в принципе невозможно, просто решение без макроподстановки будет более громоздким. Ниже приведены наиболее типичные случаи, когда макроподстановка оправдана. Разумеется, приведенными примерами далеко не исчерпывается список случаев ее использования. Просто все прочие варианты использования относительно редки. <a name="features"></a></p>
<h3>Особенности использования макроподстановки</h3>
<p>Прежде чем описывать случаи использования макроподстановки следует остановиться на некоторых особенностях самой команды макроподстановки. Основной особенностью использования макроподстановки является тот факт, что первая точка после символа макроподстановки интерпретируется не как разделитель объектов, а как символ «сложения» того текста, который стоит «внутри» макроподстановки и текста, следующего за символом точки.</p>
<pre class="bbcode">  
  lcName = 'TextBox1'  
 * Следующая команда вызовет довольно странное сообщение об ошибке  
  ?ThisForm.&amp;lcName.ReadOnly</pre>
<p>Текст ошибки будет звучать примерно так: Объекта «TextBox1ReadOnly» не существует. Как видите, символ первой точки просто «прибавил» к содержимому макроподстановки все то, что следовало за ним. Как же определяется окончание того фрагмента, который должен быть «прибавлен» к содержимому макроподстановки? «Сложение» будет идти до тех пор, пока не встретится еще один символ точки или любой другой символ, означающий окончание опции (фрагмента) команды (пробел, равенство, запятая и т.п.). Как следствие, если необходимо избежать подобного «сложения», то просто ставят две точки подряд</p>
<pre class="bbcode">  
 * Следующая команда имеет 2 точки подряд после символа макроподстановки  
  ?ThisForm.&amp;lcName..ReadOnly</pre>
<p>При таком синтаксисе, к содержимому макроподстановки «прибавляется» пустая строка, поскольку после первой точки и до второй – ничего нет. А вторая точка уже служит обычным разделителем имен объектов. <a name="reset"></a></p>
<h3>Восстановление исходных настроек среды</h3>
<p>Правилом хорошего тона считается восстановление исходных настроек среды, после того, как с ней закончили работать. Разумеется, дело тут не просто в хороших манерах, а в том, чтобы вернувшись, например, в родительскую форму после работы в дочерней форме не получить ряд проблем из-за изменившихся в дочерней форме настроек среды окружения. Как уже было показано ранее, очень многие настройки среды могут принимать только одно из двух значений и их можно восстановить без макроподстановки простым ветвлением кода. Однако далеко не все. Например, настройку ON ERROR</p>
<pre class="bbcode">  
  lcOldError = ON('Error')  
  ON ERROR DO MyProg   
 * Дальнейшая работа со средой  
 * Восстановление исходных настроек после завершения работы  
  ON ERROR &amp;lcOldError</pre>
<p>Здесь просто нет вариантов, поскольку «параметром» для настройки ON ERROR выступает никак не «имя» и не «выражение». В данном случае «параметром» является команда. А для команды нет альтернативы. Аналогичное правило действует и в отношении любых других настроек, если «параметр» настройки нельзя свести к ограниченному набору значений, имени чего-либо или выражению. Нет, разумеется, и здесь есть варианты решения без макроподстановки, но довольно громоздкие. Например, как можно было бы решить вопрос с ON ERROR? Да очень просто. Сделать процедуру, которая бы по содержимому переменной lcOldError выполняла бы соответствующую настройку. Ну, примерно так</p>
<pre class="bbcode">  
  DO CASE  
  CASE lcOldError = 'DO MyProg'  
  	ON ERROR DO MyProg  
  CASE lcOldError = …  
  ENDCASE</pre>
<p>Но, Вы представляете себе эту «простыню»? Т.е. сколько строк кода должно быть в подобной процедуре? Это не говоря о том, что процедура ON ERROR может быть контекстно-зависимой, т.е. привязанной к какому-либо объекту, ссылку на который тоже придется передавать в эту процедуру. В общем, мороки много, а толку мало. Макроподстановка в данном случае предпочтительнее во всех смыслах. <a name="setfilter"></a></p>
<h3>Настройка SET FILTER</h3>
<p>Вообще-то, настройка SET FILTER не обладает достаточной гибкостью. Как следствие, годится только для довольно простых случаев фильтрации, когда надо «по-быстрому» решить очередную «хотелку» пользователя. Если данная задача впоследствии «обрастет» дополнительными требованиями, то, скорее всего от SET FILTER придется отказаться в пользу запросов. Просто SET FILTER не справится с возросшими требованиями. Тем не менее, в простых случаях SET FILTER может оказаться полезным. Как правило, фильтрация осуществляется на основании некоего значения, введенного в объект на форме. Поэтому условие фильтра обычно выглядит так</p>
<pre class="bbcode">  
  Select MyTab  
  SET FILTER TO MyField = ThisForm.TextBox1.Value</pre>
<p>И это работает. Более того, при изменении значения TextBox1 даже не надо ничего делать, фильтр изменится автоматически. Однако, тем не менее, подобные конструкции лучше не использовать. В чем здесь подвох? Дело в том, что настройка SET FILTER привязана к рабочей области, а вовсе не к форме. Это значит, что если Вы перейдете в другую форму и обратитесь к той же самой рабочей области, то получите сообщение об ошибке вроде «Объект TextBox1 не существует». Действительно не существует. Ведь Вы же перешли в другую форму. В ту, где подобного объекта нет. Но фильтр-то об этом не знает. Он упорно пытается обратиться по тому «адресу», который ему и указали. Разумеется, это можно обойти, создав глобальную переменную со ссылкой на форму. Но это тот случай, когда лекарство хуже болезни. После этого придется предпринимать ряд усилий по контролю над этой переменной и ее своевременным уничтожением. Значительно проще проблема решается при использовании макроподстановки следующим образом</p>
<pre class="bbcode">  
 * <b>Если значение числового типа</b>  
  lnValue = ThisForm.TextBox1.Value  
  SET FILTER TO MyField =&amp;lnValue  
    
 * <b>Если значение символьного типа</b>  
  lcValue = ['] + ThisForm.TextBox1.Value + [']  
  SET FILTER TO MyField =&amp;lcValue</pre>
<p>Другими словами, при помощи макроподстановки заменяем ссылку непосредственно значением, содержащимся в этой переменной. Как следствие, настройка SET FILTER оказывается не зависимой от контекста. Она больше не привязана к объектам формы. Правда, небольшим недостатком данной замены является необходимость повторного назначения фильтра при изменении значения в объекте на форме. Но это даже недостатком можно назвать условно. Смотря, с какой точки зрения на это смотреть. <a name="selectsql"></a></p>
<h3>Формирование команды Select-SQL</h3>
<p>Это один из наиболее часто встречающихся случаев использования макроподстановки. Выглядит примерно так</p>
<pre class="bbcode">  
  Local lcFieldList, lcWhere  
  lcFieldList = 'Field1, Field2, Field3'  
  lcWhere = 'FieldId = 1 and Field1 in (1,2,3)'  
  select &amp;lcFieldList from MyTab where &amp;lcWhere</pre>
<p>Здесь также, по сути, нет альтернативы использованию макроподстановки. Список полей, это, конечно же, список имен, однако выражение имени может быть использовано только для одного имени, а не для списка. Запрос, возвращающий одно поле – достаточно редко встречается. Да и при использовании выражения имени придется дополнительно указывать имя поля в результирующей выборке, иначе оно получит имя вроде «Expr_1», ведь было вычислено выражение. В условии отбора использовать Evaluate() тоже не получится. Почему? Ну, кратко это описать затруднительно. Тут несколько причин. В зависимости от того, какое именно выражение необходимо вычислить. Если Вы попытаетесь использовать Evaluate(), то, скорее всего, ошибки это не вызовет, но вот результат запроса окажется далек от ожидаемого. Если и совпадет, то разве что случайно. Здесь еще раз уместно упомянуть тот факт, что даже один символ макроподстановки с точки зрения FoxPro означает формирование команды целиком. Это значит, что будут задействованы все механизмы оптимизации SQL-запросов. Макроподстановка не отключает оптимизацию. Соответственно, можно формировать не части команды, а всю команду сразу</p>
<pre class="bbcode">  
  Local lcSelectSQL  
  lcSelectSQL = 'select Field1, Field2, Field3 from MyTab where FieldId = 1 and Field1 in (1,2,3)'  
  &amp;lcSelectSQL</pre>
<p>Подобный способ имеет как преимущества, так и недостатки. Преимуществом является тот факт, что в режиме отладки можно посмотреть на сформированную команду (содержимое символьной переменной lcSelectSQL) и понять в чем ошибка (если есть), просто запустив эту команду в командном окне. Недостатком же является отсутствие «наглядности». Совершенно непонятно, как именно сформирована строка макроподстановки. Из каких «слагаемых» она собрана. <a name="others"></a></p>
<h2>Другие команды и функции, связанные с макроподстановкой</h2>
<p>Кроме описанных ранее команд и функций следует упомянуть еще ряд команд и функций. Подробно их описывать нет смысла, поскольку документация по ним достаточно полная. <a name="execscript"></a></p>
<h3>Макроподстановка нескольких строк кода. Функция ExecScript()</h3>
<p>Одним из ограничений макроподстановки является тот факт, что при помощи нее можно выполнить только одну команду. Если Вам необходимо выполнить несколько команд, то Вы вынуждены будете последовательно выполнять по одной команде. Но как быть, например, с операторами цикла или условия? Ведь они состоят из двух команд? Ну, строго говоря, подобных макроподстановок лучше избегать. Это еще более сложная и не однозначная задача, чем «простая» макроподстановка. Тем не менее, в этих случаях поступают следующим образом. Формируется символьная строка, по сути, содержащая фрагмент файла PRG. Затем этот файл компилируется и выполняется. Сделать это можно буквально. Сохранив символьную строку как файл PRG при помощи функции StrToFile(), откомпилировав его командой Compile, и запустив на исполнение командой Do. После этого надо не забыть удалить временный файл с диска и выгрузить его из памяти. Однако то же самое можно проделать не явно, специальной функцией ExecScript(). Фактически, эта функция берет на себя работу этих трех команд. Формирует файл, компилирует его и выполняет. Также эта функция и убирает за собой. Поскольку, по сути, функция ExecScript() выполняет отдельную процедуру, то следует помнить об области видимости переменных, если Вы собираетесь использовать их внутри данной функции. Еще раз напомню, что для FoxPro данная функция еще более «тяжелая», чем обычная макроподстановка. Поэтому, если речь идет об одиночной команде, то, лучше все-таки использовать обычную макроподстановку. <a name="vfp"></a></p>
<h3>Методы системного объекта _VFP</h3>
<p>Существуют ситуации, когда необходимо выполнить макроподстановку, но не как команду, а как функцию. Наиболее часто в этом возникает необходимость внутри отчетов, где использование команд просто невозможно. Разумеется, это можно сделать, создав специальную функцию, в которую в виде параметра передавать строку. А внутри функции уже выполнить команду макроподстановки для данной строки. Но эту задачу можно решить при помощи специальных методов системного объекта _VFP <a name="vfpeval"></a></p>
<h4>Метод _VFP.Eval()</h4>
<p>Данный метод – это полный аналог функции Evaluate(). Т.е. результат их работы будет полностью идентичен.</p>
<pre class="bbcode">  
  lcExpression = '1+2*3'  
  ?_VFP.Eval(m.lcExpression)  
    
 * Тот же самый результат даст следующая команда  
  ?Evaluate(m.lcExpression)</pre>
<p><a name="vfpdocmd"></a></p>
<h4>Метод _VFP.DoCmd()</h4>
<p>Данный метод – это полный аналог макроподстановки для целой команды. Т.е. результат их работы будет полностью идентичен.</p>
<pre class="bbcode">  
  lcCommand = 'Wait window [Подождите…] timeout 10'  
  _VFP.DoCmd(m.lcCommand)  
 * Тот же самый результат даст следующая команда  
  &amp;lcCommand</pre>
<p><a name="vfpsetvar"></a></p>
<h4>Метод _VFP.SetVar()</h4>
<p>Данный метод это аналог присвоения значения переменной через макроподстановку. Причем макроподстановка используется для имени переменной.</p>
<pre class="bbcode">  
  lcVarName = 'lnMyVar'  
  _VFP.SetVar(m.lcVarName, 123)  
  ?lnMyVar  
    
 * Тот же самый результат даст следующая команда  
  Store 123 TO (m.lcVarName)  
  ?lnMyVar</pre>
</li>
</ul>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4899">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4899">Владимир Максимов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Владимир Максимов" href="https://foxclub.ru/account/?user=4899">
				<img alt='' src='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 65<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/makropodstanovka/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Статьи]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/2-ndfl-2005/</link>
					<title><![CDATA[2-НДФЛ 2005]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>2-НДФЛ 2005</h1>
													</header>
													<div id="sol_opis">Обработка выгрузки 2-НДФЛ 2005 и печать справок</div>
<div id="sol_body">Входные данные: Файл выгрузки со сведеними о доходах в формате, указанном в ПРИКАЗЕ ФНС РФ от 25.11.2005 N САЭ-3-04 616@ Об утверждении формы сведений о доходах физических лиц.<br /> Выходные данные: Таблицы .dbf с данными о налогоплательщиках.<br /> Для печати справок используется шаблон Excel 2NDFL2005.xlt с подключенным макросом ToOnePage()<br /> Данные примера взяты из приказа ФНС С ИСПРАВЛЕНИЯМИ - в приказе есть нарушения тэговой структуры</div>
<div id="sol_avtor">Автор: Денис В. Косаревский</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/2-ndfl-2005/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/registracziya-ocx-bez-ispolzovaniya-regsvr32/</link>
					<title><![CDATA[Регистрация OCX, без использования regsvr32]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Wed, 23 Nov 2022 06:57:42 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Регистрация OCX, без использования regsvr32</h1>
													</header>
													<div id="sol_opis"><em>Любой OCX/ActiveX control, или OLE сервер может быть зарегистрирован в системе за счет применения своих внутренних функций. Этот метод имеет ряд преимуществ: - Позволяет отслеживать результат регистрации класса в системе - Не требует никаких внешних программ Автора, к сожалению не помню, взято с Universal Thread</em></div>
<div id="sol_body">
<blockquote>
<p><strong>Note:</strong> Для корректного применения кода, вам необходимо в функциях перехватить error 1754 (Cannot find entry point "name" in the DLL.) Эта ошибка генерирутся в случае передачи в качестве параметра имени файла, не являющемся OCX/ActiveX control или OLE сервером.<br />
Функция: RegisterControl</p>
</blockquote>
<p>&nbsp;</p>
<pre class="bbcode">*-- Функция регистрации OCX/ActiveX контрола или OLE сервера  
    
  FUNCTION RegisterControl  
    
 *-- Параметр:  
 *      Имя файла, с указанием пути  
 *-- Функция возвращает:  
 *      Logical TRUE если регистрация прошла успешно,  в противном случае FALSE .  
 *      В случае отсутствия файла, функция вернет также FALSE .  
 *-- Пример вызова функции:  
 *      llRegistered = RegisterControl("c:\windows\systemcomctl32.ocx")  
    
  LPARAMETERS tcFileName  
  LOCAL llSuccess  
    
  IF FILE(tcFileName)  
    
     DECLARE INTEGER DllRegisterServer ;  
        IN (tcFileName) ;  
        AS __DllRegisterServer__  
    *-- This function returns 0 if successful  
     IF __DllRegisterServer__() = 0  
        llSuccess = .T.  
     ELSE  
        llSuccess = .F.  
     ENDIF  
  ELSE  
     llSuccess = .F.  
  ENDIF  
    
  RETURN llSuccess  
    
 **Обратная функция  
    
  FUNCTION UnregisterControl  
  LPARAMETERS tcFileName  
  LOCAL llSuccess  
    
  IF FILE(tcFileName)  
     DECLARE INTEGER DllUnregisterServer ;  
        IN (tcFileName) ;  
        AS __DllUnregisterServer__  
    *-- This function returns 0 if successful  
     IF __DllUnregisterServer__() = 0  
        llSuccess = .T.  
     ELSE  
        llSuccess = .F.  
     ENDIF  
  ELSE  
     llSuccess = .F.  
  ENDIF  
  RETURN llSuccess</pre>
</div>
<div id="sol_avtor"><em> взято с Universal Thread</em></div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/registracziya-ocx-bez-ispolzovaniya-regsvr32/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Система]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/strokovye-funkczii-transact-sql-vfp/</link>
					<title><![CDATA[Строковые функции Transact-SQL &#060;-&#062; VFP]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:30 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Строковые функции Transact-SQL &#060;-&#062; VFP</h1>
													</header>
													<div id="sol_opis">Строковые функции Transact-SQL MS SQL Server, Sybase ASA, PL DB2, Oracle PL/SQL GETWORDCOUNT, GETWORDNUM, AT, RAT, CHRTRAN, STRTRAN, STRFILTER, OCCURS, PADL, PADR, PADC,  PROPER, RCHARINDEX, ARABTOROMAN, ROMANTOARAB большинство из которых являются сходными по названию и функциональности с одноименными функциями FoxPro.</div>
<div id="sol_body">Дамы и Господа,</p>
<p> Я хотел бы вам предложить следующие строковые функции Transact-SQL<br /> AT()  Выполняет поиск позиции, с которой подстрока начинается в строке и возвращает номер  позиции<br /> RAT() Выполняет поиск позиции, с которой подстрока начинается в строке и возвращает номер  позиции, но в отличии от AT() осуществляет поиск справа<br /> OCCURS() Возвращает количество вхождений подстроки в строке (учитывает "перекрытия" подстрок)<br /> OCCURS2() Возвращает количество вхождений подстроки в строке (не учитывает "перекрытия" подстрок)<br /> PADL()  Возвращает в виде символьной строки, заданную первым аргументом строку, дополненную третьим аргументом до длины, заданной вторым аргументом, причем вставляет символы-заполнители слева <br /> PADR ()  Возвращает в виде символьной строки, заданную первым аргументом строку, дополненную третьим аргументом до длины, заданной вторым аргументом,  причем вставляет символы-заполнители справа <br /> PADC() Возвращает в виде символьной строки, заданную первым аргументом строку, дополненную третьим аргументом до длины, заданной вторым аргументом, причем вставляет символы-заполнители с обеих сторон <br /> CHRTRAN()   Выполняет перекодировку выражения, заданного в первой строке, используя вторую и третью строки в качестве таблицы перекодировки <br /> STRTRAN()   Возвращает строку символов, полученную из первой строки, в которой одно или несколько вхождений второй подстроки заменены третьей подстрокой(в отличии от встроенной функции replace, STRTRAN имеет три дополнительных параметра)<br /> STRFILTER() Удаляет все символы из первой строки, за исключением символов, содержащихся во второй строке  <br /> GETWORDCOUNT() Возвращает количество слов в строке<br /> GETWORDNUM()   Возвращает заданное слово в строке<br /> GETALLWORDS()  Помещает в таблицу все слова из строки<br /> PROPER() Возвращает строку, преобразуя в ней первую букву каждого слова в прописную, а остальные в строчные<br /> RCHARINDEX () Подобна встроенной функции Transact-SQL charindex, но осуществляет поиск справа<br /> ARABTOROMAN () Преобразует обычное  число в римское число (от 1 до 3999)<br /> ROMANTOARAB () Преобразует римское число в обычное число (от I до MMMCMXCIX)</p>
<p> Функции AT, PADL, PADR, CHRTRAN, PROPER аналогичны функциям Oracle PL/SQL INSTR, LPAD, RPAD, TRANSLATE, INITCAP</p>
<p> Более 8000 человек во всем мире уже загрузили данные функции, надеюсь, что они будут полезными и для Вас.</p>
<p> Есть версии для Sybase ASA, PL DB2, Oracle PL/SQL <br /> С целью получения более полной информации относительно вышеописанных функций (на английском языке), пожалуйста, зайдите на<br /> http://www.universalthread.com/wconnect/wc.dll?LevelExtreme~2,54,33,27115<br /> Пожалуйста, загрузите файл<br /> http://www.universalthread.com/wconnect/wc.dll?LevelExtreme~2,2,27115</p>
<p> Имеются версии для Sybase ASA и для DB2. Функции GETWORDCOUNT, GETWORDNUM, AT, RAT, OCCURS, CHRTRAN, STRTRAN, PADC, PADR, PADL, PROPER были и есть в VFP, функция STRFILTER есть в библиотеке Foxtools  VFP.<br /> Имена этих функций,  вызов функций (за исключением того, что в Transact-SQL Вы не можете опускать параметры по умолчанию, нужно обязательно указывать ключевое слово default при вызове UDF), результаты работы - совпадают с одноименными функциями VFP.<br /> Прилагаются тестовые программы для получения представления о скорости работы вышеупомянутых функций и сравнения их скорости работы со скоростью встроенных функций.</p>
<p> Имеются следующие особенности:<br /> 1)  в VFP функция OCCURS подсчитывает количество вхождений подстрок в строку, не учитывая перекрытия (overlaps), то есть поиск n+1 подстроки в строке начинается<br /> с элемента номер (начало n подстроки + длина подстроки).<br /> Пример: в VFP OCCURS('ABCA', 'ABCABCABCA') -- display 2<br /> -- 1 occurrence of substring 'ABCA .. BCABCA' <br /> -- 2 occurrence of substring 'ABCABC ..ABCA' </p>
<p> Моя функция OCCURS подсчитывает количество вхождений подстрок в строку, учитывая перекрытия (overlaps), то есть<br /> поиск n+1 подстроки в строке начинается<br /> с элемента номер (начало n подстроки + 1).<br /> Пример: select dbo.OCCURS('ABCA', 'ABCABCABCA') -- display 3<br /> -- 1 occurrence of substring 'ABCA .. BCABCA' <br /> -- 2 occurrence of substring 'ABC...ABCA...BCA' <br /> -- 3 occurrence of substring 'ABCABC...ABCA' </p>
<p> То есть в VFP имеется некоторое противоречие -<br /> At(cSearchExpression, cExpressionSearched, Occurs(cSearchExpression, cExpressionSearched) + 1) должно быть всегда равно нулю, но в VFP это не всегда так :<br /> Выполните, пожалуйста, следующую программу, которая показывает противоречие в работе функций VFP At и Occurs <br /> ________________________________________________________________</p>
<p> cSearchExpression = 'ABCA'<br /> cExpressionSearched = 'ABCABCABCA'</p>
<p> ?' количество вхождений подстроки ' +cSearchExpression +' в строку '+cExpressionSearched+' , полученное с помощью функции Occurs'<br /> lnIOccurs = Occurs(cSearchExpression , cExpressionSearched ) && display 2<br /> ? lnIOccurs<br /> ** первая подстрока<br /> lnSrt = At(cSearchExpression, cExpressionSearched, 1)<br /> lnI = 1<br /> ?' показывает все подстроки, полученные с помощью функции At'<br /> Do While .Not.Empty(lnSrt)<br /> ?' подстрока номер ', lnI, ' начинающаяся с позиции номер ', lnSrt<br /> ?Substr( cExpressionSearched, lnSrt, Len(cSearchExpression))<br /> ?' оставшаяся строка '<br /> ?Space(lnSrt)+Substr( cExpressionSearched, lnSrt)<br /> lnI = lnI + 1<br /> lnSrt = At(cSearchExpression, cExpressionSearched, lnI )<br /> Enddo<br /> lnI = lnI - 1<br /> ?'количество подстрок, полученное с помощью функции At', lnI<br /> ?' количество подстрок найденных с помощью функции At больше '<br /> ?'чем количество подстрок полученных с помощью функции Occurs'<br /> ? lnI, Iif(lnI > lnIOccurs , ' > ', Iif(lnI < lnIOccurs, ' < ',' = ')) , lnIOccurs<br /> ?' следующее выражение '<br /> ?'At(cSearchExpression, cExpressionSearched, Occurs(cSearchExpression, cExpressionSearched) + 1)'<br /> ?'непустое - противоречие'<br /> ?' функция Occurs возвращает количество вхождение подстроки в строку'<br /> ?' функция At возвращает позицию, с которой начинается подстрока в строке, '<br /> ?'причем третий параметр это номер вхождения подстроки в строку'<br /> ?At(cSearchExpression, cExpressionSearched, Occurs(cSearchExpression, cExpressionSearched) + 1)<br /> ________________________________________________________________</p>
<p> Предположим, некто пишет цикл<br /> For lnI = 1 to Occurs( Var1, Var2)<br /> ?at( Var1, Var2, lnI)<br /> Endfor<br /> Он уверен, что Occurs( Var1, Var2) всегда выдает результат, соотносящийся с результатами функции at,<br /> на некоторых строках найти ошибку будет весьма трудно.<br /> Сейчас  вопрос касательно работы функции OCCURS  задан VFP Team, но ответа пока нет.</p>
<p> Для подсчета количества вхождений подстрок в строку, не учитывая перекрытия (overlaps), Stephen Dobson (Toronto), предложил элегантный прием (с моими дополнениями), это выглядит так:</p>
<p> CREATE function OCCURS2 (@cSearchExpression nvarchar(4000), @cExpressionSearched nvarchar(4000))<br /> returns smallint<br /> as<br /> begin<br /> return<br /> case <br /> when datalength(@cSearchExpression) > 0<br /> then ( datalength(@cExpressionSearched) <br /> - datalength(replace(cast(@cExpressionSearched as nvarchar(4000)) COLLATE Latin1_General_BIN, <br /> cast(@cSearchExpression as nvarchar(4000)) COLLATE Latin1_General_BIN, ''))) <br /> / datalength(@cSearchExpression)<br /> else 0 <br /> end<br /> end</p>
<p> 2) функции VFP  GETWORDCOUNT, GETWORDNUM некорректно работают со строками, содержащими нулевой символ</p>
<p> 3) особенность работы функции substring Transact-SQL.<br /> если substr('tra-la-la', 0, 2) VFP возвращает пустую строку, то есть при втором аргументе меньше единицы всегда возвращается пустая строка, то <br /> substring('tra-la-la', 0, 2) Transact-SQL возвращает 't' то есть при втором аргументе меньше единицы нужно смотреть на третий аргумент, и в зависимости от него будет получен результат, скажем,<br /> substring('tra-la-la', -5, 8) Transact-SQL возвращает 'tr' . <br /> Объяснение этому здесь http://support.microsoft.com/kb/q310421/</p>
<p> 4) баг в Microsoft SQL Server  2000 - 8.00.2039 (Intel X86)  SP4</p>
<p> declare @n nvarchar(4000)<br /> set @n = replicate(N'z',3999)+N'&#239;'<br /> select right(replace(@n, N'&#239;', N'B'),1) -- display &#239;  but this is incorrect result, correct result is B</p>
<p> Каждыйв этом может убедиться</p>
<p> Теперь вопросы, скептические замечания и мои ответы на них:<br /> »Transact-SQL  тоже язык не бедный и к чему изобретать велосипед в каждом языке родное надежнее<br /> Лично мне напоминает мне то время когда я не знал FoxPro и изобретал разные функции, не зная о существовании встроенных, а теперь я напрочь о своих разработках  .<br /> На мой взгляд, лучше просто изучить подробнее стандартные функции Transact-SQL, там должно быть всё, ну, или почти все»<br /> » Лично я стараюсь не использовать пользовательские функции в MS SQL Server... В принципе, пока обходился стандартными... А там уже не за горами версия от 2005 года...»</p>
<p> В начальных версиях FoxPro, затем VFP, не было функций GETWORDCOUNT, GETWORDNUM они были в библиотеке Foxtools, без них можно было обойтись, используя стандартные. Не было, кстати, функции ICASE она появилась, начиная с 9 версии. Начиная с шестой версии, многие функции из библиотеки Foxtools стали частью языка.<br /> Если бы существовала острая необходимость в написанных мною функциях Transact-SQL, их написал бы не я, а разработчики SQL Server.<br /> Острой необходимости в них нет, каждый день происходит 40-50 закачек, хотя объявления представлены в разделах скриптов на достаточно популярных форумах, например на <br /> http://www.sqlservercentral.com/scripts/contributions/1488.asp<br /> http://www.databasejournal.com/scripts/article.php/3503581<br /> http://www.sswug.org/scriptmgr/recentscripts.asp .<br /> и так далее<br /> В мире сотни тысячи пользователей SQL Server, закачали же мои функции за полтора месяца со всех источников, наверное, чуть более 2500. <br /> Я встретил поначалу массу скептических отзывов со стороны многих MVP, встретил, правда и положительные отзывы со стороны тех же MVP, в общем, мнения разделились. <br /> Ну а тот, кому надо, берет и использует, просто многие из тех,  кому они действительно могут быть полезными, не знают и не подозревают об их существовании.<br /> » Ну не верю я в то, что сервер беднее, чем FoxPro»<br /> Это не вопрос веры, а всего лишь знания, функций<br /> GETWORDCOUNT, GETWORDNUM, AT, RAT, CHRTRAN, STRFILTER, OCCURS, PADC, PADR, PADL, PROPER (схожих не по имени, а по функциональности) в Transact-SQL нет, насчет версии 2005 не знаю. Найти какие либо еще отсутствующие функции мне не удалось (если только не считать совсем узкоспециальное, типа JUSTNAME и т.д.).</p>
<p> “родное надежнее”<br /> Смотрите выше «баг в Microsoft SQL Server  2000 - 8.00.2039 (Intel X86)  SP4»<br /> Именно по причине большого количества дешевых поделок, умные люди не используют «функции», «библиотеки» в большом количестве встречающиеся в Интернете. Начинаешь что-нибудь ставить,<br />  а оно не устанавливается, как можно этому доверять.  Как можно доверять серьезные приложения функциям написанным неизвестно кем? Поэтому со скептицизмом встречают и вышеприведенные функции, но они потихоньку находят своих пользователей, после публикации на серьезных форумах число скептиков уменьшается, по существу возразить никто не может.<br /> Идея тестирования вышеприведенных функций очень проста - формируются случайные строки случайной длины, и затем сравниваются результаты работы встроенных функций VFP и UDF Transact-SQL. Я прогнал тесты несколько сотен тысяч раз, перед тем как попытался разместить их в разделе Downloads форума Universalthread.<br /> Код открыт и всегда можно убедится в его корректности.<br /> Так что все работает в соответствии со спецификацией VFP, за исключение того, что мои функции работают и со строками в UNICODE, то есть к примеру с символами китайского языка,<br /> я размещал их и на китайском форуме SQL Server.<br /> »Может пример приведете из своего опыта, когда что-то сделать невозможно при работе со строками»<br /> Два примера, скорее обратных, показывающих, что со строками можно сделать все, используя встроенные функции, но не из моего опыта, поскольку, если задача встречается часто или может в будущем встретится часто, я предпочитаю писать процедуру или функцию.<br /> Первый пример:<br /> На microsoft.public.sqlserver.programming некто Dave 24 апреля 2005 года спрашивает<br />  (ему видимо лень, было, обходится встроенными функциями или заходить на www.google.com набирать в строке поиска User-Defined string functions Transact-SQL)</p>
<p> How can I use the T-SQL string functions to find the _third_ occourance of a <br /> character.<br /> For example, I have an email field and it has data that looks like this:<br /> http://www.sqlservercentral.com/scripts/contributions/1488.asp<br /> I want to find the position of the third occurence of '/' so I can use its <br /> position to extract just the main domain name, truncating all the trailing <br /> garbage.<br /> Does anyone have any ideas on how to do this?</p>
<p> Ему с готовностью помогают, демонстрируя возможность обойтись встроенными функциями (действительно, можно, нет никаких сомнений)<br /> ____________________________________________________________<br /> Dave,<br /> Here's an example that should help you out:<br /> declare @t table (<br /> s nvarchar(1000) )<br /> insert into @t values (‘http://www.sqlservercentral.com/scripts/contributions/1488.asp')<br /> insert into @t values <br /> ('http://www.sqlservercentral.com/scripts/contributions/1488.asp')<br /> select<br /> substring(s,a,charindex('/',s,a)-a) as theDomain<br /> from (<br /> select<br /> s,<br /> charindex('//',s) + 2 as a<br /> from @t<br /> )</p>
<p> Steve Kass<br /> Drew University<br /> ____________________________________________________________<br /> Далее Dave благодарит за ценный совет, но получает еще один<br /> ____________________________________________________________<br /> This should extract the Domain Name...</p>
<p> Declare @V VarChar(89)<br /> Set @V = 'http://www.sqlservercentral.com/scripts/contributions/1488.asp'</p>
<p> Select Substring(@V, CharIndex('//', @V) + 2, CharIndex('/', <br /> Substring(@V, CharIndex('//', @V) + 2, Len(@V)))-1)<br /> ____________________________________________________________<br /> Ну и, естественно, я вставил свои три копейки<br /> select dbo.AT('/','http://www.sqlservercentral.com/scripts/contributions/1488.asp',3)</p>
<p> Видимо, на нашей планете, можно найти сотни тысяч подобных строк кода <br /> в базах SQL Server , иначе бы мне не говорили спасибо на нескольких языках,<br /> многие ведь нашли решение сами, не спрашивая на форумах.</p>
<p> Второй пример:<br /> На http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=49733<br /> некто JAme задает вопрос<br /> hi,<br /> is there a similar function in SQL server to ORACLES RPAD ?</p>
<p> I need to display a field for a fixed width of 10.<br /> if the field is not 60 then add blank spaces . .<br /> eg:</p>
<p> [jamie ]<br /> [sqlteam ]<br /> and so on . .. . <br /> thank you for any help/<br /> JAme<br /> *--------------------------------------------------------------<br /> То есть интересуется - имеется ли нечто подобное функции RPAD PL/SQL.<br /> Да, имеется функция PADR, если бы он поискал на форуме, то нашел бы, опубликовано несколькими днями ранее на том же форуме.</p>
<p> robvolk SQL Server MVP & SQLTeam MVY и прочая и прочая (всех титулов и званий достаточно много)<br /> начинает давать дельные советы, что то про bcp и т.д. и т.п., разворачивается оживленная дискуссия<br /> его благодарят и т.д. и т.п.<br /> В общем, кому интересно, можете почитать.</p>
<p> »Ну а особенности с ними нужно дружить, а не воевать»<br /> Их нужно сначала знать, для этого и существуют форумы, где обмениваются информацией,<br /> Форумы ведь существуют не только для того чтобы отвечать на вопросы Dave ов. У меня ушло достаточно много времени на то чтобы разобраться, этого не знали даже (теперь знают от меня) гуру от VFP.</p>
<p> Ну и в заключение, привожу фрагмент письма, показывающий, то, что  делает нашу работу приятной.<br /> To Igor Nikiforov,</p>
<p> Thank you for sharing your code. I Googled 'SQL count occurrence of<br /> character in a string' and bingo! Didn't have to write it and got so<br /> much more.</p>
<p> Appreciate it.</p>
<p> Phil Youker<br /> Programmer/Analyst<br /> VCSSO/Information Technology Services</p>
<p> Благодарю Вас за то, что Вы потратили свое время, прочитав мою статью, надеюсь,<br />  что данное чтение хоть немного будет полезным для Вас.<br /> С наилучшими пожеланиями, Никифоров Игорь.</div>
<div id="sol_avtor">Автор: Никифоров Игорь</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/strokovye-funkczii-transact-sql-vfp/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/trackbar-ispravlenyj/</link>
					<title><![CDATA[TrackBar &#8211; Исправленый]]></title>
                    					    <author><![CDATA[Vladimir_Knyr]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:30 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>TrackBar &#8211; Исправленый</h1>
													</header>
													<div id="sol_opis">Визуальное изменение значения при помощи ползунка</div>
<div id="sol_body">Обновил класс, подправил бегание ползунка,<br /> добавил отрицательный диапазон значений,<br /> подчистил, добавил словесные эквиваленты<br /> и ControlSource.</p>
<p> Пример и текстовичек в архиве.  PS подправил получение значения из RecordSource (на входе). Заменил присвоение эквивалентов: Вместо прямого присвоения значений текстовых эквивалентов на метод Set_Items(cList,sDelimiter)  </p></div>
<div id="sol_avtor">Автор: Владимир Кныр</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4754">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4754">Vladimir_Knyr</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Vladimir_Knyr" href="https://foxclub.ru/account/?user=4754">
				<img alt='' src='https://secure.gravatar.com/avatar/7dd8187cfc903829e54ae52b377e8a5a?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7dd8187cfc903829e54ae52b377e8a5a?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 15-12-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/trackbar-ispravlenyj/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/formirovanie-otchetov-na-letu-frxobj/</link>
					<title><![CDATA[Формирование отчетов &#8220;на лету&#8221; (FrxObj)]]></title>
                    					    <author><![CDATA[piva]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Формирование отчетов &#8220;на лету&#8221; (FrxObj)</h1>
													</header>
													<div id="sol_opis">Создана была когда мне было лень рисовать отчеты на каждый запрос - просто выгребает всю инфу из грида и формирует файл отчета "на лету" затем его уже выводит на печать.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Пирожков Вадим</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4821">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4821">piva</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="piva" href="https://foxclub.ru/account/?user=4821">
				<img alt='' src='https://secure.gravatar.com/avatar/0a76ea08e616d2f8a939412913fbb096?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/0a76ea08e616d2f8a939412913fbb096?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-03-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/formirovanie-otchetov-na-letu-frxobj/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/proczedura-preobrazovaniya-stroki-simvolov-iz-1251-ili-866-kodovoj-straniczy-v-utf-8r/</link>
					<title><![CDATA[Процедура преобразования строки символов из 1251 (или 866) кодовой страницы в UTF-8r.]]></title>
                    					    <author><![CDATA[Crispy]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Процедура преобразования строки символов из 1251 (или 866) кодовой страницы в UTF-8r.</h1>
													</header>
													<div id="sol_opis">Процедура преобразования строки символов из 1251 (или 866) кодовой страницы в UTF-8r - для использования при создании XML-файлов. Для FPD и тех версий VFP, где такая функция еще отсутствует.</div>
<div id="sol_body">Файл PRG - в архиве.<br /> Процедура может использовать один или два параметра. <br /> Первый параметр (обязательный) - преобразуемая строка. <br /> Второй (любого типа, проше всего числовой) - нужен, только если преобразуются символы из 866 кодовой страницы.<br /> Для 1251 кодовой страницы - он не нужен, т.е. - используется всего один параметр.<br /> Возвращаемое значение - строка, преобразованная в UTF-кодировку.</div>
<div id="sol_avtor">Автор: Crispy</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4819">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4819">Crispy</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Crispy" href="https://foxclub.ru/account/?user=4819">
				<img alt='' src='https://secure.gravatar.com/avatar/48a3902acba9a2d85995b342a89fda7b?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/48a3902acba9a2d85995b342a89fda7b?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 16-05-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/proczedura-preobrazovaniya-stroki-simvolov-iz-1251-ili-866-kodovoj-straniczy-v-utf-8r/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/vyvod-propisyu-odnoveremenno-dnya-mesyacza-i-goda/</link>
					<title><![CDATA[Вывод прописью одновеременно дня, месяца и года]]></title>
                    					    <author><![CDATA[Crispy]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Вывод прописью одновеременно дня, месяца и года</h1>
													</header>
													<div id="sol_opis">Вывод прописью одновеременно дня, месяца и года даты, введенной как параметр в формате дата в диапазоне 01.01.0001 - 31.12.9999, т.е. ?datapropis(CTOD('15.12.2005')) даст строку: &quot;пятнадцатого декабря две тысячи пятого года&quot;.</div>
<div id="sol_body">В архиве находится prg-файл.</div>
<div id="sol_avtor">Автор: Crispy</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4819">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4819">Crispy</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Crispy" href="https://foxclub.ru/account/?user=4819">
				<img alt='' src='https://secure.gravatar.com/avatar/48a3902acba9a2d85995b342a89fda7b?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/48a3902acba9a2d85995b342a89fda7b?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 16-05-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/vyvod-propisyu-odnoveremenno-dnya-mesyacza-i-goda/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/sozdanie-obektov-iz-txt-fajla/</link>
					<title><![CDATA[Создание объектов из .txt файла]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Создание объектов из .txt файла</h1>
													</header>
													<div id="sol_opis">В процессе сопровождения часто меняющегося приложения удобно делать изменения в текстовом файле, при этом, не затрагивая исходный код приложения. Тест и данные.</div>
<div id="sol_body">[code] ACTIVATE SCREEN  clea IF .t. text [/code] <br /> Программа предназначена для создания объектов, содержащих предопределённые данные.<br /> Причем, данные содержатся в текстовом файле, и в любой момент могут быть изменены.<br /> Что удобно при сопровождении часто меняющегося приложения. Подготовьте config.txt<br /> и тест готов к прогону.<br /> Проверено на VFP 7.0 </p>
<p> ОБЪЕКТ ВНАЧАЛЕ СОЗДАЕТСЯ, А ЗАТЕМ ИНИЦИАЛИЗИРУЕТСЯ<br /> Ну не получилось это у меня, чтобы одним вызовом и объекты создать и<br /> их проинициализироватью</p>
<p> See Also ОКАЗЫВАЕТСЯ. КЛАСС ВНАЧАЛЕ СОЗДАЕТСЯ, А ЗАТЕМ ИНИЦИАЛИЗИРУЕТСЯ<br /> Содержимое файла 'c:mysamplothersconfig.txt' для теста:</p>
<p> #Телефон=581-21-85       				 - первая строка файла  <br /> #ВетВрач=Максименко М.А.<br /> #E_mail=abel47@mail.ru<br /> #Заставка=C:mySamplGRAPHICSсултан.JPG<br /> #текст=Анализы<br /> -----------------------------------------------------------------<br /> Анализы:<br /> _________________________________________________________________</p>
<p> Медицина:<br /> _________________________________________________________________<br /> ... ...<br /> #конец текста<br /> #текст=Справка<br />                С П Р А В К А</p>
<p> Дана _______________ Кличка ___________ </p>
<p> Инструктор __________________________<br /> ... ... ...<br /> #Конец текста<br /> END    				- конец файла, последняя строка</p>
<p> endtext<br /> endif</p>
<p> [code] PUBLIC My_test My_test  = CREATEOBJECT('MyClass')  && Построить объекты в памяти с именами из .txt файла My_test.put_val()             		&& Присвоить значения со значениями из .txt файла WAIT WINDOW [ WAIT - для просмотра полученных значений в отладчике] RELEASE my_test  DEFINE CLASS Variablic AS CUSTOM    	Name 	= "Создание_переменной"   	value 	= [Value_of_var] ENDDEFINE   DEFINE CLASS MyClass AS Custom    name=[NewClass]    MyProperty = 'c:mysamplothersconfig.txt'    iTable = 0      xx=[ ]    namevalue=[]    objname = []      PROCEDURE init 	LOCAL s,cn, objn, x, имя	 	this.itablE=FOPEN(this.MyProperty) 		DO WHILE !FEOF(this.itablE)	 			this.xx = FGETS(this.itablE) 			s = this.xx 			IF LEFT(this.xx,1) # [#] 				LOOP 				ENDIF 			if INLIST(s,'#конец','#Конец','#end','end','END') 				loop 				endif		 			if INLIST(s,'#МЕМО=','#Текст=','#Текст =','#текст=','#текст =')    				objn = this.getvalue(s)    				this.AddObject ( (objn), "Variablic" ) 				loop 				endif 			objn = this.getobjname(s) 			this.AddObject ( (objn), "Variablic" ) 		ENDDO 	=FCLOSE(this.itablE)       endproc     PROCEDURE destroy    endproc      PROCEDURE put_val 	LOCAL s,cn, objn, x, имя 	this.itablE=FOPEN(this.MyProperty)		&& пусть: 			DO WHILE !FEOF(this.itablE)	 	&& 	#текст=ПОЛЕ21 			this.xx = FGETS(this.itablE) 	&&  Значение строки 1 111111 111 11111111 			s = this.xx  					&&  Значение строки 2 222222  2222  			IF LEFT(this.xx,1) # [#]  		&&   ... 				LOOP 						&&  #конец текста 				ENDIF  						&&  			if INLIST(s,'#МЕМО=','#Текст=','#Текст =','#текст=','#текст =') 					objn = this.getvalue(s)			&& определено NAME объекта  :  #текст=ПОЛЕ21 					имя =[my_test.]+objn+[.value] 	&& Заготовлена строка my_test.ПОЛЕ21.value			 					&имя = [] 						&& значение my_test.ПОЛЕ21.value ОЧИЩЕНО 					s=FGETS(this.itablE)			&& прочитана первая строка значения 					x = [] 					DO WHILE !FEOF(this.itablE)		&& цикл до конца значений строк поля NAME 						IF FEOF(this.itablE) 		&& т.е. для поля с именем ПОЛЕ21 							EXIT 							endif 						if INLIST(s,'#конец','#Конец','#end','end','END') 							EXIT 							endif						&&	 						x = &имя  						&&  						&имя = x  + ALLTRIM(s)+ CHR(13) && значение объекта ПОЛЕ21 						s=FGETS(this.itablE)  			&& формируется построчно 					enddo 				loop 				ENDIF 							&& Здесь приваюваются значения созданным переменным 			objn = this.getobjname(s)      		&& ВетВрач.value = "Максименко М.А." 			имя =[my_test.]+objn+[.value]   	&& E_mail.value = "abel47@mail.ru" 			STORE this.getvalue(s) TO &имя  	&&  ... 		ENDDO 	=FCLOSE(this.itablE)   	endproc  PROCEDURE getvalue       && #namexxx = VALUExxxxxx... 	LPARAMETERS s        &&            ============ 	LOCAL l 	l=ALLTRIM(SUBSTR(s, AT([=],s)+1 )) 	retURN l 	endproc	 	 PROCEDURE getobjname       && #NAMExxx... = VALUExxxxxx ... 	LPARAMETERS s          && =========== 	LOCAL l 	 	l=ALLTRIM(SUBSTR(s,2, AT([=],s)-2 )) 	retURN  l 	endproc	 	 ENDDEFINE[/code] </p>
<p></div>
<div id="sol_avtor">Автор: Старый</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/sozdanie-obektov-iz-txt-fajla/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/igra-jeti/</link>
					<title><![CDATA[Игра Йети]]></title>
                    					    <author><![CDATA[Hel!Riser]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:16 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Игра Йети</h1>
													</header>
													<div id="sol_opis">Примерный аналог LodeRunner-a</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: HellRiser</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4814">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4814">Hel!Riser</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Hel!Riser" href="https://foxclub.ru/account/?user=4814">
				<img alt='' src='https://secure.gravatar.com/avatar/e2a29a43d5cd1efb980fa624551c4b00?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e2a29a43d5cd1efb980fa624551c4b00?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 11-03-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/igra-jeti/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Игры]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-dlya-formirovaniya-word-dokumentov/</link>
					<title><![CDATA[класс для формирования Word-документов]]></title>
                    					    <author><![CDATA[krin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>класс для формирования Word-документов</h1>
													</header>
													<div id="sol_opis">Динамически создаётся prg для формирования Word-документа, исполняется, и по закрытии документа удаляется. Программист пишет только 2 метода - 1) создание таблицы и  2) заполнение шаблона из неё.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: krin</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4495">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4495">krin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="krin" href="https://foxclub.ru/account/?user=4495">
				<img alt='' src='https://secure.gravatar.com/avatar/1ec6ad5c203e6b165ed965172632eaf7?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1ec6ad5c203e6b165ed965172632eaf7?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 08-02-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-dlya-formirovaniya-word-dokumentov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/instrumenty-razrabotchika-dlya-visual-foxpro-6-0-vypusk-3/</link>
					<title><![CDATA[Инструменты разработчика для Visual FoxPro 6.0 Выпуск 3]]></title>
                    					    <author><![CDATA[Олег Бляхеров]]></author>
                    										    <pubDate>Fri, 04 Nov 2022 14:24:51 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Инструменты разработчика для Visual FoxPro 6.0 Выпуск 3</h1>
													</header>
													<div id="sol_opis">
<p>Набор утилит, для облегчения труда разработчика приложений на Visual FoxPro: </p>
<ul>
<li>Все мои проекты… вер.2.2</li>
<li>Поиск в проекте вер.3.5.</li>
<li>Сравнение файлов вер.3.11</li>
<li>Сравнение библиотек вер.2.8</li>
<li>Редактор библиотек вер.1.4</li>
<li>Сравнение проектов вер.1.0 (New!)<br />
Статус: FreeWare</li>
</ul>
</div>
<div id="sol_body">
<h3>Инструменты разработчика для Visual FoxPro 6.0</h3>
<p>Настоящий профессионал начинается с инструмента (ИМХО!). Это касается всех видов деятельности - от столяра до зубного врача, и программисты здесь не исключение. Именно эта нехитрая мысль, а также долгие поиски нужного проекта в проводнике или всех мест, где я имел неосторожность использовать “эту дурацкую функцию, которая почему-то глючит в очередном сервис-паке”, подвигли меня на изготовление (сначала для себя) нескольких простеньких инструментов, в той или иной степени решающих все эти проблемы. За несколько лет они обросли мяском, приобрели более-менее приличный вид и, что самое главное, сэкономили мне массу времени и сил. Теперь я готов предложить некоторые из них на суд широкой фокс-общественности и пусть народ скажет свое слово. </p>
<p>В третий выпуск пакета, представляемый здесь, входит шесть фокс-приложений: “Все мои проекты…”, “Поиск в проекте”, “Сравнение файлов”, “Сравнение библиотек и форм”, “Редактор библиотек” и добавленая в третьем выпуске утилита “Сравнение проектов”. </p>
<p>Приложения представляют собой app-модули и вызваются прямо из командного окна. Обращение к инструментам описано в соотвествующих разделах файла tools.chm. Для большего удобства вызов приложений можно вставить в главное меню Foxpro с помощью простенькой процедуры, запускаемой из config.fpw </p>
</div>
<div id="sol_avtor">Автор: Олег Бляхеров</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5049">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5049">Олег Бляхеров</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Олег Бляхеров" href="https://foxclub.ru/account/?user=5049">
				<img alt='' src='https://secure.gravatar.com/avatar/59254e455634d23d143dcfe629716d52?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/59254e455634d23d143dcfe629716d52?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 8<i class="rcli fa-calendar-check-o"></i>Регистрация: 23-04-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/instrumenty-razrabotchika-dlya-visual-foxpro-6-0-vypusk-3/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-foxpdftext-dlya-sozdaniya-pdf-fajla-s-otchetom-na-100-chistom-visual-foxpro/</link>
					<title><![CDATA[Класс FoxPDFText для создания PDF файла с отчетом на 100% чистом Visual FoxPro.]]></title>
                    					    <author><![CDATA[rvc44]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс FoxPDFText для создания PDF файла с отчетом на 100% чистом Visual FoxPro.</h1>
													</header>
													<div id="sol_opis">Хотите научиться создавать файлы PDF с Вашими отчетами с нуля, не имея, при этом никаких продуктов ADOBE, ни дополнительных драйверов и другого ПО? Тогда эта статья для Вас! Дополнительную информацию см. во вложении. Идея и оригинальная разработка: Loic Carrere. Публикуется с разрешения автора. Объявляется конкурс по совершенствованию данного класса!</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Кольцов Роман Васильевич</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4767">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4767">rvc44</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="rvc44" href="https://foxclub.ru/account/?user=4767">
				<img alt='' src='https://secure.gravatar.com/avatar/e89cde72d5f4d3df33e6d628fb2c4289?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e89cde72d5f4d3df33e6d628fb2c4289?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 06-12-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-foxpdftext-dlya-sozdaniya-pdf-fajla-s-otchetom-na-100-chistom-visual-foxpro/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/grid/</link>
					<title><![CDATA[Grid.]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:30 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Grid.</h1>
													</header>
													<div id="sol_opis">Для отображения текстовой информации. Поиск, фильтр по нескольким колонкам, выделение (пометка) записей.</div>
<div id="sol_body">Откройте таблицу, положите Grid на форму и запустите ее.</div>
<div id="sol_avtor">Автор: Petrovich</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/grid/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/sumcolumn/</link>
					<title><![CDATA[SUMCOLUMN]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>SUMCOLUMN</h1>
													</header>
													<div id="sol_opis">Xotel razdelit opitom.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: YD</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/sumcolumn/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/tulbar-dlya-bystroj-raboty-s-bolshim-kolichestvom-proektov/</link>
					<title><![CDATA[Тулбар для быстрой работы с большим количеством проектов]]></title>
                    					    <author><![CDATA[Zakharov_slava]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Тулбар для быстрой работы с большим количеством проектов</h1>
													</header>
													<div id="sol_opis">Тулбар для быстрой работы с большим количеством проектов,</div>
<div id="sol_body">Идея класса возникла из необходимости работать с довольно большим количеством проектов. Класс представляет собой тулбар с несколькими стандартными и настраеваемыми кнопками и несколькими формами для настроек этих кнопок. Предполагается что каждому проекту сопоставляется кнопка на тулбаре при нажатию на которую открывается сам проект, устанавливается пути к нему, и при необходимости запускается программа начальных установок.</div>
<div id="sol_avtor">Автор: Захаров Слава</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4762">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4762">Zakharov_slava</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Zakharov_slava" href="https://foxclub.ru/account/?user=4762">
				<img alt='' src='https://secure.gravatar.com/avatar/0fa4fc050f5ba8fc97ee089fcfce73b3?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/0fa4fc050f5ba8fc97ee089fcfce73b3?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 14-10-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/tulbar-dlya-bystroj-raboty-s-bolshim-kolichestvom-proektov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/otpravka-pochty/</link>
					<title><![CDATA[Отправка почты]]></title>
                    					    <author><![CDATA[Vladimir_Knyr]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Отправка почты</h1>
													</header>
													<div id="sol_opis">Вариант программного SMTP клиента</div>
<div id="sol_body">Очередной вариант SMTP клиента, в тестовом проекте умышлено вынесена функция public WSAData 	WSAData = createobject('WSAData') ссмотреть процедуу main  в тесте кроме того из-за скорости конвертироваемя приаттаченного(ных) файла(лов) в формат Base64 было принято решение оформить это дело в виде библиотеки DLL она имеется во вложении) Ессли же ее использовать не хочется, то по умолчанию свойство: use_lbase64_dll   = .f. && т.е. не использовать данную DLL (Идея Готовского Дмитрия) режим авторизации SMTP пока не предусмотрен. Ведется лог в %Temp%My_SMTP.LOG. если такового нет, то лог пишется в c:TempMy_SMTP.LOG ========= Теперь еще и use_lbase64_dll - можно менять на лету(а не один раз, при создании класса) ========= 28.10.2005 Все что отладил на своих локальных серверах - все теперь работает добавлены три типа авторизации: LOGIN CRAM-MD5 POP перед SMTP Также добавлен прогресс отправки (его можно отключить в методе send_body() и прикрутить свой в методе dispatch_of_letter_assign() 08.11.2005 протестировано на серверах smtp.yandex.ru , smtp.rambler.ru , smtp.mail.ru все работает.</div>
<div id="sol_avtor">Автор: Владимир Кныр</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4754">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4754">Vladimir_Knyr</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Vladimir_Knyr" href="https://foxclub.ru/account/?user=4754">
				<img alt='' src='https://secure.gravatar.com/avatar/7dd8187cfc903829e54ae52b377e8a5a?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7dd8187cfc903829e54ae52b377e8a5a?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 15-12-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/otpravka-pochty/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-dlya-raboty-s-crystal-reorts-9/</link>
					<title><![CDATA[Класс для работы с Crystal Reorts 9]]></title>
                    					    <author><![CDATA[Петров Андрей]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс для работы с Crystal Reorts 9</h1>
													</header>
													<div id="sol_opis">Достаточно добавить параметры (как в основной отчет так и в подотчеты) и вызвать на предпросмотр.</div>
<div id="sol_body">Вот пример работы с классом.</p>
<p> [code] CLEAR ALL SET CLASSLIB TO my_crystallrep PUBLIC oCR m.oCR=CREATEOBJECT('My_Crystall') m.oCR.addparam('Subscriber','Subs_Test') m.oCR.addparam('Dogovor','Dog_Test') m.oCR.addparam('@Date_From',CTOT('01.10.05 0:0:0')) m.oCR.addparam('@Date_To',CTOT('31.10.05 23:59:59')) m.oCR.addparam('@Id_Subscriber',0) m.oCR.addparam('@Number','920101') m.oCR.addsubparam('Phones','@Date_From',CTOT('01.10.05 0:0:0')) m.oCR.addsubparam('Phones','@Date_To',CTOT('31.10.05 23:59:59')) m.oCR.addsubparam('Phones','@Id_Subscriber',0) m.oCR.addsubparam('Phones','@Number','920101') m.oCR.previewreport(SYS(5)+SYS(2003)+'Phone.rpt') READ EVENTS[/code] <br /> Как видно достаточно простые операции. Параметры с @ это параметры хранимой процедуры MsSQL...<br /> Синтаксис AddParam(Название параметра,Занчение)<br /> Синтаксис AddSubParam(Название подотчета,Название параметра,Занчение)</p>
<p> Класс простейший и сильно упрощает жизнь. По крайней мере мне. Если не устраивает внешний вид отчета - смотрите процедуру previewreport.</p></div>
<div id="sol_avtor">Автор: Андрей</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5063">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5063">Петров Андрей</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Петров Андрей" href="https://foxclub.ru/account/?user=5063">
				<img alt='' src='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 14<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-04-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-dlya-raboty-s-crystal-reorts-9/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/predprosmotr-pechati/</link>
					<title><![CDATA[Предпросмотр печати]]></title>
                    					    <author><![CDATA[Aries]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:24 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Предпросмотр печати</h1>
													</header>
													<div id="sol_opis">Мне не понравился предпросмотр фокса поэтому, родилось вот это решение</div>
<div id="sol_body">
<h3>Предпросмотр печати</h3>
<p>  Мне не понравился предпросмотр фокса поэтому, родилось вот это решение. Подчеркиваю это<br /> предпросмотр, а не генератор отчетов. Признаюсь идея не моя, но все написано мною с нуля.</p>
<p> Запустите форму Form1 и нажмите "печать", это маленький примерчик как работает</p>
<p>Предпросмотр.<br /> Кстати вы можете посмотреть сразу от 1 до 100 %) одновременно документов.<br /> **************<br /> В архиве есть две папки FOR6 и FOR8<br /> Как видно из названий это соответственно версии для 6-го и 8-го фокса <br /> ********************************<br /> Теперь принтер указывается тот который в системе по умолчанию, как и обещал, ну и тултипсы<br /> поправил</p>
<p> ********************************<br /> Поправил надпись на тулбаре, и заменил всплывающюю подсказку, когда вместо запятых ставят<br /> точки.<br /> Теперь подсказки нет 🙂 это сделано по совету Владимира Максимова.</p>
<p> **********************************************<br /> Изменил отображение страниц. Теперь покрасивше смотрится.<br /> если у кого-то есть нестандартные страницы репорта,<br /> то для того что бы красиво отображалась страница, надо добавить<br /> в методе oGlRep.START надо добавить свои размеры страниц<br /> К примеру:<br /> DO CASE<br />     CASE ALLTRIM(lcSize)=="A4V"<br />       THIS.nHeight=1152<br />       THIS.nWidth=770<br />     CASE ALLTRIM(lcSize)=="A4G"<br />       THIS.nHeight=770<br />       THIS.nWidth=1152<br />     CASE ALLTRIM(lcSize)=="A3V"<br />       THIS.nHeight=1540<br />       THIS.nWidth=1152<br />     CASE ALLTRIM(lcSize)=="A3G"<br />       THIS.nHeight=1152<br />       THIS.nWidth=1540<br />     CASE ALLTRIM(lcSize)=="A5V" &&новый размер<br />       THIS.nHeight=321 && примерные числа определите сами нужные<br />       THIS.nWidth=231<br />   endCASE<br /> *И незабудте передать свое новое обозначение размера в метод Start</p>
<p> 16.12.2003г.<br /> Немного поправил косметически.<br /> К сожалению предпросмотр нельзя сделать, что бы он работал в фоксовом окне 🙁</p>
<p> 26.12.2003г.<br /> Исправлен баг при подсчете общего количества листов.<br /> Теперь все работает правильно</p>
<p> 22.07.2004г.<br /> Добавлена возможность вывода отчета в текстовый файл.<br /> 04.08.2005г.<br /> Убраг глюк при котором происходило сбивание настройки SET PATH.<br /> 24.10.2005г.<br /> Добавил скролинг для колеса мышки.</div>
<div id="sol_avtor">Автор: Aries</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4794">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4794">Aries</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Aries" href="https://foxclub.ru/account/?user=4794">
				<img alt='' src='https://secure.gravatar.com/avatar/41cb07f73054c6ace4bc67d9d56f5947?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/41cb07f73054c6ace4bc67d9d56f5947?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-12-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/predprosmotr-pechati/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/funkcziya-dlya-pravilnoj-sortirovki-chisel-v-tekstovyh-polyah/</link>
					<title><![CDATA[Функция для правильной сортировки чисел в текстовых полях]]></title>
                    					    <author><![CDATA[karly™]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Функция для правильной сортировки чисел в текстовых полях</h1>
													</header>
													<div id="sol_opis">При обычной сортировке название &quot;Аптека N15&quot; попадает между &quot;Аптека N1&quot; и &quot;Аптека N2&quot;. Данная функция сортирует такие строки правильно.</div>
<div id="sol_body">
<h3>Функция для правильной сортировки чисел в текстовых полях</h3>
<p>  Вам не приходилось сталкиваться с проблемой, когда при сортировке названий организаций, адресов, или наименований товаров строки располагаются не совсем так, как ожидает пользователь? Например:</p>
<p><i> Доска 100мм --> Доска 80мм<br /> Аптека N1 --> Аптека N15 --> Аптека N2<br /> ул.Центральная д.100 --> ул.Центральная д.15<br /> </i><br /> Эта простая функция решает задачу.</p>
<p> Протестировано в <b>VFP6-7-8</b>.</p>
<p> В <b>VFP5</b> данный код не работает из-за отличающегося поведения функции Subsr() </p>
<p> Загружена обновленная версия. В новой версии добавлены два необязательных параметра, облегчающих использование функции. </p></div>
<div id="sol_avtor">Автор: Игорь Ильин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4545">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4545">karly™</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="karly™" href="https://foxclub.ru/account/?user=4545">
				<img alt='' src='https://secure.gravatar.com/avatar/58afa4925ba0e3440d31fa4bebc393ae?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/58afa4925ba0e3440d31fa4bebc393ae?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 27-09-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/funkcziya-dlya-pravilnoj-sortirovki-chisel-v-tekstovyh-polyah/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/proverka-obnovleniya-html-stranichki-ili-fajla-na-http-servere/</link>
					<title><![CDATA[Проверка обновления HTML-странички или файла на http-сервере]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Проверка обновления HTML-странички или файла на http-сервере</h1>
													</header>
													<div id="sol_opis">Позволяет проверить дату обновления странички или файла на http-сервере, а также ее размер и просто доступность. Используется MSINET.OCX (Microsoft Internet Transfer Control 6.0 (SP4)</div>
<div id="sol_body">Это решение навеяно вопросом, заданным на форуме Игорем Перминовым (http://forum.foxclub.ru/read.php?f=29&i=20261&t=20261&cp=-1) и следует рассматривать как один из вариантов решения проблемы.<br /> Проверялось в Vfp6 и Vfp8.<br /> Если будете использовать в своих программах - не забывайте включать в setup MSINET.OCX</p>
<p> Буду весьма признателен, если Вы сообщите о замеченных глюках</p></div>
<div id="sol_avtor">Автор: Сергей Денисенко</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/proverka-obnovleniya-html-stranichki-ili-fajla-na-http-servere/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/pechat-tekstovyh-fajlov-na-lazernyh-printerah/</link>
					<title><![CDATA[Печать текстовых файлов на лазерных принтерах.]]></title>
                    					    <author><![CDATA[Timo]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Печать текстовых файлов на лазерных принтерах.</h1>
													</header>
													<div id="sol_opis">Программа делает следующее.    - Для текстов, не содержих Epson-овские Esc-последовательности и Hewlett-овские команды PCL.    Если текст не помещается на странице при размере шрифта 6 при книжной ориентации, устанавливается альбомная ориентацию листа. Подбирается размер шрифта, чтобы текст поместился на лист:    - Если файл содержит Epson-овские последовательности и кодировка 866, они заменяются Hewlett-овскими (PCL), насколько это возможно.    - Если кодировка 1251, при печати конвертируется в 866.    - Если файл содержит Hewlett-овские последовательности, он печатается как есть, без изменения.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Широкоступ Валерий</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4558">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4558">Timo</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Timo" href="https://foxclub.ru/account/?user=4558">
				<img alt='' src='https://secure.gravatar.com/avatar/1b72864e678eea9748207f069393df0d?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1b72864e678eea9748207f069393df0d?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 27-05-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/pechat-tekstovyh-fajlov-na-lazernyh-printerah/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/rabota-s-ini-fajlami-cherez-vcx-bez-win-ini-i-reestra/</link>
					<title><![CDATA[Работа с INI файлами через VCX. Без Win.Ini и реестра]]></title>
                    					    <author><![CDATA[Петров Андрей]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Работа с INI файлами через VCX. Без Win.Ini и реестра</h1>
													</header>
													<div id="sol_opis">Посчитал что лучше написать свое чем пользоваться примерами поставляемыми с VFP.</div>
<div id="sol_body">
<pre> Возможности:  1) Запись в INI строк. Задавая имя секции ключ и значение (WriteINIStr) 2) Запись в INI чисел. Задавая имя секции ключ и значение (WriteININum) 3) Чтение из INI строк. Задавая имя секции и ключ (ReadINIStr) 4) Чтение из INI чисел. Задавая имя секции и ключ (ReadININum) 5) Выборка всех секции файла во внешний массив (EnumSections) 6) Возможно задавать относительный путь к файлу 7) Удаление секции 8) Сохранение массива в одной из секций INI 9) Восстановление массива из INI   * 8,9 по аналогии с  Save all like ... to ...,  Rest from ... addi  Основана на вызове функций WinAPI из библиотеки Kernel32.  27.05.2005 Насчет формата массива в INI думаю сами разберетесь. Коротко. а) В параметрах передается название секции под массив а так же ключа для элементов массива. б) В значениях идет запись не только строк но и типов данных вида N 10. Число знаков в данном случае не определяется. в) Так же идет запись размерности массива.  03.10.05 Добавлена работа через объект на форме. Т.е. записьчтение идет через объект в котором есть свойства по названию совпадающие с полями в INI. ReadINIToCustom SaveINIToCustom </pre>
</div>
<div id="sol_avtor">Автор: Андрей</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5063">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5063">Петров Андрей</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Петров Андрей" href="https://foxclub.ru/account/?user=5063">
				<img alt='' src='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 14<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-04-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/rabota-s-ini-fajlami-cherez-vcx-bez-win-ini-i-reestra/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Система]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/interactivesearch/</link>
					<title><![CDATA[InteractiveSearch]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>InteractiveSearch</h1>
													</header>
													<div id="sol_opis">Интерактивный поиск в Grid-e</div>
<div id="sol_body">[code] SELECT customers IF THISFORM.optiongroup1.Value =1     L1  = UPPER(alltrim(thisform.text1.value))    LN1 = LEN(L1)        L2  = UPPER(alltrim(thisform.text2.value))    LN2 = LEN(L2)    IF !EMPTY(thisform.text1.value)  AND !EMPTY(THISFORM.TEXT2.Value)         SET FILTER TO UPPER(LEFT(customers.contactnam,LN1)) == L1 AND ;                  UPPER(LEFT(customers.companynam,LN2)) == L2    ELSE       IF !EMPTY(thisform.text1.value)          SET FILTER TO UPPER(LEFT(customers.contactnam,LN1)) == L1       ENDIF       IF !EMPTY(THISFORM.TEXT2.Value)          SET FILTER TO UPPER(LEFT(customers.companynam,LN2)) == L2       ENDIF        ENDIF               ELSE       IF !EMPTY(thisform.text1.value)  AND !EMPTY(THISFORM.TEXT2.Value)     SET FILTER TO ATC(alltrim(thisform.text1.value),customers.contactnam) > 0 AND ;                  ATC(alltrim(thisform.text2.value),customers.companynam) > 0    ELSE      IF !EMPTY(thisform.text1.value)          SET FILTER TO ATC(alltrim(thisform.text1.value),customers.contactnam) > 0      ENDIF      IF !EMPTY(thisform.text2.value)          SET FILTER TO ATC(alltrim(thisform.text2.value),customers.companynam) > 0      ENDIF         ENDIF     GO TOP ENDIF  THISFORM.GRID1.Refresh [/code]</div>
<div id="sol_avtor">Автор: EMustafaoglu</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/interactivesearch/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-hidera-indeksirovanie-tabliczy/</link>
					<title><![CDATA[Класс хидера + индексирование таблицы.]]></title>
                    					    <author><![CDATA[Aries]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:24 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс хидера + индексирование таблицы.</h1>
													</header>
													<div id="sol_opis">Кликаете на хидере и в таблице происходит сортировка по возрастанию/убыванию. Плюс появляется горячая картинка, указывающая возрастание/убывание.</div>
<div id="sol_body">
<h3>Класс хидера + индексирование таблицы.</h3>
<p> Чтобы добавить класс MyHeader нужно открыть Грид на редактирование. Выбрать Column1 в дизайнере<br /> прописать  свойство HeaderClassLibrary равным "prgMyHeader.prg". И все работает. И так<br /> сделать во всех столбцах грида.<br /> Кликаете на хидере и происходит сортировка по возрастанию/убыванию. При этом появляется на<br /> индексированном столбце картинка. Довольно симпатично получилось, и универсально.<br /> Правда класс невизуальный. Но зато работает.<br /> ******************************<br /> Поигрался с индексами. Теперь если индекс открыт то с ним происходит работа.<br /> ******************************<br /> Как и обещал, сделал версии для 6-ки и для 8-ки. К сожалению для 6-й версии нет красивых картинок<br /> указывающих<br /> сортировку. Поэтому я заменил на простые символы "".<br /> В архиве две папки FOR6 and FOR8. Можна запустить примеры, чтобы посмотреть работу.<br /> В ините формы, для 6-ки прописан код, как вставить хидер в грид.<br /> ПЕсли у кого есть вопросы стучитесь в аську 143983622<br /> Добавил процедуру Destroy для избавления от временных файлов-индексов, чтобы не засорять временные<br /> каталоги.<br /> Кстати за помощь спасибо Мичману %)<br /> ******************************<br /> Поправлен глюк с кликом. Теперь если выкликаете на хидере, то фокус получает именно та колонка<br /> в которой находится хидер.<br /> 16.12.2003г.<br /> Так  теперь фокус остается на той строке на которой бы до сортировке</p>
<p> 25.12.2003г.<br /> В папке PRG есть два файла MyHeader и MyHeaderView. MyHeader - применяется для таблиц и курсоров. Работает безотказно.  MyHeaderView - применяется для вьюшек. К сожалению, я не могу проверить MyHeaderView полностью на работоспособность. Так как не использую вьюшки, и не знаю, как они работают. Поэтому, если возникнут ошибки, думаю, вы не будете ко мне слишком строги. И еще. Не забудьте сделать высоту заголовков грида равной 20 или более. Это для того чтобы нормально влазила картинка, показывающая возрастание/убывание. <br /> 16.16.2004<br /> Новая версия. Я не помню какие изменения я внес в код но помню что что-то я изменял<br /> 29.07.2004<br /> Сделал вот такую вещь:<br /> Первый клик - сортировка по возростани.<br /> Второй клик - по убыванию<br /> Третий клик - убирается сортировка<br /> Думаю так лучше будет. 02.08.2004<br /> Вот решил добавить пару вещичек, а именно:<br /> Добавил менюшку по правому клику, в ней сделано:<br /> - Выбор сортировок<br /> - фиксация столбцов<br /> - Динамическое отображение столбцов, т.е пользователь может сам отображать/скрывать<br />   нужные ему столбцы.<br /> Кстати если кому не понравиться, то можно просто удалить процедуру RightClick<br /> на работу самого MyHeader удаление не повлияет.<br /> И еще это сделано только для 8-й версии!.<br /> 23.09.2005.<br /> Исправлена ошибка при индексации, когда длина поля больше ста символов.<br /> Теперь если длина символов 100 и более берется 99 симовлов.<br /> это для типов данных Char  </div>
<div id="sol_avtor">Автор: Aries</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4794">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4794">Aries</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Aries" href="https://foxclub.ru/account/?user=4794">
				<img alt='' src='https://secure.gravatar.com/avatar/41cb07f73054c6ace4bc67d9d56f5947?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/41cb07f73054c6ace4bc67d9d56f5947?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-12-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-hidera-indeksirovanie-tabliczy/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ispolzovanie-komandy-cpuid-iz-vfp/</link>
					<title><![CDATA[Использование команды CPUID из VFP]]></title>
                    					    <author><![CDATA[Петров Андрей]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:27 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Использование команды CPUID из VFP</h1>
													</header>
													<div id="sol_opis">Билиотека для использования команды CPUID - т.е. получение информации о процессоре включая (CPUID 0..3, 8000 0000h для AMD) Результат - строка</div>
<div id="sol_body">
<h3>Использование команды CPUID из VFP</h3>
<p>   Билиотека для использования команды CPUID - т.е. получение информации о процессоре включая (CPUID 0..3, 8000 0000h для AMD) Результат - строка в HEX виде. Кому надо - берите.<br /> По подробнее:<br /> CPUID (EAX = 0)<br /> EAX - количество возможных вызовов CPUID<br /> EBX, EDX, ECX - производитель процессора.<br /> CPUID (EAX = 1...2)<br /> почитайте описание сами... слишком долго писать...<br /> CPUID (EAX = 3)<br /> EBX, EDX - SN процессора (не помню точно какие регистры)<br /> =================Расширения от AMD=======================<br /> CPUID (EAX = 8000 0000h) Расширения от AMD<br /> EAX - до какого значение можно получать данные - по аналогии с 0<br /> ...</p>
<p> Регистры хранятся в полученной строке попорядку EAX, EBX, ECX, EDX<br /> соответственно каждый по 4 байта.   </div>
<div id="sol_avtor">Автор: Петров Андрей</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5063">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5063">Петров Андрей</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Петров Андрей" href="https://foxclub.ru/account/?user=5063">
				<img alt='' src='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 14<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-04-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ispolzovanie-komandy-cpuid-iz-vfp/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Система]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/biblioteka-dlya-vychisleniya-hash-summy-v-foxpro/</link>
					<title><![CDATA[Библиотека для вычисления hash суммы в FoxPro.]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:30 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Библиотека для вычисления hash суммы в FoxPro.</h1>
													</header>
													<div id="sol_opis">Библиотека FLL предназначенная для получения hash суммы из файла или строки по алгоритмам MD5, SHA1, SHA256. Более подробно в Readme.txt из архива.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Alexander Kagarmanov</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/biblioteka-dlya-vychisleniya-hash-summy-v-foxpro/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/easy-toolbar-2/</link>
					<title><![CDATA[Easy ToolBar 2]]></title>
                    					    <author><![CDATA[SANSoft]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Easy ToolBar 2</h1>
													</header>
													<div id="sol_opis">Обновленное решение для легкой организации кнопок на тулбарах и их программирования</div>
<div id="sol_body">Разрабатывался на VFP9. Думаю, что будет работать и на 8-ке.</p>
<p> Кратко об использовании:</p>
<p> В головном файле - создать переменную и запихнуть туда ссылку на тулбар</p>
<p> Потом создавайте в своих библиотеках кнопки, наследники от класса btn_all, придавайте им нужный вид<br /> и кидайте на свои формы.</p>
<p> В форме нужно будет подправить событие Activate для обновления тулбара. (см.пример)</p>
<p> (для кнопок можно указывать тоолтипы и хоткеи)</p></div>
<div id="sol_avtor">Автор: Александр Семеновский</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4347">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4347">SANSoft</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="SANSoft" href="https://foxclub.ru/account/?user=4347">
				<img alt='' src='https://secure.gravatar.com/avatar/a1bfcdf8367176ffbcbff3a56c55d3d2?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/a1bfcdf8367176ffbcbff3a56c55d3d2?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-09-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/easy-toolbar-2/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/filefix/</link>
					<title><![CDATA[FileFix]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:30 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>FileFix</h1>
													</header>
													<div id="sol_opis">Утилита Леса Пинтера для ремонта DBF файлов, реализованная в среде VFP8.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Лес Пинтер</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/filefix/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ochet-na-osnove-shablona-formata-rtf/</link>
					<title><![CDATA[Очет на основе шаблона формата RTF]]></title>
                    					    <author><![CDATA[Влад Колосов]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:30 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Очет на основе шаблона формата RTF</h1>
													</header>
													<div id="sol_opis">Ввиду того, что некоторые предприятия отказываются от использования MS Office и переходят к различным вариантам бесплатного редактора и электронных таблиц, был разработан этот класс для использования RTF документов в качестве основы для отчетов.    Подробности в архиве, проверено на 7.0 и 9.0 </div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Владислав Колосов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4894">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4894">Влад Колосов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Влад Колосов" href="https://foxclub.ru/account/?user=4894">
				<img alt='' src='https://secure.gravatar.com/avatar/6d059ca093aa6e3bd9ac83999fb80409?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/6d059ca093aa6e3bd9ac83999fb80409?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 05-05-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ochet-na-osnove-shablona-formata-rtf/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/splitter-clas-dlya-vfp9/</link>
					<title><![CDATA[Splitter clas для VFP9]]></title>
                    					    <author><![CDATA[mvictor]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:30 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Splitter clas для VFP9</h1>
													</header>
													<div id="sol_opis">на мой взгляд простой и удачный splitter для vfp9 основанный на якорях</div>
<div id="sol_body">на мой взгляд простой и удачный splitter для vfp9 основанный на якорях<br /> решение не мое - поэтому только ссылка <br /> <a href=http://www.sweetpotatosoftware.com/SPSBlog/CategoryView,category,Visual%20Foxpro.aspx>http://www.sweetpotatosoftware.com/SPSBlog/CategoryView,category,Visual%20Foxpro.aspx</a><br /> там же есть "календарь" и "progressbar"<br /> вроде бы там все FREE</div>
<div id="sol_avtor">Автор: Виктор</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4114">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4114">mvictor</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="mvictor" href="https://foxclub.ru/account/?user=4114">
				<img alt='' src='https://secure.gravatar.com/avatar/fe5d5f09f1689e72ae130c5aa438d707?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/fe5d5f09f1689e72ae130c5aa438d707?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 04-10-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/splitter-clas-dlya-vfp9/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/prostejshij-prosmotr-tekstovyh-fajlov/</link>
					<title><![CDATA[Простейший просмотр текстовых файлов]]></title>
                    					    <author><![CDATA[ShmSoft]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:30 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Простейший просмотр текстовых файлов</h1>
													</header>
													<div id="sol_opis">Простейший просмотр текстовых файлов</div>
<div id="sol_body">------------------------------------  Прелюдия: *---------------- ...Что тут скажешь, вся Наша, (с Вами) работа   сводиться к обслуживанию любимых юзеров... короче, решаем проблему: "дайте посмотреть и...(может быть) распечатать",  я уточняю, "хор</div>
<div id="sol_avtor">Автор: shmsoft</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4645">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4645">ShmSoft</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="ShmSoft" href="https://foxclub.ru/account/?user=4645">
				<img alt='' src='https://secure.gravatar.com/avatar/9020c1b31972c9dabbcde4d3c4a372dd?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/9020c1b31972c9dabbcde4d3c4a372dd?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-11-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/prostejshij-prosmotr-tekstovyh-fajlov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-dates-dlya-vyborov-razlichnyh-periodov-vremeni/</link>
					<title><![CDATA[класс Dates для выборов различных периодов времени]]></title>
                    					    <author><![CDATA[Aries]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:25 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>класс Dates для выборов различных периодов времени</h1>
													</header>
													<div id="sol_opis">Класс для выборов различных периодов допустим за первый квартал, за второе полугодие или декаду.</div>
<div id="sol_body">Вот возникла передо мной задача выбора периода в разных<br /> приложениях. Допустим, выбрать данные за первый квартал,<br /> за второе полугодие или декаду. Каждый раз писать одни и<br /> теже процедурки определения дат периодов для разных<br /> программ мне надоело. И вот родилось решение класс Dates.<br /> Теперь как все это работает.<br /> Помещаете контейнер oControl на форму и все радуйтесь жизни.<br /> Т.е. получаете нужные вам даты.<br /> В объекте oControl есть два основных свойства свойства, к примеру<br /> THISFORM.oControl.ValueBeg - это начало периода (даты)<br /> THISFORM.oControl.ValueEnd - это окончание периода (даты)<br /> Формат этих двух свойств DateTime. </p>
<p> Третье свойство объекта oControl nValue.<br /> Оно принимает значение от 1-7. Это означает:<br /> 1 - День<br /> 2 - Декада<br /> 3 - Месяц<br /> 4 - Квартал<br /> 5 - Полугодие<br /> 6 - Год<br /> 7 - Период<br /> nValue нужно для того чтобы по умолчанию определять,<br /> что вы хотите получить. К примеру вам надо что бы по<br /> умолчанию ну становилось не День, а на месяц.<br /> Для этого надо (в дизайнере НЕЛЬЗЯ присваивать новое значение)<br /> допустим в Init формы прописать такую строчку<br /> THISFORM.oControl.nValue=3 (можно от 1 до 7)<br /> Получите месяц.</p>
<p> В проекте есть формочка Form1 запустите и увидите как это работает!!!<br /> Удачи! <br /> 04.08.2005г.<br /> Переделал немного внутреннюю работу.<br /> Сделал событие Valid для контейнера. Это для<br /> того, что бы срабатывало одно событие при выборе значение из любого<br /> объекта.</div>
<div id="sol_avtor">Автор: aries</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4794">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4794">Aries</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Aries" href="https://foxclub.ru/account/?user=4794">
				<img alt='' src='https://secure.gravatar.com/avatar/41cb07f73054c6ace4bc67d9d56f5947?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/41cb07f73054c6ace4bc67d9d56f5947?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-12-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-dates-dlya-vyborov-razlichnyh-periodov-vremeni/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/iecombo/</link>
					<title><![CDATA[IECombo]]></title>
                    					    <author><![CDATA[Aries]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:27 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>IECombo</h1>
													</header>
													<div id="sol_opis">Вот пример комбобокса по аналогии с Internet Explorer</div>
<div id="sol_body">
<h3>IECombo</h3>
<p> Вот и я решил написать свой IECombo.<br /> Хотя наверное надо было посмотреть решения с данного сайта.<br /> Но раз написал так тому и быть. Довольно просто получилось.<br /> Теперь как это все работает.<br /> В папке PRG есть файл LibFormList.prg В нем описан класс <br /> выпадающего листа.<br /> В папке LIBS есть библиотека LibCombo в ней класс oComboBox<br /> Ложите на форму и радуетесь работе.<br /> В контейнере есть такие свойства:<br /> Height_List - высота выпадающего листа.<br /> RowSource - прописываете сюда название таблицы и поле.<br /> Прим: RowSource="tMyTable.cMyPole"<br /> RowSourceType - думаю с этим тоже все понятно<br /> По умолчанию, если вы ничего не прописали в RowSourceType<br /> принимается равным 2.<br /> *********************************<br /> Запустите форму Form1 и посмотрите как это все дело <br /> работает.<br /> Дополню что это дело работате в VFP8 в младших<br /> версия не проверял.<br /> В проекте есть еще библиотека LibsObjects это мои суперобъекты<br /> для ресайзинга, на их основе написан и IECombo. Если кому-то не<br /> по душе по суперобъекты, просто откройте библиотеку LibCombo как<br /> таблицу и исправте ParentClass на базовые классы.<br /> **********************<br /> И еще выпадающий лист может менять свой размер.<br /> **********************<br /> Сделал выбор значения из листа по одному клику.<br /> Сделал размеры листа статическими, так как при изменении<br /> резмеров иногда вываливается критическая ошибка.<br /> 04.08.2005г.<br /> Сделал полную аналогию со стандартным комбо.т.е поддержка Bound<br /> Добавил событие Valid в контейнер.<br /> К сожалению в грид так и не удалось встроить, но думаю это и не надо<br /> Если вводить занчение и ничего не было найдено, то при потере фокуса объектом<br /> поле закрасится в красный цвет, а если найдено и выбрано, то в синий.   </div>
<div id="sol_avtor">Автор: Aries</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4794">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4794">Aries</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Aries" href="https://foxclub.ru/account/?user=4794">
				<img alt='' src='https://secure.gravatar.com/avatar/41cb07f73054c6ace4bc67d9d56f5947?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/41cb07f73054c6ace4bc67d9d56f5947?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-12-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/iecombo/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/forma-dlya-vybora-neskolkih-fajlov/</link>
					<title><![CDATA[Форма для выбора нескольких файлов.]]></title>
                    					    <author><![CDATA[TAS]]></author>
                    										    <pubDate>Fri, 04 Nov 2022 14:27:34 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Форма для выбора нескольких файлов.</h1>
													</header>
													<div id="sol_opis">Может использоваться в задачах, связанных с документооборотом или импортом файлов. Основные возможности: * Возможность задания неограниченного количества масок файлов; * Возможность ограничить общий размер выбранных файлов; * Позволить просматривать файлы в приложениях по умолчанию; * Возможность разрешить или запретить пользователю менять директорию.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Т. Аскольд</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4728">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4728">TAS</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="TAS" href="https://foxclub.ru/account/?user=4728">
				<img alt='' src='https://secure.gravatar.com/avatar/7004b77ba9803498111fe71a830bd53f?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7004b77ba9803498111fe71a830bd53f?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/forma-dlya-vybora-neskolkih-fajlov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/korrektnyj-shortcut-kategorii-editsinhronizirovan-s-sistemnym-menyu-i-knopkami-paneli-instrumentov/</link>
					<title><![CDATA[Корректный ShortCut категории Edit(синхронизирован с системным меню и кнопками панели инструментов)]]></title>
                    					    <author><![CDATA[po2]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Корректный ShortCut категории Edit(синхронизирован с системным меню и кнопками панели инструментов)</h1>
													</header>
													<div id="sol_opis">Некоторое время назад в конференции состоялся короткий, но весьма эмоциональный обмен мнениями по поводу корректного отображения доступности позиций контекстного меню категории Edit(см. http://nsvisual.com/ph/read.php3?f=5&amp;i=17763&amp;t=17763). Предлагаемый пример демонстрирует один из возможных способов решения этой проблемы. Кроме этого, он наверное будет интересен и сторонникам русскоязычных эквивалентов стандартных ToolBar'ов.  Замечание к обновленной версии решения. Метод синхронизации доступности позиций меню и соответствующих кнопок на панели инструментов с помощью таймера и функции SKPBAR() требует различной организации системного и контекстного меню. Обновленный пример проверен в версиях VFP-6/7/8/9. Однако следует сначала один раз перестроить проект с перекомпилированием всех файлов.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Ившев Дмитрий</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4770">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 8 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4770">po2</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="po2" href="https://foxclub.ru/account/?user=4770">
				<img alt='' src='https://secure.gravatar.com/avatar/c214a28bf1871abdce1868aac0111f84?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c214a28bf1871abdce1868aac0111f84?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 22-12-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/korrektnyj-shortcut-kategorii-editsinhronizirovan-s-sistemnym-menyu-i-knopkami-paneli-instrumentov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/variacziya-na-temu-opendialog/</link>
					<title><![CDATA[Вариация на тему OpenDialog]]></title>
                    					    <author><![CDATA[Vladimir_Knyr]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:30 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Вариация на тему OpenDialog</h1>
													</header>
													<div id="sol_opis">Возвращает массив - список имен файлов, для групповой операции</div>
<div id="sol_body">Позволяет сделать интерактивную выборку файлов,<br /> для последующей обработки.</p>
<p> просто откройте тестовый проект и сделайте RUN<br /> (возможно BUILD..., с параметрами Application & RunAfterBuild)</p>
<p> делалось на VFP8.<br />  обновил. PS в коде кнопок THIS заменено на THISFORM</div>
<div id="sol_avtor">Автор: Владимир Кныр</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4754">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4754">Vladimir_Knyr</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Vladimir_Knyr" href="https://foxclub.ru/account/?user=4754">
				<img alt='' src='https://secure.gravatar.com/avatar/7dd8187cfc903829e54ae52b377e8a5a?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7dd8187cfc903829e54ae52b377e8a5a?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 15-12-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/variacziya-na-temu-opendialog/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/poluchenie-kursov-valyut-ot-rbc-po-metodu-1s/</link>
					<title><![CDATA[Получение Курсов валют от RBC по методу 1С]]></title>
                    					    <author><![CDATA[Tim]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 15:03:46 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Получение Курсов валют от RBC по методу 1С</h1>
													</header>
													<div id="sol_opis">Получение Курсов валют от RBC по методу 1С</div>
<div id="sol_body">Встретил пример счел его уж слишком не надежным<br />
написал prg по подобию получения 1С - это уже стабильно!!!<br />
(чем разбирать html)<br />
пример использования</div>
<p><pre class='bbcode'>  <br />  
 *************************************************************<br />  
  MESSAGEBOX(get_inet_kurs(1,1)) &amp;&amp;Курс USD на текущую дату<br />  
  MESSAGEBOX(get_inet_kurs(1,2,CTOD([05.06.2005]),CTOD([06.06.2005]),'tmp'))<br />  
  BROWSE LAST<br />  
  USE<br />  
    
</pre></p>
<div id="sol_avtor">Автор: Тимур</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="2174">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=2174">Tim</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Tim" href="https://foxclub.ru/account/?user=2174">
				<img alt='' src='https://secure.gravatar.com/avatar/16b5ae59195e39687cd52538a280748b?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/16b5ae59195e39687cd52538a280748b?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 19-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/poluchenie-kursov-valyut-ot-rbc-po-metodu-1s/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Импорт-экспорт]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/winapi-struktury-v-vfp/</link>
					<title><![CDATA[WinAPI структуры в VFP]]></title>
                    					    <author><![CDATA[JS]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:30 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>WinAPI структуры в VFP</h1>
													</header>
													<div id="sol_opis">Перевод статьи Кристофа Ланге и Марка Вильдена и класс для использования структур в Visual FoxPro</div>
<div id="sol_body">Перевод статьи можно посмотреть по адресам http://www.hot.ee/jurisfox/vfpplus/using_winapi_structures_01_ru.htm,<br /> http://kodu.neti.ee/~juri4/vfpplus/using_winapi_structures_01_ru.htm. Класс с оригиналом статьи приложен.</div>
<div id="sol_avtor">Автор: Юрий Шутенко</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4816">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4816">JS</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="JS" href="https://foxclub.ru/account/?user=4816">
				<img alt='' src='https://secure.gravatar.com/avatar/c14f791251381015573ba12653f4718a?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c14f791251381015573ba12653f4718a?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 04-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/winapi-struktury-v-vfp/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Система]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/proverka-registraczii-klassa-v-sisteme/</link>
					<title><![CDATA[Проверка регистрации класса в системе&#8230;]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 02 Dec 2022 15:54:43 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Проверка регистрации класса в системе&#8230;</h1>
													</header>
													<p>Не знаю, сталкивался ли кто с такой ситуацией, когда необходимо в приложении определить зарегистрирован в системе тот или иной класс, ну, скажем "Wscrip.Shell" или "Word.Application.8"</p>
<p>
В качестве параметра передается имя класса "Word.Application.8", а возвращается- путь к файлу или пусто.</p>
<pre class="bbcode">LPARA cClassName
*!* Параметр название класса
cClID=fregget('',cClassName+'\CLSID',1)
cFilePath=fregget('','CLSID\'+ALLTRIM(cClID)+'\InProcServer32',1)
if EMPTY (cFilePath)
cFilePath=fregget('','CLSID\'+ALLTRIM(cClID)+'\LocalServer32',1)
ENDIF
*!* Если такой класс зарегистрирован- возвращается путь к файлу, иначе пустая строка.
RETURN ALLTRIM(cFilePath)

*!* Это общая функция чтения данных из реестра 
Function fregget
LPARAMETER name, key,div
*!*	 name имя параметра,значение которого надо получить
*!*	 key полное имя раздела реестра
*!*	 div базовый ключ реестра
*!*	div=1 	HKEY_CLASSES_ROOT           -2147483648  
*!*	div=2	HKEY_CURRENT_USER           -2147483647  
*!*	div=3	HKEY_LOCAL_MACHINE          -2147483646  
*!*	div=4	HKEY_USERS                  -2147483645  
 DECLARE INTEGER RegOpenKey IN Win32API INTEGER, STRING @, INTEGER @
 DECLARE INTEGER RegCloseKey IN Win32API INTEGER
 DECLARE INTEGER RegQueryValueEx IN Win32API INTEGER, STRING, INTEGER, INTEGER @, STRING @,INTEGER @
 PRIVATE keyhandle, data, datalen, path
       IF LEFT(M.key, 1)='\'
           M.path = SUBSTR(M.key, 2)
     ELSE
           M.path = M.key
      ENDIF
 IF PARA()=2
 M.div=-2147483646 
 ELSE
DO CASE
CASE div=1

M.div=-2147483648 
CASE div=2
M.div=-2147483647
CASE div=3
M.div=-2147483646
CASE div=4
M.div=-2147483645
OTHERWISE
M.div=-2147483646 
ENDCASE
 ENDIF
 keyhandle = 0
 data = SPACE(256)
 datalen = LEN(M.data)
 type = 0
 = regopenkey(M.div,M.path,@M.keyhandle)
 = regqueryvalueex(M.keyhandle,M.name,0,@M.type,@M.data,@M.datalen)
 = regclosekey(M.keyhandle)
 DO CASE
      CASE M.type=1

           IF M.datalen &lt; AT(CHR(0), M.data)-1
                M.data = LEFT(M.data, M.datalen)
           ELSE
                M.data = LEFT(M.data, AT(CHR(0), M.data)-1)
           ENDIF
      CASE M.type=4
           nn = 0
           FOR n = M.datalen TO 1 STEP -1
                nn = nn+ASC(SUBSTR(M.data, n,1))*(256^(n-1))

           ENDFOR

           M.data = TRANSFORM(nn, "@0")
           M.data = SUBSTR(M.data, AT('x',M.data)+1)
 ENDCASE
 RETURN M.data
</pre>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/proverka-registraczii-klassa-v-sisteme/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Система]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/pochta-otpravka-priem-v-komplekte-ocx/</link>
					<title><![CDATA[Почта, отправка прием, в комплекте OCX]]></title>
                    					    <author><![CDATA[dimon555]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:30 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Почта, отправка прием, в комплекте OCX</h1>
													</header>
													<div id="sol_opis">Класс для работы с почтой, очень даже неплохой</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Дмитрий</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4333">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4333">dimon555</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="dimon555" href="https://foxclub.ru/account/?user=4333">
				<img alt='' src='https://secure.gravatar.com/avatar/bb4f63a4d8f65520982310b77da46e7e?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/bb4f63a4d8f65520982310b77da46e7e?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 07-06-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/pochta-otpravka-priem-v-komplekte-ocx/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/orientirovanie-v-gridech-2/</link>
					<title><![CDATA[Ориентирование в Grid’е(ч.2)]]></title>
                    					    <author><![CDATA[po2]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:30 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Ориентирование в Grid’е(ч.2)</h1>
													</header>
													<div id="sol_opis">Рассмотрен случай взаимодействия функции ObjToClient() с группой свойств [Dynamic…], для получения значения неявного свойства Column.Left. Без претензий на законченное решение.</div>
<div id="sol_body">Современный вариант Grid’а(VFP-8/9) казалось бы, насыщен изысками интерфейса под завязку. Однако существуют приложения, в которых Fox’совский Grid заставляет программиста ломать голову над проблемой компактного размещения информации в клетках таблицы. Решение общеизвестно, пожертвовать числом строк в пользу большего числа элементов в каждой из них. Стандартный Container или Control позволяют легко расположить нужную коллекцию объектов в несколько этажей. Но заголовок Grid’а по-прежнему прост, а при включенных XP-схемах еще и весьма коварен. Текст и картинка, вот и все, что можно себе позволить. Естественно, что Fox-сообщество не сидело сложа руки и создавало заменители Header’а. Базовым классом для такого псевдо - заголовка  чаще всего выбирался Container. Штатный Header с помощью свойства HeaderHeight низводился до нуля, и пока форма полностью вмещала Grid по ширине, а размеры и положение колонок оставались неизменными, все было Ok. Однако для повторения естественного взаимодействия связки «заголовок - колонка» приходилось писать не самый простой код, а иногда и приплясывать с бубном. Будь у колонки штатное свойство Left с возможностью назначения ему события Left_Assign, синхронизация любых объектов стала бы значительно более простым делом. Как вытянуть значение неявного свойства  Column.Left знают практически все. Функция ObjToClient() честно сообщает, где начинается очередная секция. Теперь осталось найти диспетчера, который бы уведомлял о перерисовке Grid’а. Например, какое-либо из свойств группы [Dynamic…]. Пользовательская функция, использованная в качестве начинки любого из этих свойств, срабатывает даже при проносе стороннего окна над формой содержащей Grid. <br /> Вот собственно и вся идея синхронизации. В качестве иллюстрации использования метода представлена форма, в которой для колонок Grid’а созданы заголовки на базе Container’а, имитирующие штатные. Подобным образом можно выводить любые объекты в нужных координатах в зависимости от состояния сетки.</div>
<div id="sol_avtor">Автор: Ившев Дмитрий</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4770">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 8 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4770">po2</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="po2" href="https://foxclub.ru/account/?user=4770">
				<img alt='' src='https://secure.gravatar.com/avatar/c214a28bf1871abdce1868aac0111f84?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c214a28bf1871abdce1868aac0111f84?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 22-12-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/orientirovanie-v-gridech-2/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/perevod-makrosa-excel-v-sintaksis-foxpro/</link>
					<title><![CDATA[Перевод макроса Excel в синтаксис FoxPro]]></title>
                    					    <author><![CDATA[Владимир Максимов]]></author>
                    										    <pubDate>Sat, 19 Nov 2022 18:18:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Перевод макроса Excel в синтаксис FoxPro</h1>
													</header>
													<p><a href="#MacrosExcel">Исходный макрос Excel</a><br />
<a href="#OpenExcel">Открытие листа Excel в FoxPro</a><br />
<a href="#IntelliSens">Подключение механизма IntelliSens в FoxPro</a><br />
<a href="#Select">Метод Select</a><br />
<a href="#Function">Указание диапазона ячеек для функции</a><br />
<a href="#Range">Указание произвольного диапазона ячеек</a><br />
<a href="#CommaOrSemicolon">Когда использовать "запятую", а когда "точку с запятой"</a><br />
<a href="#NumberFormat">Указание формата ячеек</a><br />
<a href="#Constant">Константы Excel</a><br />
<a href="#Parameters">Именованные параметры функций Excel</a><br />
<a href="#Borders">Рисование рамки вокруг всех данных</a><br />
<a href="#Other">Перенос слов, выравнивание, ширина столбца и высота строки</a></p>
<p>
Вы вероятно уже знаете, что для того, чтобы определить как именно (какой командой) в Excel можно сделать то или иное проще всего выполнить это действие прямо в Excel с одновременной записью Ваших действий.</p>
<p>Для этого выбирается пункт меню Excel с именем "Сервис" - "Макрос" - "Начать запись". В появившемся окне указываем имя макроса (по умолчанию "Макрос1") и нажимаем кнопку "Ok". В результате, поверх листа Excel появляется маленькое специфическое окошко - ToolBar - с именем "Остановить запись" и все Ваши действия будут автоматически записываться.</p>
<p>После того, как Вы выполните все необходимые действия, остановите запись макроса. Для этого просто нажмите иконку с черным квадратиком в этом ToolBar с именем "Остановить запись". Далее выберите пункт меню Excel с именем "Сервис" - "Макрос" - "Макросы". Выберите имя только что записанного макроса (по умолчанию "Макрос1") и нажмите кнопку "Изменить".</p>
<p>Откроется окно редактора Micosoft Visual Basic в котором будет отображен код Вашего макроса. Это все замечательно, но возникает вопрос: как перевести то, что здесь написано в синтаксис FoxPro? И как вообще использовать это в FoxPro? Вот ответам на эти вопросы и посвящена данная статья.</p>
<p>Сразу замечу, что почти без изменений все приведенные советы можно применить к Word. Для примера выбран Excel потому, что в нем проще адресация. Весь лист разбит на ячейки, к которым собственно и ссылаемся.</p>
<p></p>
<h3><a name="MacrosExcel"></a>Исходный макрос Excel</h3>
<p>Сначала собственно создадим макрос, переводом которого позже и займемся. Откройте Excel, создайте новый файл и запустите запись макроса через пункт меню "Сервис" - "Макрос" - "Начать запись". Имя макроса оставьте в значении по умолчанию "Макрос1" и нажмите кнопку "Ok".</p>
<p>Далее заполняем лист Excel таким содержимым</p>
<table border="" cellspacing="1" cellpadding="7">

<tr>
<td align="CENTER"><b>Название<br />
реквизита</b></td>
<td align="CENTER"><b>Значение<br />
реквизита</b></td>
</tr>
<tr>
<td>Первый</td>
<td align="RIGHT" bgcolor="RED">1 234,56</td>
</tr>
<tr>
<td>Второй</td>
<td align="RIGHT">9 876,54</td>
</tr>
<tr>
<td><b>ИТОГО</b></td>
<td align="RIGHT"><b>11 111,10</b></td>
</tr>

</table>
<p>Здесь сделано следующее:</p>
<ul>
<li>Вся первая и последняя строка выделены жирным шрифтом</li>
<li>Содержимое всех ячеек первой строки переносится по словам</li>
<li>Для второго столбца установлен формат данных: числовой, два знака после запятой, пробел между тройками чисел</li>
<li>Также для второго столбца, точнее, только для числовых ячеек, установлен условный формат: выделить фон ячейки красным, если его содержимое меньше 2000</li>
<li>Последняя строка второго столбца содержит формулу суммирования содержимого всех строк таблицы по второму столбцу</li>
<li>Все заполненные ячейки обрамлены сеткой</li>
</ul>
<p>Останавливаю запись макроса и смотрю, что же у меня получилось. Пункт меню "Сервис" - "Макрос" - "Макросы". Выбираю имя только что записанного макроса "Макрос1" и нажимаю кнопку "Изменить".</p>
<hr />
<pre class="bbcode"> Sub Макрос1()
'
' Макрос1 Макрос
' Макрос записан 10.05.2005 (Максимов)
'

'
'   Ввод содержимого ячеек
    ActiveCell.FormulaR1C1 = "Название реквизита"
    Range("B1").Select
    ActiveCell.FormulaR1C1 = "Значение реквизита"
    Range("A2").Select
    ActiveCell.FormulaR1C1 = "Первый"
    Range("B2").Select
    ActiveCell.FormulaR1C1 = "1324.56"
    Range("A3").Select
    ActiveCell.FormulaR1C1 = "Второй"
    Range("B3").Select
    ActiveCell.FormulaR1C1 = "9876.54"
    Range("A4").Select
    ActiveCell.FormulaR1C1 = "ИТОГО"

'   Формула расчета итога
    Range("B4").Select
    ActiveCell.FormulaR1C1 = "=SUM(R[-2]C:R[-1]C)"

'   Выделение первой и последней строк жирным шрифтом
    Range("1:1,4:4").Select
    Range("A4").Activate
    Selection.Font.Bold = True

'   Установка формата для второго столбца
    Columns("B:B").Select
    Selection.NumberFormat = "#,##0.00"

'   Установка условного формата для числовых данных второго столбца
    Range("B2:B4").Select
    Selection.FormatConditions.Delete
    Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlLess, _
        Formula1:="2000"
    Selection.FormatConditions(1).Interior.ColorIndex = 3

'   Рисование рамки вокруг всех данных
    Range("A1:B4").Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With

'   Установка формата данных для первой строки (перенос по словам и выравнивание)
    Rows("1:1").Select
    Selection.NumberFormat = "@"
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlTop
        .WrapText = True
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With

'   Уточнение ширины столбцов
    Columns("A:A").ColumnWidth = 11.57
    Columns("B:B").ColumnWidth = 10.14

'   Уточнение высоты первой строки
    Selection.RowHeight = 25.5

'   Переход на первую ячейку для сброса выделений
    Range("A1").Select
End Sub
</pre>
<hr />
<p>Разумеется, внутри кода макроса нет никаких комментариев. Я их расставил сам, для облегчения восприятия. Все остальное взято из кода макроса без изменений. Теперь попробуем разобрать, что же такое здесь понаписано.</p>
<p></p>
<h3><a name="OpenExcel"></a>Открытие листа Excel в FoxPro</h3>
<p>Прежде чем приступить к "разбору полетов" собственно макроса, небольшое отступление, для того, чтобы показать как собственно открыть Excel из FoxPro. Дело в том, что последующий код перевода макроса будет, так или иначе, ссылаться на открытый лист Excel.</p>
<p>Новый лист Excel открывается следующим образом</p>
<hr />
<pre><pre class='bbcode'>  * Создаем объект Excel  
  LOCAL loExcel  
  loExcel=CREATEOBJECT('Excel.Application')  
    
 * Создаем в нем новую рабочую книгу  
  LOCAL loBook  
  #DEFINE xlWBATWorksheet -4167  
  loBook = m.loExcel.workbooks.Add(xlWBATWorksheet)  
    
 * Создаем ссылку на новый лист в рабочей книге  
  LOCAL loSheet  
  loSheet = m.loBook.Sheets(1)  
    
 * Делаем Excel видимым  
 * Эту команду надо давать в самом конце формирования листа Excel  
 * здесь она приведена для наглядности  
  loExcel.Visible= .T.  
    
</pre> </pre>
<hr />
<p>Здесь сразу нужны некоторые пояснения.</p>
<p>Иерархия главных объектов Excel достаточно проста:</p>
<pre class="bbcode"><b>Сам объект Excel (Excel.Application) 
	Коллекция рабочих книг (WorkBooks) 
		Коллекция листов (Sheets) 
			Набор ячеек (Range, Cells, Columns, Rows)
</b></pre>
<p><b></b></p>
<p><b>Сам объект Excel (Excel.Application)</b> - это некая "оболочка", которая сама по себе особого интереса не представляет. Ну, примерно как собственно среда FoxPro не имеет особого смысла без каких-то пользовательских форм или меню. Это просто "среда", где и "живут" все прочие объекты Excel</p>
<p><b>Коллекция рабочих книг (WorkBooks)</b> - одна рабочая книга - это один файл XLS. Как правило, в одном объекте Excel открывается только один файл XLS (рабочая книга). Но, в принципе, можно открыть и несколько файлов XLS в одном объекте Excel.</p>
<p><b>Коллекция листов (Sheets)</b> - один лист - это одна "страница" файла XLS. Или одна "сетка". При использованном выше способе создания рабочей книги будет создана рабочая книга только с одним листом. Если же вообще не указывать никаких параметров в методе Add при создании новой рабочей книги, то количество листов будет определяться настройками Excel у клиента. Пункт меню Excel с именем "Сервис" - "Параметры" - Закладка "Общие" - реквизит "Листов в новой книге"</p>
<p><b>Набор ячеек (Range, Cells, Columns, Rows)</b> - это уже собственно ячейки листа Excel. Возможны разные способы адресации к ячейкам:</p>
<ul>
<li><b>Range</b> - произвольный набор ячеек, никак не связанных между собой. В частности, это может быть и одна ячейка, и строка, и столбец, и просто перечисление каких-либо ячеек</li>
<li><b>Cells</b> - одна ячейка выделенного диапазона</li>
<li><b>Columns</b> - один или несколько столбцов</li>
<li><b>Rows</b> - одна или несколько строк</li>
</ul>
<p>Чтобы начать заполнять лист Excel надо предварительно обязательно открыть сам объект Excel и в нем создать (или открыть) рабочую книгу.</p>
<p>Объект Excel создается именно командой CreateObject(), а не предварительной попыткой использовать уже существующий объект Excel через команду GetObject() не для наглядности. Именно так и следует поступать! Дело в том, что при использовании команды GetObject() неизвестно, какой именно из существующих объектов Excel будет "захвачен". Такая неопределенность рано или поздно, но "выйдет боком". Поэтому лучше создать новый объект и быть уверенным, что при этом никак не испортишь ранее открытые объекты Excel.</p>
<p>В приведенном выше примере я в конце концов получил ссылку на нужный мне лист Excel. Далее я буду работать именно с этой ссылкой. Однако, в принципе, вместо полной иерархии "Объект Excel - Рабочая книга - Лист - ячейка" можно работать и напрямую "Объект Excel - ячейка". Т.е. "пропустив" всю "лишнюю" иерархию "Рабочая книга - Лист".</p>
<p>Только следует иметь в виду, что при такой адресации тем не менее "пропущенная" иерархия будет использована. Но использована неявно. По умолчанию. В этом случае предполагается, что идет ссылка на <u>активную</u> рабочую книгу и <u>активный</u> лист. Обратите внимание на слово "активный". Это вовсе не означает "первый". Это именно "активный". Но это может быть, например, десятый лист.</p>
<p></p>
<h3><a name="IntelliSens"></a>Подключение механизма IntelliSens в FoxPro</h3>
<p>Начиная с версии Visual FoxPro 7 появился механизм IntelliSens. Если у Вас младшая версия FoxPro, то данный раздел Вы можете смело пропустить. Для собственно перевода кода макроса Excel в синтаксис FoxPro то, что написано в данном разделе принципиального значения не имеет. Это просто дополнительные удобства, связанные исключительно с механизмом IntelliSens</p>
<p>Итак, механизм IntelliSens в частности отображает список всех свойств, методов и событий объекта в выпадающем списке, который появляется автоматически как только Вы установите точку сразу за именем объекта. Однако чтобы этот механизм сработал в программе необходимо выполнить то, что в FoxPro называется "ранее связывание". Другими словами, необходимо как-то дать понять FoxPro еще на этапе написания программного кода какой именно объект "скрывается" за выбранным именем переменной. Для этого используется специальный синтаксис в определении области видимости объекта. В данном случае, примерно так:</p>
<p>LOCAL loExcel as Excel.Application<br />
loExcel=CREATEOBJECT('Excel.Application')</p>
<p>Откуда FoxPro узнал о том, где взять список свойств, событий и методов объекта Excel.Application? А из системного реестра Windows. Точнее, конечно, в системном реестре храниться не сам список свойств, а ссылка на библиотеку, в которой эти свойства описаны. Просто в процессе установки собственно Excel в системном реестре Windows был сформирован некий идентификатор для объекта с названием Excel.Application. А уже по этому идентификатору можно определить массу информации связанную с этим объектом. В том числе и полный путь к файлу со списком свойств и методов данного объекта.</p>
<p>Все это, конечно, хорошо. Но ведь основная работа будет происходить не собственно с объектом Excel.Application, а с объектами, существующими внутри Excel.Application. Неужели, для того, чтобы работал механизм IntelliSens придется всегда писать полную иерархию объектов Excel начиная с самого верхнего уровня?</p>
<p>Нет. Не придется. Разработчики механизма IntelliSens предусмотрели возможность явного подключения списка свойств, методов и событий, как самого объекта, так и объектов, существующих внутри него.</p>
<p>В данном случае надо воспользоваться пунктом системного меню FoxPro с именем Tools - подпункт IntelliSens. В открывшемся окне перейдите на закладку Types и нажмите кнопку Type Libraries. Появится список тех объектов, которые зарегистрированы в системном реестре Windows. Вам следует найти в этом списке объект "<b>Microsoft Excel 10.0 Obect Library</b>". Или с большим номером. Библиотека с номером 5.0 нас не интересует, поскольку она не даст нужного результата.</p>
<p>Ставите птичку слева от имени "<b>Microsoft Excel 10.0 Obect Library</b>" и нажмите кнопку "Done". Это вовзвращает Вас в окно IntelliSens Meneger. Убедитесь, что в списке объектов в этом окне появилась только что выбраная Вами дополнительная библиотека, и нажмите кнопку "Ok"</p>
<p>Все. Теперь механизм IntelliSens будет работать не только для объекта, непосредственно зарегистрированного в системном реестре Windows, но и для "вложенных" в него объектов. Для этого, следует переписать приведенный выше код определения объектов следующим образом.</p>
<hr />
<pre><pre class='bbcode'>  * Создаем объект Excel  
  LOCAL loExcel as Excel.Application  
  loExcel=CREATEOBJECT('Excel.Application')  
    
 * Создаем в нем новую рабочую книгу  
  LOCAL loBook as Excel.Workbook  
  #DEFINE xlWBATWorksheet -4167  
  loBook = m.loExcel.workbooks.Add(xlWBATWorksheet)  
    
 * Создаем ссылку на новый лист в рабочей книге  
  LOCAL loSheet as Excel.Worksheet  
  loSheet = m.loBook.Sheets(1)  
    
 * Делаем Excel видимым  
 * Эту команду надо давать в самом конце формирования листа Excel  
 * здесь она приведена для наглядности  
  loExcel.Visible= .T.  
    
</pre> </pre>
<hr />
<p></p>
<h3><a name="Select"></a>Метод Select</h3>
<p>Первое, что бросается в глаза, при просмотре кода макроса Excel, это разбросанный по всему телу макроса метод <b>Select</b>. Что это такое? А это просто визуализация перехода или выделения нужной ячейки. Т.е. просто визуальное отображение того факта, что Вы встали, например, на ячейку "A1".</p>
<p>При написании кода в FoxPro нам это совсем не нужно. Ну, действительно, зачем нам <u>показывать</u> пользователю, что мы встали на ячейку "A1" и сейчас начнем в ней что-то менять?</p>
<p>Если сравнить с формами FoxPro, то метод <b>Select</b> в Excel аналогичен методу <b>SetFocus()</b> в FoxPro. А зачем нам переводить фокус, например, в TextBox, если я могу изменить его состояние и без этого? Достаточно просто получить ссылку на нужный объект. В данном случае на ячейку Excel.</p>
<p>Именно так и следует поступить. Тем более, что визуализация перехода на нужные ячейки занимает довольно значительное время. Тогда первая часть макроса - "заполнение ячеек" - в синтаксисе FoxPro с учетом предыдущего кода будет выглядеть так:</p>
<hr />
<pre><pre class='bbcode'>  * Ввод содержимого ячеек  
  m.loSheet.Cells(1,1).Value = "Название реквизита"  
  m.loSheet.Cells(1,2).Value = "Значение реквизита"  
  m.loSheet.Cells(2,1).Value = "Первый"  
  m.loSheet.Cells(2,2).Value = 1324.56  
  m.loSheet.Cells(3,1).Value = "Второй"  
  m.loSheet.Cells(3,2).Value = "9876.54"  
  m.loSheet.Cells(4,1).Value = "ИТОГО"  
    
</pre> </pre>
<hr />
<p>В данном случае идет обращение к каждой отдельной ячейке. Поэтому для получения ссылки я использовал метод Cell(номер строки, номер столбца).</p>
<p>Откуда я взял синтаксис использования Cells()? Да из HELP самого Excel. Я просто в коде макроса выделил ключевое слово "<b>Range</b>" и нажал клавишу F1. Далее посмотрел пример его использования и увидел такой замечательный метод Cells() и пример его использования.</p>
<p>Обратите внимание, что я передал число в одном случае как число (ячейка с координатами "2,2"), а в другом - как символьную строку (ячейка с координатами "3,2"). Но в обоих случаях Excel воспринял полученное значение именно как число. Это уже связано с особенностью интерпретации символьных строк самим Excel. В общем случае неочевидно, во что будет конвертировано содержимое символьной строки. Поэтому, логично указывать числа именно как числа. Впрочем, для однозначной интерпретации данных лучше делать предварительное форматирование ячеек Excel. Но об этом ниже.</p>
<p>О ссылках на диапазон ячеек отличный от одной ячейки будет рассказано далее.</p>
<p></p>
<h3><a name="Function"></a>Указание диапазона ячеек для функции</h3>
<p>По той же самой схеме, которая описана в предыдущем разделе, формулу для расчета итога можно записать так:</p>
<hr />
<pre><pre class='bbcode'>  * Формула расчета итога  
  m.loSheet.Cells(4,2).Value = "=SUM(R[-2]C:R[-1]C)"  
 * Или в более привычном виде  
  m.loSheet.Cells(4,2).Formula = "=SUM(B2:B3)"  
    
</pre> </pre>
<hr />
<p>Однако оба этих способа имеют недостатки. Начну с конца, как более очевидного</p>
<p>Второй способ записи неудобен тем, что в общем случае достаточно трудно перевести номер столбца в соответствующую букву. Вы можете сказать, какая буква будет соответствовать, например, 53 столбцу?</p>
<p>Как легко понять, первый способ использует относительные ссылки. Относительно текущей ячейки. Т.е. адрес:</p>
<p>R[-2]C</p>
<p>Следует читать как: строка (<b>R</b>ow) на 2 выше от текущей и тот же самый, текущий, столбец (<b>C</b>olumn)</p>
<p>Здесь проблема в том, что не всегда легко получить именно относительные значения. Особенно, если используемый диапазон ячеек не является "сплошным". Надо исключить ряд ячеек из расчета.</p>
<p>Немного покопавшись в HELP и поэкспериментировав, выяснилось, что можно писать не относительные ссылки, а абсолютные</p>
<hr />
<pre><pre class='bbcode'>  * Формула расчета итога  
  m.loSheet.Cells(4,2).Formula = "=SUM(R2C2:R3C2)"  
 * Или несколько более громоздко  
  m.loSheet.Cells(4,2).Formula = "=SUM("+m.loSheet.Cells(2,2).Address +":"+m.loSheet.Cells(3,2).Address +")"  
    
</pre> </pre>
<hr />
<p>Здесь первый вариант - это указание абсолютных ссылок. Второй вариант - это тоже абсолютные ссылки, но полученные не путем "расчета", а просто считанные из реквизитов нужных ячеек. Какой вариант для Вас более предпочтительный - решайте сами.</p>
<p>Использовать ли свойство Value или Formula в данном случае все равно. Оба свойства дадут один и тот же результат.</p>
<p>Обратите внимание еще на одну "тонкость". В данном случае использовано английское ключевое слово "SUM", несмотря на то, что я создал исходный макрос в русифицированной версии Excel. Т.е. если посмотреть, что же написано в самом листе Excel, то там будет стоять русское "СУММ".</p>
<p></p>
<h3><a name="Range"></a>Указание произвольного диапазона ячеек</h3>
<p>Далее в коде макроса стоит установка полужирного шрифта. Здесь сложность не в самой команде установки реквизита шрифта, а в указании диапазона ячеек, для которых надо что-то изменить. Кое-что уже было написано в предыдущем разделе посвященному указанию диапазона для формулы. Здесь опишу это подробнее.</p>
<p>Для указания произвольного диапазона ячеек используется метод Range(). В самом общем виде он имеет примерно такой синтаксис:</p>
<p>m.loSheet.Range("1:1;B:B;C2:D3")</p>
<p>В данном случае указан диапазон, в который входят: все ячейки первой строки, все ячейки столбца "B", все ячейки лежащие между ячейками "C2" и "D3". Т.е. символ двоеточия выступает как фраза "от ... до", а точка с запятой как фраза "... и ...".</p>
<p>Обратите внимание, что в коде макроса Excel вместо символа точки с запятой использован символ запятой. Это не опечатка. Это отличие синтаксиса внутри Excel и при работе с самим Excel как COM-компонентом. О том, когда надо использовать "точку с запятой", а когда просто "запятую" чуть ниже.</p>
<p>Внутри метода RANGE недопустимо использование абсолютных ссылок вида "R1C1", как это можно сделать внутри формул. Это вызовет ошибку. Следовательно, по сути, единственным способом указания произвольного диапазона остается считывание нужных адресов. Если взять приведенный выше пример, то получается так:</p>
<pre><pre class='bbcode'>   m.loSheet.Range(m.loSheet.Rows(1).Address+";"+;  
  	m.loSheet.Columns(2).Address+";"+;  
  	m.loSheet.Cells(3,2).Address+":"+m.loSheet.Cells(4,3).Address)  
    
</pre> </pre>
<p>Ну, а фрагмент кода макроса переводится в синтаксис FoxPro следующим образом:</p>
<pre><pre class='bbcode'>   m.loSheet.Range(m.loSheet.Rows(1).Address+";"+;  
  	m.loSheet.Columns(4).Address).Font.Bold = .T.  
    
</pre> </pre>
<p>Следует заметить, что писать в одном методе RANGE() слишком уж длинных строк диапазонов не надо. Дело в том, что у команд Excel, также как и у команд FoxPro, есть ограничение по длине. В данном случае - это вероятно 1024 символа на одну команду. Если Вы хотите одной командой изменить множество разрозненных ячеек, то следует их объединить при помощи метода Union. Примерно так:</p>
<pre><pre class='bbcode'>   LOCAL loUnion  
  loUnion = m.loExcel.UNION(m.loSheet.Rows(1),m.loSheet.Rows(2))  
  loUnion = m.loExcel.UNION(m.loUnion,m.loSheet.Cells(3,2))  
  loUnion = m.loExcel.UNION(m.loUnion,m.loSheet.Cells(3,3))  
  loUnion = m.loExcel.UNION(m.loUnion,m.loSheet.Cells(4,2))  
  loUnion = m.loExcel.UNION(m.loUnion,m.loSheet.Cells(4,3))  
  m.loUnion.Font.Bold = .T.  
    
</pre> </pre>
<p>Обратите внимание, что метод UNION относиться к объекту "Excel.Application" (переменная m.loExcel). Это значит, что в нем можно объединять диапазоны не просто из разных листов, но и из разных книг.</p>
<p>Метод UNION не может иметь меньше двух параметров. Однако нельзя одной командой указать больше 30 параметров. Впрочем, как видно из примера, можно наращивать уже объединенные ячейки. Т.е. в качестве первого параметра указать ранее объединенный через UNION диапазон ячеек.</p>
<p>Использование метода UNION - это еще один способ указания произвольного диапазона</p>
<p></p>
<h3><a name="CommaOrSemicolon"></a>Когда использовать "запятую", а когда "точку с запятой</h3>
<p>При переводе кода макроса Excel в синтаксис FoxPro иногда приходится заменять символ "запятой" на символ "точки с запятой" и наоборот. С чем это связано, и когда это необходимо делать?</p>
<p>Это связано с особенностью разделения параметров в синтаксисе Visual Basic и в синтаксисе FoxPro. Чтобы не залезать глубоко в "дебри" мудреных определений просто запомните общее правило:</p>
<p>Если необходимо отделить друг от друга элементы одного списка, то в синтаксисе FoxPro следует использовать символ "точки с запятой". А если друг от друга отделяются "параметры", то следует использовать символ "запятой".</p>
<p>Чтобы было понятно о чем речь, возьмем ранее рассмотренный пример выделения диапазона ячеек. В макросе Excel это записано так:</p>
<p>Range("1:1,4:4").Select</p>
<p>Здесь, по смыслу, внутри Range() просто перечислены элементы одного списка. Если "перевести" это на русский язык, то можно прочитать это так: выделить первую <b>и</b> четвертую строку</p>
<p>Поскольку речь идет именно о перечислении, а не о параметрах, то в синтаксисе FoxPro следует заменить символ "запятой" на символ "точки с запятой". Примерно так:</p>
<p>m.loSheet.Range("1:1;4:4").Select</p>
<p>К сожалению, в использованном в качестве примера коде макроса нет функций, которые бы использовали диапазоны как параметры. Поэтому приведу пример функции ЕСЛИ() никакого отношения к разбираемому коду макроса не имеющую.</p>
<p>.ActiveCell.FormulaR1C1 = '=IF(RC[-1]&gt;0;RC[-1];"")'</p>
<p>В данном случае, эта формула "переводится" так. Если значение ячейки в текущей строке, но на столбец ранее больше нуля, то отобразить значений этой ячейки. В противном случае - ничего не отображать.</p>
<p>Как видите, в коде макроса использован символ "точки с запятой". Но в данном случае, разделенные величины выступают как параметры. Это явно не перечисление. Значит, в синтаксисе FoxPro следует вместо символа "точки с запятой" использовать символ "запятой".</p>
<p>m.loSheet.Cells(2,3).Value = '=IF(RC[-1]&gt;0,RC[-1],"")'</p>
<p></p>
<h3><a name="NumberFormat"></a>Указание формата ячеек</h3>
<p>Далее в коде макроса стоит указание формата для всего второго столбца. В переводе в синтаксис FoxPro это выглядит так:</p>
<p>m.loSheet.Columns(2).NumberFormat = "#,##0.00"</p>
<p>Обратите внимание, что хотя числовой формат был задан на весь второй столбец, но тем не менее содержимое заголовка столбца (первой строки) как было текстом, так текстом и осталось.</p>
<p>В данном случае символ запятой и точки - это не есть реальные символы-разделители. Их назначение аналогично назначению тех же символов при задании маски ввод "InputMask" в FoxPro.</p>
<p>По умолчанию, все ячейки листа Excel имеют формат "General". Это некий универсальный формат, который сам, автоматически, предпринимает попытку конвертировать полученные данные в тот формат, который он считает наиболее правильным. Это не всегда хорошо.</p>
<p>Например, если Вы выводите в Excel банковский расчетный счет (это 20 цифр), то Excel автоматически конвертирует полученное значение в число. Но, поскольку точность вычисления Excel до 15 значащих цифр, то произойдет округление и последующее изменение формата отображения уже не сможет исправить эту ошибку.</p>
<p>В подобных случаях надо до начала вывода в Excel установить формат ячеек - текстовый</p>
<p>m.loSheet.Columns(1).NumberFormat = "@"</p>
<p></p>
<h3>Установка условного формата для числовых данных второго столбца</h3>
<p>Далее по коду макроса идет установка условного формата. Но чтобы понять, что там написано, и как это перевести в FoxPro следует сделать ряд пояснений</p>
<p></p>
<h3><a name="Constant"></a>Константы Excel</h3>
<p>В теле макроса встречаются странные значения, которые начинаются с символов "xl". В данном случае - это xlCellValue и xlLess. Но и дальше по коду макроса встречаются аналогичные значения. Это именно значения, поскольку, судя по коду, они присваиваются неким параметрам. Что это такое?</p>
<p>Это константы. Т.е. это некоторые значения, которые были определены в момент открытия Excel. Их отличительным признаком как раз и является то, что они начинаются с символов "xl" и из кода макроса следует, что это некоторые ранее определенные значения.</p>
<p>Определить, чему же равны эти константы можно там же, в редакторе "Microsoft Visula Basic", где Вы и просматриваете код макроса Excel. Для этого надо открыть "Object Browser". Пункт меню "View" - подпункт "Object Browser". Далее в пустом окошке слева от кнопки с иконкой бинокля ввести имя искомой константы и нажать кнопку с иконкой бинокля (или клавишу Enter). В результате поиска в самом низу окна "Object Browser" будет отображено значение искомой константы.</p>
<p>В синтаксисе FoxPro константы записываются через директиву #DEFINE следующим образом:</p>
<pre><pre class='bbcode'>   #DEFINE xlCellValue 1  
  #DEFINE xlLess 6  
    
</pre> </pre>
<p></p>
<h3><a name="Parameters"></a>Именованные параметры функций Excel</h3>
<p>В коде макроса, для установки условного формата используется функция ADD с несколькими именованными параметрами. Как это перевести в синтаксис FoxPro, ведь в нем нет такого понятия как "именованный параметр"</p>
<p>Именованный параметр - это передача параметров в функцию не обязательно в порядке их определения, но при этом значению параметра предшествует его имя. В этом случае принимающая функция проанализирует имя параметра и поймет, к чему именно следует отнести полученное значение.</p>
<p>Повторю еще раз. Такого в FoxPro нет. Т.е. реализовать-то это не проблема. Просто этого нет "штатно". На уровне самой среды FoxPro.</p>
<p>А вот здесь как раз избыточность макроса Excel очень кстати. Дело в том, что в подобных случаях, макрорекодер Excel запишет вообще все параметры, какие есть у данной функции или метода и расположит их в том порядке, в котором они идут в самой функции.</p>
<p>В синтаксисе FoxPro параметры должны идти в том порядке, в котором они определены в функции и отделяться друг от друга запятыми. В макросе Excel они также будут идти в том порядке, в котором они определены в функции, но отделены друг от друга пробелом и каждому значению параметра предшествует его имя.</p>
<p>Тогда все очень просто. В FoxPro установка условного форматирования примет вид</p>
<hr />
<pre><pre class='bbcode'>   #DEFINE xlCellValue 1  
  #DEFINE xlLess 6  
  LOCAL loUnion, loFormatCondition  
  loUnion = m.loExcel.Union(m.loSheet.Cells(2,2),m.loSheet.Cells(3,2))  
  loUnion = m.loExcel.Union(m.loUnion,m.loSheet.Cells(4,2))  
  m.loUnion.FormatConditions.Delete  
  loFormatCondition = m.loUnion.FormatConditions.Add(xlCellValue,xlLess,2000)  
  m.loFormatCondition.Interior.ColorIndex = 3  
    
</pre> </pre>
<hr />
<p>В данном случае, все параметры метода Add() обязательны. Т.е. нельзя не задать какой-либо из параметров. Однако во многих функциях часть параметров задавать не обязательно. Это означает либо что данный параметр остается неизменным, либо принимает некоторое значение по умолчанию. В этом случае в синтаксисе FoxPro можно просто ничего не указывать, но обязательно поставить запятую, чтобы нужный нам параметр оказался на соответствующем месте.</p>
<p></p>
<h3><a name="Borders"></a>Рисование рамки вокруг всех данных</h3>
<p>В переводе кода рисования рамки ничего нового нет. Разве что, здесь просто не нужно указывать ряд команд. Например, зачем указывать, что нет диагональных линий, если их и так нет? А в остальном все то же самое, что было описано ранее:</p>
<hr />
<pre><pre class='bbcode'>   #DEFINE xlThin 2  
  #DEFINE xlDiagonalDown 5  
  #DEFINE xlDiagonalUp 6  
  #DEFINE xlEdgeLeft 7  
  #DEFINE xlEdgeTop 8  
  #DEFINE xlEdgeBottom 9  
  #DEFINE xlEdgeRight 10  
  #DEFINE xlInsideVertical 11  
  #DEFINE xlInsideHorizontal 12  
    
  LOCAL loRange  
  loRange = m.loSheet.Range(m.loSheet.Cells(1,1).Address+":"+m.loSheet.Cells(4,2).Address)  
  loRange.Borders(xlEdgeLeft).Weight = xlThin  
  loRange.Borders(xlEdgeTop).Weight = xlThin  
  loRange.Borders(xlEdgeBottom).Weight = xlThin  
  loRange.Borders(xlEdgeRight).Weight = xlThin  
  loRange.Borders(xlInsideVertical).Weight = xlThin  
  loRange.Borders(xlInsideHorizontal).Weight = xlThin  
    
</pre> </pre>
<hr />
<p>Как видите, большая часть кода просто не вошла в итоговый "перевод". В этом нет необходимости. В данном случае нас вполне устраивает стиль и цвет линий по умолчанию. Т.е. сплошная линия черного цвета. Нет смысла менять эти значения. Достаточно только указания толщины (веса) линии</p>
<p></p>
<h3><a name="Other"></a>Перенос слов, выравнивание, ширина столбца и высота строки</h3>
<p>Собственно, оставшийся код Вы уже можете перевести самостоятельно. Поэтому я приведу его уже безо всяких пояснений</p>
<hr />
<pre><pre class='bbcode'>   #DEFINE xlCenter -4108  
  #DEFINE xlTop -4160  
    
  m.loSheet.Rows(1).NumberFormat = "@"  
  m.loSheet.Rows(1).HorizontalAlignment = xlCenter  
  m.loSheet.Rows(1).VerticalAlignment = xlTop  
  m.loSheet.Rows(1).WrapText = .T.  
  m.loSheet.Rows(1).RowHeight = 25.5  
    
  m.loSheet.Columns(1).ColumnWidth = 11.57  
  m.loSheet.Columns(2).ColumnWidth = 10.14  
</pre> </pre>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4899">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4899">Владимир Максимов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Владимир Максимов" href="https://foxclub.ru/account/?user=4899">
				<img alt='' src='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 65<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/perevod-makrosa-excel-v-sintaksis-foxpro/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Статьи]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/material-iz-ufy/</link>
					<title><![CDATA[Материал из Уфы]]></title>
                    					    <author><![CDATA[piva]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:30 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Материал из Уфы</h1>
													</header>
													<div id="sol_opis">Мой материал, который я представлял в Уфе</div>
<div id="sol_body">Если запускать через main.prg, то предварительно запустите autoexec.prg - там установятся необходимые пути для работы приложения </div>
<div id="sol_avtor">Автор: Пирожков Вадим</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4821">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4821">piva</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="piva" href="https://foxclub.ru/account/?user=4821">
				<img alt='' src='https://secure.gravatar.com/avatar/0a76ea08e616d2f8a939412913fbb096?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/0a76ea08e616d2f8a939412913fbb096?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-03-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/material-iz-ufy/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/podvodnyj-kamen-s-unique-i-deleted/</link>
					<title><![CDATA[Подводный камень с UNIQUE и DELETED()]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:30 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Подводный камень с UNIQUE и DELETED()</h1>
													</header>
													<div id="sol_opis">при выставлении индекса пропали записи.</div>
<div id="sol_body">
<pre>Не нашел такого в баззе по этому делюсь вдруг кто столкнется, есть база [работа,тип] пример: [ЧП Иванов],[Предприниматель]  [ООО Ферросплавы],[Предприятия]...  типы: Медики, Образование, Бюджет, МВД и т.д. индекс был сделан так: [code] index on [тип] tag tip1 uniq [/code] от пользователей поступила жалоба что из списка пропал тип [Предприятия],  смотрю базу все наместе, а в списке нет. Понять ни чего не могу индек же на то и уникальный чтобы всех записей было по одному. После долгих мук база была упакована, все заработало, но проблемато осталась, как  оказалось при индексации fox включает в уникальные и удаленные записи не зависимости от  [code]SET DELETE [ON/OFF] [/code]  Решение вообщем следующие:  [code] index on [тип] tag tip1 uniq FOR !dele()[/code] </pre>
</div>
<div id="sol_avtor">Автор: Даниил Александрович</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/podvodnyj-kamen-s-unique-i-deleted/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/bystrodejstvie-programm-na-vfp/</link>
					<title><![CDATA[Быстродействие программ на VFP]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Sat, 19 Nov 2022 18:09:36 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Быстродействие программ на VFP</h1>
													</header>
													<p><a href="#remark">Важное замечание</a><br />
<a href="#load">Пользовательский интерфейс</a><br />
<a href="#rushmore">Rushmore</a><br />
<a href="#navigation">Навигационный и реляционный подходы</a><br />
<a href="#queries">Оптимизация запросов</a><br />
<a href="#normalization">Нормализация БД</a><br />
<a href="#algorithm">Алгоритм</a><br />
<a href="#arrays">Массивы (Arrays)</a><br />
<a href="#tables">Работа с таблицами</a><br />
<a href="#commands">Скорость выполнения отдельных команд</a><br />
<a href="#example">Пример</a><br />
<a href="#user">Как успокоить пользователя</a><br />
<a href="#test">Тестирование</a><br />
<a href="#thanks">Благодарности</a></p>
<p><i><a href="/articles/files/velocity.zip"><b>Здесь</b></a> вы можете скачать тексты демонстрационных программ.</i></p>
<h3><a name="remark"></a>Важное замечание</h3>
<p>Наши пользователи хотят, чтобы программы выполнялись максимально быстро. Но часто бывает, что быстродействие может быть достигнуто в ущерб другим требованиям, например универсальности, модифицируемости или надежности кода. Далеко не всегда стоит добиваться максимальной производительности. Бывает, что код настолько усложняется, что вы рискуете потерять контроль над своей "супер-быстрой" программой. Так же не стоит отказываться от проверок входящих параметров. Сэкономленные секунды могут обернуться долгими часами, потраченными на ликвидацию последствий незначительной ошибки.</p>
<h3><a name="load"></a>Пользовательский интерфейс</h3>
<p>Если пользователи жалуются на слишком медленную работу форм, вы можете предпринять следующие действия:</p>
<ul>
<li>Загружайте элементы интерфейса только тогда, когда в них появится необходимость. Это могут быть элементы на неактивных закладках <b>PageFrame</b>, скрытые узлы <b>Treeview</b>, или невидимые формы в <b>FormSet</b>. Практически любой набор объектов можно поместить в контейнер, сохранить его, как класс, а в нужный момент создать экземпляр этого класса.
</li>
<li>Можно поступить "с точностью до наоборот" - при загрузке программы создать самые тяжелые и часто используемые объекты, и сделать их невидимыми до определенного момента. Обращали внимание, как долго загружается программа 1С? Зато потом скорость работы вполне приемлемая. Это пример такого подхода.
</li>
<li>Если в большой таблице наложить фильтр, установить активный индекс, и отобразить результат через <b>Browse</b> или <b>Grid</b>, то переход между строками будет происходить очень медленно. Более подходящий источник для отфильтрованных и отсортированных данных - <b>Local View</b>.
</li>
<li>Если вам не нужны все возможности <b>Grid</b>-а, замените его на <b>Listbox</b>. Этот контрол намного легче и быстрее. Кроме того, в нем нет проблем с подсветкой строки, которые имели место до 8-й версии VFP.
</li>
<li>Установите последние обновления для сети и операционной системы. В моей практике было, когда для первоначального открытия десяти таблиц на сервере Novell требовалось полминуты. После установки на рабочих станциях патча для работы с Novell открытие таблиц стало происходить мгновенно.
</li>
</ul>
<h3><a name="rushmore"></a>Rushmore</h3>
<p>Как использовать индексы для оптимизации <i>Rushmore</i>, описано в разделе HELP <i>"Using Rushmore Query Optimization to Speed Data Access"</i>. В этой же статье вы найдете список команд, которые могут быть оптимизированы.</p>
<p>Оптимизация не будет работать, если:</p>
<ul>
<li>Не совпадает <b>Set Collate</b> (в индексах таблицы используется <i>Russian</i>, а системная установка - <i>Machine</i>)
</li>
<li>Индекс содержит условие <b>FOR ...</b> или ключевое слово <b>UNIQUE</b>
</li>
<li>Индексное выражение включает условие <b>.NOT.</b>, например <b>Index on .NOT. DELETED()</b>
</li>
<li>Выражение для поиска не совпадает с индексным. Часто допускают такую ошибку. Предположим, у таблицы есть индекс по <b>UPPER(cField1)</b>. Для поиска пустых полей используют условие <b>EMPTY(cField1) = .T.</b>, что не совпадает с индексным выражением. Для того, чтобы поиск был оптимизированным, выражение должно выглядеть как <b>UPPER(cField1) = SPACE(N)</b>, где N - длина поля cField1.
</li>
</ul>
<h3><a name="navigation"></a>Навигационный и реляционный подходы</h3>
<p>В FoxPro сосуществуют два подхода к обработке данных - навигационный и реляционный.Навигационные команды - это <b>Locate, Seek, Set Relation, Set Order, GoTo</b>. Основная реляционная команда - <b>Select SQL</b>. Скорость выполнения запросов SQL весьма высока, однако во многих случаях навигационный подход работает еще быстрее.</p>
<p>Пример поиска максимального значения поля различными способами:</p>
<pre class="bbcode"> *** поиск с помощью Select SQL
Select MAX(Field1) as MaxField From Table1 Into Cursor _Temp
? _Temp.MaxField

*** а так выполнится значительно быстрее (необходимо наличие индекса по полю Field1)
Select Table1
Set Order To Field1
Go Bottom
? Field1</pre>
<h3><a name="queries"></a>Оптимизация запросов</h3>
<p>Запросы на FoxPro могут выполняться долго, если в них участвует больше трех-четырех таблиц. Речь идет именно о запросах к родным БД на dbf, а не о запросах, отправляемых на сервер. Как правило, увеличить скорость путем разбиения большого запроса на несколько последовательно выполняемых подзапросов не удается. Можно выйти из положения, исключая из запроса справочные таблицы (например, ФИО сотрудников), и привязывая их к результату через <b>Set Relation</b>, смешивая таким образом "реляционный" и "навигационный" подходы.</p>
<p>Использование <b>Outer join</b> снижает скорость выполнения запроса. Если нет прямой необходимости в этой опции, лучше переписать запрос без нее. Как вариант - если у вас есть строки, не имеющие соответствия в связанной таблице, и потому содержащие в поле для связи <b>.NULL.</b>, добавьте в связанную таблицу строку с нулевым кодом, а в основной - замените пустые значения на этот нулевой код.</p>
<p>Подзапросы вида <b>Where Field1 in (Select ... )</b> или <b>Where Exists (Select ... )</b> могут замедлить скорость выполнения запроса (хотя это зависит от многих параметров). Если такой запрос выполняется слишком медленно - попробуйте переписать его с использованием простого объединения.</p>
<p>Для большего быстродействия располагайте первыми те условия, которые максимально сужают область дальнейшего поиска.</p>
<p>Для анализа оптимальности SQL-запроса воспользуйтесь функцией <b>Sys(3054</b>). Имейте в виду, что если у таблиц нет индексов по <b>Deleted(</b>), эта функция будет показывать частичную оптимизацию, даже если фактически они вносят отрицательный вклад в скорость выполнения запроса. Этот эффект <a href="/articles/art35.php#HowMuch" target="_blank" rel="noopener">подробно описан</a> Владимиром Максимовым.</p>
<h3><a name="normalization"></a>Нормализация БД</h3>
<p>Принципы нормализации требуют, чтобы все повторяющиеся значения были вынесены в отдельные таблицы. Однако это может замедлить выполнение программы. В некоторых случаях нормализацией можно пренебречь.</p>
<p>Например, в справочнике клиентов есть поле "Город". Исходя из принципов нормализации, необходимо завести таблицу - справочник городов. Так как названия городов меняются нечасто, в таблице клиентов вместо кода города можно записывать его название. Это позволит уменьшить количество таблиц в запросах, но потребует аккуратности, если название города все-таки изменилось, или в нем была допущена ошибка.</p>
<p>Другой вариант - предварительные расчеты. Например, с помощью триггеров можно заранее пересчитывать суммарные данные о продажах за день в момент добавления или корректировки нового счета. К примеру, пусть счета хранятся в таблице Invoices, а данные о продажах за день - в таблице DailySales. Тогда в триггеры таблицы Invoices нужно добавить примерно такой код:</p>
<pre class="bbcode"> *** для триггера Insert
Update DailySales Set TolalSum = TolalSum <b>+ Invoices.InvoiceSum</b> Where DailySales.SalesDate = Invoices.InvoiceDate

*** для триггера Update
Update DailySales Set TolalSum = TolalSum <b>+ Invoices.InvoicesSum - OldVal(Invoices.InvoiceSum)</b> Where DailySales.SalesDate = Invoices.InvoiceDate

*** для триггера Delete
Update DailySales Set TolalSum = TolalSum <b>- Invoices.InvoiceSum</b> Where DailySales.SalesDate = Invoices.InvoiceDate

</pre>
<p>Естественно, сам код триггеров будет намного сложнее. Кроме приведенных строк там необходимы проверки, обработка ошибок и т.д.</p>
<p>Если вы решите идти по такому пути, не забудьте написать процедуру синхронизации, если из-за сбоев предварительные расчеты станут отличаться от основных.</p>
<h3><a name="algorithm"></a>Алгоритм</h3>
<p>Как правило, стройный и понятный алгоритм выполняется быстрее всего, хотя бывают исключения. С другой стороны, применяя "обходные маневры" вы можете потерять возможность исправить что либо в коде, когда условия изменятся.</p>
<p>Вот несколько общих советов:</p>
<ul>
<li>Вынесите за пределы циклов однократно выполняемые установки типа <b>Set deleted, Set exact</b>, и т.д.
</li>
<li>Поместите проверки в начало подпрограммы. Это позволит не выполнять лишние действия, если проверки окончатся неудачно.
</li>
<li>Освобождайте память от объектов и таблиц, которые вам больше не понадобятся.
</li>
<li>Если позволяют технические возможности, перенесите наиболее тяжелые расчеты на другой компьютер, воспользовавшись технологией DCOM.
</li>
</ul>
<h3><a name="arrays"></a>Массивы (Arrays)</h3>
<p>Иногда можно встретить утверждение, что использование массивов ускоряет работу, так как весь объем информации находится в оперативной памяти. Возможно, это верно для небольших массивов. Если же вам нужно обработать большой объем информации - поместите данные в таблицы. Для работы с ними VFP имеет широкий набор оптимизированных команд и функций, которых вы лишитесь, работая с массивами.</p>
<p>Во многих языках программирования принято обрабатывать данные, находящиеся именно в массивах. На одном из форумов я даже видел тесты, в которых сравнивалась скорость обработки больших массивов в FoxPro и в других языках. IMHO, это сравнение не совсем корректно. Нужно сравнивать обработку массивов в других языках, и обработку таблиц - в FoxPro.</p>
<h3><a name="tables"></a>Работа с таблицами</h3>
<p>Как уже говорилось, основная задача VFP - работа с таблицами. Здесь перечислены приемы, которыми вы можете воспользоваться для ускорения обработки данных:</p>
<ul>
<li>Поиск записей с помощью команды <b>Seek</b> (или ее аналога функции <b>SEEK( )</b> ) выполняется примерно в 5-10 раз быстрее, чем с помощью команды <b>Locate</b>.
</li>
<li>Команда <b>Locate</b> позволяет указывать несколько условий, например <b>Locate for ClientID = X AND InvoiceDate = Y</b>. Для максимально быстрого поиска по нескольким полям заведите сложный индекс, в данном случае - <b>STR(ClientID, 10, 0) + DTOS(InvoiceDate)</b>, и осуществляйте поиск с помощью <b>Seek STR(X, 10, 0) + DTOS(Y)</b>.
</li>
<li>"Быстрая" команда <b>Seek</b> может работать с любыми индексами, в том числе содержащими ключевое слово <b>UNIQUE</b> или условие <b>FOR...</b>. Однако имейте ввиду, что сложные индексы затрудняют читабельность и модификацию кода.
</li>
<li>Если нужно только проверить наличие строк, удовлетворяющих условию, по которому есть индекс, но нет необходимости перемещать указатель на эти строки, воспользуйтесь функцией <b>IndexSeek()</b> (она появилась в VFP начиная с 6-й версии).
</li>
<li>Команда <b>Goto ...</b> выполняется практически мгновенно. Если вам нужно вернуться к какой-либо записи в таблице - запомните текущее значение <b>RECNO()</b>. Возврат по номеру записи отработает быстрее, чем поиск по идентификатору с помощью <b>Seek</b> или <b>Locate</b>.
</li>
<li>Цикл <b>Scan...EndScan</b> оптимизирует перебор записей таблицы даже без индекса. Там где это возможно, используйте его вместо конструкции <b>Do While not EOF() ... Skip ... EndDo</b>.
</li>
<li>Выполнение команд <b>Locate, Scan For.., Set Filter to..</b> замедлится, если у таблицы установлен активный индекс. Отключите индекс командой <b>Set Order to</b> без параметров, если порядок перебора строк неважен.
</li>
<li>Команда <b>Set Filter to..</b> входит в число <i>Rushmore</i>-оптимизируемых команд, и в "лабораторных условиях" скорость ее работы вполне удовлетворительна. Тем не менее, эта команда очень чувствительна к "внешним факторам", например, к установке активного индекса. Поэтому в большинстве случаев использование фильтров негативно сказывается на быстродействии.
</li>
<li>Если вам необходимо просканировать некоторый диапазон значений в таблице, и по этим значениям есть индекс, вы можете воспользоваться приемом, известным как "Set Order + Seek + Scan while".
<pre class="bbcode"> Set Order to Field1
Seek StartValue &amp;&amp; устанавливаем указатель на начало диапазона
Scan While Field1 =&lt; EndValue &amp;&amp; перебираем строки до конца диапазона
...
EndScan</pre>
<p>Этот код работает быстрее, чем <b>Scan for Between( Field1, StartValue, EndValue ) ... EndScan</b>, но проигрывает ему в читабельности, и кроме того, требует установки активного индекса.</p>
</li>
<li>Если какой-либо индекс в таблице используется чаще других, во время технического обслуживания БД физически отсортируйте записи в таблице в порядке этого индекса. (Я никогда не использовал этот прием на практике, однако такой совет есть в HELP, в статье <i>"Optimization of Tables and Indexes"</i>).
</li>
</ul>
<h3><a name="commands"></a>Скорость выполнения отдельных команд</h3>
<p>Скорость выполнения отдельных команд приобретает критическое значение, когда они выполняются в цикле, и доли секунды, за которые выполняется одна команда, умножаются в тысячи, если не в сотни тысяч раз. Так же бывает важным максимально сократить время работы триггеров, чтобы не тормозить операции с таблицей. Вот некоторые приемы:</p>
<ul>
<li>Там, где это возможно, вместо макроподстановки <b>&amp;</b> используйте выражения имени <b>( )</b> и функцию <b>EVALUATE()</b>. Выражения имени можно применять там, где Fox ожидает увидеть имя переменной или поля. Функция <b>EVALUATE()</b> может быть использована в операциях присвоения и вычислениях.
<pre class="bbcode"> X = "Var1"
Y = "Var2"
Store EVALUATE(X) to (Y) &amp;&amp; так быстрее
&amp;Y = &amp;X &amp;&amp; эта команда сделает то же, что и предыдущая, но существенно медленнее</pre>
</li>
<li>Если команда состоит из несколько макроподстановок, лучше собрать части команды в одну переменную, и выполнить единой макроподстановкой
<pre class="bbcode"> *** медленный вариант
Select <b>&amp;</b>FieldsList From <b>&amp;</b>TablesList Where <b>&amp;</b>JoinConditions
*** так быстрее
cSQL = "Select " + FieldsList + " From " + TablesList + " Where " + JoinConditions
<b>&amp;</b>cSQL</pre>
</li>
<li>Стандартные функции VFP хорошо оптимизированы и выполняются достаточно быстро. Например, условиями задачи требуется найти цифру, входящую в текстовую строку. Можно по очереди перебирать символы:
<pre class="bbcode"> For I = 1 to LEN(cText)
	If ISDIGIT( SUBSTR(cText, m.I,1) )
		? m.I
		Exit
	EndIf
EndFor</pre>
<p>Более быстрый вариант с использованием стандартных функций:</p>
<pre class="bbcode"> cText1 = STRTRAN(cText, "123456789", "0")
? AT(cText1, "0")</pre>
</li>
<li>Скорость обращения к переменным выше, чем к свойствам объекта или полям таблицы. Если значение какого-то свойства или поля используется многократно, присвойте это значение переменной.<br />
Подавление системных сообщений с помощью команд <b>Set Talk off, Set Notify off</b> (в последних версиях еще и <b>Set Notify Cursor off</b>) может существенно ускорить процесс.<br />
Сложение текстовых строк происходит быстрее, если к длинной строке добавлять короткую, а не наоборот. То есть</p>
<pre class="bbcode"> *** этот код выполнится быстро
x = ""
For i = 1 to 10000
	x = x + Sys(3) &amp;&amp; функция Sys(3) играет роль "короткого текстового выражения"
EndFor

*** а этот - медленно
x = ""
For i = 1 to 10000
	x = Sys(3) + x
EndFor</pre>
</li>
<li>Для поиска "узких мест" воспользуйтесь командой <b>Set Coverage to</b>. Эта команда создаст текстовый файл, в котором будет записано время выполнения каждой строки. Вы можете сохранить этот файл в таблицу, и проанализировать ее. Либо воспользоваться Coverage profiler из дистрибутива Visual FoxPro.
</li>
</ul>
<h3><a name="example"></a>Пример</h3>
<p>Предположим, вам необходимо всем клиентам, у которых есть заказ в предыдущем месяце, предоставить скидку 10% на будущие заказы. Данные о заказах хранятся в таблице Invoices, а информация о скидке - в таблице Clients.</p>
<pre class="bbcode"> New_Discount = 0.10 &amp;&amp; скидка, которую мы хотим предоставить
PrevDate = GoMonth(Date(), -1)
PrevMonth = Month(PrevDate) &amp;&amp; предыдущий месяц
PrevYear = Year(PrevDate) &amp;&amp; год, в котором был предыдущий месяц

Go top in Clients
Do while not EOF("Clients") &amp;&amp; перебор записей в таблице клиентов
	Go top in Invoices
	Do while not EOF("Invoices") &amp;&amp; перебор записей в таблице счетов
		If Invoices.ClientID = Clients.ClientID AND ;
		Year(Invoices.InvoiceDate) = PrevYear AND ;
		Month(Invoices.InvoiceDate) = PrevMonth
			Replace Clients.Discount with New_Discount
			Exit
		EndIf
		Skip in Invoices
	EndDo
	Skip in Clients
EndDo</pre>
<p>Приведенный код логически верен, но абсолютно не оптимизируем.</p>
<p>Попробуем переписать этот код:</p>
<pre class="bbcode"> Month_End = Date() - Day(Date()) &amp;&amp; последний день предыдущего месяца
Month_Start = Month_End - Day(Month_End) + 1 &amp;&amp; первый день предыдущего месяца
Select Clients
Scan
	Select Invoices
	Locate for ClientID = Clients.ClientID AND Between(InvoiceDate, Month_Start, Month_End)
	If Found("Invoices")
		Replace Clients.Discount with New_Discount
	Endif
EndScan</pre>
<p>Перебор записей таблицы Clients осуществляется командой <b>Scan</b>. Поиск в таблице Invoices может быть оптимизирован с помощью индексов по полям ClientID и InvoiceDate. Этот вариант будет выполняться существенно быстрее.</p>
<p>Для реализации следующего варианта необходимо, чтобы у таблицы Invoices существовал особый индекс:</p>
<pre class="bbcode"> Index on STR(ClientID, 10,0) + DTOS(InvoiceDate) tag MIXED
...
...
...
Set Exact OFF
LastMonth  = LEFT(DTOS( GOMONTH(DATE(), -1) ), 6) &amp;&amp; год и месяц в формате "YYYYMM"
Select Clients
Replace Clients.Discount with New_Discount For IndexSeek( STR(ClientID, 10,0) + m.LastMonth, .F., "Invoices", "MIXED" )</pre>
<p>Поиск в таблице Invoices осуществляется по индексу, поэтому этот пример отработает еще быстрее. Но индекс весьма специфический, и не может быть применен для других вычислений. Кроме того, даже автору это кода этого потребуется немало времени, чтобы спустя полгода разобраться, что именно он делает 🙂</p>
<p>Решение с использованием команд SQL:</p>
<pre class="bbcode"> Update Clients Set Discount = New_Discount Where Exists ;
(Select * From Invoices Where ;
Invoices.ClientID = Clients.ClientID AND ;
Invoices.InvoiceDate BETWEEN Month_Start AND Month_End)</pre>
<p>Возможно, данный вариант не выиграет с точки зрения скорости по сравнению с предыдущим, но он гораздо понятнее. Если время выполнения запроса находится в разумных пределах, я бы остановился именно на нем. К сожалению, такой синтаксис команды <b>SQL-Update</b> возможен только в VFP9.</p>
<p><i><a href="/articles/files/velocity.zip"><b>По этой ссылке</b></a> вы можете скачать исходные тексты примеров</i></p>
<h3><a name="user"></a>Как успокоить пользователя, пока выполняется программа</h3>
<p>Если программа в течение минуты не будет подавать признаков жизни, у пользователей возникает жгучее желание нажать Ctrl+Alt+Del, и прервать процесс. Вам необходимо информировать пользователя о состоянии дел. Вот варианты.</p>
<p>Если расчеты многоступенчатые, перед каждым этапом выводите либо в статус-бар, либо в окно сообщение</p>
<pre class="bbcode"> Wait window "Этап 1: Проверка данных" nowait
...
Wait window "Этап 5: Суммирование данных за год" nowait
...
Wait window "Этап 10: Окончательное форматирование" nowait
...
Wait clear</pre>
<p>При сканировании большой таблицы выводите номер обрабатываемой записи. Имейте ввиду, что вывод на экран - очень медленный процесс. Поэтому выводите сообщения только на каждой десятой или даже сотой строке:</p>
<pre class="bbcode"> Set Talk Off
...
Scan
	...
	...
	If MOD(RECNO(), 100) = 0
		Application.StatusBar = "Обработано "  + TRANSFORM( RECNO() ) + " строк из " + TRANSFORM( RECCOUNT() )
	EndIf
EndScan</pre>
<p>Очень полезным может оказаться следующий прием. Запоминайте, сколько времени длился расчет в прошлый раз, и используйте эти данные для текущего расчета. Сохранять эту информацию нужно локально, так как скорость вычислений зависит от возможностей данной рабочей станции.</p>
<pre class="bbcode"> Wait window "В прошлый раз расчет длился " + TRANSFORM(Duration) + " секунд" + CHR(13) + ;
		"Этот расчет начался в " + TIME() + CHR(13) + ;
		"и продлится примерно до " + TTOC( DATETIME() + Duration , 2 ) nowait

</pre>
<p>Если длительность расчета зависит от каких-то параметров, вы можете экстраполировать старые показания пропорционально новым. Например, если параметрами для вашей процедуры является диапазон дат, разделите длительность процесса на количество дней в диапазоне, и получите примерную длительность в расчете на один день. В следующий раз, когда пользователь укажет другие даты, умножьте сохраненный результат на новое количество дней, и получите экстраполяцию, сколько будут длиться вычисления. Время, естественно, будет очень приблизительным, но это в любом случае поможет пользователю оценить, сколько чашечек кофе он успеет выпить 🙂</p>
<p>Для полноты картины можете вывести прогресс-бар. Однако имейте в виду, что любые украшательства требуют системных ресурсов. Так что не переусердствуйте.</p>
<h3><a name="test"></a>Тестирование</h3>
<p>Советы уважаемых гуру, и даже выдержки из HELP не дают гарантий, что именно ваш случай не будет редким, но исключением из общих правил. Скорость работы может зависеть от сервера и сети, от активности пользователей, от объема и частотного распределения данных. Самый хороший способ определить, насколько быстро будет выполняться программа - провести тесты, максимально приближенные к реальности. Использование тестов только кажется сложным. Нет ничего сверхъестественного в том, чтобы сгенерировать табличку, близкую по размерам к максимальному ожидаемому размеру реальной БД, и попробовать поработать. В генерации тестовых данных вам помогут функции <b>RAND()</b>, <b>SYS(3)</b> и <b>SYS(2015)</b>, а так же любой осмысленный текст достаточно большого размера. В тестах для данной статьи я использовал <a href="http://www.nalogy.ru/kladr.html" target="_blank" rel="nofollow noopener"><u>kladr</u></a> - классификатор адресов России. Для большей достоверности постарайтесь, чтобы данные не были физически отсортированы по какому-либо полю.</p>
<pre class="bbcode"> *** Генерация тестовой таблицы ***
=RAND(-1) &amp;&amp;  HELP рекомендует перед началом работы вызвать RAND() с отрицательным параметром
For nCount = 1 to BigNumber &amp;&amp; число добавляемых записей
*** пример генерации случайного числа от 1 до 1000
	nRandomValue = CEILING(1000 * RAND())
	*** а так можно заполнять почтовые индексы и номера телефонов
	cZipCode = PADR(CEILING(999999 * RAND()), 6, "0")
	*** поиск случайной записи в связанной таблице
	Goto CEILING(RECCOUNT("ChildTable") * RAND() ) in ChildTable
	RelatedTableValue = ChildTable.Field1
	*** пример генерации случайного адреса
	Goto CEILING(RECCOUNT("Towns") * RAND() ) in Towns
	Goto CEILING(RECCOUNT("Streets") * RAND() ) in Streets
	cAddress = ALLTRIM(Towns.Name) + ", " + ALLTRIM(Streets.Name) + ", дом " + TRANSFORM( CEILING(200 * RAND()) )
	*** Вставляем полученные данные в таблицу

	Insert into BigTable (...) values (nRandomValue, cZipCode, cAddress, RelatedTableValue)
EndFor</pre>
<p>Регулярное проведение тестов имеет еще одну приятную особенность. Пока выполняется тест, вы имеете полное право откинуться на спинку стула, и несколько минут наслаждаться бездельем 😉</p>
<h3><a name="thanks"></a>Благодарности</h3>
<p>В работе над статьей принимали участие члены <a href="/" target="_blank" rel="noopener"><b>Фокс-Клуба</b></a>: Владимир Максимов, Игорь Королев, Alex Shustikov, Соколов Игорь</p>
<p>Игорь Ильин<br />
Последнее обновление: 22.12.05</p>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/bystrodejstvie-programm-na-vfp/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Статьи]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/nastraivaemyj-messager-s-shirokimi-vozmozhnostyami-po-upravleniyu-vidom-okna-soobshheniya/</link>
					<title><![CDATA[Настраиваемый MESSAGER с широкими возможностями по управлению видом окна сообщения.]]></title>
                    					    <author><![CDATA[TAS]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:30 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Настраиваемый MESSAGER с широкими возможностями по управлению видом окна сообщения.</h1>
													</header>
													<div id="sol_opis">1) Выравнивание текста LEFT,RIGHT,CENTER,JUSTIFY с возможностью управлением выравнивания каждой строки.  2) Возможность поставить кнопки по указанным координатам формы, подписать и раскрасить их как захочется. 3) Масштабируемая сложность задания параметров - можно использовать только часть возможностей без потери функциональности. 4) Полная настройка любого объекта в форме вывода сообщения через параметры.</div>
<div id="sol_body">[code] * Пример запуска: *-------------------------------------------------------------------------------------------------------------- * =DN("Быть или не быть? - вот в чем вопрос. Выберите ответ:","1","I=N") *============================================================================================================== * Отрабатываемые параметры настроек формы и текста сообщения *-------------------------------------------------------------------------------------------------------------- *	"H"	- height *	"W"	- width *	"T"	- top *	"L"	- left *	"G"	- background color *	"F"	- font message *	"I"	- настройки вывода текста: *         B - bold *         I - Italic *         L - Left Alignment *         R - Right Alignment *         0-5 - Margin *         N - Запретить рамку вокруг текста *	"S"	- size font message *	"R"	- font color message *	"C"	- caption формы *	"P"	- picture *	"U"	- picture back tip *	"N"	- настройки формы: *         0-5 - Жирность обрисовки по краю формы. *         M - Movable=.T. *         C - Скрыть Caption формы. *         G - Использовать зеленую схему *         R - Использовать красную схему *         B - Использовать синюю схему *         E - Использовать голубую схему *         Y - Использовать желтую схему *         P - Использовать розовую схему *  Также можно указать параметр следующего вида: *  Edit1.Width=Thisform.Edit1.Width-50 - ширина текста уменьшится на 50 пикселей *  Edit1.Left=50 - текст сдвинется вправо на 50 пикселей *============================================================================================================== * Список объектов формы: *-------------------------------------------------------------------------------------------------------------- * Edit1      - для вывода текста сообщения * Command1   - кнопка да * Command0   - кнопка нет * Image1     - для натягивания фона или вывода картинки * Container1 - для рамки *============================================================================================================== * Отрабатываемые параметры для управления кнопками *-------------------------------------------------------------------------------------------------------------- *	"0"	- 1 кнопка (по умолчанию: центруется от центра, надпись меняется на "OK") *	"1"	- 2 кнопки, фокус на первой *	"2"	- 2 кнопки, фокус на второй *	"A"	- background color (в виде цифры) активной кнопки *-------------------------------------------------------------------------------------------------------------- *   Далее, все параметры могут задаваться как в описанном виде, так и имея указатель на номер кнопки *   К примеру     H=100 сделает высоту обеих кнопок = 100, *   а результатом H1=100,H0=50 будет 2 кнопки разной высоты. *-------------------------------------------------------------------------------------------------------------- *	"H"	- height  *	"W"	- width *	"T"	- top *	"L"	- left, может также задаваться через ключевые слова: *         CENTER - Разместить от центра *         LEFT   - Левая сторона кнопки = Left сообщения  *         RIGHT  - Правая сторона кнопки =Right сообщения *	"G"	- background color (в виде цифры) *	"F"	- font name *	"I"	- настройки font: *         N - запретить bold *         I - Italic *	"S"	- size font *	"R"	- font color *	"C"	- caption (не используйте запятые!) *	"P"	- picture (icon) *	"U"	- picture position *============================================================================================================== * Порядок следования параметров: *-------------------------------------------------------------------------------------------------------------- * * =DN("Правильно:","1,W0=150,L0=RIGHT")	&& W0=150 - ширина второй кнопки=150, L0=RIGHT - выровнять от правого края  * =DN("Не правильно:","1,L0=RIGHT,W0=150") * * в этих двух примерах суть - сначала должны следовать параметры по заданию размера, а потом по определению  * местоположения! *============================================================================================================== *  Возвращает: *-------------------------------------------------------------------------------------------------------------- *   -1  - отказ от ответа (был нажат ESC) *    0  - ответ нет *    1  - ответ да *-------------------------------------------------------------------------------------------------------------- [/code] для ознакомления запустите дему.</div>
<div id="sol_avtor">Автор: Т. Аскольд</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4728">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4728">TAS</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="TAS" href="https://foxclub.ru/account/?user=4728">
				<img alt='' src='https://secure.gravatar.com/avatar/7004b77ba9803498111fe71a830bd53f?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7004b77ba9803498111fe71a830bd53f?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/nastraivaemyj-messager-s-shirokimi-vozmozhnostyami-po-upravleniyu-vidom-okna-soobshheniya/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/library-grid-s-mnogostrochnym-zagolovkom-s-vozhmozhnostyu-obedineniya-yacheek-ex_grid-na-ego-osnove-tekstovoe-pole-s-combobox-om-kontejner-s-prokrutkoj/</link>
					<title><![CDATA[library: grid с многострочным заголовком, с вожможностью объединения ячеек (Ex_Grid), на его основе текстовое поле с combobox-ом, контейнер с прокруткой&#8230;]]></title>
                    					    <author><![CDATA[dushes]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:30 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>library: grid с многострочным заголовком, с вожможностью объединения ячеек (Ex_Grid), на его основе текстовое поле с combobox-ом, контейнер с прокруткой&#8230;</h1>
													</header>
													<div id="sol_opis">Классы контролов для vfp9.0.  Все описание в файле MultiRows Grid DemoОписание_классов_элементов управления.xls в архиве.. Архив распаковать, для демки запустить MultiRows Grid Demoex_grid_sample_01.prg из проекта</div>
<div id="sol_body"><b>Классы контролов для vfp9.0.</b>  Все описание в файле MultiRows Grid DemoОписание_классов_элементов управления.xls в архиве.. Архив распаковать, для демки запустить MultiRows Grid Demoex_grid_sample_01.prg из проекта///  Вообщем-то, говорить нечего, лучше посмотреть, классы пока недоработаны, в гриде поддерживаестя контекстное меню (или же можно вызвать по ctrl+f12), а также возможности автофильтра (пока до конца тоже не отлажено, есть кривости), сортировка по указанным колонкам (работает) - есть соотвествующие события (на сортировку и фильтр, к которым можно прибиндиться из клиентской формы)...  Сам грид заполняется в методе m_init (настройка колонок, хидеров, признаки автофильтра, сортировки и прочее), базовый Init сделан как protected, m_createcursor как раз создает или получает тот курсор, который необходимо отображать...  Принцип объединения ячееек: в одну общуюю ячейку объединяются те, у которых сапшины равны, соответственно по вертикади и горизонтали, количество уровней хидеров считается автоматически ...см. в примере m_init использование метода m_AddHeader///  Принцип именования членов классов: префикс m_ - метод, p_ - свойство, e_ - событий, далее квалификатор типа данных...  ps: буду рад выявлению грубых ошибок, участию других разработчиков, которых собственно и хотелось бы пригласить для доведения до ума данных контролов, при желании могу выслать код классов в prg /// комментариев думаю должно хватить, чтобы понять принцип организации грида... Текстовое поле с комбиком реализовано на основе класса Ex_Grid, документация также в файле .xls...   pps: принимаются пожелания по юзабилити, а также по дополнительным возможностям, критика по коду тоже привествуется, сразу же оговорюсь, часто забывал отбиндить обработку событий, где-то перемудрил с использованием коллекций - наверно, во многих местах можно было обойтись использованием массивов...</div>
<div id="sol_avtor">Автор: dushes</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4584">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4584">dushes</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="dushes" href="https://foxclub.ru/account/?user=4584">
				<img alt='' src='https://secure.gravatar.com/avatar/00b48d89bcbc9433ae0de4176eecc420?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/00b48d89bcbc9433ae0de4176eecc420?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 13-03-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/library-grid-s-mnogostrochnym-zagolovkom-s-vozhmozhnostyu-obedineniya-yacheek-ex_grid-na-ego-osnove-tekstovoe-pole-s-combobox-om-kontejner-s-prokrutkoj/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/svoj-variant-report-preview-output-dlya-vfp9/</link>
					<title><![CDATA[Свой вариант Report Preview/Output для VFP9]]></title>
                    					    <author><![CDATA[amaximum]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:30 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Свой вариант Report Preview/Output для VFP9</h1>
													</header>
													<div id="sol_opis">Реализация просмотра и вывода в различные форматы отчетов FoxPro</div>
<div id="sol_body">Реализация просмотра и вывода в различные форматы отчетов FoxPro. Тестировал на стандартных отчетах из дистрибутива VFP9. Форматы ыывода: НTML, XLS, JPEG, Form (Objects). Комментарии по использованию программы внутри архива. Работа через _reportpreview (_reportoutput) не поддерживается. Вобщем есть еще чего написать. Главное, что базовый движок вывода уже написан и к нему можно прикрутить другие форматы. Было бы желание и время 😉</div>
<div id="sol_avtor">Автор: amaximum</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4441">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4441">amaximum</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="amaximum" href="https://foxclub.ru/account/?user=4441">
				<img alt='' src='https://secure.gravatar.com/avatar/2c781ecf6eddbf78c42905d69b47a834?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/2c781ecf6eddbf78c42905d69b47a834?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 26-04-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/svoj-variant-report-preview-output-dlya-vfp9/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/popytka-lokalizaczii-standartnogo-preview-report-vfp-9/</link>
					<title><![CDATA[Попытка Локализации стандартного Preview Report VFP-9]]></title>
                    					    <author><![CDATA[ShmSoft]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Попытка Локализации стандартного Preview Report VFP-9</h1>
													</header>
													<div id="sol_opis">Комментарии находятся в самом модуле preview_rus.prg</div>
<div id="sol_body">Комментарии находятся в самом модуле preview_rus.prg</div>
<div id="sol_avtor">Автор: Андрей Шморин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4645">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4645">ShmSoft</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="ShmSoft" href="https://foxclub.ru/account/?user=4645">
				<img alt='' src='https://secure.gravatar.com/avatar/9020c1b31972c9dabbcde4d3c4a372dd?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/9020c1b31972c9dabbcde4d3c4a372dd?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-11-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/popytka-lokalizaczii-standartnogo-preview-report-vfp-9/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-v/</link>
					<title><![CDATA[Советы начинающим Часть V]]></title>
                    					    <author><![CDATA[Владимир Максимов]]></author>
                    										    <pubDate>Fri, 16 Dec 2022 13:32:41 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Советы начинающим Часть V</h1>
													</header>
													<p>В этой статье :</p>
<p><a href="#Trigger">Триггер</a></p>
<ul>
<li><a href="#FunctionTrigger">Особенности использования функций - триггеров</a></li>
<li><a href="#ReferentialIntegrity">Referential Integrity</a></li>
<li><a href="#ApplyTrigger">Когда и для чего использовать триггер</a>
<p><a href="#Rule">Правила (Rule)</a></li>
<li><a href="#FunctionRule">Особенности использования правил (Rule)</a></li>
<li><a href="#ApplyRule">Когда и для чего использовать правило</a>
<p><a href="#Default">Значение по умолчанию (Default)</a></li>
<li><a href="#FunctionDefault">Особенности использования значения по умолчанию</a></li>
<li><a href="#ApplyDefault">Когда и для чего использовать значение по умолчанию</a>
<p><a href="#FieldDesign">Дизайн полей таблицы</a></p>
<p><a href="#Directive">Директивы компилятора</a></p>
<div align="center"><b><a name="Trigger"></a>Триггер</b></div>
<p style="text-align: justify;">В FoxPro существует некоторая путаница с этим термином (впрочем, как и с большинством других терминов), вызванная не столько неясностью самого термина, сколько особенностью его использования.</p>
<p style="text-align: justify;"><b>Триггер - это выражение</b>, значение которого вычисляется при наступлении определенного события. Это выражение должно вернуть обязательно логическое значение .T. или .F.</p>
<p style="text-align: justify;">Но все дело в том, что в качестве одного из аргументов этого выражения может стоять некоторая функция (или несколько функций). Вот эти-то функции, вызываемые из выражения триггера, также называют "триггер".</p>
<p style="text-align: justify;">Как правило, когда речь идет о триггере, то подразумевают именно функцию - триггер, а не выражение - триггер.</p>
<p style="text-align: justify;">Вычисление выражения триггера происходит при наступлении одного из следующих событий: добавлении записи, удалении записи, модификации записи. Соответственно различают 3 вида триггеров: триггер на вставку, триггер на удаление и триггер на модификацию.</p>
<p style="text-align: justify;">Если выражение триггера вернет .T., то сделанные модификации принимаются и записываются в базу данных. Если же выражение триггера вернет .F., то сделанные модификации отвергаются и генерится ошибка с кодом 1539 (ошибка триггера). Уточнить, какой именно вид триггера вызвал ошибку, можно используя функцию AERROR().</p>
<p style="text-align: justify;">Триггер - это "вратарь" или последний этап проверки корректности введенных данных. После него уже идет собственно модификация данных без каких-либо еще проверок. Причем триггер не обращает внимания на всякие "ложные" попытки модификации данных, а реагирует только на окончательную (физическую) модификацию данных. Имеется в виду, что триггер не сработает при модификации буфера таблицы, но выполнит проверку в момент сброса буфера.</p>
<p style="text-align: justify;">О некоторых особенностях поведения триггеров в FoxPro Вы можете почитать в описании к команде CREATE TRIGGER. Замечу, что в этой команде речь идет именно о выражении, но никак не о функции триггера.</p>
<p>
<b><a name="FunctionTrigger"></a>Особенности использования функций - триггеров</b></p>
<p>Функции триггеров хранятся в <a href="/sovety-nachinayushhim-chast-iv/#Stored" target="_blank" rel="noopener">хранимых процедурах</a>, поскольку это действия, которые связаны напрямую с данными и не должны зависеть от приложения.</p>
<p>При использовании функций триггеров следует учитывать некоторые особенности их использования в FoxPro. В дальнейшем, используя термин "триггер", я буду подразумевать именно функцию - триггер.</p>
<ul>
<li style="text-align: justify;">Триггер всегда анализирует изменения сделанные только в одной записи таблицы. Иначе говоря, даже если вы использовали некоторую групповую команду вставки или модификации (например, APPEND FROM), тем не менее, модификация будет производиться по одной записи за раз чтобы дать возможность триггерам выполнить свои проверки.</li>
<li style="text-align: justify;">Внутри тела триггера (внутри выражения или первой функции) произойдет автоматический переход в ту рабочую область и на ту запись, которые и вызвали срабатывание тела триггера. Однако если Вы используете в качестве выражения триггера несколько функций триггера (например, "Func1().AND.Func2()"), то во второй функции такого автоматического перехода уже не произойдет. Поэтому при завершении функции триггера необходимо особо проконтролировать возврат в ту рабочую область, в которой началось выполнение функции триггера.</li>
<li style="text-align: justify;">По завершении вычисления выражения триггера Вы вернетесь в ту рабочую область, в которой была дана команда, вызвавшая срабатывание триггера.</li>
<li style="text-align: justify;">Внутри тела триггера запрещено перемещать указатель записи в той рабочей области, которая вызвала срабатывание триггера. Этот запрет можно обойти, открыв ту же самую таблицу еще раз в другой рабочей области (USE MyTab IN 0 AGAIN ALIAS MyTab2)</li>
<li style="text-align: justify;">Запрещен рекурсивный вызов триггера в пределах одной и той же таблицы. Т.е. если сработал, например, триггер на удаление, то Вы никаким способом не сможете внутри триггера на удаление удалить какие-либо еще записи из этой же таблицы (удалить "ветку" в древовидной структуре через триггер не получится). Хотя допустимо удалить записи из другой таблицы.</li>
<li style="text-align: justify;">В принципе, функция триггера может вернуть абсолютно любое значение. Важно только чтобы выражение триггера возвращало именно логическое значение. Ну, например, если в качестве выражения триггера используется что-то вроде: "Func1() &gt; Func2()", то главное, чтобы эти 2 функции возвращали значения, которые можно сравнить между собой, а какого именно типа уже не важно.</li>
<li style="text-align: justify;">Следует помнить, что если внутри тела триггера произойдет ошибка, то выражение триггера автоматически вернет .F. и будет сообщение об ошибке 1539 (ошибка триггера), но никак не о той ошибке, которая произошла внутри тела триггера. Поэтому внутри тела триггера следует предусмотреть собственный обработчик ошибок, записывающий причину возможной ошибки в какой-либо объект. Например, внутри тела триггеров автоматически создающихся FoxPro (Referential Integrity) для этой цели создается глобальный массив gaErrors[n,12]. Т.е. из 12 столбцов, а количество строк зависит от количества ошибок.</li>
<li style="text-align: justify;">Если Вы модифицируете данные в режиме буферизации, а сброс изменений в исходные таблицы осуществляется исключительно командой TABLEUPDATE(), то в случае возникновении ошибки триггера никакого сообщения об ошибке не появится. Просто команда TableUpdate() вернет .F. Чтобы уточнить причину отказа в сбросе буфера следует использовать функцию AERROR(). Примерно так:<br />
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  IF TableUpdate(.T.,.T.)=.F.  
        LOCAL laError(1)  
        =AERROR(laError)  
        DO CASE  
        CASE laError[1,1]=1539  
        * Триггер вернул .F. уточняю какой именно триггер  
              DO CASE  
              CASE laError[1,5] =1  
              * Ошибка триггера Insert  
              CASE laError[1,5] =2  
              * Ошибка триггера Update  
              CASE laError[1,5] =3  
              * Ошибка триггера Delete  
              ENDCASE  
        ENDCASE  
  ENDIF  
  </pre>
</td>
</tr>

</table>
</li>
<li style="text-align: justify;">Внутри тела триггера значения полей текущей записи содержат данные после модификации. Чтобы получить значения тех же полей до модификации следует использовать функцию OldVal(). Следует иметь в виду, что если это триггер на вставку и создается действительно новая запись (а не восстановление ранее удаленной по RECALL), то OldVal() вернет значение NULL, даже если данное поле и не может принимать значение NULL. Опираясь на эту особенность, можно внутри тела триггера определить из какого именно типа триггера данная функция была вызвана примерно следующим способом:<br />
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  DO CASE  
  CASE Deleted()  
 * вызов из триггера на удаление  
  CASE NVL(OldVal("Deleted()"),.T.)  
 * вызов из триггера на вставку  
  OTHERWISE  
 * вызов из триггера на модификацию  
  ENDCASE  
  </pre>
</td>
</tr>

</table>
<p>Такой анализ позволяет в некоторых случаях писать универсальный триггер (функцию - триггер) вне зависимости от того из какого типа триггера он был вызван без ввода дополнительных параметров.</p>
<p>Кроме того, триггер UPDATE срабатывает при модификации <i>любого</i> поля таблицы. Если же тригер предназначен для контроля изменения только определенного поля таблицы, то разумно в самое начало триггера вставить проверку на факт изменения проверяемого поля:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  IF MyField=OldVal("MyField")  
        * Значение поля MyField не изменилось, нет смысла запускать триггер  
        RETURN .T.  
  ENDIF  
  </pre>
</td>
</tr>

</table>
</li>
</ul>
<p>
<b><a name="ReferentialIntegrity"></a>Referential Integrity</b></p>
<p>В простых случаях FoxPro может самостоятельно создать как выражение, так и функцию триггера. Для этой цели и служит пункт главного меню "DataBase", подпункт "Edit Referential Integrity".</p>
<p>"Ссылочная целостность" предназначена для автоматической генерации выражения и функции триггера для пары связанных таблиц. Иначе говоря, она следит за тем, чтобы значение внешнего ключа дочерней таблицы всегда соответствовало значению ключевого поля родительской таблицы. Никакие другие поля в данном случае значения не имеют.</p>
<p>Для указания построителю, какое поле считать ключевым, а какое внешним ключом, необходимо установить между двумя таблицами "<a href="/sovety-nachinayushhim-chast-iv/#PersistentRelationship">постоянную связь</a>". Далее вы выбираете один из 3 возможных типов отношений между этими двумя таблицами (для триггера на вставку только 2 варианта). Ну, какие именно варианты есть достаточно понятно.</p>
<table border="1" width="100%" cellspacing="1" cellpadding="7">

<tr>
<td valign="top"><b>Update</b></td>
<td valign="top"><b>Cascade</b></td>
<td>При изменении значения ключевого поля родительской таблицы изменить значение внешнего ключа во всех соответствующих записях подчиненной таблицы.</td>
</tr>
<tr>
<td valign="top"> </td>
<td valign="top"><b>Restrict</b></td>
<td>Запрет на модификацию ключевого поля родительской таблицы, если существует хотя бы одна соответствующая ей запись в подчиненной таблице</td>
</tr>
<tr>
<td valign="top"> </td>
<td valign="top"><b>Ignore</b></td>
<td>Не настраивать никаких отношений между таблицами. Модификация в одной таблице никак не влияет на модификацию в другой</td>
</tr>
<tr>
<td valign="top"><b>Delete</b></td>
<td valign="top"><b>Cascade</b></td>
<td>При удалении записи в родительской таблицы удалить все соответствующие записи подчиненной таблицы.</td>
</tr>
<tr>
<td valign="top"> </td>
<td valign="top"><b>Restrict</b></td>
<td>Запрет на удаление записи в родительской таблице, если существует хотя бы одна соответствующая ей не удаленная запись в подчиненной таблице</td>
</tr>
<tr>
<td valign="top"> </td>
<td valign="top"><b>Ignore</b></td>
<td>Не настраивать никаких отношений между таблицами. Модификация в одной таблице никак не влияет на модификацию в другой</td>
</tr>
<tr>
<td valign="top"><b>Insert</b></td>
<td valign="top"><b>Cascade</b></td>
<td>Не существует, поскольку данный тип взаимоотношений между двумя таблицами не имеет физического смысла</td>
</tr>
<tr>
<td valign="top"> </td>
<td valign="top"><b>Restrict</b></td>
<td>Запрет на создание новой записи в подчиненной таблице, если в родительской таблице не существует записи с указанным значением ключевого поля.</td>
</tr>
<tr>
<td valign="top"> </td>
<td valign="top"><b>Ignore</b></td>
<td>Не настраивать никаких отношений между таблицами. Модификация в одной таблице никак не влияет на модификацию в другой</td>
</tr>

</table>
<p>Подчеркну еще раз, что данные правила относятся исключительно к содержимому ключевого поля родительской таблицы и внешнего ключа дочерней.</p>
<p>После того, как Вы выберите типы взаимоотношений между таблицами, произойдет следующее:</p>
<ul>
<li>в <a href="/knowledgebase/sovety-nachinayushhim-chast-iv/#Stored" target="_blank" rel="noopener">хранимых процедурах</a> базы данных будут созданы функции, обеспечивающие указанный тип взаимоотношений выбранных таблиц</li>
<li>в свойствах таблиц будут добавлены в выражения триггеров вызов соответствующих функций</li>
</ul>
<p>В принципе, по окончании создания триггеров "Referential Integrity" постоянную связь, послужившую основой для создания данной ссылочной целостности можно удалить. Это уже никак не скажется на факте существования созданных триггеров. Однако я не советовал бы этого делать по той причине, что в случае внесения изменений в "Referential Integrity" (пусть даже по отношению к другим таблицам) генератор "затрет" ранее созданные триггера.</p>
<p>Генератор "Referential Integrity" несколько прямолинеен. Он действует по принципу: удалить все - создать заново. Поэтому, если <a href="/sovety-nachinayushhim-chast-iv/#PersistentRelationship">постоянная связь</a> была удалена, то триггера функции, созданные на ее основе, при очередной модификации "Referential Integrity" будут удалены, хотя останутся триггера выражения в свойствах таблицы. А это вызовет сообщение об ошибке при попытке вызвать несуществующие функции.</p>
<p>Как правило, функции триггеров, созданных "Referential Integrity" получают имена вроде __RI_UPDATE_MyTab. Если теперь открыть <a href="/knowledgebase/sovety-nachinayushhim-chast-iv/#Stored" target="_blank" rel="noopener">хранимые процедуры</a> на модификацию и посмотреть содержимое созданных функций, то первой реакцией будет немедленно это закрыть. Очень уж громоздко и неприглядно это все выглядит.</p>
<p>Если же преодолеть первый испуг и попытаться разобраться в этих "играх нечеловеческого разума", то общая логика достаточно проста:</p>
<ul>
<li style="text-align: justify;">Если вызов триггера произошел в результате действий пользователя, а не как результат модификации данных в другом триггере (это отслеживается по значению системной переменной _triggerlevel), то делаются некоторые предварительные настройки</li>
<li style="text-align: justify;">Делаются некоторые настройки среды окружения</li>
<li style="text-align: justify;">Функция триггера обязательно окружается транзакцией на случай групповых (Cascade) модификаций данных.</li>
<li style="text-align: justify;">Настраивается свой обработчик ошибок (RIError). Ошибки, возникшие внутри тела триггера, попадут в глобальный массив gaErrors[n,12]. Количество строк определяется количеством ошибок. Запоминать ошибки необходимо потому, что в случае возникновения ошибки в теле триггера выражение триггера вернет .F. и будет ошибка 1539, но никак не та, что привела к прерыванию триггера. Кроме того, массив gaErrors позволяет записать причину отказа в принятии данных изменений (т.е. если произошла логическая ошибка, для контроля которой данный триггер и был создан). В этом случае значение gaErros[1,1] = -1.</li>
<li style="text-align: justify;">Связанная таблица (в которой надо сделать проверки или изменения) открывается еще раз в новой рабочей области (RIOpen). Причем организована специальная проверка, чтобы не открывать одну и ту же таблицу несколько раз. Причина повторного открытия в том, что внутри тела триггера недопустимо перемещать указатель записи в той рабочей области, которая вызвала срабатывание триггера.</li>
<li style="text-align: justify;">Выполняются нужные проверки или действия. Причем каскадное удаление или обновление реализуются через функции общие для всех триггеров (RIDelete, RIUpdate)</li>
<li style="text-align: justify;">Функция RIReUse "освобождает" повторно открытую таблицу. Т.е. устанавливает признак того, что данная копия таблицы уже не используется и ее можно использовать в другом триггере. Это сделано, чтобы повторно не открывать одну и ту же таблицу несколько раз внутри одной иерархии цепочки триггеров.</li>
<li style="text-align: justify;">По окончании триггера среда возвращается в то состояние, в котором она была на момент начала выполнения триггера, закрывается транзакция, и закрываются все открытые внутри триггера таблицы (RIEnd)</li>
</ul>
<p>Вот собственно и все, что делается в этих триггерах. Несколько громоздко и избыточно, но ничего особого сложного.</p>
<p>Однако даже в такой относительно простой вещи есть некоторые "подводные камни".</p>
<ul>
<li>Настройка Referential Integrity связана с модификацией контейнера базы данных, поэтому требует единоличного (Exclusive) доступа к базе данных</li>
<li>При выполнении модификации <a href="/knowledgebase/sovety-nachinayushhim-chast-i/#DataBase" target="_blank" rel="noopener">базы данных</a> под ногами не должен болтаться всякий мусор оставшийся от предыдущих модификаций. Т.е. непосредственно перед настройкой Referential Integrity необходимо выполнить очистку базы данных</li>
</ul>
<p style="text-align: justify;">Если одно из этих условий не будет выполнено, то при вызове пункта главного меню "DataBase", подпункт "Edit Referential Integrity" Вы получите предупреждение. Это будет либо напоминание о том, что база данных не открыта в режиме Exclusive и изменения сохранены не будут (хотя состояние Referential Integrity посмотреть можно), либо настойчивое предложение выполнить очистку базы данных (в этом случае даже посмотреть Referential Integrity не удастся).</p>
<p style="text-align: justify;">Еще одна тонкость при использовании "Referential Integrity" заключается в том, что в случае модификации "Referential Integrity" FoxPro ищет, что именно надо заменить в выражении триггерра, опираясь именно на стандартные имена функций. При этом все то, что отличается от имен по умолчанию остается неизменным.</p>
<p style="text-align: justify;">Например, если до настройки "Referential Integrity" Вы уже написали в выражении триггера какую-либо свою функцию (MyFunc()), то Referential Integrity не удалит эту функцию, но добавит к ней свою. В результате выражение триггера примет примерно такой вид: "__RI_UPDATE_MyTab().AND.(MyFunc())"</p>
<p style="text-align: justify;">Стоит ли использовать Referential Integrity? А почему бы и нет. Следует только помнить о том, что триггера созданные при помощи Referential Integrity касаются только и исключительно поддержания ссылочной целостности между парой таблиц. Причем не всех возможных видов ссылочной целостности, а только определенных ее видов. Т.е. в больших проектах этих триггеров недостаточно. Придется дописывать еще что-то свое.</p>
<p style="text-align: justify;">Только не надо модифицировать те функции, которые были созданы автоматически при настройке Referential Integrity (несмотря на то, что очень хочется). Иначе при очередной модификации базы данных Вы можете с удивлением обнаружить, что триггеры не работают, как положено, поскольку все внесенные Вами изменения куда-то пропали.</p>
<p>
<b><a name="ApplyTrigger"></a>Когда и для чего использовать триггер</b></p>
<p style="text-align: justify;">О чем собственно речь? А речь о том, в каких случаях следует использовать именно триггер, а не что-нибудь другое.</p>
<p style="text-align: justify;">Основная задача триггера - это, прежде всего проверка допустимости уже сделанных изменений. Внесение изменений в теле триггера допустимо, но тут есть ряд ограничений.</p>
<p style="text-align: justify;">Если Вы читали эту статью с самого начала, то уже знаете, что триггер не контролирует изменения данных в буфере. Т.е. процесс формирования данных триггер не интересует. Он работает уже с предполагаемым результатом.</p>
<p style="text-align: justify;">Таким образом, при использовании триггера предполагается, что Вы уже полностью сформировали данные (по крайней мере, в таблице, вызвавшей срабатывание триггера) и хотите убедиться, что данные изменения допустимы, либо внести изменения в <i><u>другие</u></i> таблицы, опираясь на данные изменения.</p>
<p style="text-align: justify;">Например, если у Вас стоит задача создания журнала изменений (кто, когда и что именно изменил в базе данных), то нет смысла делать запись в журнал при редактировании буфера. Может пользователь и вообще не примет эти изменения. Но уж если пользователь захотел эти изменения записать, то вот тут-то и надо сделать запись в журнал. А в этот момент как раз и срабатывают триггера.</p>
<p style="text-align: justify;">Более спорный момент - это контроль уникальности данных. Достаточно подробно это описано в главе Индексы, раздел <a href="/sovety-nachinayushhim-chast-iii/#CheckUnique" target="_blank" rel="noopener">Контроль уникальности данных при помощи индекса</a>.</p>
<p style="text-align: justify;">А вот для чего триггер точно не стоит использовать, так это для модификации той записи, изменение в которой и вызвало срабатывание триггера. Даже если опустить тот момент, что в FoxPro это просто невозможно, то все равно для этой цели лучше использовать Rule уровня записи.</p>
<div align="center"><b><a name="Rule"></a>Правила (Rule)</b></div>
<p>В FoxPro существует некоторая путаница с этим термином (впрочем, как и с большинством других терминов), вызванная не столько неясностью самого термина, сколько особенностью его использования.</p>
<p><b>Правило - это выражение</b>, значение которого вычисляется при наступлении определенного события. Это выражение должно вернуть обязательно логическое значение .T. или .F.</p>
<p>Но все дело в том, что в качестве одного из аргументов этого выражения может стоять некоторая функция (или несколько функций). Вот эти-то функции, вызываемые из выражения правила, также называют "правило".</p>
<p>Как правило, в большинстве случаев подразумевают именно функцию - правило.</p>
<p>В FoxPro различают 2 вида правил:</p>
<ul>
<li>Правило на поле текущей записи таблицы</li>
<li>Правило на запись таблицы</li>
</ul>
<p style="text-align: justify;">Вычисление значения выражения - правила для поля текущей записи таблицы происходит в случае модификации соответствующего поля.</p>
<p style="text-align: justify;">Вычисление значения выражения - правила для записи таблицы происходит в случае модификации любого поля записи.</p>
<p style="text-align: justify;">Точнее, вычисление происходит при завершении модификации. Но момент завершения модификации зависит от самого способа модификации.</p>
<p style="text-align: justify;">Например, если Вы редактируете данные в Grid (Browse-окне), то правило для поля сработает при переходе на другое поле или запись или при попытке перейти на другой объект. А правило на запись сработает при попытке перехода на другую запись или на другой объект.</p>
<p style="text-align: justify;">Если используется объект формы (не Grid, например, TextBox или EditBox) для редактирования содержимого поля, на которое наложено правило, то при попытке выйти из этого объекта после его редактирования сначала срабатывает правило для соответствующего поля, затем все события объекта-формы (Valid, LostFocus) и затем правило уровня записи таблицы (если есть). Т.е. выполнение правила на запись выполняется при завершении модификации одного поля, даже если Вы и не делаете попытку перейти на другую запись.</p>
<p style="text-align: justify;">Таким образом, при редактировании поля через объект формы Вы никак не сможете перехватить выполнение правила событиями формы. Правило для поля будет выполнено в первую очередь. Конечно, если было редактирование.</p>
<p style="text-align: justify;">В случае же использования для модификации какой-либо команды (например, REPLACE) правила срабатывают сразу же на этой команде. При этом порядок срабатывания правил для полей определяется порядком следования полей в соответствующей команде, либо, если порядок следования полей не указан явно (например, APPEND BLANK), в порядке их физического расположения в таблице.</p>
<p style="text-align: justify;">Разумеется, правило на запись срабатывает только после обработки правил на поля текущей записи, если все они вернули .T. Более того, если одно из правил для поля вернуло .F., то выполнение команды модификации немедленно прерывается и не предпринимается даже попытки выполнить модификацию остальных полей.</p>
<p style="text-align: justify;">Правила вычисляются при любой модификации данных любым способом. Т.е. они работают и в буферизированных данных. Поэтому, если правило вернет .F., то немедленно будет отображено сообщение об ошибке 1582 (отказ в правиле - поля) или 1583 (отказ в правиле - записи). Вы можете написать собственное сообщение об ошибке в предусмотренном для этого окне Message в конструкторе таблиц. Это сообщение будет отображаться только в том случае, если соответствующее правило вернет .F.</p>
<p style="text-align: justify;">Если же Вы будете обрабатывать ошибку правила программно, используя функцию AERROR(), то при ошибках правила - поля текущей записи пятый столбец полученного массива будет содержать порядковый номер поля, в котором произошла ошибка вычисления правила.</p>
<p style="text-align: justify;">При программном добавлении правила через команду CREATE TABLE или ALTER TABLE подразумевается именно выражение - правило, но никак не функция. Для добавления правила в этих командах используется ключевое слово CHECK.</p>
<p>
<b><a name="FunctionRule"></a>Особенности использования правил (Rule)</b></p>
<p style="text-align: justify;">Функции правил следует хранить в хранимых процедурах, поскольку это действия, которые связаны напрямую с данными и не должны зависеть от приложения.</p>
<p style="text-align: justify;">При использовании функций правил следует учитывать некоторые особенности их использования в FoxPro. В дальнейшем, используя термин "правило", я буду подразумевать именно функцию - правило.</p>
<ul>
<li style="text-align: justify;">Правила всегда анализирует изменения сделанные только в одной записи таблицы. Иначе говоря, даже если вы использовали некоторую групповую команду вставки или модификации (например, APPEND FROM), тем не менее, модификация будет производиться по одной записи за раз чтобы дать возможность правилам выполнить свои проверки.</li>
<li style="text-align: justify;">Внутри тела правила (внутри выражения или первой функции) произойдет автоматический переход в ту рабочую область и на ту запись, которые и вызвали срабатывание тела правила. Однако если Вы используете в качестве выражения правила несколько функций правила (например, "Func1().AND.Func2()"), то во второй функции такого автоматического перехода уже не произойдет. Поэтому при завершении функции правила необходимо особо проконтролировать возврат в ту рабочую область, в которой началось выполнение функции правила.</li>
<li style="text-align: justify;">По завершении вычисления выражения правила Вы вернетесь в ту рабочую область, в которой была дана команда, вызвавшая срабатывание правила.</li>
<li style="text-align: justify;">Внутри тела правила запрещено перемещать указатель записи в той рабочей области, которая вызвала срабатывание правила. Этот запрет можно обойти, открыв ту же самую таблицу еще раз в другой рабочей области (USE MyTab IN 0 AGAIN ALIAS MyTab2)</li>
<li style="text-align: justify;">Внутри правила допустимо модифицировать поля той же записи, в которой Вы сейчас и выполняете проверку правил. Но я не рекомендовал бы делать это в правилах для поля, поскольку в этом случае велик риск "зацикливания". Ведь модификация поля тут же вызовет срабатывание правила для этого поля, а если внутри него опять выполняется его же модификация, то Вы можете получить бесконечное срабатывание правила на поле.</li>
<li style="text-align: justify;">При модификации полей записи в правиле на запись повторное срабатывание правила на запись НЕ происходит. Т.е. даже если внутри тела правила для записи Вы модифицируете поле, которое имеет свое правило, то зацикливания не произойдет. Просто будет выполнено еще раз правило для измененного поля. Поэтому, если Вам необходимо внутри правила выполнить модификацию каких-то полей этой же записи, то их следует выполнить в правиле на запись</li>
<li style="text-align: justify;">Сообщение об ошибке правила будет отображено немедленно, как только выражение правила вернет .F. При этом все прочие правила в той же записи выполнены уже не будут.</li>
<li style="text-align: justify;">При удалении записи правила не срабатывают. Однако они срабатывают при создании новой записи или восстановлении ранее удаленной (RECALL)</li>
<li style="text-align: justify;">Внутри тела правила значения полей текущей записи содержат данные после модификации. Чтобы получить значения тех же полей до модификации следует использовать функцию OldVal() даже если таблица не была буферезирована. Следует иметь в виду, что если создается действительно новая запись (а не восстановление ранее удаленной по RECALL), то OldVal() вернет значение NULL, даже если данное поле и не может принимать значение NULL. Таким образом, можно выполнить проверку на факт реального изменения значения поля:<br />
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  IF MyField=OldVal("MyField")  
        * Значение поля MyField не изменилось, нет выполнять проверку  
        RETURN .T.  
  ENDIF  
  </pre>
</td>
</tr>

</table>
</li>
</ul>
<p>
<b><a name="ApplyRule"></a>Когда и для чего использовать правило</b></p>
<p style="text-align: justify;">О чем собственно речь? А речь о том, в каких случаях следует использовать именно правило, а не что-нибудь другое.</p>
<p style="text-align: justify;">Основная задача правила - это, прежде всего проверка допустимости изменений именно в процессе их внесения. Внесение изменений в теле правила допустимо, но тут есть ряд ограничений.</p>
<p style="text-align: justify;">Если Вы читали эту статью с самого начала, то уже знаете, что правило контролирует изменения данных даже в буфере. Т.е. правило следит за процессом формирования данных. В отличие от триггера, который контролирует именно результат.</p>
<p style="text-align: justify;">Таким образом, при использовании правила предполагается, что процесс формирования данных еще не завершен. Фактически правило определяет, какие именно данные можно ввести в данное поле, а какие - нет.</p>
<p style="text-align: justify;">Например, Вы можете написать правило для вычисления контрольной суммы ИНН (Идентификационный Номер Налогоплательщика). Если пользователь ошибся при вводе ИНН, то правило на данное поле тут же ему сообщит, что введено некорректное значение и не даст выйти из поля пока не будет введено корректное значение (и закрыть форму не даст!). Другой вопрос, насколько оправдан такой жесткий контроль. Но это уже зависит от логики Вашей программы.</p>
<p style="text-align: justify;">Можно, конечно, в случае некорректного ввода ввести корректное значение, но тут есть опасность "зацикливания". Бесконечного вызова правила на изменяемое поле. Поэтому лучше этого не делать.</p>
<p style="text-align: justify;">Пожалуй, наиболее удобным, является использование правил для фиксации времени изменений. Т.е. если в Вашей таблице введено специальное поле, например, LastModify типа DateTime, то Вы можете создать правило на запись, в котором и сделать присвоение:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> REPLACE LastModify WITH DateTime()</pre>
</td>
</tr>

</table>
<p style="text-align: justify;">Т.е. при <u>любой</u> модификации записи (кроме удаления) в поле LastModify будет записано дата и время этой модификации. А если добавить еще и поле, содержащее логин пользователя, то Вы получите информацию о том, кто и когда последний раз изменил данную запись. Разумеется, дата и время будут взяты с клиентской машины, где произошло изменение.</p>
<p style="text-align: justify;">Крайне нежелательно изнутри тела правила ссылаться вовне базы данных. Если такая необходимость все-таки существует, то следует всерьез задуматься о необходимости реализации логики именно через правила. Возможно, разумнее вынести нужную проверку на уровень приложения, а не базы данных.</p>
<p style="text-align: justify;">Также неразумно внутри тела правила делать ожидание реакции пользователя. Правило должно выполняться без каких-либо дополнительных действий со стороны пользователя. Опять же, если необходима реакция со стороны пользователя, то желательно вынести данную процедуру на уровень приложения</p>
<div align="center"><b><a name="Default"></a>Значение по умолчанию (Default)</b></div>
<p>В FoxPro существует некоторая путаница с этим термином (впрочем, как и с большинством других терминов), вызванная не столько неясностью самого термина, сколько особенностью его использования.</p>
<p><b>Значение по умолчанию - это выражение</b>, значение которого вычисляется при наступлении определенного события. Это выражение должно вернуть значение того типа данных, что и тип данных поля для которого это значение и указывается. Впрочем, иногда это правило сознательно нарушают. Но об этом чуть ниже.</p>
<p>Однако в качестве одного из аргументов этого выражения может стоять некоторая функция (или несколько функций). Вот эти-то функции, вызываемые из выражения значения по умолчанию, также называют "значение по умолчанию".</p>
<hr />
<p><b>Вычисление значения по умолчанию происходит только в момент создания новой записи, если значение соответствующего поля не указано явно.</b></p>
<hr />
<p>Этот момент требует пояснения, поскольку именно с ним связано большинство недоразумений</p>
<p>Если запись уже существует, то, разумеется, ни о каких значениях по умолчанию не может быть и речи, поскольку данные уже введены во все без исключения поля текущей записи. FoxPro просто не умеет по-другому, поскольку выделяет физическое место на диске под все поля записи сразу в момент ее создания. Ну, пожалуй, кроме полей типа Memo и General, но это отдельный разговор, да и то, выделение места все равно происходит.</p>
<p>Значит, значения по умолчанию вычисляются только в момент создания новой записи, причем обязательно до того, как новая запись будет создана физически.</p>
<p>Однако если Вы в команде создания новой записи явно укажете значение поля, для которого есть значение по умолчанию, то в этом случае вычисление значения по умолчанию не произойдет. Будет использовано то значение, которое указано явно в команде создания новой записи.</p>
<p>Ну, например, для поля MyField таблицы MyTab Вы написали некоторое выражение по умолчанию. Если для создания новой записи Вы используете команду вида:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> INSERT INTO MyTab (MyField) VALUES ("Новое значение")</pre>
</td>
</tr>

</table>
<p>То в новой записи в качестве значения поля MyField будет указано именно "Новое значение", а не то выражение, которое Вы указали как значение по умолчанию.</p>
<p>С другой стороны, если для создания новой записи Вы используете команду APPEN BLANK или ту же команду INSERT-SQL, но, не указав в списке полей поле MyField, то в этом случае, поскольку FoxPro явно не указали, какое именно значение следует присвоить полю MyField, будет использовано значение по умолчанию.</p>
<p>Более того, следует иметь в виду, что значение по умолчанию будет использовано и при создании новой записи в буферизированных таблицах.</p>
<p>Вычисление правила для поля таблицы произойдет после формирования значения по умолчанию. Что, в общем-то, и логично: чтобы проверить правильность введенного значения это значение сначала необходимо сформировать.</p>
<p>
<b><a name="FunctionDefault"></a>Особенности использования значения по умолчанию</b></p>
<p>Функции значений по умолчанию следует хранить в <a href="/sovety-nachinayushhim-chast-iv/#Stored" target="_blank" rel="noopener">хранимых процедурах</a>, поскольку это действия, которые связаны напрямую с данными и не должны зависеть от приложения.</p>
<p>При использовании функций значений по умолчанию следует учитывать некоторые особенности их использования в FoxPro. В дальнейшем, используя термин "значение по умолчанию", я буду подразумевать именно функцию - значения по умолчанию.</p>
<ul>
<li>Значение по умолчанию всегда формирует значение только в одной записи таблицы. Иначе говоря, даже если вы использовали некоторую групповую команду вставки (например, APPEND FROM), тем не менее, вставка будет производиться по одной записи за раз чтобы дать возможность вычислить значение по умолчанию для каждой вставляемой записи.</li>
<li>Внутри тела значения по умолчанию (внутри выражения или первой функции) произойдет автоматический переход в ту рабочую область и на ту запись, которые и вызвали срабатывание тела значения по умолчанию. Однако если Вы используете в качестве выражения значения по умолчанию несколько функций (например, "Func1()+Func2()"), то во второй функции такого автоматического перехода уже не произойдет. Поэтому при завершении функции значения по умолчанию необходимо особо проконтролировать возврат в ту рабочую область, в которой началось выполнение функции.</li>
<li>По завершении вычисления выражения значения по умолчанию Вы вернетесь в ту рабочую область, в которой была дана команда, вызвавшая срабатывание этого выражения.</li>
<li>Внутри тела функции значения по умолчанию запрещено перемещать указатель записи в той рабочей области, которая вызвала срабатывание функции. Этот запрет можно обойти, открыв ту же самую таблицу еще раз в другой рабочей области (USE MyTab IN 0 AGAIN ALIAS MyTab2)</li>
<li>Внутри тела функции значения по умолчанию не имеет смысла ссылаться на поля создаваемой записи той же таблицы, поскольку в общем случае не известно какие значения эти поля будут иметь в момент формирования значения по умолчанию отдельного поля. Т.е. сами поля уже будут существовать, но вот будут ли они содержать какое-либо значимое значение или же все еще будут оставаться пустыми заранее предсказать невозможно.</li>
<li>Если в результате расчета функция значения по умолчанию вернет значение, которое не может быть использовано в качестве значения данного поля, то Вы получите сообщение об ошибке, и новая запись создана не будет. Иногда это свойство используют сознательно, чтобы прервать создание новой записи в определенных ситуациях.</li>
<li>Если в качестве значения по умолчанию в реквизитах поля таблицы ничего не указано, то FoxPro использует в качестве значений по умолчанию пустые значения (для строк - пробелы, для чисел - ноль и т.п.), но ни в коем случае не значение NULL. Если Вы хотите использовать значение NULL, как значение по умолчанию, то его следует прописать явно как значение по умолчанию. Не забыв, разумеется, указать признак допустимости использования значения NULL для данного поля.</li>
</ul>
<p>
<b><a name="ApplyDefault"></a>Когда и для чего использовать значение по умолчанию</b></p>
<p>О чем собственно речь? А речь о том, в каких случаях следует использовать именно значение по умолчанию, а не что-нибудь другое.</p>
<p>Основная задача значения по умолчанию - это сформировать некоторое значение автоматически, когда в случае отсутствия явного указания значения Вас не устраивает пустое значение поля.</p>
<p>Ну, например, генерация нового значения суррогатного ключа. Как правило, это всегда относительно сложная функция (конечно, если Вы не используете поле типа Integer (AutoIncrement), появившееся в 8 версии FoxPro). Эту функцию записывают в <a href="/sovety-nachinayushhim-chast-iv/#Stored" target="_blank" rel="noopener">хранимых процедурах</a>, а в свойствах таблицу указывают в качестве значения по умолчанию имя этой функции.</p>
<p>Кстати, использование функции для генерации нового значения суррогатного ключа удобно еще тем, что ее вызов можно добавить в значение по умолчанию ключевого поля Local View (кнопка Properties на закладке Fields в дезайнере Local View). В этом случае новое значение ключевого поля будет создаваться сразу при создании новой записи в Local View, а при сбросе изменений в исходную таблицу в качестве значения ключевого поля будет использовано значение, вычисленное в Local View.</p>
<p>Если в процессе вычисления нового значения суррогатного ключа произошла ошибка или по каким-то причинам новое значение сформировать нельзя, то надо как-то сообщить внешнему приложению, что сформировать новое значение суррогатного ключа не удалось.</p>
<p>Самым простым решением в данном случае является присвоение значения NULL при том условии, что данное поле не имеет признака допустимости использования значения NULL. Т.е. сформировать значение, которое заведомо будет отвергнуто в качестве допустимого значения. Это и будет сигналом внешнему приложению, что при создании нового значения суррогатного ключа произошла какая-то ошибка.</p>
<p>А вот для чего не следует использовать значение по умолчанию, так это для формирования внешнего ключа, т.е. ссылки на родительскую таблицу. Проблема в том, что в этом случае Вам придется опираться на текущее положение указателя записи в родительской таблице. А это не всегда соответствует нужной записи родительской таблице. Поэтому переложите контроль ссылочной целостности на триггеры, которые, в общем-то, для этого и предназначены. А значение внешнего ключа всегда присваивайте явно в самом приложении при создании новых записей подчиненной таблицы.</p>
<div align="center"><b><a name="FieldDesign"></a>Дизайн полей таблицы</b></div>
<p>В этом разделе я опишу те свойства полей таблицы, о которых либо вообще не упомянул в других разделах, либо упомянул буквально парой слов. Дело в том, что эти свойства предназначены не столько для контроля корректности ввода данных и целостности базы данных, сколько для удобства построения пользовательского интерфейса. Речь идет о следующих свойствах полей таблицы:</p>
<ul>
<li>Format</li>
<li>Input Mask</li>
<li>Caption</li>
<li>Display library</li>
<li>Display class</li>
</ul>
<p>Главное, что следует понять об этих свойствах - это то, что данные свойства предлагают соответствующие настройки по умолчанию при отображении данных полей в пользовательском приложении. Однако они могут быть <u>перекрыты</u> соответствующими настройками в самом приложении.</p>
<p>Например, если Вы укажете для какого-либо поля значение свойства Format="T" (отсечение ведущих пробелов), то это отнюдь не значит, что Вы в принципе не сможете ввести в данное поле значение, имеющее ведущие пробелы.</p>
<p>Да, ведущие пробелы будут отсечены, если Вы будете редактировать данное поле в Browse-окне или же использовать прямые команды модификации данных (REPLACE, INSERT-SQL и т.п.)</p>
<p>Однако если Вы будете редактировать данное поле через объект формы (TextBox, Grid), то настройки свойства FORMAT используемых объектов <u>перекроют</u> настройки Format поля таблицы.</p>
<p>Таким образом, эти настройки определяют некоторые реквизиты полей таблицы, если явно не указаны другие значения для этих же реквизитов</p>
<p>В общем-то, назначение каждого из этих реквизитов ясно уже из их названия, но все-таки вкратце опишу их назначение:</p>
<p><b>Format</b> - определяет формат ввода и вывода данных. Принимаемые значения можно посмотреть в описании к Format property</p>
<p><b>Input Mask</b> - определяет способ ввода и вывода данных. Принимаемые значения можно посмотреть в описании к InputMask property</p>
<p>По большому счету и Format, и Input Mask предназначены для одного и того же. Просто Format действует на итоговое введенное значение (т.е. значение надо сначала ввести и только потом оно будет модифицировано в соответствии с настройками Format), а Input Mask на процесс ввода</p>
<p><b>Caption</b> - название поля. Это будет либо заголовок поля в Browse-окне, либо Header.Caption в Grid (если Вы создадите Grid путем "перетаскивания" таблицы из DataEnvironment формы), либо Label.Caption слева от поля (если Вы создадите TextBox путем "перетаскивания" поля из DataEnvironment формы).</p>
<p>Лично мне эта настройка только мешает. Поскольку в процессе отладки я достаточно часто открываю таблицы в Browse-окне для уточнения тех или иных действий. И если вместо имени поля я вижу значение Caption, то приходится прилагать дополнительные усилия, чтобы уточнить о каком именно поле идет речь. Впрочем, это дело личных предпочтений и способов отладки приложения.</p>
<p><b>Display class</b> - в каком классе следует отобразить содержимое данного поля</p>
<p><b>Display library</b> - из какой библиотеки классов следует взять класс, указанный в свойстве <b>Display class</b>. Если он не указан, то предполагается базовая библиотека классов.</p>
<p>Вообще-то, какая именно реакция будет при "перетаскивании" полей из DataEnvironment формы определяется в настройках FoxPro: пункт главного меню Tools, подпункт Options, закладка Field Mapping</p>
<p>На этой закладке представлен список классов, которые будут использованы по умолчанию для отображения содержимого тех или иных типов данных, а под этим списком - набор переключателей, определяющих, что именно будет перенесено в объекты формы при "перетаскивании" поля из DataEnvironment</p>
<p>Как видите можно отключить копирование настроек Format, Input Mask, Caption при "перетаскивании" поля из DataEnvironment. Т.е. фактически отменить действие этих настроек в объектах формы.</p>
<p>Надо ли использовать эти настройки? А почему бы и нет! Надо только помнить, что в отличие от всех прочих настроек полей таблиц изменения в этих настройках не приведут к изменению соответствующих настроек в ранее созданных объектах формы. Поэтому после их модификации придется пройтись по всем ранее созданным классам, формам и отчетам для приведения ранее сделанных настроек в соответствие с новыми.</p>
<div align="center"><b><a name="Directive"></a>Директивы компилятора</b></div>
<p>Директивы компилятора - это те команды, которые начинаются с символа "#". Наиболее известные из них это:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  #DEFINE  
  #INCLUDE  
  </pre>
</td>
</tr>

</table>
<p>Однако есть и другие аналогичные команды.</p>
<p>Из-за недопонимания того, что собственно делают эти команды, возникает масса недоразумений. Самое главное, что следует понять об этих командах, это то, что они не работают в уже готовом (откомпилированном) приложении. Их цель - это указание компилятору, что именно надо подставить в данном месте именно в процессе компиляции. Собственно, поэтому они и называются "директивы компилятора"</p>
<p>Рассмотрим простейший код:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  #DEFINE MY_CONST 1  
  ?MY_CONST  
  </pre>
</td>
</tr>

</table>
<p>Что собственно делает этот код. И самое главное, когда он это делает. А происходит следующее:</p>
<ul>
<li>На этапе компиляции фрагмента приложения, как только компилятор встречает директиву #DEFINE, он запоминает, что вместо слова MY_CONST необходимо подставить число 1</li>
<li>Если при дальнейшей компиляции компилятор встречает слово MY_CONST, он вместо него подставляет число 1 и продолжает компиляцию.</li>
</ul>
<p>Т.е. фактически происходит <b><u>замена</u></b> слова MY_CONST на цифру 1, начиная с директивы #DEFINE и "ниже".</p>
<p>А "ниже" - это где?</p>
<p>Если речь идет о файле PRG, то тут все ясно: "ниже" - это до конца файла. И именно файла, а не процедуры. Т.е. если файл PRG содержит несколько процедур, то действие директивы #DEFINE будет распространяться на все строки файла PRG физически расположенные "ниже" нее вне зависимости от любых других команд (исключая другую директиву #UNDEFINE).</p>
<p>Но если речь идет о форме, и команда #DEFINE была дана в одном из методов формы, то предсказать на какие еще события и методы она подействует заранее невозможно. Поэтому, если необходимо, чтобы директива #DEFINE подействовала на все без исключения события и методы формы (или класса), эти директивы собирают в один общий файл, называемый "файл заголовка" или "заголовочный файл". И далее подключают этот заголовочный файл через специальный пункт меню Form (или Class), подпункт Include File.</p>
<p><b>Заголовочный файл</b> - это обычный текстовый файл, имеющий расширение из одной буквы "h"</p>
<p>Следует иметь в виду, что директива компилятора действует только и исключительно в пределах одного объекта проекта. Чаще всего, под объектом проекта понимается конкретный <i>файл</i>. Хотя в отношении библиотеки классов, под объектом проекта следует понимать отдельный класс этой библиотеки классов.</p>
<p>Это значит, что если Вы подключили заголовочный файл в каком-либо классе, то указанные там директивы будут действовать только в данном классе, а вот на объекты, созданные на основе данного класса они уже распространяться не будут! Поскольку это уже <i>другие</i> объекты проекта.</p>
<p>Из этого следует довольно неудобный вывод. Если Вы хотите, чтобы директивы компилятора, указанные в одном заголовочном файле действовали во всех объектах Вашего проекта, то его необходимо будет подключать во всех объектах. Т.е. невозможно будет сделать подключение в каком-нибудь стартовом модуле, с тем, чтобы он распространился на весь проект. Не получится.</p>
<p>В принципе, до некоторой степени эту рутинную работу по подключению заголовочного файла можно автоматизировать. Для этой цели служит системная переменная _INCLUDE или (что, то же самое) настройка через пункт системного меню Tools, подпункт Options, закладка File Locations, строка "Default Include File"</p>
<p>Т.е. если Вы дадите команду</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> _INCLUDE="C:\MyDir\MyHeadFile.h"</pre>
</td>
</tr>

</table>
<p>Или укажите этот файл в опциях, то при создании <b><u>новых</u></b> формы и классов указанный файл автоматически будет подключаться к этим формам и классам. Но эта настройка никак не повлияет на ранее созданные формы и классы. Более того, воспользовавшись пунктом меню Form (или Class), подпункт Include File Вы можете заменить подставленный заголовочный файл на другой или вовсе его удалить.</p>
<p>В этом пункте меню можно указать только один заголовочный файл. Поэтому, если Вам надо указать несколько заголовочных файлов, то придется создать еще один файл, который и объединит в себе несколько других. Его содержание будет примерно следующим:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  #INCLUDE C:\MyDir\MyHeadFile1.h  
  #INCLUDE C:\MyDir\MyHeadFile2.h  
  #INCLUDE C:\MyDir\MyHeadFile3.h  
  </pre>
</td>
</tr>

</table>
<p>Проблема заключается в том, что на этапе компиляции факт отсутствия заголовочного файла не вызовет сообщения об ошибке, поскольку все слова, которые следовало бы заменить будут восприняты компилятором как переменные памяти. Ошибка возникнет только на этапе исполнения готового приложения.</p>
<p>Обращаю внимание еще раз. Директивы компилятора действуют только в момент компиляции. В готовом приложении они не работают. Это значит, что нет необходимости поставлять заголовочный файл клиенту или включать этот файл внутрь приложения. Все что можно взять из этого файла проект возьмет в момент компиляции.</p>
<p>Разумеется, если Вы собираетесь компилировать какие-то фрагменты кода "на лету" в готовом приложении, то тогда заголовочный файл может пригодиться.</p>
<p>Но если директивы компилятора так неудобно использовать, то почему же их вообще продолжают использовать?</p>
<p>У меня нет достаточно убедительного ответа на этот вопрос. Поэтому ограничусь тем, что директивы компилятора - это еще один инструмент, который дает Вам FoxPro. А использовать его или нет, решайте сами.</p>
</li>
</ul>
<p>&nbsp;</p>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4899">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4899">Владимир Максимов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Владимир Максимов" href="https://foxclub.ru/account/?user=4899">
				<img alt='' src='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 65<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-v/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Статьи]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kalkulyator/</link>
					<title><![CDATA[Калькулятор]]></title>
                    					    <author><![CDATA[Перминов Игорь]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Калькулятор</h1>
													</header>
													<div id="sol_opis">Поле с калькулятором</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Перминов Игорь</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5060">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5060">Перминов Игорь</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Перминов Игорь" href="https://foxclub.ru/account/?user=5060">
				<img alt='' src='https://secure.gravatar.com/avatar/c037d0f24a4cd0738110665cf089b985?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c037d0f24a4cd0738110665cf089b985?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 16-09-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kalkulyator/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/perevod-fio-v-ukazannyj-padezh-padeg-dll-s-www-delphikingdom-ru/</link>
					<title><![CDATA[Перевод ФИО в указанный падеж &#8211; Padeg.DLL с www.DelphiKingdom.ru]]></title>
                    					    <author><![CDATA[Петров Андрей]]></author>
                    										    <pubDate>Tue, 22 Nov 2022 07:08:56 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Перевод ФИО в указанный падеж &#8211; Padeg.DLL с www.DelphiKingdom.ru</h1>
													</header>
													<div id="sol_opis">Использование указанной библиотеки в VFP</div>
<div id="sol_body">
<p>Возможности (кратко):</p>
<ol>
<li>Перевод ФИО (именительный падеж) в указанный падеж по номеру падежа и полу.</li>
<li>Перевод строки содержащей ФИО в указанный падеж по номеру падежа и полу.</li>
<li>Перевод строки из любого падежа в именительный без указания пола.</li>
<li>Возможно автоматическое определение пола.</li>
<li>Работа со словарем исключений.</li>
</ol>
<p>Более подробно смотрите вот здесь <a href="http://www.delphikingdom.ru/asp/viewitem.asp?UrlItem=/mastering/poligon/webpadeg.htm"><u>здесь</u></a> <br />
Вот текст на VFP:</p>
<pre><pre class='bbcode'>    
 *     _______________________________________Петров А.О.__  
 *    |  Преобразование ФИО v2.1				            |  
 *    |  Адаптация всех функций под Visual FoxPRO	        |  
 *    |  Программа FoxPRO.prg				                |  
 *    |____________________________________________________|  
 *    |  Дата изменения: 13.04.05,   написана  11.02.04    |  
 *    |____________________________________________________|  
 * 13.04.05 Исправил багис с полом  
    
  #DEFINE MAX_FIO_LEN 100  
  PRIVATE f,l,s  
  m.f='Петрова'  
  m.l='Мария'  
  m.s='Ивановна'  
  m.sex='ж'  
    
  DECLARE integer GetFIOPadeg IN padeg.dll;  
  	string pFirstName,;  
  	string pLastName,;  
  	string pMiddleName,;  
  	integer bSex,;  
  	integer nPadeg,;  
  	string @pResult,;  
  	integer @nLen  
  	  
  DECLARE integer GetFIOPadegAS IN padeg.dll;  
  	string pFirstName,;  
  	string plastName,;  
  	string pMiddleName,;  
  	integer nPadeg,;  
  	string @pResult,;  
  	integer @nLen  
    
  DECLARE integer GetFIOPadegFS IN padeg.dll;  
  	string pFIO,;  
  	integer bSex,;  
  	integer nPadeg,;  
  	string @pResult,;  
  	integer @nLen  
    
  DECLARE integer GetFIOPadegFSAS IN padeg.dll;  
  	string pFIO,;  
  	integer nPadeg,;  
  	string @pResult,;  
  	integer @nLen  
  	  
  DECLARE integer GetIFPadeg IN padeg.dll;  
  	string pFirstName,;  
  	string pLastName,;  
  	integer bSex,;  
  	integer nPadeg,;  
  	string @pResult,;  
  	integer @nLen  
    
  DECLARE integer GetIFPadegFS IN padeg.dll;  
  	string pIF,;  
  	integer bSex,;  
  	integer nPadeg,;  
  	string @pResult,;  
  	integer @nLen  
  	  
  DECLARE integer GetNominativePadeg IN padeg.dll;  
  	string pFIO,;  
  	string @pResult,;  
  	integer @nLen  
    
  DECLARE integer UpdateExceptions IN padeg.dll;  
    
 *  ============================== КОД ЗДЕСЬ =================================  
  PRIVATE _l  
    
  CLEAR  
  FOR m.x=1 TO 6  
  	m._l=MAX_FIO_LEN  
  	m.str=SPACE(m._l)  
  	=getfiopadeg(m.f,m.l,m.s,IIF(m.sex='м',1,0),m.x,@str,@_l)  
  	? 'Номер падежа = ',x,' ФИО = ',SUBSTR(str,1,m._l)  
  ENDFOR  
    
  ? 'GetFIO			= ',getfio(m.f,m.l,m.s,ASC(m.sex),2)  
  ? 'GetFIOFromStr		= ',getfiofromstr(f+' '+l+' '+s,ASC(m.sex),2)  
  ? 'GetIF			= ',getif(m.f,m.l,ASC(m.sex),2)  
  ? 'GetIFFromStr		= ',getiffromstr(m.f+' '+m.l,ASC(m.sex),2)  
  ? 'GetNominative		= ',getnominative(getfio(m.f,m.l,m.s,ASC(m.sex),2))  
    
  ? 'UpdateExceptions = ',UpdateExceptions()#0  
 *  ==========================================================================  
    
  FUNCTION GetFIO  
  LPARAMETERS pFirstName, plastName, pMiddleName, bSex, nPadeg  
  PRIVATE result, l  
  m.l=MAX_FIO_LEN  
  m.result=REPLICATE(CHR(0),m.l)  
  m.bsex=IIF(m.sex='м',1,0)  
  =getfiopadeg(pFirstName, plastName, pMiddleName, bSex, nPadeg, @result, @l)  
  RETURN SUBSTR(m.result,1,m.l)  
    
  FUNCTION GetFIOFromStr  
  LPARAMETERS pFIO, bSex, nPadeg  
  PRIVATE result, l  
  m.l=MAX_FIO_LEN  
  m.result=REPLICATE(CHR(0),m.l)  
  m.bsex=IIF(m.sex='м',1,0)  
  =getFIOPadegFS(pFIO, bSex, nPadeg, @result, @l)  
  RETURN SUBSTR(m.result,1,m.l)  
    
  FUNCTION GetIF  
  LPARAMETERS plastName, pFirstName, bSex, nPadeg  
  PRIVATE result, l  
  m.l=MAX_FIO_LEN  
  m.result=REPLICATE(CHR(0),m.l)  
  m.bsex=IIF(m.sex='м',1,0)  
  =GetIFpadeg(plastName, pFirstName, bSex, nPadeg, @result, @l)  
  RETURN SUBSTR(m.result,1,m.l)  
    
  FUNCTION GetIFFromStr  
  LPARAMETERS pIF, bSex, nPadeg  
  PRIVATE result, l  
  m.l=MAX_FIO_LEN  
  m.result=REPLICATE(CHR(0),m.l)  
  m.bsex=IIF(m.sex='м',1,0)  
  =getIFPadegFS(pIF, bSex, nPadeg, @result, @l)  
  RETURN SUBSTR(m.result,1,m.l)  
    
  FUNCTION GetNominative  
  LPARAMETERS pFIO  
  PRIVATE result, l  
  m.l=MAX_FIO_LEN  
  m.result=REPLICATE(CHR(0),m.l)  
  m.bsex=IIF(m.sex='м',1,0)  
  =getnominativepadeg(pFIO, @result, @l)  
  RETURN SUBSTR(m.result,1,m.l)  
</pre></pre>
<p>
<a href="http://www.delphikingdom.com/asp/viewitem.asp?catalogid=412">http://www.delphikingdom.com</a></p>
</div>
<div id="sol_avtor">Автор: Петров Андрей</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5063">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5063">Петров Андрей</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Петров Андрей" href="https://foxclub.ru/account/?user=5063">
				<img alt='' src='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 14<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-04-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/perevod-fio-v-ukazannyj-padezh-padeg-dll-s-www-delphikingdom-ru/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-clsprinter/</link>
					<title><![CDATA[Класс clsPrinter]]></title>
                    					    <author><![CDATA[Syberex]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс clsPrinter</h1>
													</header>
													<div id="sol_opis">Класс для вывода на принтер текста и графики. На основе WIN32API функций. Хорошо подойдет для вывода на печать аналога &quot;белых&quot; форм. Версия 1.1 Добавлена возможность рисования на формах.</div>
<div id="sol_body">Это первая версия класса. Пока вывод может идти только на принтер установленный в Винде по умолчанию. Список функций для графики ограничен. Описание приложено в файле "описание класса.doc". Класс будет постепенно дорабатываться. Думаю над реализацией предварительного просмотра. (При отладке класса очень помог драйвер моего принтера Canon i250, который имеет встроенную возможность предпросмотра любых документов, отправляемых на печать!)  Про новые возможности читать в Описании класса!</div>
<div id="sol_avtor">Автор: Syberex</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4749">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4749">Syberex</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Syberex" href="https://foxclub.ru/account/?user=4749">
				<img alt='' src='https://secure.gravatar.com/avatar/3575a3e6d812a3bc6213378083787328?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/3575a3e6d812a3bc6213378083787328?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 19-01-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-clsprinter/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/odnostoronnyaya-sinhronizacziya-katalogov-i-zapusk-prilozheniya/</link>
					<title><![CDATA[Односторонняя синхронизация каталогов и запуск приложения]]></title>
                    					    <author><![CDATA[urfin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Односторонняя синхронизация каталогов и запуск приложения</h1>
													</header>
													<div id="sol_opis">Назначение : Клонирование каталогов и запуск файл-серверного приложения на клиентских машинах.</div>
<div id="sol_body">Очередной велосипед c оригинальным подходом к решению задачи односторонней синхронизации каталогов<br /> Писалось на VFP9, но должно работать под любой версией. Рекомендации по использованию :<br /> 1) Заполните таблицу клонируемых каталогов START.DBF<br /> Поле cSource – исходный каталог для клонирования. Например C:WORKMySourceFolder<br /> Поле cTarget – целевой каталог-клон. Например D:BACKUP MyTargetFolder<br /> (если пусто, то будет создан подкаталог в каталоге запуска программы с названием аналогичным исходному подкаталогу)<br /> Например при запуске C:STARTstart.exe, будет создан каталог-клон C:STARTMySourceFolder)<br /> 2) Настройки копируемой и запускаемой программы хранятся в автосоздаваемом файле START.INI<br /> [Скопировать и запустить программу]<br /> Копируемый исполняемый файл=<br /> Целевой каталог для запуска=<br /> P.S. Будьте особенно внимательны с полем Start.cTarget<br /> Синхронизация каталогов – односторонняя и Вы можете потерять файлы.<br /> (будут удалены все файлы и каталоги, не существующие в Start.cSource)</p>
</div>
<div id="sol_avtor">Автор: Радченко Виктор Вадимович</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4641">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 7 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4641">urfin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="urfin" href="https://foxclub.ru/account/?user=4641">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/4641-70x70.png?ver=1757136223' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/4641.png?ver=1757136223 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-08-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/odnostoronnyaya-sinhronizacziya-katalogov-i-zapusk-prilozheniya/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kak-sdelat-exe-fajl/</link>
					<title><![CDATA[Как сделать exe файл в Visual FoxPro]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Mon, 21 Nov 2022 09:04:49 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Как сделать exe файл в Visual FoxPro</h1>
													</header>
													<h3>Как сделать exe файл</h3>
<p><u><b>Содержание</b></u><br />
<b>1.Как скомпилировать EXE<br />
1.1 Технология компиляции<br />
1.2 Сопутствующие файлы<br />
2.Что нужно включить в EXE</b></p>
<p><u><b>1.Как скомпилировать EXE</b></u><br />
<b>1.1 Технология компиляции</b><br />
<i><b>Эпиграф:<br />
"Ай да Пушкин, ай да..."<br />
А.С.Пушкин</b></i></p>
<p>Технология компиляции EXE в Visual FoxPro довольно проста. Мы не будем отвлекаться на такие экстремальные методы как ввод в командном окне команд типа <b>BUILD PROJECT, BUILD APP, BUILD EXE</b>, а ограничимся удобствами, предоставляемыми графическим интерфейсом VFP.<br />
Итак, для создания EXE нам понадобится нажать в менеджере проекта кнопку <b>"BUILD..."</b>. Выбрав в открывшемся диалоговом окне опцию <i><b>Win32 executable / COM server (EXE)</b></i> давим <b>OK</b>. ВСЕ. 😉<br />
"Как все?"-- спросите Вы -- "А указать под каким именем сохранить файл?"<br />
Согласен... Надо указать обязательно, иначе все насмарку.<br />
Кстати, думаю, что нелишним будет напомнить о том, что для того чтобы процесс компиляции прошел успешно необходимо менеджер проекта заполнить файлами Вашей программы, один из которых обязательно должен быть как main (в менеджере проектов имя этого файла выделено жирным шрифтом), т.е. файл который будет исполнен первым. По умолчанию как main-программа устанавливается первый включенный в проект программный файл (*.prg) или файл формы (*.scx).<br />
Вобщем все довольно просто! Просто..?<br />
Теперь о грустном...</p>
<p><b>1.2 Сопутствующие файлы</b><br />
<i><b>Эпиграф:<br />
"... а включаешь - не работает!"<br />
М.Жванецкий</b></i></p>
<p>Все перепетии этапа компиляции приложения уже позади, и Вы, гордый от сознания собственного превосходства над простыми смертными, семимильными шагами несетесь к заказчику, устанавливаете свое приложение, попутно расписывая ему(заказчику) как теперь у него все будет круто, и подсчитывая в уме какой винт нужно купить, что бы осталось на пиво, вдруг натыкаетесь на то, что Ваша супер-пупер прога не фурычит. Грустно. Обидно. А главное не будет у Вас нового вичестера или Чего Вы Там Себе запланировали купить с гонорара...</p>
<p>Все дело в том, что скомпилированный нами .exe не есть самодостаточным исполняемым файлом. Для нормальной работы этому псевдо-исполняемому файлу необходимы библиотеки поддержки (.dll). Я не буду сильно вдаваться в рассуждения об этом, а просто приведу названия файлов, необходимых для нормальной работы приложения.<br />
В принципе до 6-й версии включительно для переноса приложения на клиентскую машину можно использовать штатный <b>Setup Wizard</b>, который самостоятельно все прописывает, а в последующих --<b>InstallShield</b> (или другой инсталятор).<br />
Все приведенные ниже файлы есть минимально-необходимый набор файлов для различных версий VFP (по материалам ):</p>
<pre>VFP 8.0		msvcr70.dll, vfp8r.dll, vfp8rrus.dll, gdiplus.dll
VFP 7.0		msvcr70.dll, vfp7r.dll, vfp7rrus.dll
VFP 6.0		vfp6r.dll, vfp6renu.dll , vfp6rrus.dll
VFP 5.0		vfpole50.dll, vfpodbc.dll, vfp500.dll, vfp5rus.dll, Foxpro.int</pre>
<p>
Указанный выше набор библиотек необходимо разместить в каталоге программы или в системном каталоге Windows. Для различных версий Windows эти каталоги различны:</p>
<pre>Win9x, WinMe			c:\Windows\SYSTEM
WinNT,Win2000,WinXP		c:\Windows\SYSTEM32</pre>
<p>
<u><b>2.Что нужно включить в EXE</b></u><br />
<b><u>Эпиграф:<br />
"To include or not to include?"<br />
пьяный электрик</u></b></p>
<p>Все изложенное ниже является личным мнением автора, которым Вы можете пренебречь. Но делая по-своему помните: <i>биться головой в бетонную стену гораздо больнее, чем воспользоваться проломом сделаным до Вас</i>.<br />
По умолчанию в готовый .exe включаются все файлы, необходимые для работы приложения - программы, формы, меню, библиотеки, классы и т.д. кроме файлов баз данных и таблиц (такие файлы можно узнать по перечеркнутому кружочку возле имени файла в менеджере проекта). Все включенные в .exe файлы после компиляции станут немодифицируемыми (доступными только для чтения). Понятно, что файлы таблиц (*.dbf) включать не стоит поскольку они подвергаются постоянным операциям изменения-дополнения данных, но иногда бывают случаи когда необходимо скрыть какие-либо статическиеданные от пользователя, но обеспечить доступ к ним самой программы. Лучшего места чем "внутренности" exe-шника не придумать.<br />
Так же довольно нередкая ситуация, когда нужно "находу", или временно, изменить файл отчета, или когда имеем целый набор отчетов, уникальных для каждого пользователя. Ну в самом деле представьте: десять операторов и каждому по десять отчетов и все это в *.exe. единственным выходом в этой ситуации будет исключить эти отчеты из конечного файла и поставлять их вместе с приложением.<br />
В любом случае решение о том какие файлы исключить, а какие оставить за Вами.</p>
<p>Все, пиво кончилось, надо идти в гастроном.</p>
<p>С уважением, Владислав Кулак</p>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kak-sdelat-exe-fajl/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Статьи]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/dlinnye-chisla/</link>
					<title><![CDATA[Длинные числа]]></title>
                    					    <author><![CDATA[Vladimir_Knyr]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Длинные числа</h1>
													</header>
													<div id="sol_opis">Арифметические действия с большими числами в строковом представлении</div>
<div id="sol_body">
<h3>Длинные числами</h3>
<p> Сначала написал этот класс, потом решил поискать на форуме,<br /> и действительно, данна тема обсуждалась в 2001 (далеком году)<br /> http://forum.foxclub.ru/read.php?f=5&i=9992&t=9992<br /> поэтому критике или советам буду только рад !!!     </div>
<div id="sol_avtor">Автор: Владимир Кныр</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4754">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4754">Vladimir_Knyr</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Vladimir_Knyr" href="https://foxclub.ru/account/?user=4754">
				<img alt='' src='https://secure.gravatar.com/avatar/7dd8187cfc903829e54ae52b377e8a5a?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7dd8187cfc903829e54ae52b377e8a5a?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 15-12-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/dlinnye-chisla/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/server-pechati-dlya-ms-dos-prilozhenij/</link>
					<title><![CDATA[Сервер печати для MS-DOS-приложений]]></title>
                    					    <author><![CDATA[Foxtrot]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:26 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Сервер печати для MS-DOS-приложений</h1>
													</header>
													<div id="sol_opis">Программа сканирует определенную пользователем папку на предмет наличия файлов для печати и при нахождении оных отправляет их в Printer Spool Windows</div>
<div id="sol_body">
<h3>Сервер печати для MS-DOS-приложений</h3>
<p> Программа печати текстовых файлов с 866-ой кодировкой стандарта ASCII, хотя может работать с любой другой.<br /> Предназначена для тех, кто имеет лазерный принтер (чаще всего с USB-портом), но все еще работающих с программами MS-DOS.<br /> Работает в двух режимах: ручном и автоматическом.<br /> Если с ручным режимом все понятно, т.е. выбрали файл, отправили на печать;<br /> то для автоматического нужно выбрать папку, в которую Вы будете копировать или Ваша программа будет формировать файлы.<br /> Программа будет сканировать заданную папку по таймауту и отправлять встретившиеся файлы (только по заданной маске) на печать, затем их удаляет (в Корзину Windows(R) или безвозвратно) или игнорирует при следующем сканировании.<br /> Основное удобство программы состоит в том, что Вам не нужно изменять Ваши программы или их настройки.<br /> Если при обработке текста в начале строки встретится код конца страницы, то строка будет либо удалена, либо заменена пустой строкой.<br /> Также можно передать параметром файл для печати. Тогда программа просто отправит файл на печать и закончит свою работу.<br /> Можно применять один из двух методов обработки файлов: построчный и "быстрый". Оба выдают порой непредсказуемые результаты. Какой более приемлем к Вашим условиям, решать Вам.<br /> При "быстром" режиме обработки файлов доступна технология "Drag&Drop". Для этогo нужно перенести нужный Вам файл из Проводника Windows(R) в картинку-логотип программы.  </div>
<div id="sol_avtor">Автор: Foxtrot</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4782">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4782">Foxtrot</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Foxtrot" href="https://foxclub.ru/account/?user=4782">
				<img alt='' src='https://secure.gravatar.com/avatar/14af643bd13aa7e300bf3487d9a2cdc5?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/14af643bd13aa7e300bf3487d9a2cdc5?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-04-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/server-pechati-dlya-ms-dos-prilozhenij/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/browser/</link>
					<title><![CDATA[Browser]]></title>
                    					    <author><![CDATA[Foxtrot]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:26 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Browser</h1>
													</header>
													<div id="sol_opis">Программа для просмотра таблиц</div>
<div id="sol_body">
<h3>Browser</h3>
<p> Программа для просмотра таблиц. Функциональные возможности:<br /> 1. сортировка по любому полю<br /> 2. передача параметра (базу или таблицу) с командной строки<br /> 3. технология "Drag & Drop". Для этогo нужно перенести нужный Вам файл из Проводника Windows(R) в картинку-логотип программы<br /> 4. исправление контейнеров DBC<br /> 5. индексирование, упаковка таблиц<br /> 6. просмотр структуры таблиц<br /> 7. экспорт данных в текстовой файл<br /> 8. "сжатие" - удаление пустых записей<br /> 9. "статистика" - подсчет записей, помеченных как удаленные<br /> 10. установка, удаление кодовой страницы таблиц</p>
<p> PS: VFP6SP5    </p></div>
<div id="sol_avtor">Автор: Foxtrot</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4782">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4782">Foxtrot</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Foxtrot" href="https://foxclub.ru/account/?user=4782">
				<img alt='' src='https://secure.gravatar.com/avatar/14af643bd13aa7e300bf3487d9a2cdc5?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/14af643bd13aa7e300bf3487d9a2cdc5?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-04-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/browser/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/otkryt-rar-arhiv-pozhalujsta/</link>
					<title><![CDATA[Открыть RAR архив? &#8212; Пожалуйста!]]></title>
                    					    <author><![CDATA[lnu]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:25 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Открыть RAR архив? &#8212; Пожалуйста!</h1>
													</header>
													<div id="sol_opis">Как розархивировать rar-файл с помощью UnRar.dll?</div>
<div id="sol_body">
<h3>Открыть RAR архив? -- Пожалуйста!</h3>
<p> Чтобы открыть Rar архив, конечно же, можно использовать Rar.exe. Но есть ли у вас на него права?<br /> Нет? Тогда используйте UnRar.dll. Распространяется библиотека свободно...  <br /> В файле UsingUnrarDll.zip пример использования этой dll.(VFP7.0) </p>
<p> P.S. Для работы с указателями использую Netlib.vcx(clsheap) с этого сайта. </p></div>
<div id="sol_avtor">Автор: lnu</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4435">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4435">lnu</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="lnu" href="https://foxclub.ru/account/?user=4435">
				<img alt='' src='https://secure.gravatar.com/avatar/2f3638ab5dc18cedfe75fc0daf44a0c0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/2f3638ab5dc18cedfe75fc0daf44a0c0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 04-11-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/otkryt-rar-arhiv-pozhalujsta/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/prostoj-generator-otchetov-v-eksel-10000-zapisej-za-2-minuty/</link>
					<title><![CDATA[Простой генератор отчетов в Ексель, 10000 записей за 2 минуты.]]></title>
                    					    <author><![CDATA[s28091973]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Простой генератор отчетов в Ексель, 10000 записей за 2 минуты.</h1>
													</header>
													<div id="sol_opis">Простой генератор отчетов в Ексель, 10000 записей за 2 минуты. Построение ведется на таблице BBF, должна быть как минимум одна группировка, хотя бы по искусственному полю. Многострочные подвалы и данные. Реализован в виде класса.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Сергей</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4619">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4619">s28091973</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="s28091973" href="https://foxclub.ru/account/?user=4619">
				<img alt='' src='https://secure.gravatar.com/avatar/73110ce2ed72bdfa8003e44c19d1b04a?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/73110ce2ed72bdfa8003e44c19d1b04a?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 05-04-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/prostoj-generator-otchetov-v-eksel-10000-zapisej-za-2-minuty/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/proverka-korrektnosti-scheta-iban/</link>
					<title><![CDATA[Проверка корректности счета IBAN]]></title>
                    					    <author><![CDATA[Петров Андрей]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Проверка корректности счета IBAN</h1>
													</header>
													<div id="sol_opis">Проверка корректности счета IBAN</div>
<div id="sol_body">По мотивам ссылки http://www.apacs.org.uk/IBAN/iban/Iban_check.html Те перевод кода Java в код VFP.</div>
<div id="sol_avtor">Автор: Андрей</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5063">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5063">Петров Андрей</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Петров Андрей" href="https://foxclub.ru/account/?user=5063">
				<img alt='' src='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 14<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-04-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/proverka-korrektnosti-scheta-iban/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/shahmatka-s-ispolzovaniem-ctgrid/</link>
					<title><![CDATA[Шахматка с использованием ctGrid]]></title>
                    					    <author><![CDATA[Aptex]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Шахматка с использованием ctGrid</h1>
													</header>
													<div id="sol_opis">При выводе отчета в виде шахматки некоторые трудности вызывает неопределенное число колонок в отчете.При таком решении этого нет. Сколько будет колонок,столько и напечатает.</div>
<div id="sol_body">
<h3>Шахматка с использованием ctGrid</h3>
<p> Как обычно,для шахматки исходная таблица данных должна содержать три поля:<br />     1 - Строки  (Тип "С")<br />     2 - Колонки (Тип "С")<br />     3 - Данные  (Тип "N")<br /> Таблица должна быть отсортирована по первой и второй колонкам (Order by 1,2)<br /> ctGrid позволяет редактировать данные и ширину колонок.Как откорректируешь,<br /> так и напечатает.Управляя множеством параметров ctGrid,получаем желаемый вид на<br /> екране и в печати.<br /> Есс-но ctGrid.ocx должон быть зарегистрирован<br /> Прошу не рассматривать это решение как готовое на все случаи жизни, а только как возможный путь решения задачи шахматки и поетому сильно не пинать.<br /> В примере запустите main.prg    </div>
<div id="sol_avtor">Автор: Анатолий</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4741">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4741">Aptex</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Aptex" href="https://foxclub.ru/account/?user=4741">
				<img alt='' src='https://secure.gravatar.com/avatar/9856ea7b7753edd543881b64e84e1074?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/9856ea7b7753edd543881b64e84e1074?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 07-11-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/shahmatka-s-ispolzovaniem-ctgrid/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/postroenie-diagramm-ispolzuya-winapi-na-chistom-vfp-ole-treeview/</link>
					<title><![CDATA[Построение диаграмм используя WinApi на чистом VFP + Ole TreeView.]]></title>
                    					    <author><![CDATA[Петров Андрей]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Построение диаграмм используя WinApi на чистом VFP + Ole TreeView.</h1>
													</header>
													<div id="sol_opis">Построение диаграмм используя WinApi на чистом VFP + Ole TreeView. Класс служит только как пример по работе с графическим Api. Он недоработан.</div>
<div id="sol_body">
<h3>Построение диаграмм используя WinApi на чистом VFP + Ole TreeView.</h3>
<p> Пример содержит<br /> 1) Форму (ее и запускайте)<br /> 2) Библиотеку для работы с графиками (исходный код там)<br /> 3) Charts.h - константы<br /> 4) Charts.PRG - Определение функций (declare)<br /> 5) d_curs.dbf - таблица из которой берутся данные для графиков. Взята из решений этого сайта. Решение Curs_Currency (помоему)</p>
<p> Как загнать данные. В классе есть ListBox задаете ему RowSource причем обязательно 2 столбца (X,Y) Если нужно 2 графика то задаете 4 столбца соответственно.</p>
<p> Насчет функциональности.</p>
<p> 1) Выбирать прямоугольную область.<br /> 2) Ставить метки на графиках.<br /> 3) Отображается положение мыши на графике в координатах графика.<br /> 4) Можно делать ZOOM нажатием клавиши Enter или привязать другое действие на выбор области.<br /> 5) Печатать график или область.</p>
<p> Вроде все. Пишите если что не работает или не до конца понятно...   </p></div>
<div id="sol_avtor">Автор: Петров Андрей</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5063">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5063">Петров Андрей</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Петров Андрей" href="https://foxclub.ru/account/?user=5063">
				<img alt='' src='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 14<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-04-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/postroenie-diagramm-ispolzuya-winapi-na-chistom-vfp-ole-treeview/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/franczuzskaya-vojna/</link>
					<title><![CDATA[Французская война]]></title>
                    					    <author><![CDATA[Вадим Ермолаев]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Французская война</h1>
													</header>
													<div id="sol_opis">Просто игрушка - римейк когда-то популярной во Франции игры типа шашек. Мне интересно было набросать не столько сам движок игры, сколько поэкспериментировать с концепцией самообучающегося игрового автомата. Чуть подробнее в readme1st.txt</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Вадим Ермолаев</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4878">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4878">Вадим Ермолаев</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Вадим Ермолаев" href="https://foxclub.ru/account/?user=4878">
				<img alt='' src='https://secure.gravatar.com/avatar/410b07bd04ec59d070d26c397b2feb04?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/410b07bd04ec59d070d26c397b2feb04?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 16-01-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/franczuzskaya-vojna/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Игры]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/glavnyj-startovyj-fajl-proekta/</link>
					<title><![CDATA[Главный (стартовый) файл проекта]]></title>
                    					    <author><![CDATA[Владимир Максимов]]></author>
                    										    <pubDate>Sun, 20 Nov 2022 06:33:51 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Главный (стартовый) файл проекта</h1>
													</header>
													<p></p>
<p><a href="#MainFile">Главный (стартовый) файл проекта<br />
</a><a href="#MainMark">Как выделить (пометить, обозначить) главный файл<br />
</a><a href="#MainTypeFile">Какой тип файла сделать главным<br />
</a><a href="#MainContent">Содержимое главного файла<br />
</a><a href="#IdeologyProject">Идеология построения приложения<br />
</a><a href="#ReadEvents">Точка останова. Read Events<br />
</a><a href="#ShutDown">Аварийное прекращение приложения. Настройка ON ShutDown<br />
</a><a href="#Quit">Надо ли давать команду QUIT для закрытия приложения<br />
</a><a href="#ScreenVisible">Как скрыть главное окно FoxPro (SCREEN)<br />
</a><a href="#ToolBarHide">Как скрыть системные ToolBar<br />
</a><a href="#Setting">Настройка среды FoxPro<br />
</a><a href="#GlobalObject">Использование глобального объекта goAPP<br />
</a><a href="#Parameters">Передача параметров в EXE<br />
</a><a href="#Summary">Заключение<br />
</a><a name="MainFile"></a></p>
<h3>Главный (стартовый) файл проекта</h3>
<p style="text-align: justify;">Конечной целью разработки приложения является создание одного (или нескольких) EXE-файла. Но это то, что должно получиться в результате. А на этапе его создания мы имеем большую кучу самых разных файлов (формы, запросы, программные модули, классы и т.п.).</p>
<p style="text-align: justify;">Возникает закономерный вопрос, какой файл из этой кучи в готовом файле EXE должен запускаться первым? А как этот файл выделить (пометить, обозначить)?</p>
<p style="text-align: justify;">Вот этот самый файл, который в готовом файле EXE должен запускаться первым и называется <b>главным (стартовым) файлом</b>. О нем и пойдет речь в данном разделе. Для простоты, далее я буду называть этот файл просто <b>главным файлом</b>. <a name="MainMark"></a></p>
<h3>Как выделить (пометить, обозначить) главный файл</h3>
<p style="text-align: justify;">На этапе создания готового EXE-файла все наши файлы включаются в общий файл проекта (файлы с расширением PJX и PJT). Файл проекта - это средство как-то упорядочить ту кучу файлов, из которой впоследствии будет собран готовый EXE-файл, а, кроме того, это инструмент собственно сборки EXE-файла.</p>
<p style="text-align: justify;">Так вот, в FoxPro <b>главный файл может быть обозначен только и исключительно внутри файла-проекта</b>. Не существует никаких особых ключевых слов или синтаксических конструкций для его выделения в программном коде.</p>
<p style="text-align: justify;">По умолчанию, первый добавленный в проект файл автоматически становиться главным (если это возможно). Такой файл выделяется в проекте полужирным шрифтом.</p>
<p style="text-align: justify;">Если Вас не устраивает такой автоматический выбор, то Вы можете в любой момент указать в качестве главного файла нужный Вам файл. Для этого щелкните внутри проекта правой клавишей мыши по нужному файлу и в появившемся меню выберите пункт "Set Main". Выбранный файл будет выделен полужирным шрифтом, а файл, ранее обозначенный как главный файл, сбросит свое выделение и станет обычным (не главным) файлом.</p>
<p style="text-align: justify;">В пределах одного файла - проекта может быть только один главный файл.  В принципе, допустимо вообще не указывать главный файл. Однако из такого проекта невозможно будет создать готового EXE-файла. На этапе компиляции возникнет ошибка с сообщением о том, что Вы не указали главный файл проекта. <a name="MainTypeFile"></a></p>
<h3>Какой тип файла сделать главным</h3>
<p>Главным файлом проекта может быть</p>
<ol>
<li>Программный файл (PRG)</li>
<li>Форма (SCX)</li>
<li>Меню</li>
</ol>
<p style="text-align: justify;">Ну, по сути, файл меню - это и есть программный файл. Так исторически сложилось. Точнее, разработчики FoxPro пока "не доросли" до коренной переделки идеологии построения меню, как они это сделали с формами, а в 9 версии и с отчетами.</p>
<p style="text-align: justify;">Дело в том, что хотя на этапе проектирования меню - это файлы с расширением MNT, MNX, но после создания макета меню необходимо запустить его генерацию. Результатом генерации меню становятся файлы MPR, MPX. Вот эти-то файлы и есть обычные файлы PRG и FXP, только с измененным расширением.</p>
<p style="text-align: justify;">Следовательно, по сути, выбор стоит между программным файлом и файлом формы.</p>
<p style="text-align: justify;">Так вот, <b>всегда указывайте в качестве главного файла программный файл</b>. Более того, это должен быть именно файл PRG и ничто другое.</p>
<p style="text-align: justify;">Причин этому множество. По мере дальнейшего обсуждения Вы увидите, что очень многое из того, что надо сделать в главном файле очень трудно, а иногда и просто невозможно реализовать в форме.</p>
<p style="text-align: justify;">В принципе, в зависимости от конкретной задачи, часть операций в главном файле, которые будут описаны далее, можно и не выполнять. А оставшиеся операции можно "втиснуть" в форму. Но я не советовал бы этого делать. Программы имеют "привычку" разрастаться. А использование в качестве главного файла формы сильно сужает возможность модификации. <a name="MainContent"></a></p>
<h3>Содержимое главного файла</h3>
<p style="text-align: justify;">Ответить на вопрос, что же должно быть в главном файле очень сложно. Сложно не потому, что там надо писать какие-то уж очень сложные коды, а именно потому, что невозможно однозначно сказать, что нужно делать, а что нет. Очень многое зависит от конкретной задачи и личных предпочтений программиста.</p>
<p style="text-align: justify;">Исходя из так называемого "здравого смысла" в главном файле необходимо выполнить все те операции, которые выполняются при загрузке программы. А также все те операции, которые выполняются при выгрузке программы, поскольку главный файл обычно бывает и последним (завершающим) файлом проекта. Т.е. обычно "вход" в программу и "выход" из нее - это один и тот же файл.</p>
<p style="text-align: justify;">Попробую просто перечислить некоторые действия, которые следует выполнить в главном файле, если Вы пишите "стандартное" приложение.</p>
<ol>
<li>Сделать настройки среды FoxPro для корректной работы программы</li>
<li>Предложить ввести пользователю пароль для входа в программу и проконтролировать корректность ввода</li>
<li>Выполнить инициализацию служебных библиотек, пользовательских настроек</li>
<li>Инициализировать управляющие модули приложения</li>
<li><b>Организовать "точку останова" для ожидания реакции пользователя </b></li>
<li>Выполнить восстановление настройки среды FoxPro</li>
</ol>
<p style="text-align: justify;">Это далеко не полный перечень всего того, что может (или должно) быть выполнено в главном файле. Более того, что-то из перечисленного может или вообще не выполняться или выполняться не в главном файле.</p>
<p style="text-align: justify;">В связи с этим, в дальнейшем, я буду описывать не столько то, что должно быть собственно в главном файле, сколько то, что должно быть выполнено при старте приложения. А уж где именно и каким способом Вы это реализуете в Вашем приложении целиком зависит от Вас. Для простоты, я буду предполагать, что все описанные действия выполняются непосредственно в главном файле. <a name="IdeologyProject"></a></p>
<h3>Идеология построения приложения</h3>
<p>Как уже упоминалось ранее, содержимое главного файла проекта зависит в первую очередь от конкретной задачи. Например, если целью Вашего проекта является создание COM-сервера, то в главном файле вообще ничего не будет. Однако, в некоторой степени, содержимое главного файла зависит от принятой идеологии построения приложения. Здесь, под фразой "идеология приложения" я имею в виду одну из следующих реализаций:</p>
<ol>
<li>На базе основного окна FoxPro (SCREEN)</li>
<li>На базе "As Top-Level" форм</li>
</ol>
<p>Построение приложения на базе основного окна FoxPro предполагает, что в конечном приложении пользователь будет видеть это основное окно (разумеется, со своим меню и ToolBar) и все формы будут открываться внутри этого основного окна. Построение приложения на базе "As Top-Level" форм предполагает, что основное окно FoxPro вообще не будет отображаться в конечном приложении. А в качестве основного окна будет выступать созданное программистом окно со свойством ShowWindow = 2 - "As Top-Level form" Разработчики FoxPro предполагали, что основной идеологией построения приложений будет построение приложений на базе основного окна FoxPro. На это указывает хотя бы тот факт, что значение по умолчанию для свойства формы ShowWindow = 0 - In Screen (Default). Кроме того, есть еще ряд проблем, которые возникнут по мере реализации приложения на базе "As Top-Level" форм, связанные именно с отсутствием основного окна FoxPro. Как следствие, построение приложения на базе "As Top-Level" форм требует повышенной бдительности от программиста и несколько сложнее в реализации. Не то, чтобы эти сложности были непреодолимы или требовали какого-то сложного программирования, но зачем создавать себе лишние проблемы, когда без них можно обойтись? Дальнейшее описание содержимого главного файла будет строиться исходя из предположения, что создается приложение на базе основного окна FoxPro. Впрочем, даже если Вы строите приложение на базе "As Top-Level" форм содержимое главного файла останется практически таким же. Отличия будут в некоторых деталях. По мере описания я буду указывать на эти детали. <a name="ReadEvents"></a></p>
<h3>Точка останова. Read Events</h3>
<p>При создании приложения основным управляющим элементом всего приложения, как правило, является главное меню. Это значит, что в главной программе необходимо сделать вызов этого меню</p>
<p><pre class='bbcode'>  DO MainMenu.mpr  
</pre></p>
<p>Синтаксически все абсолютно правильно. Более того, когда Вы будете запускать главный файл, на этапе разработки приложения все будет работать нормально. Но вот после того, как Вы создадите готовый EXE-файл и запустите его, то вместо ожидаемого приложения Вы увидите "странный" эффект: <u><b>Окно FoxPro мелькнет на экране и тут же закроется.</b></u> Причиной такого "странного" поведения является то, что Вы "забыли" указать FoxPro, в каком месте ему надо остановиться и подождать реакции пользователя. На этапе отладки такой "точкой останова" является ранее открытая среда FoxPro. Но в готовом файле EXE до него никакой среды FoxPro открыто не было! Чтобы создать "точку останова" надо дать специальную команду</p>
<pre class="bbcode"> READ EVENTS</pre>
<p>Т.е. содержимое главного файла будет выглядеть примерно так:</p>
<p><code>DO MainMenu.mpr</code><br />
<code>READ EVENTS</code></p>
<p>Если Вы строите приложение на базе "As Top-Level" форм, то вместо меню, основным управляющим элементом является Ваша главная форма. И содержимое главного файла будет выглядеть примерно так:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> DO FORM MainForm.scx
  READ EVENTS</pre>
</td>
</tr>

</table>
<p>Вот теперь, в готовом файле EXE, когда программа дойдет до команды READ EVENTS, то произойдет остановка в ожидании реакции пользователя. Буквально, фраза "READ EVENTS" переводится как "чтение событий". Т.е. вместо "точки останова" это следовало бы назвать как-то вроде "обнаружение и выполнение событий, инициализированных пользователем". Это более точно выражает смысл и задачи данной команды. Но уж больно длинно получается. Поэтому, хотя "точка останова" - это не совсем корректный термин, но в дальнейшем я буду использовать именно его. Имейте в виду, что одновременно, во всем приложении может быть активна только одна команда READ EVENTS. Вызов другой команды READ EVENTS не приведет к ошибке, но эта команда будет просто проигнорирована. Чтобы отменить действие команды READ EVENTS надо дать специальную команду</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> CLEAR EVENTS</pre>
</td>
</tr>

</table>
<p>По этой команде будет отменено действие команды READ EVENTS и выполнение перейдет на команду, следующую за командой READ EVENTS. Если затем не будет подано еще одной команды READ EVENTS, то главный файл будет выполнен до конца и приложение автоматически закроется. Если команда READ EVENTS была дана в главном файле, то CLEAR EVENTS сработает как команда RETURN TO MASTER. Т.е. выполнение той процедуры или метода, где собственно и была дана команда CLEAR EVENTS, будет прервана на этой команде и все что стоит ниже этой команды просто никогда не будет выполнено. Так, где же давать команду CLEAR EVENTS? Разумеется, в специальном пункте меню "Выход". Если Вы создаете приложение на базе "As Top-Level" форм, то команду CLEAR EVENTS надо давать в событии UNLOAD Вашей главной формы. Итого, получается примерно такая логика:</p>
<ol>
<li>Запускается главный файл</li>
<li>Активизируется основное меню (или основная форма)</li>
<li>По команде READ EVENTS организуется "точка останова" для ожидания действий пользователя</li>
<li>Команда CLEAR EVENTS прекращает действие команды READ EVNETS и передает управление в главный файл на команду, непосредственно следующую за командой READ EVENTS.</li>
<li>Завершается выполнение главного файла, что приводит к закрытию приложения FoxPro.</li>
</ol>
<p><a name="ShutDown"></a></p>
<h3>Аварийное прекращение приложения. Настройка ON ShutDown</h3>
<p>До сих пор, речь шла о "штатном" завершении. Т.е. когда пользователь дисциплинированно использует все положенные пункты меню для выхода из приложения. Но ведь пользователь может закрыть приложение, нажав на крестик в правом верхнем углу основного окна FoxPro или, например, через окно "Диспетчер задач Windows" (Ctrl+Shift+Esc). Если все оставить так, как было описано до сих пор, то после такой попытки пользователя выскочит сообщение об ошибке</p>
<table style="border: black 1px dashed;" border="0" width="90%" cellspacing="2" cellpadding="2" align="center">

<tr>
<td>Quote: Cann`t quit Visual FoxPro</td>
</tr>

</table>
<p>Или, в старших версиях FoxPro без сокращений</p>
<table style="border: black 1px dashed;" border="0" width="90%" cellspacing="2" cellpadding="2" align="center">

<tr>
<td>Quote: Cannot quit Visual FoxPro</td>
</tr>

</table>
<p>Причина такого сообщения в том, что осталась активной команда READ EVENTS. Именно она и вызывает такое сообщение об ошибке в описанной ситуации. Чтобы перехватить описанные события закрытия приложения используется специальная настройка <b>ON SHUTDOWN </b>В принципе, можно просто написать</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> ON SHUTDOWN CLEAR EVENTS</pre>
</td>
</tr>

</table>
<p>Но обычно перед закрытием приложения надо выполнить ряд предварительных операций. Каких? Это уже зависит от Вашего приложения. Ну, например, можно спросить пользователя о том, действительно ли он хочет выйти из приложения или это у него "рука дрогнула". В общем случае одной команды недостаточно. Нужен вызов процедуры. Например:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> ON SHUTDOWN DO MyExitProcedure</pre>
</td>
</tr>

</table>
<p style="text-align: justify;">И вот уже в этой процедуре MyExitProcedure и надо дать команду CLEAR EVENTS. Причем эта команда должна быть самой последней, поскольку в момент ее выполнения управление будет передано на команду, следующую за командой READ EVENTS в главном файле и все то, что написано после CLEAR EVENTS в процедуре MyExitProcedure просто не будет выполнено.</p>
<p style="text-align: justify;">Для универсальности, желательно в пункте меню "Выход", вместо простой команды CLEAR EVENTS также сделать вызов этой процедуры. Тогда у Вас будет один общий код, обрабатывающий выход из Вашего приложения при любых ситуациях.</p>
<p style="text-align: justify;">Поскольку выход из приложения может быть выполнен в любой момент и из любого места, то процедура MyExitProcedure должна быть доступна также в любой момент и из любого места. Проще всего расположить это процедуру непосредственно в главном файле (в конце). Поскольку главный файл - это "корневой" файл, из которого осуществляется вызов любых других файлов, то расположенная таким образом процедура будет "видна" и доступна из любого места Вашего приложения.</p>
<p style="text-align: justify;">Если Вы делаете приложение на базе "As Top-Level" форм, то вызов этой процедуры надо организовать еще и в событии QueryUnload главной формы. Точнее так, в событии QueryUnload главной формы надо перенаправить вызов на собственно метод, организующий закрытие всего приложения.</p>
<p>В результате, содержимое главного файла приобретает следующий вид</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> ON SHUTDOWN DO MyExitProcedure
  DO MainMenu.mpr
  READ EVENTS
PROCEDURE MyExitProcedure
* Необходимые действия по "штатному" закрытию приложения
CLEAR EVENTS RETURN</pre>
</td>
</tr>

</table>
<p><a name="Quit"></a></p>
<h3>Надо ли давать команду QUIT для закрытия приложения</h3>
<p style="text-align: justify;">В FoxPro существует команда QUIT, которая приводит к немедленному закрытию приложения FoxPro. Правда эта команда также перехватывается настройкой ON SHUTDOWN и также по ней невозможно выйти из приложения, если активна команда READ EVENTS.</p>
<p style="text-align: justify;">Возникает резонный вопрос, а нужна ли эта команда, если приложение FoxPro и так само закроется, когда завершится выполнение главного файла?</p>
<p style="text-align: justify;">Ну, лично я считаю, что это команда для ленивых программистов. Т.е. для тех, кому лень отслеживать все открытые в приложении объекты. Как я уже упоминал ранее, "штатное" закрытие приложения (содержимое процедуры MyExitProcedure) в общем случае - это очень не тривиальная задача.</p>
<p style="text-align: justify;">Ну, например, пользователь редактировал какие-либо данные в форме и нажал на крестик или пункт меню "Выход". Следует ли организовать "штатное" закрытие формы или просто "прихлопнуть" все открытые процессы?</p>
<p style="text-align: justify;">По "правильному" логично спросить пользователя желает ли он сохранить внесенные изменения. Т.е. организовать "штатное" закрытие всех открытых объектов. А команда QUIT просто "прихлопнет" все открытые объекты без каких-либо дополнительных вопросов и все!</p>
<p style="text-align: justify;">Есть и более тонкие моменты. Т.е. по хорошему, в процедуре MyExitProcedure надо организовать "штатное" закрытие всех открытых объектов и после команды READ EVENTS (где собственно и предполагается давать команду QUIT) вообще не должно остаться ничего такого, что следовало бы закрывать именно командой QUIT. Если все-таки что-то осталось, то это явная недоработка разработчика. И эта недоработка может очень сильно "аукнуться" в готовом приложении. Без команды QUIT Вы отловите эту проблему еще на стадии отладки приложения.</p>
<p style="text-align: justify;">Кроме того, использование команды QUIT может осложнить отладку. Что, каждый раз после запуска главного файла заново открывать среду FoxPro? Впрочем, как это обойти, чуть ниже.</p>
<p>Итого, я не рекомендовал бы использовать команду QUIT. <a name="ScreenVisible"></a></p>
<h3>Как скрыть главное окно FoxPro (SCREEN)</h3>
<p>В большинстве случаев, вне зависимости от того в какой идеологии Вы разрабатываете свое приложение при загрузке среды FoxPro желательно скрыть главное окно FoxPro (SCREEN). Если Вы разрабатываете приложение в основном окне FoxPro, то потом его можно будет отобразить. Ну, а если приложение на базе "As Top-Level" форм, то отображение его и не нужно. Можно первой же командой в главном файле дать команду</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> _SCREEN.Visible = .F.</pre>
</td>
</tr>

</table>
<p>Окно FoxPro действительно скроется. Однако перед этим успеет все-таки "мелькнуть". Не хорошо. Чтобы подавить открытие главного окна следует использовать файл конфигурации Config.fpw. Это обычный текстовый файл. В нем должна быть строчка:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> SCREEN=OFF</pre>
</td>
</tr>

</table>
<p>Более подробно о файле конфигурации рассказано в других разделах. Данная статья посвящена только главному файлу. Чтобы снова отобразить главное окно FoxPro (SCREEN) следует дать команду</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> _SCREEN.Visible = .T.</pre>
</td>
</tr>

</table>
<p>Если главное окно FoxPro (SCREEN) и до этой команды было отображено, то от этой команды хуже не будет. <a name="ToolBarHide"></a></p>
<h3>Как скрыть системные ToolBar</h3>
<p>Когда Вы запускаете свое приложение в режиме отладки, то системное меню заменяется Вашим меню. Но вот системный ToolBar остается "висеть", как ни в чем не бывало. Строго говоря, на системный ToolBar можно вообще не обращать внимания. Дело в том, что информация о том, какие именно системные ToolBar открыты и где именно они расположены, хранится в так называемом "ресурсном файле". По умолчанию, это файл FoxUser.dbf и связанный с ним файл FoxUser.fpt. Разумеется, Вы не потащите пользователю этот ресурсный файл. Как следствие, на машине клиента системные ToolBar вообще не появятся. Просто потому, что там не будет ресурсного файла с машины разработчика. Однако если на этапе отладки Вам все-таки необходимо скрыть системные ToolBar, то это можно сделать набором команд</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> HIDE WINDOW</pre>
</td>
</tr>

</table>
<p>Имя того или иного ToolBar можно посмотреть в заголовке самого ToolBar (если он не "приклеен" к меню) или через пункт меню View, подпункт ToolBars Например, скрыть стандартную панель можно командой</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> HIDE WINDOW "Standard"</pre>
</td>
</tr>

</table>
<p>Снова активизировать стандартную панель можно командой</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> SHOW WINDOW "Standard"</pre>
</td>
</tr>

</table>
<p>Проверить тот факт, что та или иная панель в настоящий момент активна можно используя команду WEXIST()</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> IF WEXIST("Standard") = .T.
        HIDE WINDOW "Standard"
  ENDIF</pre>
</td>
</tr>

</table>
<p>Таким образом, если Вам очень хочется скрыть системные ToolBar в режиме отладки, то несложно написать простые процедуры их закрытия в начале главного файла и восстановления после команды CLEAR EVENTS. Или же использовать класс, поставляемый с FoxPro. <code>MODIFY CLASS _systoolbars OF (Home()+"FFC_app.vcx")</code> Но, повторюсь, особого смысла в готовом приложении это не имеет. Поскольку там их и так не будет. <a name="Setting"></a></p>
<h3>Настройка среды FoxPro</h3>
<p style="text-align: justify;">Ранее я вскользь уже упомянул тот факт, что просто запустить среду FoxPro недостаточно. Надо сделать некоторые предварительные настройки. Хотя бы настройку <em>ON SHUTDOWN</em>.</p>
<p style="text-align: justify;">Дело в том, что среда FoxPro по умолчанию настроена таким образом, чтобы облегчить создание новых и модификацию старых приложений. Т.е. она настроена для удобства <u>разработчика</u>. Но в готовом приложении такая настройка среды FoxPro не просто некорректна. Она может оказаться недопустимой!</p>
<p style="text-align: justify;">Вообще-то, настроек среды FoxPro много. Даже очень много. Однако на практике, для корректной работы готового приложения следует уточнить только несколько настроек. Самое большее -два ... три десятка.</p>
<p style="text-align: justify;">Часть настроек среды FoxPro можно увидеть через пункт меню Tools, подпункт Options. А чтобы получить эти настройки в виде кодов нажмите и удерживайте клавишу "Shift" и левой кнопкой мыши нажмите на кнопку "Ok". В командное окно будет выведены все текущие настройки формы Options. В версии VFP9 список настроек будет выведен в окно Output окна Debugger.</p>
<p style="text-align: justify;">Вы можете просто скопировать полученный список настроек и вставить в главный файл. Разумеется, предварительно просмотрев, что именно из них действительно нужно для успешной работы Вашего приложения.</p>
<p style="text-align: justify;">Программно можно получить тот же список текущих настроек среды FoxPro, используя команду <em>DISPLAY STATUS</em></p>
<p style="text-align: justify;">Сложность в том, что на этапе отладки приложения все-таки нужны несколько другие настройки, чем в готовом приложении.</p>
<p style="text-align: justify;">Например, на этапе отладки хорошо бы иметь возможность прервать выполнение какого-либо процесса по нажатию клавиши "Esc", но в готовом приложении этого допускать ни в коем случае нельзя. Это регулирует настройка <em>SET ESCAPE</em>.</p>
<p style="text-align: justify;">Т.е. получается, что необходимо как-то отличать, в каком режиме было запущено приложение. В режиме отладки или как готовый файл EXE.</p>
<p>Есть несколько вариантов определения режимов работы. Самый простой - это посмотреть значение свойства</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> _VFP.StartMode</pre>
</td>
</tr>

</table>
<p>Если это свойство имеет значение 0, то мы находимся в режиме отладки. Т.е. получается что-то вроде:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> * Общие настройки вне зависимости от режима работы
  IF _VFP.StartMode = 0
    * Настройки только для режима отладки  
  ELSE
    * Настройки только для готового приложения  
  ENDIF</pre>
</td>
</tr>

</table>
<p style="text-align: justify;">Есть и еще одна проблема настроек. Дело в том, что при открытии Private DataSession часть настроек, связанных с работой с данными сбрасываются в значения по умолчанию. Полный список таких настроек Вы можете посмотреть в описании к команде "SET DataSession". Причем для некоторых настроек эти самые значения по умолчанию отличаются в зависимости от того, в какой DataSession мы находимся.</p>
<p style="text-align: justify;">Т.е. получается, что недостаточно просто один раз сделать настройки в главном файле. Нужно еще повторить часть настроек в каждой <em>Private DataSession</em>.</p>
<p style="text-align: justify;">Следовательно, выполнение настроек среды FoxPro надо вынести либо в отдельную процедуру, либо оформить как метод класса. Если как метод класса, то либо как метод некоей базовой формы, на основе которой будут созданы все формы Вашего проекта, либо как метод класса Custom, экземпляр которого будет "бросаться" на нужные формы.</p>
<p style="text-align: justify;">Наконец, еще одна проблема настроек. По завершении работы приложения надо вернуть настройки в то состояние, в котором они были на момент запуска приложения.</p>
<p style="text-align: justify;">На первый взгляд, это кажется абсолютно бессмысленным требованием. Но не надо забывать, что мы отлаживаем наше приложение. Это значит, что есть часть настроек, которые просто обязаны отличаться в зависимости от того, просто мы отлаживаем какую-то форму (процедуру) или запустили приложение в режиме отладки, начиная с главного файла.</p>
<p style="text-align: justify;">Например, при отладке триггеров хорошо бы видеть записи помеченные как удаленные. Но в готовом приложении, даже при запуске в режиме отладки, нам видеть эти записи не надо. Это регулирует настройка <em>SET DELETED</em></p>
<p style="text-align: justify;">Да и в любом случае желательно всегда следовать принципу: намусорил, убери за собой. Для программирования это особенно важно во всех смыслах.</p>
<p>Таким образом, в общем случае, работа с настройками выглядит примерно так:</p>
<ol>
<li>Проверяем текущее состояние настройки</li>
<li>Если текущее состояние настройки отличается от нужного нам значения в данном режиме работы в данном месте, то сохраняем старое значение настройки и устанавливаем новое</li>
<li>По окончании работы восстанавливаем измененные настройки</li>
</ol>
<p>Из этой логики следует, что использовать процедуры в принципе можно, но очень уж неудобно. Нужны две отдельные процедуры для установки и для восстановления настроек. А, кроме того, нужно где-то хранить старые настройки. Более удобным кажется использование классов. Создаются два метода одного и того же класса (возможно больше, ведь для Private DataSession надо установить только часть настроек). А для хранения старых значений настроек можно использовать свойства (Properties) класса. Тогда остается уточнить, использовать ли класс Custom или класс на базе Form? По большому счету - это абсолютно одинаковые варианты. Следует только помнить, что методы класса Custom можно запустить не ранее события Init этого класса. Но в любом случае методы собственно формы или любых ее объектов еще не существуют на момент выполнения события BeforOpenTables в DataEnvironment формы. Т.е. автоматическое открытие таблиц, включенных в DataEnvironment формы, произойдет с использованием настроек по умолчанию. Но в большинстве случаев, это не столь уж и принципиально. Почему? Это отдельный вопрос, выходящий за рамки данной статьи. Просто примите к сведению, что выполнение настроек в <em>INIT</em>-формы в большинстве случаев вполне уместно и не будет "слишком поздно". Возвращаясь к содержимому нашего главного файла, получаем, что его содержимое уже выглядит примерно так:</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode"> * Подключаю библиотеку классов, содержащую ряд полезных классов общего назначения  
  LOCAL loSetting, llIsClass  
  IF UPPER("MyClass.VCX ALIAS MyClass") $ UPPER(SET("ClassLib"))  
        llIsClass = .T.  
  ELSE  
        llIsClass = .F.  
        SET CLASSLIB TO MyClass ADDITIVE  
  ENDIF  
    
 * Класс, устанавливающий глобальные настройки среды (находится в MyClass.VCX)  
  loSetting = CREATEOBJECT("Setting")  
    
  ON SHUTDOWN DO MyExitProcedure  
  PUSH MENU _MSYSMENU  
  DO MainMenu.mpr  
  _SCREEN.Visible = .T.  
  READ EVENTS  
    
 ********* Восстановление исходных настроек  
  POP MENU _MSYSMENU  
  ON SHUTDOWN  
  IF m.llIsClass=.F.  
        RELEASE CLASSLIB MyClass  
  ENDIF  
    
 ******** Процедура "аварийного" выхода из программы  
  PROCEDURE MyExitProcedure  
 * Необходимые действия по "штатному" закрытию приложения  
  CLEAR EVENTS  
  RETURN</pre>
</td>
</tr>

</table>
<p>
Здесь я предполагаю, что в библиотеке классов MyClass.VCX есть класс "Setting" в событии Init, которого происходит установка нужных настроек, а в событии Destroy восстановление исходных настроек. Т.е. удаление переменной m.loSetting означает автоматическое восстановление исходных настроек. Еще использованы дополнительные команды <em>PUSH MENU</em> и POP MENU, которые сохраняют и восстанавливают системное меню FoxPro. Обратите внимание на то, что переменные объявляются как <b>LOCAL</b>. Дело в том, что если не объявить переменные, то по умолчанию они получат область видимости <em>PRIVATE</em>. А для переменных главного файла это равнозначно объявлению их как <em>PUBLIC</em>, поскольку они будут видны во всех вызванных формах и процедурах. Еще один тонкий момент заключается в том, что команды, записанные после команды <em>READ EVENTS</em>, будут выполнены только после подачи команды <em>CLEAR EVENT</em>S. Т.е. все то, что обозначено, как "Восстановление исходных настроек" будет выполнено непосредственно перед закрытием приложения. Как видите, главный файл начинает разрастаться. С этим надо что-то делать. Чем больше листинг программы (код одного метода или процедуры), тем сложнее такой код отлаживать и модифицировать. </p>
<p><a name="GlobalObject"></a></p>
<h3>Использование глобального объекта goAPP</h3>
<p>До сих пор, я описал лишь часть того, что в принципе должно бы быть в главном файле. Фактически, описан самый минимум, без которого сложно написать полноценное приложение. В принципе, можно оставить все "как есть". Если проект не очень большой и не предполагается его активное развитие, то того, что уже описано вполне хватит. Однако по мере развития проекта одного файла PRG для управления загрузкой и выгрузкой проекта оказывается недостаточно. "Недостаточно" не в смысле "мало", а в смысле "не удобно" Дело в том, что в большом проекте необходим целый набор различных процедур и функций, которые должны запускаться как при старте приложения, так и при его завершении. Вот некоторые из них:</p>
<ol>
<li>Контроль повторного запуска приложения на одном компьютере</li>
<li>Контроль логина и пароля пользователя</li>
<li>Чтение и запись настроек среды FoxPro и приложения из внешних хранилищ (реестр, ini-файл и т.п.)</li>
</ol>
<p>Это, еще не считая ряда специфических процедур, которые необходимо запустить при старте в конкретном проекте в зависимости от конкретной задачи. Да еще добавьте к этому все то, что уже было описано ранее. Разумеется, все это можно реализовать в идеологии процедурного программирования. Т.е. написав нужное количество процедур и раскидав их по процедурным файлам. Или создать один большой процедурный файл. Но у такого подхода есть ряд недостатков. Например:</p>
<ol>
<li>Один большой процедурный файл с множеством процедур или много процедурных файлов очень трудно модифицировать. Просто тяжело найти нужное место и понять, как модификация в этом месте повлияет на все остальные процедуры.</li>
<li>Невозможно написать "универсальную" процедуру "на все случаи жизни". Как правило, в каждом конкретном проекте, надо сделать "как там", но вот в этом месте чуть-чуть по другому.</li>
<li>Проблематично написать парные процедуры загрузки-выгрузки, если они требуют некоторого "внешнего" по отношению к этим процедурам хранилища данных. Например, восстановление исходных настроек среды FoxPro требует где-то сохранить эти самые настройки.</li>
</ol>
<p>Вот для решения этих проблем и еще многих других создается специальный класс на базе класса Custom. Экземпляр этого класса обычно и называют <b>goApp</b>. Пример реализации подобного класса можно посмотреть в стандартном проекте, поставляемом вместе с FoxPro под названием TasTrade.pjx</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> MODIFY PROJECT (HOME(2)+"tastrade	astrade.pjx")</pre>
</td>
</tr>

</table>
<p>По сути, если опустить некоторые детали, содержимое главного файла в этом случае будет выглядеть примерно так:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> SET CLASSLIB TO MAIN, TSGEN
  PUBLIC goApp
  goApp = CREATEOBJECT("TasTrade")
  goApp.Do()</pre>
</td>
</tr>

</table>
<p>В чем тут "фокус"? А "фокус" в том, что в момент создания объекта на базе класса TasTrade выполняется его событие Init. А уже из события Init этого класса осуществляется вызов всех тех методов, которые необходимы в данном приложении в момент загрузки приложения Метод <em>goApp.Do()</em> содержит собственно команду <em>READ EVENTS</em>, что и обеспечивает "точку останова" всего приложения. Команда <em>CLEAR EVENTS</em> дается в одном из методов класса goApp. В данном случае - это метод goApp.CleanUp2() Методы, которые необходимо выполнить при закрытии приложения можно вызвать в том же методе <em>goApp.Do()</em> после команды <em>READ EVENTS</em> или в событии <em>goApp.Destroy()</em> Все те процедуры, которые были описаны в данной статье, оформляются как отдельные методы класса TasTrade. И вызываются в соответствующем месте класса. Обратите внимание, что собственно класс TasTrade из библиотеки классов Main.vcx является наследником другого класса Application из библиотеки классов TSGen.vcx. Такая "иерархия" вовсе не случайна. В этом случае Вы можете использовать класс Application во всех Ваших приложениях, создавая на его основе собственный класс, например, MyClass в собственной библиотеке классов MyClass.vcx. Т.е. Вы получите некую общую библиотеку классов вообще для всех ваших проектов, как заготовку для класса конкретного приложения. Несколько слов о том, чего не должно быть в классе goApp. Дело в том, что возникает большое искушение "впихнуть" в класс goApp вообще все глобальные методы, переменные памяти и разные обработчики. Так вот, не надо этого делать. Цель класса goApp - это организовать корректную загрузку и выгрузку вашего приложения. Все! Все что "сверх" этой задачи должно быть выделено в отдельные классы. Например:</p>
<ol>
<li>Объект - обработчик ошибок</li>
<li>Объект - стек активных объектов (форм) приложения</li>
<li>Объект, содержащий глобальные настройки приложения</li>
</ol>
<p>Список можно продолжать. Но основной принцип: не смешивать в одном объекте разные задачи. Будьте осторожны с использованием класса из проекта TasTrade.pjx. Он достаточно далек от идеала. Его следует рассматривать скорее как учебное пособие, но не как объект готовый к использованию. Не надо слепо копировать его в свое приложение. Лучше напишите свой собственный класс. Да, это займет больше времени, но Вы лучше поймете что это такое и для чего это используется. <a name="Parameters"></a></p>
<h3>Передача параметров в EXE</h3>
<p>Как правило, готовый файл EXE самодостаточен в том смысле, что ему не требуется передавать какие-либо параметры. Все необходимые "внешние" настойки делаются либо в файле CONFIG.FPW, либо в специальных ini-файлах. Но иногда такая необходимость все-таки возникает. Например, чтобы указать, где именно находится нужный ini-файл. В системе Windows общепринятым стандартом является указание параметров сразу за именем программы через пробел: MyProg.exe Par1 Par2 Для приема таких "внешних" параметров в главном файле в качестве первой исполняемой команды надо дать стандартную команду PARAMETRS (или LPARAMETERS) <code>PARAMETERS tcPar1, tcPar2</code> Т.е. с точки зрения кода FoxPro ничего нового и необычного. Стандартный список параметров через запятую как первая исполняемая команда программного модуля. Однако есть некоторые отличия в приеме "внешних" параметров <br />
<b>Во-первых</b>, один параметр от другого разделяется пробелом, поэтому если Вы хотите передать в свое приложение некую символьную строку, которая сама содержит пробелы, то ее следует взять в кавычки MyProg.exe "первый параметр" "второй параметр"</p>
<p><b>Во-вторых</b>, все внешние параметры, передаваемые в приложение FoxPro, имеют символьный тип данных. Т.е. даже если Вы дадите команду: <code>MyProg.exe 1 2</code> То в программе FoxPro будут приняты не числа 1 и 2, а символы "1" и "2"</p>
<p><b>В-третьих</b>, несмотря на то, что кажется, будто в момент запуска Вашего приложения сразу оно и начинает исполняться, но на самом деле это не совсем так. Сначала происходит загрузка среды FoxPro и только после этого уже из загруженной среды FoxPro начинает исполняться Ваше приложение.</p>
<p>Применительно к передаче параметров в Ваше приложение из этого следует, что сначала переданные параметры будут приняты и обработаны собственно средой FoxPro. Но все дело в том, что сама среда FoxPro в момент загрузки может принимать несколько <b>именованных параметров </b>(переключателей, ключей).</p>
<p>Именованные параметры среды FoxPro начинаются либо с символа дефиса (знак минус), либо с наклонной черты (знак деления). Полный список именованных параметров и для чего они предназначены, Вы можете посмотреть в HELP к Visual FoxPro в разделе с именем вроде <b>"Command-line switches in Visual FoxPro"</b> </p>
<p>Как именно называется этот раздел, и в какой именно статье он находится, зависит от версии FoxPro. В разных версиях он находится в разных статьях. Поэтому откройте HELP к Вашей версии FoxPro, перейдите на закладку "Поиск" и введите ключевое слово "switches" для поиска. Самая первая из найденных статей, скорее всего и будет содержать список и описание "ключей".</p>
<p>Начиная с версии Visual FoxPro 7.0 список ключей можно получить, запустив среду FoxPro с ключом "/?". Примерно так: </p>
<p>"C:Program FilesMicrosoft Visual FoxPro 8vfp8.exe" /? </p>
<p>Здесь я не буду описывать эти самые "ключи" и для чего они предназначены. Для нас более важным является то, как использование ключей FoxPro повлияет на передачу параметров в созданное приложение. Оказывается, эти самые "ключи" перехватываются самой средой FoxPro в момент ее запуска и исключаются из списка переданных параметров. Например, если Вы дадите команду:</p>
<p><code>MyProg.exe -t 1 2</code></p>
<p>То в момент загрузки среды FoxPro будет найден ключ "-t". Этот ключ будет соответствующим образом обработан средой FoxPro, а непосредственно вызов Вашего приложения примет вид:</p>
<p><code>MyProg.exe 1 2</code></p>
<p>Таким образом, "ключи" FoxPro просто исключаются из списка параметров, передаваемых в Ваше приложение. Поэтому будьте аккуратнее в выборе значений внешних параметров Вашего  приложения. <a name="Summary"></a></p>
<h3>Заключение</h3>
<p>В данной статье были рассмотрены основные идеи по содержимому главного файла проекта FoxPro. Причем, не вообще все, что только можно и нельзя "впихнуть" в главный файл, а только самый минимум. Без чего проблематично написать полноценное приложение. В статье сознательно не давалось подробное описание кода той или иной части главного файла. Опять же, только самый минимум, как общая идея того, что должно быть. Есть несколько причин, такого "поверхностного" описания:</p>
<ol>
<li>Содержимое главного файла сильно зависит от конкретной задачи и личных предпочтений программиста</li>
<li>Достаточно часто, одну и ту же задачу в FoxPro можно решить несколькими способами. Как следствие, следовало бы привести конкретный код реализации той или иной задачи каждым из способов и провести сравнительный анализ этих способов. Это слишком обширная задача, далеко выходящая за рамки данной статьи.</li>
</ol>
<p>Т.е. просто не существует некоего "стандартного" кода для главного файла проекта. Есть только некоторые <u>стандартные задачи</u>, которые следует решить в главном файле. Вот именно эти задачи и наиболее простые пути их реализации и были описаны в данной статье.</p>
<p></p>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4899">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4899">Владимир Максимов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Владимир Максимов" href="https://foxclub.ru/account/?user=4899">
				<img alt='' src='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 65<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/glavnyj-startovyj-fajl-proekta/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Статьи]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/raschet-sroka-mezhdu-dvumya-datami/</link>
					<title><![CDATA[Расчет срока между двумя датами]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Расчет срока между двумя датами</h1>
													</header>
													<div id="sol_opis">Имеем две даты надо знать количество лет, месяцев и дней</div>
<div id="sol_body">
<h3>Расчет срока между двумя датами</h3>
<p> Сталкнулся с таким думал все просто посмотрел на форуме супер сложные и умные какието предложения:</p>
<p> d1=начальная дата<br /> d2=конечная дата<br /> yy=int((d2-d1)/365.2425) && года<br /> mm=int((d2-d1)/30.4369)  && месяца<br /> dd=(d2-GOMONTH(d1,mm))   && дни</p>
<p> от куда такие цыфры:<br /> set date to germ<br /> d1=CTOD('1.12.2000')<br /> d2=CTOD('1.12.6000')<br /> ((d2-d1)/(YEAR(d2)-YEAR(d1)))=365.2425 && среднее число дней в году за 4000 лет<br /> ((d2-d1)/(YEAR(d2)-YEAR(d1)))/12=30.4369 && среднее число дней в месяце за 4000 лет</p>
<p>  кому мало точности, берите больше срок будет точнее 😉</p></div>
<div id="sol_avtor">Автор: Даниил Александрович</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/raschet-sroka-mezhdu-dvumya-datami/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/upravlenie-videorezhimami-monitora-dll-vcx/</link>
					<title><![CDATA[Управление видеорежимами монитора (dll + vcx)]]></title>
                    					    <author><![CDATA[Alex Roublev]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Управление видеорежимами монитора (dll + vcx)</h1>
													</header>
													<div id="sol_opis">Библиотека для управления видеорежимами монитора</div>
<div id="sol_body">
<h3>Управление видеорежимами монитора (dll + vcx)</h3>
<p> VMode - библиотека для управления видеорежимами монитора</p>
<p> Методы:</p>
<p> GetVideoMode - возвращает: <br />                           а) имя библиотеки текущего SVGA драйвера;<br />                           б) ширину экрана;<br />                           в) высоту экрана;<br />                           г) бит на пиксель (bpp, глубина цвета);<br />                           д) частоту обновления экрана;</p>
<p>               принимает параметр lnWhat (numeric):</p>
<p>                           0 или пустые скобки - общий список (string);<br />                           1 - SVGA + версия драйвера (string);<br />                           2 - ширина экрана (numeric);<br />                           3 - высота экрана (numeric);<br />                           4 - бит на пиксель (numeric);<br />                           5 - частота обновления экрана (numeric).</p>
<p> SetVideoMode - возвращает значения .T. или .F. в зависимости от достигнутого результата;<br />                принимает числовые параметры: ширина, высота, глубина и частота (all numeric).</p>
<p> Регистрация: RegSvr32 VMode.dll</p>
<p> Требования: vfp9r.dll и vfp9t.dll</p>
<p> Вызов: oVM = CreateObject("VMode.VMode")</p>
<p> Пример:</p>
<p> ?oVm.GetVideoMode()                && возвращает: "G400D;1024;768;32;85"<br /> ?oVm.GetVideoMode(0)               && возвращает: "G400D;1024;768;32;85"<br /> ?oVm.GetVideoMode(1)               && возвращает: "G400D" (Matrox Millenium G450, maj.ver. 4.00, min.ver. D) <br /> ?oVm.GetVideoMode(2)               && возвращает: 1024<br /> ?oVm.GetVideoMode(3)               && возвращает: 768<br /> ?oVm.GetVideoMode(4)               && возвращает: 32<br /> ?oVm.GetVideoMode(5)               && возвращает: 85<br /> ?oVm.SetVideoMode(800,600)         && возвращает .T.<br /> ?oVm.SetVideoMode(800,600,0,0)     && возвращает .T.<br /> ?oVm.SetVideoMode(800,600,32,85)   && возвращает .T.<br /> ?oVm.SetVideoMode(800,100,0,0)     && возвращает .F.<br /> ?oVm.SetVideoMode(1024,768,2,22)   && возвращает .F.</p>
<p> Замечания:</p>
<p> Если в параметре глубина = 0 или не указана, а также частота = 0 или не указана, то берутся в обработку <br /> текущие значения.</p>
<p> Если параметры указаны неверно или не соответствуют возможностям вашего SVGA-адаптора, то значения входных <br /> параметров обработаны не будут и возвращаемое значение = .F.</p>
<p> P.S.</p>
<p> У кого VFP более младшей версии, нежели 9-я, прилагается библиотека класса для перекомпилляции. Нужно <br /> добавить библиотеку в новый проект и на выходе создать Multi-Threaded Com Server. Скопировать dll в <br /> системную папку Windows (System для Win4; System32 для WinNT) и сделать регистрацию библиотеки в реестре:</p>
<p> RegSvr32 VMode.dll</p>
<p> Тем, кто будет пользоваться непосредственно классом, а не com-сервером, вызов делать в пределах видимости <br /> библиотеки вызывающей программой:</p>
<p> oVm = NewObject("VMode","VMode")<br /> oVm.GetVideoMode(lnWhat)<br /> oVm.SetVideoMode(lnWidth,lnHeight,lnBpp,lnFreq)   </div>
<div id="sol_avtor">Автор: Alex Roublev</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4786">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4786">Alex Roublev</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Alex Roublev" href="https://foxclub.ru/account/?user=4786">
				<img alt='' src='https://secure.gravatar.com/avatar/00346040923c19be64dc8ef2c05347d9?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/00346040923c19be64dc8ef2c05347d9?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-09-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/upravlenie-videorezhimami-monitora-dll-vcx/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Система]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/tajna-potustoronnih-svyazej-ili-ispolzovanie-pereadresovannyh-vyzovov/</link>
					<title><![CDATA[Тайна потусторонних связей или Использование переадресованных вызовов]]></title>
                    					    <author><![CDATA[piva]]></author>
                    										    <pubDate>Sat, 19 Nov 2022 18:35:33 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Тайна потусторонних связей или Использование переадресованных вызовов</h1>
													</header>
													<p><u>Как это теперь модно писать - <b>Преамбула</b></u></p>
<p>В далеком, теперь уже, 1994 году, в свете развития всяких ООП технологий , в том же Turbo Vision, захотелось и мне в Фоксе придумать нечто такое же, пусть, хоть и отдаленно напоминающее сие новаторства. Собственно все сводилось к возможности получения результата функции из внешнего, по отношению к текущему, модуля. Если разработчики дали возможность использовать конструкции</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> DO Func1 in Module1 </pre>
</td>
</tr>

</table>
<p>То почему-то не дали возможности хотя бы сделать так</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> Do Func1 in Module1 to myVar</pre>
</td>
</tr>

</table>
<p>Хотя и такая конструкция, меня не устраивала. Хотелось сделать модуль отвечающий за поведение определенного вида документа, но как получать результат функции их этого модуля или другого без шаманского передергивания с использованием Set Procedure To, которая тогда позволяла использовать только один общий процедурный модуль. Тогда надо было выносить все мелкие общие функции из одного модуля и раскладывать их на кучу мелких. Это мне тоже не нравилось. Оставалось одно – пропадать.<br />
Надо было как-то заставить эти функции держать в связке стека вызовов FoxPro иначе он никак их не хотел находить.<br />
И вот пришло решение, что вызов функции нужно переадресовать тому модулю откуда он должен быть вызван, но как? Да все оказалось проще простого.<br />
Пишем процедурный модуль <i>MODULE1.PRG </i>с небольшим «довеском» , допустим в нем есть некая функция <i>P1</i></p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> * MODULE1.PRG  
  parameter m.__  
  if type('m.__')='C'  
  	return eval(m.__)  
  endif  
    
  Procedure P1  
  Return 1</pre>
</td>
</tr>

</table>
<p>Далее пишем некий главный файл <i>MAIN.PRG </i>(Привет <u>Владимиру Максимову</u>)</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> * MAIN.PRG  
  ? MODULE1([P1()])</pre>
</td>
</tr>

</table>
<p>На выходе получаем искомое значение 1 которое вернула функция <i>P1</i> – Ура, у нас получилось !<br />
Изменяем модуль <i>MAIN.PRG </i>на такой</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> * MAIN.PRG  
  ? MODULE1([P1()])  
    
  Procedure P1  
  Return 2</pre>
</td>
</tr>

</table>
<p>Проверим, что вернет нам наша «шаманская» функция ? А в результате видим – <b>1</b>. Значит наша функция в <i>MAIN.PRG </i>не сработала ! И правильно, ибо вызов функции идет в модуле <i>MODULE1.PRG </i>в строке <i>EVAL(m.__)</i> – фокс находит функцию в текущем модуле и перестает ее искать где-то еще и возвращает значение нужной нам функции. Ну пробовать, так пробовать. Еще раз меняем файл <i>MAIN.PRG</i></p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> * MAIN.PRG  
  ? MODULE1([P2()])  
    
  Procedure P2  
  Return 2</pre>
</td>
</tr>

</table>
<p>Прошу заметить, что зайца в шляпе нет, то <u>есть функции <i>P2</i> в <i>MODULE1.PRG</i> нет</u>. Смотрим,что вернет функция.<br />
Оказывается возвращает значение – <b>2</b>. Пробуем штатными средствами FoxPro, пишем</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> DO P2 in MODULE1 </pre>
</td>
</tr>

</table>
<p>И получаем ошибку: Procedure "P2" not found – чего собственно и ждали, но в нашем случае такой ошибки нет и функция вернула, значение из модуля <i>MODULE1</i> , это что же получается Фокс нас обманывает ? Или все-таки мы его? .<br />
Давайте подумаем, а собственно откуда в <i>MODULE1.PRG </i>взялось значение функции <i>P2</i> ?<br />
Фокс в модуле <i>MODUL1.PRG </i>пытается найти функцию <i>P2</i> – не находит и переходит по стеку вызовов на ранние вызовы, и что же, находит ее в модуле <i>MAIN.PRG </i>– соответственно значение этой функции он нам и вернет. Проблема побеждена, и в том же 1994 году за полторы недели на коленке был написан склад с использование псевдо-объектности. Жаль исходники потерял, за давностью лет. Но было здорово и быстро.</p>
<p><u>Ну вот, а теперь собственно - <b>Амбула</b>.</u></p>
<p>Был у меня некий проект на VFP6 – размер исполняемого файла 3.5 метра – все в одном. Решил я это дело порезать на куски. Ну общие процедурные модули и дополнительные невизуальные классы вынести в отдельный модуль COMMON.APP – сказано – сделано – исполняемый файл уменьшили на 1 метр, осталось 2.5 – из них картинок около 1.5 метров – на все случаи жизни, так сказать. А чего давай и их выкинем из исполняемого файла – вынесем куда-нибудь в IMAGES.APP и пусть там валяются, все равно этот модуль – ну очень редко будет изменяться. Ладно собираем все картинки в новый IMAGES.APP в проекте им даем атрибут Excluded – собираем главный исполняемый файл, предварительно в нем подключаем модуль IMAGES.APP. А вместо картинок видим крестики, это что же теперь на картинках крест поставить ? Ладно начнем думать. Если так картинки не подключаются, давай старым дедовским шаманским способом – переадресуем подключение картинок в IMAGES.APP<br />
В базовом классе Image дописываем в свойство <i>Picture_Assing </i>следующий код</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> LPARAMETERS vNewVal  
 *To do: Modify this routine for the Assign method  
  THIS.Picture = m.vNewVal  
  if not empty(this.picture)  
  	* Если файл не найдет в исполняемом файле или на диске – переадресуем вызов   
  	if not file(this.picture)   
  		if file("IMAGES.APP")  
  			DO "IMAGES.APP" with (this),'picture',this.picture  
  		endif  
  	endif  
  endif</pre>
</td>
</tr>

</table>
<p>Соответственно меняем главный файл для проекта IMAGES, а как без главного модуля ? Даже пустого – APP не слепить.<br />
Процедура может принимать от 3 параметров<br />
<i>1 – ссылка на объект к которому будем цеплять картинку<br />
2 – имя свойства, в нашем случае PICTURE<br />
3 – собственно имя файла картинки<br />
4 – параметр может использоваться для ListBox или ComboBox для свойства Picture(N) – как N</i></p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> lparameter m.ObjRef, m.cProperty, m.xValue, m.nIndex  
  if pcount() &lt; 3  
  	MessageBox("Это модуль ресурсов",64,_screen.caption)  
  	Return .F.  
  endif  
  if vartype(m.ObjRef)='O' ;  
  	and vartype(m.cProperty)='C' ;  
  	and PEMStatus(m.ObjRef,m.cProperty,5)  
    
  	if vartype(m.nIndex)='N'  
  		if m.cProperty='PICTURE'  
  			ObjRef.Picture[m.nIndex]=m.xValue  
  		else  
  			Return ObjRef.WriteExpression(m.cProperty+'[m.nIndex]',[m.xValue])  
  		endif  
  	else  
  		Return ObjRef.WriteExpression(m.cProperty,[m.xValue])  
  	endif  
  	Return .T.  
  endif  
    
  Return .F.</pre>
</td>
</tr>

</table>
<p>
Теперь пересобираем APP для картинок – и главный исполняемый файл – и видим все картинки на месте. Ну вот – наконец-то смогли уменьшить размер главного исполняемого файла еще на 1.5 метра – остался метр «живого» кода – теперь можно вздохнуть спокойно.</p>
<p>Используя «потусторонние связи» с переадресацией вызова, оказывается можно много чего получить в Фоксе</p>
<p class="little">Последние обновление: 2005-01-26 09:11<br />
Опубликовал: Пирожков Вадим</p>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4821">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4821">piva</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="piva" href="https://foxclub.ru/account/?user=4821">
				<img alt='' src='https://secure.gravatar.com/avatar/0a76ea08e616d2f8a939412913fbb096?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/0a76ea08e616d2f8a939412913fbb096?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-03-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/tajna-potustoronnih-svyazej-ili-ispolzovanie-pereadresovannyh-vyzovov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Статьи]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/rtfeport-generator-otchetov-iz-rtf-shablona-sovmestim-s-genrep-isklyuchaya-ego-rasshirennye-vozmozhnosti-nebolshoe-ispravlenie-ot-26-01-2005/</link>
					<title><![CDATA[RtfEPORT &#8211; генератор отчетов из RTF-шаблона (совместим с GenRep, исключая его расширенные возможности). Небольшое исправление от 26.01.2005.]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:25 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>RtfEPORT &#8211; генератор отчетов из RTF-шаблона (совместим с GenRep, исключая его расширенные возможности). Небольшое исправление от 26.01.2005.</h1>
													</header>
													<div id="sol_opis">Генератор отчетов RtfEPORT предназначен для вывода данных из DBF-файлов/алиасов VFP в виде отчета в  формате RTF на основании предварительно созданного файла шаблона (.SAB-файл).  RtfEPORT разрабатывался как замена генератору отчетов GenRep (автор А. Куденцов), поэтому совместим с ним по формату шаблона (с небольшими отличиями в выражениях и без расширенных возможностей GenRep), а также содержит некоторые расширения и добавления функциональности.  Update4: исправлены ошибки при группировке Update3: исправлена ошибка вывода при использовании условных функций IF/IIF, при несовпадении типов внутри выражения Update2: исправлена ошибка при работе с курсорами, полученными в результате выполнения SQL-запросов вида SELECT * FROM table_name INTO CURSOR cursor_name. Как оказалось, с такими курсорами RtfEPORT не работал. Update1: исправлены некоторые ошибки и неточности с группировкой. Добавлен новый формат вывода - dtm (месяц прописью) </div>
<div id="sol_body">
<h3>RtfEPORT - генератор отчетов из RTF-шаблона (совместим с GenRep)</h3>
<p>  Генератор отчетов RtfEPORT предназначен для вывода данных из DBF-файлов/алиасов VFP в виде отчета в  формате RTF (отчет открывается в программе, установленной по умолчанию для расширения .rtf – обычно это MS Word) на основании предварительно созданного файла шаблона (.SAB-файл). Работает в VFP 5.0 и выше. RtfEPORT разрабатывался как более функциональная замена генератору отчетов GenRep (автор А. Куденцов), поэтому совместим с ним по формату шаблона (с небольшими отличиями в выражениях и без расширенных возможностей GenRep), а также содержит некоторые расширения и добавления функциональности (выражения VFP; работает с мемо-полями; условное форматирование шрифта). Подробное описание внутри архива. <br />    Отличия RtfEPORT от GenRep<br /> 1. Может использоваться только в программах, написанных на Visual FoxPro;<br /> 2. Поставляется в виде исходных кодов (prg-файл);<br /> 3. Может использовать не только внешние DBF-файлы, но и алиасы FoxPro;<br /> 4. Работает с мемо-полями;<br /> 5. может использовать любые выражения Visual FoxPro в полях вывода (в т.ч. данные не только из основной для отчета таблицы/алиаса, но и из других открытых в приложении алиасов);<br /> 6. Содержит дополнительные возможности условного форматирования: цвет и тип шрифта<br /> 7. В выражениях не работают знаки: <br />   # - деление с округлением до большего,<br />   | - деление с округлением до меньшего.<br /> Вместо них нужно использовать функции FoxPro (round).<br /> 8. Более низкая скорость формирования отчетов (связанная, по крайней мере, с характером исполняемого кода: интерпретируемый p-код, в случае RtfEPORT,  и компилированный – в случае GenRep). Возможно, проблема и в коде 🙂 - из-за неоднакратных дописываний/переписываний не совсем оптимизирован (есть что сделать в след. версии ;-)).</p>
<p> В настоящий момент RtfEPORT используется в работающем клиент-серверном приложении (RTF-шаблоны проще хранить в BLOB-поле, чем 2 файла отчетов VFP), в котором раньше использовался GenRep. Шаблоны переписывать не пришлось. 🙂</p>
<p> Генератор поставляется в виде prg-файла RtfEPORT.prg (VFP 5.0) Подробно об использовании см. в описании (RtfEPORT.rtf) и в демо-проекте dortfrep.            </p></div>
<div id="sol_avtor">Автор: Алексей Кирпичев</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/rtfeport-generator-otchetov-iz-rtf-shablona-sovmestim-s-genrep-isklyuchaya-ego-rasshirennye-vozmozhnosti-nebolshoe-ispravlenie-ot-26-01-2005/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/proverka-pravopisaniya-v-fokse/</link>
					<title><![CDATA[Проверка правописания в фоксе]]></title>
                    					    <author><![CDATA[piva]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Проверка правописания в фоксе</h1>
													</header>
													<div id="sol_opis">Простенький вариант проверки правописания без подключения MS Word, только средствами фокса. Используется Reserved.fll и FoxTools.fll. Всю интерфейсную часть можно доработать напильником</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Пирожков Вадим</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4821">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4821">piva</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="piva" href="https://foxclub.ru/account/?user=4821">
				<img alt='' src='https://secure.gravatar.com/avatar/0a76ea08e616d2f8a939412913fbb096?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/0a76ea08e616d2f8a939412913fbb096?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-03-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/proverka-pravopisaniya-v-fokse/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/prichesyvatel-koda/</link>
					<title><![CDATA[Причесыватель кода]]></title>
                    					    <author><![CDATA[piva]]></author>
                    										    <pubDate>Mon, 31 Aug 2020 08:55:16 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Причесыватель кода</h1>
													</header>
													<div id="sol_opis">Вот тут попросили выложить в решения причесыватель кода, может использоваться как простая замена beautify.app или работать с ним в связке, сначала beautify.app наводит порядок, а потом эта утилька придает ему тот вид к которому я больше привык или можно поменять на корпоративный стиль оформления кода. Первое упоминание про нее я нашел у себя даированное 17 октября 1997 года. Переделано под VFP8</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Пирожков Вадим</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4821">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4821">piva</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="piva" href="https://foxclub.ru/account/?user=4821">
				<img alt='' src='https://secure.gravatar.com/avatar/0a76ea08e616d2f8a939412913fbb096?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/0a76ea08e616d2f8a939412913fbb096?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-03-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/prichesyvatel-koda/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/otmetki-v-grid/</link>
					<title><![CDATA[Отметки в Grid]]></title>
                    					    <author><![CDATA[Олег Бляхеров]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Отметки в Grid</h1>
													</header>
													<div id="sol_opis">Класс предназначен для установки/снятия отметок в списке элементов, выдаваемых в Grid. Отметки можно делать мышкой, клавишей Ins, клавишами Shift+Up, Shift+Down или через меню.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Олег Бляхеров</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5049">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5049">Олег Бляхеров</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Олег Бляхеров" href="https://foxclub.ru/account/?user=5049">
				<img alt='' src='https://secure.gravatar.com/avatar/59254e455634d23d143dcfe629716d52?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/59254e455634d23d143dcfe629716d52?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 8<i class="rcli fa-calendar-check-o"></i>Регистрация: 23-04-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/otmetki-v-grid/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/programma-izmeneniya-formy-posle-perevoda-iz-foxpro-2-6/</link>
					<title><![CDATA[Программа изменения формы после перевода из foxpro 2.6]]></title>
                    					    <author><![CDATA[Петров Андрей]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Программа изменения формы после перевода из foxpro 2.6</h1>
													</header>
													<div id="sol_opis">перевод свойств форм из досовского fox в visual</div>
<div id="sol_body">
<h3>Программа изменения формы после перевода из foxpro 2.6</h3>
<p> 	Программа перевода досовских экранов (FoxProX 2.6)  	     в видовые формы (для Visual FoxPro 6.0) 			    (FreeWare)  </p>
<pre> Как пользоваться данным пакетом ...   Обычно в FoxPro экраны храняться в одном каталоге поэтому данная  программа на это ориентирована. 1.а) Сконвертировать все файлы в формат Visual Fox (Functional convertation) 1.б) Запустить программу Do Change_All.Prg With 'Path',1 	Где path - путь к файлам *.scx 	    1    - Переводить кодировку файла (Dos в Windows), если нет непереводить 	И Л И      Если нужно сконвертировать 1 файл то ... 	1) use form.scx excl 	2) do ch_form		- Перевести из PageFrame в Form 	3) do change with 1	- Сконвертировать (1 - переводить или нет кодировку)  				Возможности  1) Перевод файла формы из PageFrame в Form 2) Перекодирование (DosToWin) 3) Преобразование CommandGroup в CommandButton 4) Убирание глюков связанных с OptionGroup 5) Преобразование шрифтов 6) Растягивание формы в 1.1 раз по вертикали 7) Преобразование Message в ToolTipText 8) Преобразование линий в Shape (3D линии) 9) Поле ControlSource -> Name 10) Всякие мелочи ...  Данная программа основана на поиске EOFов (#13#10)  Также прилагается программа на Pascal меняющая в Prg файлах Show Get на .obj.enabled (ch_prg.exe). Изменяет 1 файл переданный в качестве параметра.  				Недостатки 1) Если вызвать ее несколько раз она слишком растянет форму. 2) Не изменяет шрифт у OptionGroup   Петров А.О. JellFish@mail.ru    29.03.02   Пишите если что !!! </pre>
</p></div>
<div id="sol_avtor">Автор: Петров Андрей</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5063">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5063">Петров Андрей</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Петров Андрей" href="https://foxclub.ru/account/?user=5063">
				<img alt='' src='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 14<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-04-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/programma-izmeneniya-formy-posle-perevoda-iz-foxpro-2-6/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/lyuboj-put-programmy/</link>
					<title><![CDATA[Любой путь программы]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Любой путь программы</h1>
													</header>
													<div id="sol_opis">позволяет располагать программу в любом месте на диске</div>
<div id="sol_body">
<h3>Любой путь программы</h3>
<p> *процедура определения и установка пути программы<br /> *отучает программу от привязанности к пути на диске</p>
<p> xp=ALLTRIM(SYS(16))<br /> xpl=LEN(xp)<br /> i=1<br /> DO WHILE LEFT(RIGHT(xp,i),1)#''<br /> 	i=i+1<br /> 	xpl=xpl-1<br /> ENDDO<br /> xp=LEFT(xp,xpl)<br /> SET DEFAULT TO &xp<br /> retu   </div>
<div id="sol_avtor">Автор: Pyhar</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/lyuboj-put-programmy/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/opyat-arhivirovanie-po-metodu-zip/</link>
					<title><![CDATA[Опять архивирование по методу Zip]]></title>
                    					    <author><![CDATA[ShmSoft]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Опять архивирование по методу Zip</h1>
													</header>
													<div id="sol_opis">Архивация по методу Zip с использованием механизма API при свободно распространяемой библиотеке ZlibWapi.Dll  - архивация указываемого каталога по методу .Zip - поддерживаются (default) вложенные подкаталоги - стандартные маски файлов с использованием &quot;*&quot; и &quot;?&quot; - распаковка стандартных архивов Zip, (как внешних, так и Native, созданных) - распаковка файлов с исходными атрибутами (время,атрибуты)  Изменения и дополнения от 20.12.2004 в файле Read_Me.txt</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Shm-Soft</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4645">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4645">ShmSoft</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="ShmSoft" href="https://foxclub.ru/account/?user=4645">
				<img alt='' src='https://secure.gravatar.com/avatar/9020c1b31972c9dabbcde4d3c4a372dd?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/9020c1b31972c9dabbcde4d3c4a372dd?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-11-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/opyat-arhivirovanie-po-metodu-zip/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/resajzer-na-baze-svojstva-anchor/</link>
					<title><![CDATA[Ресайзер на базе свойства Anchor]]></title>
                    					    <author><![CDATA[Олег Бляхеров]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Ресайзер на базе свойства Anchor</h1>
													</header>
													<div id="sol_opis">Эмуляция свойства Anchor, введенного в VFP9, для более ранних версий VFP с дополнениями, которые автору показались очень полезными.</div>
<div id="sol_body">Какое-то время назад в форуме по VFP9 обсуждалось введенное в VFP9 свойство Anchor. (<A href="http://forum.foxclub.ru/read.php?f=29&i=654&t=654">См. http://forum.foxclub.ru/read.php?f=29&i=654&t=654</A> ) </p>
<pre> К сожалению, я довольно редко бываю теперь на форуме и прочел его только недавно. У себя я использовал использовал похожий механизм, но он удовлетворял меня не слишком. Главная проблема - достаточно часто нужно привязать контрол не к границам контейнера, а к положению другого контрола. Например, если нужно привязать textbox с итогом по колонке grid'а к самой колонке. Все такие изыски приходилось прописывать руками.    Механизм с якорями мне понравился гораздо больше, а также идея Игоря Королева о 'приклеивании' к границам и, особенно, о реализации всего этого для ранних версий VFP (сам я до сих пор работаю на VFP6 SP4 и не жалуюсь, а 9-ка когда еще выйдет...). Пример Игоря меня, что называется, раззадорил и я решил на основе его решения реализовать привязку не только к границам родного контейнера, но к любому другому контролу на форме. Т.е. я предалагаю в пару к свойству nAnchor добавить еще свойство cAnchorControl, которое будет определять имя контрола-якоря. Привязка должна выполняться аналогично привязке к границам контейнера: левая грань контрола - к левой грани якоря и т.п. Я посмотрел свои формы на предмет применимости нового свойства и обнаружил, что количество сэкономленного кода измеряется десятками строк. Кстати, предваряя реакцию типа 'не усложняй без нужды', хочу заметить, что используя такие стандартные механизмы, я, конечно, усложняю инструмент, зато значительно упрощаю основной текст. Для чего, собственно, инструмент и делается:) Но аппетит приходит во время еды, к тому же выяснилось, что не все проблемы это новое свойство решает. Пример - контрол Mover, позволяющий отбирать элементы из одного списка в другой. В нем два listbox'a (исходный и целевой списки) и посередине кнопки Add и Remove. При растягивании/сжатии Mover'а хотелось бы, чтобы внешние границы listbox'ов оставались 'приклеенными' к границам Mover'а, а внутренние - к кнопкам. Значит, нужно еще одно свойство - nAnchorMask, которое бы в дополнение к nAnchor и cAnchorControl определяло какими гранями контрол цепляется к якорю, а какими - к родному контейнеру. Кроме того, такое свойство позволяет элементарно реализовать Splitter. Код самого Splitter'а получается минимальным, а все привязки деляются заданием свойств nAnchor, cAnchorControl и nAnchorMask для контролов слева и справа от Splitter'а. Задумано - сделано! Класс, который все это делает, перед Вами. И еще одно усовершенствование, которое я бы предложил для свойства Anchor. Как показал мой минимальный опыт при тестировании класса, высчитывать число, задающее нужную комбинацию привязок, - занятие чрезвычайно нудное. И через пять минут ты, естественно, забываешь исходные цифры и нужно решать обратную задачу. Вот я и предлагаю, чтобы значение Anchor задавалось не только числом (11), но и выражением (1+2+8). Реализовать это дело оказалось до смешного простым:</pre>
<p> [code]   .nAnchor = iif(vartype(.nAnchor)='C' and type(.nAnchor) = 'N',;                   evaluate(.nAnchor), .nAnchor)                   [/code] </p></div>
<div id="sol_avtor">Автор: Олег Бляхеров</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5049">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5049">Олег Бляхеров</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Олег Бляхеров" href="https://foxclub.ru/account/?user=5049">
				<img alt='' src='https://secure.gravatar.com/avatar/59254e455634d23d143dcfe629716d52?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/59254e455634d23d143dcfe629716d52?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 8<i class="rcli fa-calendar-check-o"></i>Регистрация: 23-04-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/resajzer-na-baze-svojstva-anchor/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/instrumenty-razrabotchika-dlya-visual-foxpro-6-0-vypusk-2/</link>
					<title><![CDATA[Инструменты разработчика для Visual FoxPro 6.0 Выпуск 2]]></title>
                    					    <author><![CDATA[Олег Бляхеров]]></author>
                    										    <pubDate>Fri, 04 Nov 2022 14:28:15 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Инструменты разработчика для Visual FoxPro 6.0 Выпуск 2</h1>
													</header>
													<div id="sol_opis">
<p>Набор утилит, для облегчения труда разработчика приложений на Visual FoxPro: </p>
<ul>
<li>Все мои проекты… вер.2.1</li>
<li>Поиск в проекте вер.3.4.</li>
<li>Сравнение файлов вер.3.10</li>
<li>Сравнение библиотек вер.2.7</li>
<li>Редактор библиотек вер.1.3<br />
Статус: FreeWare</li>
</ul>
</div>
<div id="sol_body">
<h3>Инструменты разработчика для Visual FoxPro 6.0</h3>
<p>Настоящий профессионал начинается с инструмента (ИМХО!). Это касается всех видов деятельности - от столяра до зубного врача, и программисты здесь не исключение. Именно эта нехитрая мысль, а также долгие поиски нужного проекта в проводнике или всех мест, где я имел неосторожность использовать “эту дурацкую функцию, которая почему-то глючит в очередном сервис-паке”, подвигли меня на изготовление (сначала для себя) нескольких простеньких инструментов, в той или иной степени решающих все эти проблемы. За несколько лет они обросли мяском, приобрели более-менее приличный вид и, что самое главное, сэкономили мне массу времени и сил. Теперь я готов предложить некоторые из них на суд широкой фокс-общественности и пусть народ скажет свое слово. </p>
<p>В второй выпуск пакета, представляемый здесь, входит пять фокс-приложений: “Все мои проекты…”, “Поиск в проекте”, “Сравнение файлов”, “Сравнение библиотек и форм” и “Редактор библиотек”. </p>
<p>Приложения представляют собой app-модули и вызваются прямо из командного окна. Обращение к инструментам описано в соотвествующих разделах файла tools.chm. Для большего удобства вызов приложений можно вставить в главное меню Foxpro с помощью простенькой процедуры, запускаемой из config.fpw </p>
</div>
<div id="sol_avtor">Автор: Олег Бляхеров</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5049">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5049">Олег Бляхеров</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Олег Бляхеров" href="https://foxclub.ru/account/?user=5049">
				<img alt='' src='https://secure.gravatar.com/avatar/59254e455634d23d143dcfe629716d52?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/59254e455634d23d143dcfe629716d52?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 8<i class="rcli fa-calendar-check-o"></i>Регистрация: 23-04-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/instrumenty-razrabotchika-dlya-visual-foxpro-6-0-vypusk-2/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/komponenta-activex-zip-interfejs-ispolzovaniya-vfp8/</link>
					<title><![CDATA[Компонента ActiveX Zip, интерфейс использования, VFP8]]></title>
                    					    <author><![CDATA[ShmSoft]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Компонента ActiveX Zip, интерфейс использования, VFP8</h1>
													</header>
													<div id="sol_opis">Предлагаю для рассмотрения еще один вариант работы с архивами Zip,</div>
<div id="sol_body">
<h3>Компонента ActiveX Zip, интерфейс использования, VFP8</h3>
<p> Предлагаю для рассмотрения еще один вариант работы с архивами Zip,<br /> 1) вся основная информация: http:www.hdse.org/activexzip/<br /> 2) компонента свободно-распространяемая<br /> 3) основные недостатки:<br /> 	- стартовый банер<br /> 	- архивация подкаталогов, которые удовлетворяют маске<br /> 	(если они не удовлетворяют маске, то не архивируются)<br /> 	- пустые подкаталоги упаковываются, но не распаковываются<br /> 	- просмотр архивов при помощи WinZip,WinRar некорректен</p>
<p> 4) разработка и тестирование: VFP8 (SP1)<br /> 5) используются возможности<br /> 	- Bindevent(...)<br /> 	- Define Class ... OlePublic Implements ... In ...</p>
<p> подробности в файлах:<br />  - ReadMe.txt<br />  - ActiveXZip.chm<br />  - Zip_Objects.prg</p>
<p> Пример: форма Test.scx</p>
<p> Принимаются Пожелания, замечания,вопросы<br /> ShmSoft@rol.ru<br /> ----------------------------------------------------------</p>
<p> Основные элементы Архиватора<br /> ----------------------------<br /> (пример использования - форма Test)</p>
<p> Некоторые замечания<br /> -------------------<br /> 1) Наименование объекта : 'hdsecompression.activexzip'</p>
<p> 2) Основные методы:</p>
<p> addFile(filespec As String, 		- добавить файлы в архив<br /> 		recursive As Logical, <br /> 		storepaths As Logical, <br /> 		password As String) As Void</p>
<p> Close()								- закрыть открытый ранее архивный файл (Open)</p>
<p> create(zipFile As String) As Void	- создать новый архив Zip</p>
<p> deleteFile(item As Variant) As Void	- удалить файл из архива</p>
<p> extract(item As Variant, 			- извлечь файл из архива<br /> 		extractDir As String, <br /> 		password As String) As Void</p>
<p> getCount(count As Long) As Void		- вернуть количество элементов в архиве<br /> 										нумерация файлов считается с 0</p>
<p> getFileDetails(item As Variant)		- прочитать данные о файле в архиве<br /> 				 As Void				по номеру файла (элемента) 0-n</p>
<p> onFileDetails(file As String, 		- событие, расшифровывающее данные о файле<br /> 		passprotected As Logical,		требуется механизм связывания событий<br /> 		uncompressedSize As Long,  		Bindevent(...)<br /> 		compressedSize As Long) <br /> 		As H Result</p>
<p> onFileProcessed(file As String, 	- событие, происходящее при сжатии файла, или разжатии,<br /> 	successfullyArchived As Logical, 	уточняющее также ошибку упаковки/распаковки<br /> 	failDescription As String) <br /> 	As H Result</p>
<p> open(zipFile As String) As Void		- открыть файл архива</p>
<p> showSplash(screenX As Long, 		- показать Лицензионный Банер, (не удалось обойти)<br /> 	screenY As Long, <br /> 	size As SplashSizeRange) <br /> 	As Void</p>
<p> compressString(uncompressed As String, - сжатие символьной строки, не тестировалось<br /> 	compressed As Variant) As Void</p>
<p> uncompressData(compressed As Variant,  - разжатие символьной строки, не тестировалось<br /> 	uncompressed As String) As Void</p>
<p> Замечание 1.: Параметры в данные методы-функции передаются по-ссылке. Возвраты функций<br /> 				не анализировались.</p>
<p> Замечание 2.: Технологические моменты - в такстах методов примера TEST</p>
<p> Уверенно работает с шаблоном *.*</p>
<p> -----------------------------<br /> Shm-Soft, ноябрь, 2004<br /> -----------------------------    </div>
<div id="sol_avtor">Автор: Andrew</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4645">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4645">ShmSoft</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="ShmSoft" href="https://foxclub.ru/account/?user=4645">
				<img alt='' src='https://secure.gravatar.com/avatar/9020c1b31972c9dabbcde4d3c4a372dd?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/9020c1b31972c9dabbcde4d3c4a372dd?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-11-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/komponenta-activex-zip-interfejs-ispolzovaniya-vfp8/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/opyat-zip-arhiacziya-s-ispolzovaniem-zlib/</link>
					<title><![CDATA[Опять zip-архиация с использованием Zlib]]></title>
                    					    <author><![CDATA[ShmSoft]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Опять zip-архиация с использованием Zlib</h1>
													</header>
													<div id="sol_opis">Краткое описание элементов компоненты Shm_zip2 (Shm-Soft,декабрь,2004) ---------------------------------------------- Архивация по методу Zip с использованием механизма API при свободно распространяемой библиотеке ZlibWapi.Dll  - архивация указываемого каталога по методу .Zip - поддерживаются (default) вложенные подкаталоги - стандартные маски файлов с использованием "*" и "?" - распаковка стандартных архивов Zip, (как внешних, так и Native, созданных) - распаковка файлов с исходными атрибутами (время,атрибуты) - распаковка файлов по маске (см. выше) - маска не распространяется на подкаталоги, если включен (default) режим .Recurse  ПОЖЕЛАНИЯ... принимаются критические замечания и пожелания, советы, предложения... ShmSoft@rol.ru </div>
<div id="sol_body">см. _ReadMe.txt </div>
<div id="sol_avtor">Автор: shmsoft</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4645">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4645">ShmSoft</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="ShmSoft" href="https://foxclub.ru/account/?user=4645">
				<img alt='' src='https://secure.gravatar.com/avatar/9020c1b31972c9dabbcde4d3c4a372dd?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/9020c1b31972c9dabbcde4d3c4a372dd?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-11-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/opyat-zip-arhiacziya-s-ispolzovaniem-zlib/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Система]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/strelochnyj-pribor/</link>
					<title><![CDATA[Стрелочный прибор]]></title>
                    					    <author><![CDATA[DmGr]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Стрелочный прибор</h1>
													</header>
													<div id="sol_opis">Стрелочный прибор</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: DmGr</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4731">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4731">DmGr</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="DmGr" href="https://foxclub.ru/account/?user=4731">
				<img alt='' src='https://secure.gravatar.com/avatar/333bfef466a5a9cecf9b94f79b0e468d?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/333bfef466a5a9cecf9b94f79b0e468d?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 21-01-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/strelochnyj-pribor/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/proverka-nalichiya-kompyutera-v-seti-po-ip-protokolu-analog-funkczii-ping/</link>
					<title><![CDATA[Проверка наличия компьютера в сети по IP протоколу. Аналог функции ping.]]></title>
                    					    <author><![CDATA[dvp]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:29 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Проверка наличия компьютера в сети по IP протоколу. Аналог функции ping.</h1>
													</header>
													<div id="sol_opis">Проверка наличия компьютера в сети по IP протоколу. Аналог функции ping.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Дмитрий Петров</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1888">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1888">dvp</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="dvp" href="https://foxclub.ru/account/?user=1888">
				<img alt='' src='https://secure.gravatar.com/avatar/2b80585062171452f39df1a339781899?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/2b80585062171452f39df1a339781899?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 19-11-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/proverka-nalichiya-kompyutera-v-seti-po-ip-protokolu-analog-funkczii-ping/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kompleks-dlya-buhgalterii/</link>
					<title><![CDATA[Комплекс для бухгалтерии]]></title>
                    					    <author><![CDATA[Profi]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Комплекс для бухгалтерии</h1>
													</header>
													<div id="sol_opis">АРМ бухгалтера</div>
<div id="sol_body"> </p>
<h3>Комплекс для бухгалтерии</h3>
<p> Этот комплекс расчитан более на программиста чем на пользователя, так-как там много чего нужно<br /> улучшать, хотя если устраивает так как есть, то пользоваться можно, с условием, не держать у себя<br /> улучшения, а делиться.</p>
<p>    </div>
<div id="sol_avtor">Автор: Profi</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1009">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1009">Profi</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Profi" href="https://foxclub.ru/account/?user=1009">
				<img alt='' src='https://secure.gravatar.com/avatar/c4e97088f245d131bbac794d6df2830f?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c4e97088f245d131bbac794d6df2830f?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 07-11-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kompleks-dlya-buhgalterii/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Распространение программ]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/report-s-peremennym-chislom-kolonok/</link>
					<title><![CDATA[Report с переменным числом колонок]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Report с переменным числом колонок</h1>
													</header>
													<div id="sol_opis">Позволяет строить Report с переменным числом колонок</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Фетисов Валерий</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/report-s-peremennym-chislom-kolonok/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/foxzip-klass-dlya-raboty-s-zip-arhivami-v-visual-foxpro-ispravlennyj/</link>
					<title><![CDATA[FoxZip – класс для работы с ZIP-архивами в Visual FoxPro (исправленный).]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>FoxZip – класс для работы с ZIP-архивами в Visual FoxPro (исправленный).</h1>
													</header>
													<div id="sol_opis">Позволяет создавать и распаковывать файлы архивов ZIP-формата. Реализован в виде Visual Class Library, использует библиотеку zlib (http://www.winimage.com/zLibDll/) Библиотека ZLIB (версии 1.1.4) находится внутри класса (т.е. наличие DLL-библиотеки не требуется).  Толчком к созданию класса послужило решение http://www.foxclub.ru/sol/index.php?act=view&amp;id=293   Изменения: 1. Решена проблема с русскими именами файлов 2. Добавлено свойство AlertReplacingFile (по умолч. - .T.), управляющее выдачей сообщения о наличии существующего файла</div>
<div id="sol_body">Подробное описание см. в файле <b>FoxZip.rtf</b> из архива.  <b><u>Пример использования класса</b></u></p>
<p> SET CLASSLIB TO foxzip.vcx</p>
<p> _SCREEN.AddObject.( 'fz', 'foxzip')  && добавляем объект FoxZip</p>
<p> _SCREEN.fz.ZipOpen('c:winntwin.zip')  && открываем ZIP-файл</p>
<p> _SCREEN.fz.ZipFile('c:winntwin.ini')  && добавляем файл</p>
<p> _SCREEN.fz.ZipFile('c:winntwinhelp.exe')  && добавляем второй файл</p>
<p> _SCREEN.fz.ZipClose  && закрываем ZIP-файл</p>
<p> _SCREEN.fz.UnZip('c:winntwin.zip', 'c:winnt111') && декомпрессия созданного ZIP-файла в несуществующий каталог</p>
<p><p> _SCREEN.fz.IncludePath = .T. && включать пути</p>
<p> _SCREEN.fz.ZipOneFile('c:winntwelcome.exe')  && компрессия одного файла с созданием одноименного ZIP-файла</p>
<p> _SCREEN.fz.UnZip('c:winntwelcome.zip', 'c:winnt111')  && декомпрессия нового ZIP-файла в уже созданный новый каталог и с созданием подкаталога winnt</p>
<p><p> _SCREEN.fz.ClearDlls = .T.</p>
<p> _SCREEN.fz.removeobject('fz')</p>
</div>
<div id="sol_avtor">Автор: Кирпичев Алексей</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/foxzip-klass-dlya-raboty-s-zip-arhivami-v-visual-foxpro-ispravlennyj/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Система]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/indeksirovannyj-poisk-po-otdelnym-slovam/</link>
					<title><![CDATA[Индексированный поиск по отдельным словам]]></title>
                    					    <author><![CDATA[karly™]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Индексированный поиск по отдельным словам</h1>
													</header>
													<div id="sol_opis">Индексированный поиск по нескольким словам, входящим в искомое выражение. Поиск не зависит от порядка слов.</div>
<div id="sol_body"><H3>Пример организации <u>индексированного</u> контекстного поиска</H3>  При запросе "Центральная аптека" будут найдены <UL> </p>
<li>Центральная аптека</li>
<li>Аптека "Центральная"</li>
<li>Аптека на ул.Центральная</li>
<p> </UL>  Протестировано в <b>VFP7-8</b>.</p>
<p> Для <b>VFP6</b> придется подключить библиотеку <i>foxtools.fll</i> и воспользоваться аналогами функций GetWordNum() и GetWordCount()</p></div>
<div id="sol_avtor">Автор: Игорь Ильин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4545">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4545">karly™</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="karly™" href="https://foxclub.ru/account/?user=4545">
				<img alt='' src='https://secure.gravatar.com/avatar/58afa4925ba0e3440d31fa4bebc393ae?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/58afa4925ba0e3440d31fa4bebc393ae?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 27-09-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/indeksirovannyj-poisk-po-otdelnym-slovam/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/buh-kompleks/</link>
					<title><![CDATA[Бух комплекс]]></title>
                    					    <author><![CDATA[Profi]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Бух комплекс</h1>
													</header>
													<div id="sol_opis">Комплекс для бухгалтерии</div>
<div id="sol_body">
<h3>Бух комплекс</h3>
<p> Это комплекс задач для бухгалтерии от Зарплаты до Главной книги , не пропадать же добру, пусть кому надо попользуются, может быть будет продолжать свое развитие на что немного надеюсь...  </p></div>
<div id="sol_avtor">Автор: Profi</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1009">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1009">Profi</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Profi" href="https://foxclub.ru/account/?user=1009">
				<img alt='' src='https://secure.gravatar.com/avatar/c4e97088f245d131bbac794d6df2830f?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c4e97088f245d131bbac794d6df2830f?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 07-11-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/buh-kompleks/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/skin-y-dlya-form-visual-foxpro-versiya-3/</link>
					<title><![CDATA[Skin-ы для форм Visual FoxPro Версия 3]]></title>
                    					    <author><![CDATA[Magellan]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Skin-ы для форм Visual FoxPro Версия 3</h1>
													</header>
													<div id="sol_opis">VCX-библиотека, позволяющая изменить внешний вид Ваших окон а-ля WinAmp. С примером</div>
<div id="sol_body">
<h3>Skin-ы для форм Visual FoxPro Версия 3</h3>
<p> Авторы: <br /> Pablo J. Molina from La Rioja, Argentina<br /> pablo@vfpskin.com.ar</p>
<p> Daniel Diaz from Tucuman, Argentina<br /> daniel@vfpskin.com.ar</p>
<p> Cайт производителя:<br /> http://www.vfpskin.com.ar/index.htm<br /> Шкуры (35 штук):<br /> http://www.vfpskin.com.ar/skins.htm</p>
<p> Эта библиотека была размещена здесь исключительно в образовательных целях, так сказать, посмотри<br /> как сделали люди и сделай сам лучше. 🙂</p>
<p> VFP7SP1<br /> В декомпилированной библиотеке VFPSKIN убрано <br /> - напоминание в title окна VFPSKIN 3.0 Demo<br /> - появление About окна после каждой смены шкуры</p></div>
<div id="sol_avtor">Автор: Magellan</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4778">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 21 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4778">Magellan</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Magellan" href="https://foxclub.ru/account/?user=4778">
				<img alt='' src='https://secure.gravatar.com/avatar/0e8e914876ff9e57b7ef8db5a2ee00e1?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/0e8e914876ff9e57b7ef8db5a2ee00e1?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 31-08-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/skin-y-dlya-form-visual-foxpro-versiya-3/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/skin-y-dlya-form-visual-foxpro/</link>
					<title><![CDATA[Skin-ы для форм Visual FoxPro]]></title>
                    					    <author><![CDATA[SabRust]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Skin-ы для форм Visual FoxPro</h1>
													</header>
													<div id="sol_opis">Интересная vcx-библиотека, позволяющая изменить внешний вид Ваших окон. Рекомендую всем!</div>
<div id="sol_body">Очень интересная vcx-библиотека(vfp-skin2.vcx), позволяющая изменить внешний вид Ваших окон. Устанавливаешь на Ваше окно, минимальные настройки и все. На примере-проекте показана суть работы с библиотекой. И вместе с проектом 10 готовых скинов. Удачи! Рекомендую всем!</div>
<div id="sol_avtor">Автор: Sabrust</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="2172">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=2172">SabRust</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="SabRust" href="https://foxclub.ru/account/?user=2172">
				<img alt='' src='https://secure.gravatar.com/avatar/0e0abf9d086924842553518edd8bc3a6?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/0e0abf9d086924842553518edd8bc3a6?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-10-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/skin-y-dlya-form-visual-foxpro/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/vzaimodejstvie-treeview-s-listview-a-lya-provodnik-windows/</link>
					<title><![CDATA[Взаимодействие TreeView с ListView (а-ля Проводник Windows)]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 04 Nov 2022 14:28:47 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Взаимодействие TreeView с ListView (а-ля Проводник Windows)</h1>
													</header>
													<div id="sol_opis">Взаимодействие TreeView с ListView (а-ля Проводник Windows)</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: SoloSerg</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/vzaimodejstvie-treeview-s-listview-a-lya-provodnik-windows/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/primer-s-dragdrop-iz-grida-v-grida/</link>
					<title><![CDATA[Пример с Drag&#038;Drop из грида в грида]]></title>
                    					    <author><![CDATA[_Jet_]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Пример с Drag&#038;Drop из грида в грида</h1>
													</header>
													<div id="sol_opis">регистрационная форма из одной программы.</div>
<div id="sol_body">
<h3>Пример с Drag&Drop из грида в грида</h3>
<p> подробности: readme<br /> извините за бедные комментарии и за кривой "кодинг"   </div>
<div id="sol_avtor">Автор: _Jet_</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4608">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4608">_Jet_</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="_Jet_" href="https://foxclub.ru/account/?user=4608">
				<img alt='' src='https://secure.gravatar.com/avatar/de898857daec2ba70b3cd2fbea81f61f?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/de898857daec2ba70b3cd2fbea81f61f?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 07-02-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/primer-s-dragdrop-iz-grida-v-grida/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/vyvod-struktury-tablicz/</link>
					<title><![CDATA[Вывод структуры таблиц]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Вывод структуры таблиц</h1>
													</header>
													<div id="sol_opis">Вывод структуры таблиц</div>
<div id="sol_body">Вывод структуры таблиц которые находятся в выбранной  папке в текстовый файл или excel, а также вывод в excel структуры таблиц находящихся в БД (dbc).</div>
<div id="sol_avtor">Автор: SoloSerg</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/vyvod-struktury-tablicz/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/arhivirovanie-dannyh-2/</link>
					<title><![CDATA[Архивирование данных]]></title>
                    					    <author><![CDATA[_Jet_]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Архивирование данных</h1>
													</header>
													<div id="sol_opis">Архивирование файлов. Смотрите ReadMe.txt</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: _Jet_</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4608">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4608">_Jet_</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="_Jet_" href="https://foxclub.ru/account/?user=4608">
				<img alt='' src='https://secure.gravatar.com/avatar/de898857daec2ba70b3cd2fbea81f61f?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/de898857daec2ba70b3cd2fbea81f61f?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 07-02-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/arhivirovanie-dannyh-2/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Система]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/preobrazovatel-edinicz-izmerenij/</link>
					<title><![CDATA[Преобразователь единиц измерений]]></title>
                    					    <author><![CDATA[avm]]></author>
                    										    <pubDate>Fri, 04 Sep 2020 06:21:17 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Преобразователь единиц измерений</h1>
													</header>
													<div id="sol_opis">Решение включает набор форм, процедур, меню и таблиц базы данных и предназначено для показа эквивалентов значений величин в различных единицах измерений. Решение особенно актуально, когда приходится одновременно использовать англо-американскую систему и международную систему единиц SI — дюймы и сантиметры, фунты и килограммы, галлоны и литры.</div>
<div id="sol_body">
<p>Форма <i>Measurement Units Equivalents</i> не только преобразует значения величин. Ее удобно использовать как вспомогательное (эскортное) информационное окно: как только в главной форме фокус попадает в поле, содержащее, к примеру, размер в дюймах, эскортная форма показывает этот размер в сантиметрах, микронах и т.п. Переходим в другое поле, показывающее давление в мегапаскалях, и получаем также эквивалент в атмосферах и килограммах на квадратный сантиметр. Таблицы базы данных содержат информацию о более чем 120 единицах измерений 17 категорий и более 750 формул преобразований. База может легко пополняться.</p>
<p>Автор: ARPA Software</p>
</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4173">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4173">avm</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="avm" href="https://foxclub.ru/account/?user=4173">
				<img alt='' src='https://secure.gravatar.com/avatar/71be87f3c973d67820c692f77ac787f6?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/71be87f3c973d67820c692f77ac787f6?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 26-04-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/preobrazovatel-edinicz-izmerenij/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/modnaya-funkcziya-otkrytiya-tabliczy/</link>
					<title><![CDATA[Модная функция открытия таблицы]]></title>
                    					    <author><![CDATA[XGarik]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Модная функция открытия таблицы</h1>
													</header>
													<div id="sol_opis">Данная функция реализует открытие таблицы в режимах SHARED или EXCLUSIVE (при возникновении проблем возвращает соответствующий код ошибки).</div>
<div id="sol_body">
<h3>Модная функция открытия таблицы</h3>
<p> Данная функция реализует открытие таблицы в режимах SHARED или EXCLUSIVE (при возникновении проблем возвращает соответствующий код ошибки).<br /> Теперь вам не надо думать о проверках... функция сделает все сама.    </div>
<div id="sol_avtor">Автор: XGarik</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4118">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4118">XGarik</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="XGarik" href="https://foxclub.ru/account/?user=4118">
				<img alt='' src='https://secure.gravatar.com/avatar/b4a5df18a698199417bd73119aab3afa?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/b4a5df18a698199417bd73119aab3afa?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 07-02-2006        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/modnaya-funkcziya-otkrytiya-tabliczy/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/windows-common-controls-sample/</link>
					<title><![CDATA[Windows Common Controls Sample]]></title>
                    					    <author><![CDATA[piva]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Windows Common Controls Sample</h1>
													</header>
													<div id="sol_opis">Класс работы с Common Controls виндузы через WinAPI без использования ActiveX Пример, который я выложил, имеет статус FREEWARE как и написано в ReadMe.1St? так что, думаю, автор не будет на меня сильно в обиде.  Piva</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Alexander Grigorjev</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4821">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4821">piva</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="piva" href="https://foxclub.ru/account/?user=4821">
				<img alt='' src='https://secure.gravatar.com/avatar/0a76ea08e616d2f8a939412913fbb096?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/0a76ea08e616d2f8a939412913fbb096?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-03-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/windows-common-controls-sample/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Система]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ohota-na-lis/</link>
					<title><![CDATA[Охота на лис]]></title>
                    					    <author><![CDATA[Big Duck]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Охота на лис</h1>
													</header>
													<div id="sol_opis">Найти всех "лис" за минимальное время</div>
<div id="sol_body">
<pre> Есть такой вид спорта "Охота на лис" или "Радеопеленгация" - человек бегает по лесу с пеленгатором и ищет "лис" - передатчики. Чем ближе подбегает к "лисе" - тем громче слышит ее сигнал. Задача найти всех "лис" за минимальное время. Игрушка похожа на виндозового сапера, только в отличии от него, при нажатии на поле показывает расстояние до ближайшей "лисы" по горизонтали или ревтикали в любую сторону (по диагонали искать еще не умеет). Если от поля на расстоянни трех клеток нет ни одной "лисы" (пеленгатор ничего не слышит), то, соответсвенно расстояние не пишется - выводится "?". Задачу усложнил ограниченим времени - на все дела 60 секунд и 10 "лис". Вперед!! скачать можно здесь: http://www.d-tech.ru/foxhunt.zip Требует рантайм от восьмерки. Вот такик вот файлы: gdiplus.dll msvcr70.dll vfp8r.dll VFP8RENU.DLL у кого нету - качайте из раздела <a href=http://www.foxclub.ru/farc/>файловый архив</a> </pre>
</div>
<div id="sol_avtor">Автор: Big Duck</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4422">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4422">Big Duck</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Big Duck" href="https://foxclub.ru/account/?user=4422">
				<img alt='' src='https://secure.gravatar.com/avatar/6e387dd8f20db8ab337f0a5b814d318c?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/6e387dd8f20db8ab337f0a5b814d318c?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 09-04-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ohota-na-lis/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Игры]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ierarhicheskie-spiski-listbox-i-combo-s-piktogrammami-gdi/</link>
					<title><![CDATA[Иерархические списки ListBox и Combo с пиктограммами (GDI)]]></title>
                    					    <author><![CDATA[Вячеслав Клепинин]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Иерархические списки ListBox и Combo с пиктограммами (GDI)</h1>
													</header>
													<div id="sol_opis">Небольшой проект, иллюстрирующий использование возможностей GDI+ для формирования иерархических списков ListBox и Combo</div>
<div id="sol_body">
<h3>Иерархические списки ListBox и Combo с пиктограммами</h3>
<p> Вашему вниманию предлагается простое решение, позволяющее создавать псевдо-иерархические списки с пиктограммами<br /> на базе контролов ListBox и ComboBox.<br /> Идея была предложена на форуме Вадимом Пирожковым (piva). <br /> Так как используется GDI+, то в Вашей системе д.б. библиотека GdiPlus.dll.<br /> Она включена в состав WinXP, а так же поставляется с VFP8 - VFP9beta<br /> Весь код с комментариями см. в методе Click кнопки ЗАГРУЗИТЬ   </div>
<div id="sol_avtor">Автор: Вячеслав Клепинин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4913">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4913">Вячеслав Клепинин</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Вячеслав Клепинин" href="https://foxclub.ru/account/?user=4913">
				<img alt='' src='https://secure.gravatar.com/avatar/11287ca5ef54419c4cf1193225c53073?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/11287ca5ef54419c4cf1193225c53073?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 26-03-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ierarhicheskie-spiski-listbox-i-combo-s-piktogrammami-gdi/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/emulyator-anchor-dlya-vfp8-i-mladshe/</link>
					<title><![CDATA[Эмулятор Anchor для VFP8 и младше]]></title>
                    					    <author><![CDATA[Igor Korolyov]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Эмулятор Anchor для VFP8 и младше</h1>
													</header>
													<div id="sol_opis">Позволяет автоматически изменять размеры элементов управления при изменении размеров формы. Содержит экспериментальное расширение свойства Anchor.</div>
<div id="sol_body">
<h3>Эмулятор Anchor для VFP8 и младше</h3>
<p> Свойства nAnchor выставляются в соответствии с описанием встроенного Anchor для VFP9. Дополнительные значения:<br /> 1024 - Приклеить к верхней границе контейнера<br /> 2048 - Приклеить к левой границе контейнера<br /> 4096 - Приклеить к нижней границе контейнера<br /> 8192 - Приклеить к правой границе контейнера<br /> Для запуска необходимо подключить библиотеку Lib.prg по SET PROCEDURE TO<br /> Естественно что классы должны браться из библиотеки BaseClass.vcx - можно (и нужно) их субклассировать для использования в ваших программах.<br /> Рекомендуется окружить m.loObj.Move в процедуре ResizeCnt (в самом низу Lib.prg) кострукцией TRY ... ENDTRY или иной поглощающей ошибки (в зависимости от ваших предпочтений в обработке ошибок) - дабы избежать возможных проблем, проистекающих из недостоверной работы функции PemStatus() в VFP - например она находит Move у тех объектов, у которых его отродясь не было (например ActiveX контрол Microsoft ImageList) 🙁 Проверка на то что Move это метод вроде помогает в VFP8, но насчёт более ранних версий не уверен.<br /> см. также ветку обсуждения http://forum.foxclub.ru/read.php?f=29&i=654&t=654   </div>
<div id="sol_avtor">Автор: Igor Korolyov</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4825">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4825">Igor Korolyov</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Igor Korolyov" href="https://foxclub.ru/account/?user=4825">
				<img alt='' src='https://secure.gravatar.com/avatar/669f5f66224f3ae8257ff4493933f2e4?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/669f5f66224f3ae8257ff4493933f2e4?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-05-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/emulyator-anchor-dlya-vfp8-i-mladshe/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/predosmotr-pechati/</link>
					<title><![CDATA[Предосмотр печати]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:27 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Предосмотр печати</h1>
													</header>
													<div id="sol_opis">Предосмотр печати + сама печать</div>
<div id="sol_body">
<h3>Предосмотр печати</h3>
<p> Предосмотр печати<br /> =================<br /> Метод - (вывод на предосмотр)<br /> 	ShowReport() </p>
<p> Свойства -<br /> 	- Orientation<br /> 		ориентация страницы - <br /> 		книжная - 0  (по умолчанию)<br /> 		альбомная - 1)<br /> 	- Scale<br /> 		масштаб <br /> 		по умолчанию 70%<br /> 	-FileName<br /> 		Название выводимого файла<br /> ============================================<br /> Установка и запуск</p>
<p> Кладем куда нибудь Greport.dll<br /> Регистрим - RegSvr32 GReport.dll</p>
<p> В прог. коде - </p>
<p> Local qq as GReport.GPreview<br /> Local aa as String</p>
<p> aa = GetFile()</p>
<p> qq = CreateObject('GReport.GPreview')<br /> qq.Scale = 100<br /> qq.Orientation = 1<br /> qq.FileName = aa<br /> qq.ShowReport()     </div>
<div id="sol_avtor">Автор: Tamito</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/predosmotr-pechati/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/net-time-ili-funkcziya-dlya-polucheniya-vremeni-s-servera-v-seti-na-osnove-api-netremotetod/</link>
					<title><![CDATA[Net Time или функция для получения времени с сервера в сети на основе API NetRemoteTOD]]></title>
                    					    <author><![CDATA[Михаил (Bomber)]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Net Time или функция для получения времени с сервера в сети на основе API NetRemoteTOD</h1>
													</header>
													<div id="sol_opis">Процедура позволяет получить дату-время с любого компьютера сети. без всяких dcom и прочего</div>
<div id="sol_body">
<h3>Net Time или функция для получения времени с сервера в сети на основе API NetRemoteTOD </h3>
<p> PARAMETERS m.cServerName<br /> *Имя сервера обязательно с символов , например server</p>
<p> PRIVATE m.lcServerName, m.lnBufferPointer, m.cSetDate, m.nHour, m.nMin, m.nSec, m.nmDiv, m.nDay, m.nMon, m.nYear, m.nRetValue<br /> m.cSetDate=SET("DATE")<br /> SET DATE GERMAN <br /> m.nRetValue={..::}<br /> LOCAL ARRAY Arrdlls[1,3]<br /> =ADLLS(Arrdlls)<br /> IF ASCAN(Arrdlls,"NetRemoteTOD")=0<br />   DECLARE INTEGER NetRemoteTOD IN NETAPI32 STRING ServerName,INTEGER @BufferPointer<br /> ENDIF  <br /> IF ASCAN(Arrdlls,"NetApiBufferFree")=0<br />   DECLARE INTEGER NetApiBufferFree IN NETAPI32 INTEGER Pointer<br /> ENDIF<br /> IF ASCAN(Arrdlls,"RtlMoveMemory")=0<br />   DECLARE RtlMoveMemory IN Kernel32 String@ dest, Integer src, Integer nsize<br /> ENDIF    <br /> IF ASCAN(Arrdlls,"lstrlenW")=0<br />   DECLARE Integer lstrlenW IN Kernel32 Integer src<br /> ENDIF  </p>
<p> m.cServerName=ALLTRIM(m.cServerName)<br /> m.lcServerName = StrConv(StrConv(m.cServerName + Chr(0), 1), 5)<br /> m.lnBufferPointer = 0<br /> IF NetRemoteTOD(m.lcServerName,@m.lnBufferPointer)=0 && Все хорошо!<br />   m.nHour = GetMemoryDWORD(lnBufferPointer+8) &&часы<br />   m.nMin  = GetMemoryDWORD(lnBufferPointer+12) &&минуты<br />   m.nSec  = GetMemoryDWORD(lnBufferPointer+16) &&секунды<br />   m.nmDiv = GetMemoryDWORD(lnBufferPointer+24) &&смещение<br />   m.nDay  = GetMemoryDWORD(lnBufferPointer+32) &&день<br />   m.nMon  = GetMemoryDWORD(lnBufferPointer+36) &&месяц<br />   m.nYear = GetMemoryDWORD(lnBufferPointer+40) &&год<br />   m.nRetValue=CTOT(PADL(ALLTRIM(STR(m.nDay)),2,"0")+"."+;<br />         PADL(ALLTRIM(STR(m.nMon)),2,"0")+"."+;<br />         PADL(ALLTRIM(STR(m.nYear)),4,"0")+" "+;<br />         PADL(ALLTRIM(STR(m.nHour)),2,"0")+":"+;<br />         PADL(ALLTRIM(STR(m.nMin)),2,"0")+":"+;        <br />         PADL(ALLTRIM(STR(m.nsec)),2,"0"))-(60*m.nmDiv)<br /> ENDIF<br /> SET DATE &cSetDate<br /> NetApiBufferFree(m.lnBufferPointer)<br /> RETURN m.nRetValue</p>
<p> FUNCTION GetMemoryLPString<br />   LParameter m.nPointer, m.nPlatform<br />   Local m.cResult, m.nLPStr, m.nslen</p>
<p>   m.nLPStr = GetMemoryDWORD(m.nPointer)</p>
<p>   m.nslen = lstrlenW(m.nLPStr) * 2<br />   m.cResult = Replicate(chr(0), m.nslen)<br />   RtlMoveMemory(@m.cResult, m.nLPStr, m.nslen)<br />   m.cResult = StrConv(StrConv(m.cResult, 6), 2)</p>
<p>   RETURN m.cResult<br /> ENDFUNC<br /> *--<br /> *  Return Number from a pointer to DWORD<br /> *--<br /> FUNCTION GetMemoryDWORD<br />   LParameter m.nPointer<br />   Local m.cstrDWORD<br />   m.cstrDWORD = Replicate(chr(0), 4)<br />   RtlMoveMemory(@m.cstrDWORD, m.nPointer, 4)<br />   RETURN str2long(m.cstrDWORD)<br /> ENDFUNC</p>
<p> *-- <br /> *   Convert a Number intto a binary Long Integer<br /> *--<br /> FUNCTION long2str<br />   LParameter m.nLong</p>
<p>   m.nLong = Int(m.nLong)<br />   RETURN (chr(bitand(m.nLong,255))                 + ;<br />           chr(bitand(bitrshift(m.nLong,  8), 255)) + ;<br />           chr(bitand(bitrshift(m.nLong, 16), 255)) + ;<br />           chr(bitand(bitrshift(m.nLong, 24), 255)))<br /> ENDFUNC<br /> *-- <br /> *   Convert a binary Long Integer into a Number<br /> *--<br /> FUNCTION str2long<br />   LParameter m.cpLong<br />   Return (Bitlshift(Asc(Substr(m.cpLong, 4, 1)), 24) + ;<br />           Bitlshift(Asc(Substr(m.cpLong, 3, 1)), 16) + ;<br />           Bitlshift(Asc(Substr(m.cpLong, 2, 1)),  8) + ;<br />           Asc(Substr(m.cpLong, 1, 1)))<br /> ENDFUNC   </div>
<div id="sol_avtor">Автор: Михаил (Bomber)</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4475">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4475">Михаил (Bomber)</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Михаил (Bomber)" href="https://foxclub.ru/account/?user=4475">
				<img alt='' src='https://secure.gravatar.com/avatar/4c49dad0201f4672d83e197a9b2ef761?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4c49dad0201f4672d83e197a9b2ef761?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 26-08-2020        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/net-time-ili-funkcziya-dlya-polucheniya-vremeni-s-servera-v-seti-na-osnove-api-netremotetod/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/proverka-pravopisaniya-s-vozmozhnostyu-polucheniya-spiska-slov-sinonimov-iz-slovarya-ms-word/</link>
					<title><![CDATA[Проверка правописания с возможностью получения списка слов-синонимов из словаря MS Word]]></title>
                    					    <author><![CDATA[Вячеслав Клепинин]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Проверка правописания с возможностью получения списка слов-синонимов из словаря MS Word</h1>
													</header>
													<div id="sol_opis">Предлагается механизм проверки правописания с использованием глоссария MS Word. Отличие от решения, предложенного ранее Hel!Riser, в том, что можно формировать список слов-синонимов для замены ошибочного слова.</div>
<div id="sol_body">Господа!  В процессе разработки большого приложения решил оформить как решение небольшой примерчик на VFP, позволяющий полноценно использовать словарь MS Word. Предлагается метод проверки правописания с возможностью формирования меню со словами-синонимами из словаря MS Word для замены неправильного слова. Поиск ошибочных слов - см. метод ErrorInText формы ErrorInText Формирование меню из слов - синонимов - см. метод RightClick в Grid1.Column2.Text1 на форме ErrorWords. Будет работать, начиная с VFP7.  </div>
<div id="sol_avtor">Автор: Вячеслав Клепинин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4913">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4913">Вячеслав Клепинин</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Вячеслав Клепинин" href="https://foxclub.ru/account/?user=4913">
				<img alt='' src='https://secure.gravatar.com/avatar/11287ca5ef54419c4cf1193225c53073?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/11287ca5ef54419c4cf1193225c53073?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 26-03-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/proverka-pravopisaniya-s-vozmozhnostyu-polucheniya-spiska-slov-sinonimov-iz-slovarya-ms-word/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Система]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/biznes-kalendar/</link>
					<title><![CDATA[Бизнес-календарь]]></title>
                    					    <author><![CDATA[avm]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Бизнес-календарь</h1>
													</header>
													<div id="sol_opis">Компактная форма-календарь, позволящая &quot;сносить&quot; или &quot;перетягивать&quot; выбранную дату; показывает интервал между выбранной и сегодняшней датами в календарных днях и (главное) в банковских, сиречь — рабочих днях; решает и обратную задачу: &quot;какая это будет дата, столько-то банковских дней от сегодня&quot;. Средство очень полезно в бизнес-приложениях, где постоянно надо определять сроки платежа, отгрузки и т.п. Кроме набора форм решение содержит пакет из свыше 40 функций для программного манипулирования датами, дополняющих стандартный набор процедур.</div>
<div id="sol_body">Для правильного расчета рабочих дней используется информация таблицы праздников и рабочих выходных ("черных суббот", кто помнит такой термин). Таблица может включаться в базу данных приложения или существовать отдельно (free DBF). Решение содержит набор форм для обслуживание таблицы — включения, удаления и комментирования даты (комментарий к дате появляется в календаре как tool tip). Все праздники США и Канады можно ввести автоматически, с помощью соответствующей формы (получить программно — с помощью функции пакета). Изготовление аналогичного инструментария для стран СНГ всячески приветствуется. <BR><BR>  Решение содержит два релиза: последовательное объектно-ориентированное решение "all-in-one" в виде одной библиотеки классов и более традиционный набор форм и программ. <BR><BR> Чтобы скачать решение зайдите на <a HREF=http://www.arpasoftware.com/calendar/1/ TARGET="_blank">http://www.arpasoftware.com/calendar/1/</A> и там нажмите на Download Solution (205Kb). Там же есть более подробное описание (правда, по-английски) и скриншоты. <BR><BR> Скачав архив <i>BusinessCalendar.zip</i>, раскройте его (появится подкаталог <i>Business Calendar</i>). Откройте проект <i>Calendar.pjx</i> и запустите программу <i>main.prg</i>. Появится форма-контрольный пример, демонстрирующая технику работы с решением. Она же позволяет инсталлировать решение в каталог вашего проекта, т.е. скопировать нужние файлы и скорректировать должным образом ссылки на ресурсы в формах и классах. <BR><BR> N.B. Открывая всякий раз проект, запускайте программу <i>runme1st.prg</i>, чтобы настроились пути.</div>
<div id="sol_avtor">Автор: ARPA Software</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4173">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4173">avm</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="avm" href="https://foxclub.ru/account/?user=4173">
				<img alt='' src='https://secure.gravatar.com/avatar/71be87f3c973d67820c692f77ac787f6?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/71be87f3c973d67820c692f77ac787f6?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 26-04-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/biznes-kalendar/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/rasshirenie-graficheskih-vozmozhnostej-vfp-sredstvami-gdi/</link>
					<title><![CDATA[Расширение графических возможностей VFP средствами GDI+]]></title>
                    					    <author><![CDATA[Вячеслав Клепинин]]></author>
                    										    <pubDate>Sun, 30 Aug 2020 16:23:16 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Расширение графических возможностей VFP средствами GDI+</h1>
													</header>
													<div id="sol_opis"><em>Класс, написанный на VFP, позволяющий использовать возможности GDI+ для работы с графикой.</em></div>
<div id="sol_body">
<p>Вниманию коллег, испытывающих трудности при работе с графикой, предлагается написанный на фоксе класс. Реализует работу с графическими файлами различных форматов, а так же позволяет программно создавать рисунки. Прилагается описание и демонстрационный пример.</p>
</div>
<div id="sol_avtor">Автор: Вячеслав Клепинин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4913">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4913">Вячеслав Клепинин</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Вячеслав Клепинин" href="https://foxclub.ru/account/?user=4913">
				<img alt='' src='https://secure.gravatar.com/avatar/11287ca5ef54419c4cf1193225c53073?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/11287ca5ef54419c4cf1193225c53073?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 26-03-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/rasshirenie-graficheskih-vozmozhnostej-vfp-sredstvami-gdi/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Графика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/dizajner-vyushek/</link>
					<title><![CDATA[Дизайнер вьюшек]]></title>
                    					    <author><![CDATA[Syberex]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:27 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Дизайнер вьюшек</h1>
													</header>
													<div id="sol_opis">Для работы с видами. SQL код пишется вручную, список параьетров вруную, свойства полей в Grid-е галочками. Теперь легко переключатся между видами: вверху в Combo выводится список.</div>
<div id="sol_body">
<h3>Дизайнер вьюшек</h3>
<p> В Combo выводится список видов текущей базы данных.<br /> SQL код правиться вручную в editbox-е на 1-ой вкладке,<br /> на 2-ой вкладке свойства вида. Кнопка "Установить" на 1-ой вкладке<br /> изменяет SQL код и устанавливает список параметров и баз данных.<br /> Устанавливаемые свойства подписаны синим цветом.</p>
<p> На 3-ей вкладке в Grid с 4 колонками, свойства в колнках 2,3,4 (Header-ы выделены синим)<br /> устанавливаются в базе кнопкой "Установить" на этой вкладке.</p>
<p> Принцип работы:<br /> 1. Правится SQL код, определяется список параметров.<br /> 2. Нажать кнопку "Установить" на 1-ой вкладке. <br /> (будет изменен SQL код вида и список параметров в базе, <br /> затем дизайнер сообщит "Сохранено!" и обновится)<br /> 3. На вкладке 3 в Grid-е установить свойства полей (ключевые и обновляемые).<br /> 4. На этой вкладке под Grid-ом нажать "Установить", для сохранения свойств в базе.</p>
<p> Пишите, если чего нехватает!  </div>
<div id="sol_avtor">Автор: Syberex</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4749">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4749">Syberex</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Syberex" href="https://foxclub.ru/account/?user=4749">
				<img alt='' src='https://secure.gravatar.com/avatar/3575a3e6d812a3bc6213378083787328?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/3575a3e6d812a3bc6213378083787328?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 19-01-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/dizajner-vyushek/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ispolzovanie-msgraph-chart/</link>
					<title><![CDATA[Использование MSGRAPH CHART]]></title>
                    					    <author><![CDATA[Перминов Игорь]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:27 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Использование MSGRAPH CHART</h1>
													</header>
													<div id="sol_opis">Использование объекта MSGRAPH.CHART (объекты, свойства, методы)</div>
<div id="sol_body">
<h3>Использование MSGRAPH CHART</h3>
<p> MSGRAPH.CHART - отображение некоторой табличной информации в виде графика. Это всего лишь пример того, как можно использовать некоторые объекты, их свойства и методы объекта MSGRAPH.CHART.<br /> 1. Пример написан на VFP 9, но его можно использовать и VFP 8.<br /> 2. Перед использованием это примера, проверьте, должен быть установлен пакет MSGRAPH, который входит в состав MS OFFICE (GRAPH.EXE).<br /> 3. Распакуйте архив, запустите TEST_GRAPH_FORM.PRG).<br /> <b>11-08-2004</b>).<br /> Архив дополнен H-файлом с константами<br /> <b>06-09-2004</b><br /> Архив дополнен примером (FORM2.SCT,FORM2.SCX) который демонстрирует, как можно динамически менять график в заданном диапазоне. Задается дельта значения по оси X, в примере это время, и равняется оно 10 секундам, на график в режиме реального времени выводятся некоторые значения (RAND()), при этом весь график сдвигается. Дельту можно менять, например поставить 25, шкала X графика изменентся. При изменении значения этой самой дельты в модуле GRAPH.EXE (MS OFFICE SP2)возникала ошибка. После установки SP3 для MS OFFICE, данная ошибка перестала возникать. Пример просто показывает, как можно динамически изменять данные графика.    </div>
<div id="sol_avtor">Автор: Перминов Игорь</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5060">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5060">Перминов Игорь</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Перминов Игорь" href="https://foxclub.ru/account/?user=5060">
				<img alt='' src='https://secure.gravatar.com/avatar/c037d0f24a4cd0738110665cf089b985?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c037d0f24a4cd0738110665cf089b985?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 16-09-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ispolzovanie-msgraph-chart/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Графика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/rabota-s-tablo-pokupatelya-i-termo-printerom-cherez-com-port/</link>
					<title><![CDATA[Работа с табло покупателя и термо принтером, через COM порт.]]></title>
                    					    <author><![CDATA[yss]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:27 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Работа с табло покупателя и термо принтером, через COM порт.</h1>
													</header>
													<div id="sol_opis">Краткий и примитивный пример работы с табло покупателя (фирма производитель - "Синт"), и термо принтером (epson-совместимый, работающий на esc-последовательностях).... Все давольно примитиано, но зато наглядно..... Так же может быть исспользованно как пример работы с  COM портом.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Borman</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4808">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4808">yss</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="yss" href="https://foxclub.ru/account/?user=4808">
				<img alt='' src='https://secure.gravatar.com/avatar/f52aa6287c1371f8b1f0930241f940d1?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/f52aa6287c1371f8b1f0930241f940d1?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 29-07-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/rabota-s-tablo-pokupatelya-i-termo-printerom-cherez-com-port/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Система]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/rabota-s-setyu/</link>
					<title><![CDATA[Работа с сетью.]]></title>
                    					    <author><![CDATA[yss]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:27 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Работа с сетью.</h1>
													</header>
													<div id="sol_opis">Простая и доступная работа с сетью... Блокировка - разблокировка, Открытие таблиц (exlusive - shared, path - alias)         Ориентированно на людей, предпочитающих обрабатывать все "руками"</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: borman</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4808">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4808">yss</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="yss" href="https://foxclub.ru/account/?user=4808">
				<img alt='' src='https://secure.gravatar.com/avatar/f52aa6287c1371f8b1f0930241f940d1?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/f52aa6287c1371f8b1f0930241f940d1?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 29-07-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/rabota-s-setyu/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/obrabotka-skanera-shtrih-kodov-dlya-com-porta/</link>
					<title><![CDATA[Обработка сканера штрих кодов, для COM порта.]]></title>
                    					    <author><![CDATA[yss]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:27 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Обработка сканера штрих кодов, для COM порта.</h1>
													</header>
													<div id="sol_opis">Примитивный пример считывания штрих кода сканером, через COM порт....(Соответственно работает и со сканерами, подключаемыми в разрез клавиатуры)</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Borman</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4808">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4808">yss</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="yss" href="https://foxclub.ru/account/?user=4808">
				<img alt='' src='https://secure.gravatar.com/avatar/f52aa6287c1371f8b1f0930241f940d1?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/f52aa6287c1371f8b1f0930241f940d1?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 29-07-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/obrabotka-skanera-shtrih-kodov-dlya-com-porta/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Система]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/splittery-rabotayut-na-forme-v-kontejnere-i-na-pageframe/</link>
					<title><![CDATA[Сплиттеры. Работают на форме, в контейнере и на PageFrame]]></title>
                    					    <author><![CDATA[Nik]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:27 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Сплиттеры. Работают на форме, в контейнере и на PageFrame</h1>
													</header>
													<div id="sol_opis">Классы для создания сплиттеров. Иногда для красоты полезно 🙂</div>
<div id="sol_body">
<h3>Сплиттеры. Работают на форме, в контейнере и на PageFrame</h3>
<p> Вот, создал нечто, что может быть полезно кому-то кроме меня. Основная цель при создании было - простота в обращении и универсальность. В простейшем варианте, достаточно набросать на форму несколько сплиттеров и один AdminSplitter. В Init формы вызвать AdminSplitter.PrepareSplitter, а в Resize AdminSplitter.ResizeSplitter.    </p></div>
<div id="sol_avtor">Автор: nik</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4642">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4642">Nik</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Nik" href="https://foxclub.ru/account/?user=4642">
				<img alt='' src='https://secure.gravatar.com/avatar/58d6bafa8a61951c89fb4ea760b9fbdb?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/58d6bafa8a61951c89fb4ea760b9fbdb?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/splittery-rabotayut-na-forme-v-kontejnere-i-na-pageframe/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kakoj-ne-dolzhna-byt-programma/</link>
					<title><![CDATA[Какой не должна быть программа]]></title>
                    					    <author><![CDATA[Ydin]]></author>
                    										    <pubDate>Sat, 04 Nov 2023 06:05:48 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Какой не должна быть программа</h1>
													</header>
													<div id="sol_opis">Какой не должна быть программа: советы и рекомендации для начинающих</div>
<div id="sol_body">
<h3>Какой не должна быть программа</h3>
<p>Какой не должна быть программа</p>
<p>Когда-то я был маленький<br />
Еще не знал кем быть<br />
Но очень уж не нравилось<br />
Фекалии возить</p>
<p>Много книг и статей касаются темы «Какой должна быть программа». Если программы еще нет, то сам такой подход можно считать оптимистическим (может ее никогда и не будет). Рассмотрим похожую тему «Какой не должна быть программа». Если программы еще нет и, следовательно не известно будет ли она, то подход можно назвать пессимистическим (если она будет такой, какой не должна быть, лучше б ее и не было вообще).<br />
Итак, еще не знаем как писать, но на ровном месте нагнетаем обстановку и говорим, допустим, не хочу потратить много времени на отладку, иметь проблемы с модернизацией и сопровождением. Список можно продолжить, но не включая пунктов таких, например, как « не хочу, чтобы мою программу похитили». Это уже оптимизм – надо еще ее сделать такой, чтобы ее кому то хотелось украсть.<br />
Оптимизм и пессимизм по Гегелю – две стороны одного или единство и борьба противоположностей. Поработаешь хорошо на свой пессимизм и станешь оптимистом. Поработай с оптимизмом, но без опыта и почувствуешь законы Мерфи на свой шкуре и можешь впасть в пессимизм и это уже прямой путь к депрессии. Выработать иммунитет легче пессимисту – из депрессии в депрессию хода нет.<br />
Программа начинает свою жизнь при первом запуске кода. Но это стадия эмбриона. На этой стадии пишем и отлаживаем. Если Вы молодой оптимист и пишите сразу длинный код со всеми бантиками – отладка не оставит времени на досуг. Долгая отладка раздражает и утомляет, а дистанция длинная и нужно экономить силы.<br />
Напишите самую суть, отладьте и порадуйтесь жизни – что-то уже есть. Можно улучшать код – скорость, интерфейсные штучки, фишки красивые и т.д.<br />
Программа начинает жизнь после первого показа тому, кто ее не писал.<br />
Хорошо, когда ее ругают – еще есть время исправить ее, а со стороны лучше видно, что в ней плохо.<br />
Программа начинает взрослую жизнь после установки у заказчика (даже если это ознакомительная версия). Теперь могут всплыть самые серьезные ошибки, а увидите их первыми не Вы. Скорее всего вы узнаете об этом по телефону и на ломаном русском вам продиктуют английские буквы сообщения об ошибке. Что делать?<br />
Стоит написать обработчик ошибок.<br />
Где-то в стартовом коде поставим<br />
<code>ON ERROR DO ERRTRAP WITH ERROR(), MESSAGE(), MESSAGE(1), SYS(2018), LINENO()</code><br />
Можно и не передавать параметры, но бывает это полезно. Например, я вызываю ту же ERRTRAP в Catch’е структуры Try … endtry и передаю через параметры свойства объекта.<br />
Что должно быть в ERRTRAP?<br />
- возможность протолкнуть ошибку или снять задание<br />
- сохранение информации об ошибке (например, в Errors.dbf)<br />
- вызов формы с сообщением об ошибке в таком виде, который по возможности не сильно шокирует юзера и дает ему шанс сообщить Вам что-то полезное по телефону. Если есть модемная связю с юзером, то можно получить файл Errors.dbf и разобраться в ситуации.</p>
<p>Я не считаю свой<em> ERRTRAP</em> показательным, поэтому его здесь не показываю, но эти задачи он решает.<br />
На стадии эмбриона можно избежать некоторых типичных ошибок. У каждого свой путь. Описываю мой.</p>
<p>2. Использование правил при названии переменных и полей.<br />
Пользуюсь рекомендациями MicroSoft. 2 первых символа имени переменной памяти означают область действия (l,g – local,public) и тип переменной (c,n,d,t,l,u,o,a – соответственно текст, число, дата, время, логическое, неопределенное, объект и массив). Поля называю без префикса.<br />
Например, если поле UserName, тогда</p>
<p><code>lcUserName = UserName</code></p>
<p>и можно не писать m.lcUserName.<br />
Если надо, чтобы lcUserName была Private, то пишу явно. Public тоже пишу явно, но тогда переменная должна быть gcUserName.<br />
Выделяю и беру в карман текст программы или метода. К функциональной клавише F9 у меня привязан код, по которому в кармане добавляется оператор Local для переменных с префиксом ‘l’:<br />
<code>ON KEY LABEL F9 DO locals</code><br />
Заменяю выделенное на карман и не боюсь неприятной ошибки, когда в вызываемой программе или методе найдется переменная – двойник.<br />
Текст программы locals:</p>
<pre>#DEFINE TAB CHR(9)
#DEFINE CRLF CHR(13)+CHR(10)
SET EXACT ON
LOCAL i, lc1, lc2, lcLeft, lcLine, lcOther, lcPrefix, ;
ll, ln, lnEq, lnLine, lnLines, lnLocal

lc=_CLIPTEXT
lnLines=ALINES(la,lc)
STORE " " TO gcExclude
DIME laLocals(1), gaOther(1), laDeclare(3)
laDeclare(1)="LOCAL "
laDeclare(2)="PRIVATE "
laDeclare(3)="PUBLIC "
laLocals(1)="@"
STORE 0 TO gnLocals, gnOther

FOR lnLine=1 TO lnLines
IF LEFT(la(lnLine),1)="*"
LOOP
ENDIF
lcLine=ALLT( CHRT(la(lnLine),TAB," "))
FOR ln=1 TO ALEN(laDeclare,1)
lnLocal=AT(laDeclare(ln) , UPPER(lcLine))
IF lnLocal=1
i=1
DO WHILE RIGHT(lcLine,1) = ";"
lcLine=RTRIM(LEFT(lcLine,LEN(lcLine)-1))+CHRT(ALLT(la(lnLine+i)),TAB," ")
i=i+1
ENDDO
gcExclude=gcExclude+ UPPER(ALLT( SUBS( lcLine,AT( laDeclare(ln), UPPER(lcLine))+6)))+" "
LOOP
ENDIF
NEXT
lnLocal=AT("LPARA" , UPPER(ALLT(lcLine)))
IF lnLocal=1
gcExclude=gcExclude+ UPPER(ALLT( SUBS( lcLine,AT(" " , UPPER(lcLine)))))+" "
LOOP
ENDIF
NEXT
gcExclude=CHRT(gcExclude,","," ")

FOR lnLine=1 TO lnLines
IF LEFT(la(lnLine),1)="*"
LOOP
ENDIF
lcLine=ALLT(CHRT(la(lnLine),TAB," "))
IF UPPER(LEFT(lcLine,6))="STORE " AND " TO " $ UPPER(lcLine)
lc1=SUBS(lcLine,AT(" TO ",UPPER(lcLine))+4)+","
ln=OCCURS(",",lc1)
FOR i=1 TO ln
lc2=ALLT(LEFT(lc1,AT(",",lc1)-1))
IF "(" $ lc2
LOOP
ENDIF
=putIt(lc2)
lc1=SUBS(lc1,AT(",",lc1)+1)
NEXT
LOOP
ENDIF
lnEq=AT("=",lcLine)
IF lnEq=0
LOOP
ENDIF
lcLeft=ALLT(LEFT(lcLine,lnEq-1))
IF LEFT(lcLeft,4)="FOR "
=putIt(SUBS(lcLeft,5))
LOOP
ENDIF
IF LEFT(lcLeft,2)="M."
lcLeft=SUBS(lcLeft,3)
ENDIF
IF "&amp;" $ lcLeft
LOOP
ENDIF
IF " " $ lcLeft OR "." $ lcLeft
LOOP
ENDIF
=putIt(lcLeft)
NEXT

= ASORT(laLocals)

gclocals="LOCAL "
lcPrefix="@@"
FOR lnLine=1 TO gnLocals
lc=laLocals(lnLine)
IF LEN(lc)&gt;1
lc=LOWER(LEFT(lc,2))+UPPER(SUBS(lc,3,1))+IIF(LEN(lc)&gt;3,SUBS(lc,4),"")
ll = lcPrefix # LEFT(lc,2) AND lnLine&gt;1
lcPrefix=LEFT(lc,2)
ELSE
lc=LOWER(lc)
ll=.F.
ENDIF
gclocals=gclocals+IIF(ll,TAB+";"+CRLF+TAB,"")+ lc+IIF(lnLine=gnLocals,"",", ")
NEXT
i=0
lcOther=""
FOR lnLine=1 TO gnOther
lc=gaOther(lnLine)
lcOther=lcOther+IIF(i&gt;6,CRLF,"")+ lc+IIF(lnLine=gnOther,"",", ")
i=IIF(i&gt;6,0,i+1)
NEXT

lc=IIF(LEN(gclocals)&lt;7,"","Карман @"+gclocals) ;
+IIF(EMPTY(lcOther),"","@@Другие : "+lcOther)
IF !EMPTY(lc)
IF messagebox(lc,292,"Делать вставку?")=7
_CLIPTEXT=gclocals+CRLF
RETU
ENDIF
ELSE
= messagebox ("OK",0,'')
RELEASE la
RETURN
ENDIF

lnInsert=0
lnTabs=0
FOR lnLine=1 TO lnLines
lcLeft4=UPPER(LEFT(ALLT(CHRT(la(lnLine),TAB," ")),4))
IF INLIST(lcLeft4,"FUNC","PROC","PARA","LPAR") ;
OR "#" $ lcLeft4 OR LEFT(lcLeft4,1)="*"
LOOP
ENDIF
lnInsert=lnLine
lnTabs=OCCURS(TAB,la(lnLine))
EXIT
NEXT
IF BETW(lnInsert,1,lnLines) AND LEN(gclocals)&gt;6
lc=""
FOR lnLine=1 TO lnInsert-1
lc=lc+la(lnLine)+CRLF
NEXT
lc=lc+IIF(lnTabs&gt;0,REPL(TAB,lnTabs),"")+gclocals+CRLF
FOR lnLine=lnInsert TO lnLines
lc=lc+la(lnLine)+CRLF
NEXT
_CLIPTEXT=lc
KEYBOARD '{CTRL+V}'
RETURN
ENDIF
_CLIPTEXT=gclocals+CRLF

FUNC putIt
LPARA lc
lcUp=UPPER(lc)
IF EMPTY(lc)
RETURN
ENDIF
IF " "+lcUp+" " $ gcExclude
RETU
ENDIF
IF "(" $ lc
RETU
ENDIF
IF ! INLIST(LEFT(lcUp,2) , "LC", "LD", "LT", "LU", "LN", "LL", "LO") ;
AND !LEFT(lcUp,1) $ "IJ"
IF ASCAN(gaOther,lcUp)&gt;0
RETU
ENDIF
gnOther=gnOther+1
DIME gaOther(gnOther)
gaOther(gnOther)=lcUp
ELSE
FOR lnLine=1 TO ALEN(laLocals)
IF UPPER(laLocals(lnLine))=lcUp
RETU
ENDIF
NEXT
gnLocals=gnLocals+1
DIME laLocals(gnLocals)
laLocals(gnLocals)=lc
ENDIF
RETU</pre>
<p>Стараюсь избегать коротких имен. Раньше писал, например,<br />
FOR i=1 to N<br />
…<br />
Next<br />
Когда требовалось найти или переименовать переменую i, то натыкался на массу слов, в которых есть эта буква. Сейчас пишу<br />
FOR lnLine=1 TO lnLines<br />
…<br />
NEXT</p>
<p>Во-первых, знаю, что речь идет о строке (Line) и, что их количество lnLines, а не безликое N.</p>
<p>1. Проблема открытия и закрытия файла<br />
Не люблю сообщений “file is in use” и ему подобных.<br />
Две подпрограммы AutoLoad(‘список файлов’) и Unload() помогают жить.<br />
lcListOfFiles = AutoLoad(‘partners;people’)<br />
В переменную lcListOfFiles попадает информация для каждого файла из списка о том, был ли он до того открыт. После вызова AutoLoad все файлы будут открыты, если они вообще видны.<br />
Далее с помощью<br />
=Unload(lcListOfFiles)<br />
закрываются файлы, которые ранее не были открыты.<br />
Написать подобные подпрограммы может каждый. В моих присутствует дополнительный код, нужный не каждому.<br />
С помощью подпрограммы Close(‘список файлов’) закрываю файл, если от открыт</p>
<pre>FUNC Close
LPARA lc1,lc2,lc3,lc4,lc5,lc6,lc7,lc8,lc9,lc10, ; lc11,lc12,lc13,lc14,lc15,lc16,lc17,lc18,lc19,lc20
LOCAL lc, lcFile, lnCol, lnCols, lnLine
LOCAL la(1)
FOR lnLine=1 TO PARA()
lc=EVAL('lc'+ALLT(STR(lnLine)))
IF TYPE('lc')='C'
lc=ALLT(lc)
lnCols=ALINE(la,lc,',')
FOR lnCol=1 TO lnCols
lcFile = ALLTRIM(la(lnCol))
IF USED(lcFile)
SELECT (lcFile)
USE
ENDIF
NEXT
ENDIF
NEXT</pre>
<p>Недавно решил, что и этого мало. Добавил 2 функции. Первая запоминает имена открытых в данный момент файлов. Второй передаю этот список и она закрывает все, что в этот список не входит.<br />
Перед вызовом формы или программы запоминаю то, что открыто, а на выходе закрываю то, что открывалось внутри. Особенно хорошо при коллективном творчестве. Вызываю что-то не мной писанное и не боюсь, что там не закрываются файлы. Опять же SQL любит открывать, а закрывать самому нужно.</p>
<p>3. Оператор Try … EndTry<br />
Программа или ее часть, которая не прошла тяжелую обкатку можно поместить в Try … EndTry. На Catch’е включаю ERRTRAP. При ошибке юзер за один раз проталкивает программу и не попадает в ошибки – следствия первоначальной, а они могут оказаться в цикле и проталкивать больше 1000 раз многие из моих юзеров не любят.<br />
Со временем Try … EndTry можно и убрать.</p>
<p>4. Файл Errors можно смотреть через Browse, но можно написать свою форму для его просмотра, а вызов ее где-то завуалировать или явно поставить где-нибудь в Top Menu.</p>
<p>5. Ошибки – это хорошо. Только их надо исправлять и думать как в следующий раз таких не допустить. Благодаря ошибкам идет развитие программиста как личности. Начинаешь другим прощать ошибки, становишься лучше. Многие из нас хвастаются ленью. Я, мол, ленивый и, поэтому сразу пишу гениально. Потом оказывается, нашлись еще более гениальные ошибки. Хорошо, если это ошибки MicroSoft и своя гениальность (не путать с генитальностью) вне сомнений. Иначе лучше лениво молчать об этом.<br />
Даже если Вы ленивый гений, подумайте как быстро и проще исправлять ошибки. Ошибку в .prg легко исправить, если его нет в проекте. Все включать в проект, т.е. в ехе не обязательно. Frx вообще в проект лучше не включать. Делайте вызов в виде:<br />
lcPrg=’alfa’<br />
do &amp;lcPrg with …</p>
<p>Alfa.prg не будет автоматически включена в проект и Вы сможете отредактировать ее на месте (у юзера).<br />
На этом подходе мной с коллегами создан Framework, который одновременно является выполняемой программой и средством разработки и отладки. Он позволяет без инсталляции Fox’а у юзера исправлять ошибки и модифицировать и отлаживать программу на месте. Это еще называют «на лету». Конечно, создать свой Framework не так быстро. На первых порах можно просто не включать в проект все подряд.<br />
Имея модемную связь с юзером, можно отсылать ему отдельно изменения в формах, репортах, подпрограммах. Лишь бы их не было в проекте.</p>
<p>5. Вынесите Public – переменные, которые могут со временем меняться в отдельную форму, где юзер при необходимости может их сам исправить.<br />
Некоторые прогмены этого не любят. Мол, пусть юзер знает за что платит. Попросит, тогда и сделаю. <br />
Если программа тиражируется, накладно объезжать всех юзеров, да и надо же любить юзера, а не держать его в напряжении даже если он Вас в напряжении держит.</p>
<p>Заключение.</p>
<p>Если Вам покажется часть изложенного правдой, найдите еще что-то свое, что упростит ваше будущее. За юзера сегодня приходится бороться, ведь альтернатива – это работа не по специальности и не по призванию. Вместо ощущения пластмассовости клавиш на кончиках пальцев и общения с коллегами на комповом сленге ощущение дискомфорта от выполнения работы, в которой нет романтики (смотри эпиграф в начале статьи)</p>
</div>
<div id="sol_avtor">Автор: Юдин А.Ю.</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4809">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 20 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4809">Ydin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Ydin" href="https://foxclub.ru/account/?user=4809">
				<img alt='' src='https://secure.gravatar.com/avatar/1d0b9037d3d21551d6994ec6ae0105a6?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1d0b9037d3d21551d6994ec6ae0105a6?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 16-12-2005        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kakoj-ne-dolzhna-byt-programma/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Статьи]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/interaktivnyj-vybor-iz-spiska/</link>
					<title><![CDATA[Интерактивный выбор из списка]]></title>
                    					    <author><![CDATA[Alex Roublev]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:27 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Интерактивный выбор из списка</h1>
													</header>
													<div id="sol_opis">Класс с объектом для интерактивного выбора из списка. Класс написан на базе Shape и элементов управления Label и List. Контрол представляет собой аналог ComboBox с инкрементным поиском в списке.</div>
<div id="sol_body">
<h3>Интерактивный выбор из списка</h3>
<p> ICmb.vcx  - класс с контролом для интерактивного выбора из списка<br /> Test.scx  - тестовая форма<br /> SprFm.dbf - справочник фамилий<br /> SprIm.dbf - справочник имен<br /> SprOt.dbf - справочник отчеств</p>
<p> Класс имеет следующие встроенные свойства:</p>
<p> STbl - источник данных (обязательная опция)<br /> SFld - поле источника данных (обязательная опция)<br /> CPos  -  символьная  позиция,  с  которой ведется<br /> поиск   в  поле  источника  данных  (обязательная<br /> опция)</p>
<p> Источники данных помещаются в DataEnvironment формы.</p>
<p> BClr - цвет фона для различных элементов класса<br /> SObj  -  имя  контрола  на форме рядом с объектом<br /> класса.  Указанный  контрол  получает  фокус  при<br /> нажатии клавиши Enter (опция необязательная, но в<br /> некоторых ситуациях нужная)</p>
<p> Для   правильной   организации  работы  требуется<br /> расположение   объекта   класса   на   форме   по<br /> графическому  уровню  (ZOrder)  на переднем плане<br /> (меню   VFP:   Format  /  Bring  to  Front).  Это<br /> необходимо  для  того,  чтобы  элемент управления<br /> List,    в   котором   отарывается   список,   не<br /> "подныривал"   под  другие  элементы  управления,<br /> расположенные на форме чуть ниже объектов класса.</p>
<p> Класс  создавался  и  тестировался в среде VFP9 и<br /> VFP7. На более ранних версиях не проверялось.   </div>
<div id="sol_avtor">Автор: Alex Roublev</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4786">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4786">Alex Roublev</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Alex Roublev" href="https://foxclub.ru/account/?user=4786">
				<img alt='' src='https://secure.gravatar.com/avatar/00346040923c19be64dc8ef2c05347d9?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/00346040923c19be64dc8ef2c05347d9?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-09-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/interaktivnyj-vybor-iz-spiska/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kadendar-s-prazdnikami/</link>
					<title><![CDATA[Кадендарь с праздниками]]></title>
                    					    <author><![CDATA[Penner]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:27 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Кадендарь с праздниками</h1>
													</header>
													<div id="sol_opis">Маленький календарь с праздниками. Написан для Германии, но все очень прозрачно</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Penner</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4790">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4790">Penner</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Penner" href="https://foxclub.ru/account/?user=4790">
				<img alt='' src='https://secure.gravatar.com/avatar/09e0b2ac8a5650d4eb4d665b01050602?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/09e0b2ac8a5650d4eb4d665b01050602?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 26-04-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kadendar-s-prazdnikami/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/eshhe-raz-k-voprosu-o-nevernom-otobrazhenii-otdelnyh-simvolov/</link>
					<title><![CDATA[Еще раз к вопросу о неверном отображении отдельных символов]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:27 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Еще раз к вопросу о неверном отображении отдельных символов</h1>
													</header>
													<div id="sol_opis">Дополнение к инструкции Владимира Максимова "Неверное отображение отдельных символов или несовпадение кодовых страниц" </div>
<div id="sol_body">
<h3>Еще раз к вопросу о неверном отображении отдельных символов</h3>
<p> Вот еще одно свежее (для меня, во всяком случае 😉 дополненьице.<br /> При введении данных в поля character в форме - сначала все нормально, но при переходе в иное поле (хошь клавой, хошь мышем, хошь как 😉 некоторые русские буквы вне зависимости от того, где именно в слове они располагаются, заменяются на аглицкие, сиречь латинские. Например, вводим "русский", а при переходе в иное поле получаем "dусский". И не побороть это было никак!<br /> Fox у меня 8-й, аглицкий (дареному коню, знаете ли...), установка полная, операционка XP Pro, т.е. все нужные файлы присутствуют. Настройки сделаны все (именованные коллегой выше и еще некоторые). Кодовые страницы - исключительно принудительные, 1251-е. Операционная система настроена вся. <br /> Кстати, <br /> >Т.е. надо влезть в системный реестр и поменять все ссылки с 1252 на 1251. К сожалению, я не могу указать полный перечень адресов, где такая замена необходима. </p>
<p> В реестре вводите строку поиска "1252" и везде, где в содержимом энта пакость проявится - прописываете "1251". Для пущей стабильности я оное действие проделал и с параметром "1250".</p>
<p> К сожалению, все это не помогло. Вернее, в пределах самой Фоксы - оные действия пользу принесли. Но вот при запуске компилированных приложений (от .app до TopLevel exe) - увы...<br /> Не спасла даже подмена кодовых таблиц *.cpx на русские внутри, но с аглицкими именами.</p>
<p> А лечилось все до противности просто - вместо Character в редакторе структуры таблицы прописываете Character(binary), или, если таблиц много, а времени мало - делаете простую программку: </p>
<p> USE old.dbf<br /> COPY STRUCTURE EXTENDED TO old_ext<br /> SELECT b<br /> USE old_ext<br /> GO TOP<br /> REPLACE field_nocp WITH .T. all FOR field_type=[C]<br /> GO TOP<br /> CREATE new from old_ext</p>
<p> Можно, конечно и лучше, но уж очень некогда было...</p></div>
<div id="sol_avtor">Автор: Wild Kitten</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/eshhe-raz-k-voprosu-o-nevernom-otobrazhenii-otdelnyh-simvolov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/grid-trehurovnevyj-spravochnik/</link>
					<title><![CDATA[Grid &#8211; трехуровневый справочник]]></title>
                    					    <author><![CDATA[Aptex]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:27 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Grid &#8211; трехуровневый справочник</h1>
													</header>
													<div id="sol_opis">Трехуровневый справочник с использованием Grid для подготовки условий отчета</div>
<div id="sol_body">
<h3>Grid - трехуровневый справочник</h3>
<p> Такой себе простенький трехуровневый справочник для подготовки условий отчета с исполь-<br /> зованием Grid.Представляется как возможный путь реализации многоуровневого справочника.<br /> Функции редактирования отсутствуют,однако,IMHO,добавить таковые дело техники,если посмотреть поле U0.spskno(см.прилагаемый пример TestSpr.zip).В решении использованы публикации форума,в частности гг.Жихарева,Равиля и др. Отсутствие сортировки по наимениванию компенсируется наличием инкрементного поиска.Управление справочником описано в ToolTipText объектов.Глюков я не обнаружил.(может и есть).<br /> Прошу строго не судить.<br /> Используется в VFP8.   </div>
<div id="sol_avtor">Автор: Aptex</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4741">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4741">Aptex</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Aptex" href="https://foxclub.ru/account/?user=4741">
				<img alt='' src='https://secure.gravatar.com/avatar/9856ea7b7753edd543881b64e84e1074?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/9856ea7b7753edd543881b64e84e1074?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 07-11-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/grid-trehurovnevyj-spravochnik/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/generator-messagebox/</link>
					<title><![CDATA[Generator MessageBox()]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:27 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Generator MessageBox()</h1>
													</header>
													<div id="sol_opis">Генератор МессажеБокс</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: halk</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/generator-messagebox/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/generacziya-koda-programmy-sozdayushhej-tabliczy-bazy-dannyh-na-osnove-uzhe-sozdannoj-bazy-dannyh/</link>
					<title><![CDATA[Генерация кода программы, создающей таблицы базы данных на основе уже созданной базы данных]]></title>
                    					    <author><![CDATA[Serguei Otchirov]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:26 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Генерация кода программы, создающей таблицы базы данных на основе уже созданной базы данных</h1>
													</header>
													<div id="sol_opis">Создание таблиц базы данных - дело вкуса каждого разработчика. Я создаю их оператором Create table - это очень удобно - не надо помнить структуру таблиц - они все есть в коде. Ну а если вы любите создавать таблицы дизайнером, то моя программа поможет создать код, создающий таблицы указанной базы данных. Затем этот код можете использовать по своему усмотрению. Кроме этого создаются функции индексирования таблиц на основе существующих индексов.</div>
<div id="sol_body">
<h3>Генерация кода программы, создающей таблицы базы данных на основе уже созданной базы данных</h3>
<p> set safety off<br /> dir_windows_temp=addbs(sys(2023))<br /> dbcfile=getfile('dbc','database')		&& source database<br /> pathtbl=addbs(justpath(dbcfile))<br /> dbcname=justfname(dbcfile)<br /> out=putfile('txt')			&& target txt-file<br /> strtofile('',out)<br /> strtofile('if !file("'+dbcname+'")'+chr(13),out,.t.)<br /> strtofile(chr(9)+'create data '+dbcname+chr(13),out,.t.)<br /> strtofile('else'+chr(13),out,.t.)<br /> strtofile(chr(9)+'open data '+dbcname+chr(13),out,.t.)<br /> strtofile('endif'+chr(13),out,.t.)</p>
<p> if !empty(dbcfile) and !empty(out)<br />  use "&dbcfile" in 0 alias dbctable again<br />  select objectname,objectid from dbctable;<br />   where UPPER(objecttype)='TABLE' into cursor dbccursor<br />  use in dbctable<br />  go top in 'dbccursor'<br />  do while !eof('dbccursor')<br />   tbl=alltr(dbccursor.objectname)<br />   objid=dbccursor.objectid<br />   if !file(pathtbl+alltr(tbl)+'.dbf')<br />    messagebox('There are no table '+alltr(tbl)+', enter path to it.',16,'')<br />    lf=locfile(tbl)<br />    tbl=juststem(lf)<br />    if !used(tbl)<br />     use "&lf" in 0<br />    endif<br />   else<br />    if !used(tbl)<br />     use "&pathtbl.&tbl" in 0<br />    endif<br />   endif</p>
<p>   sele &tbl<br />   if used('stbl')<br />    use in 'stbl'<br />   endif<br />   copy stru exte to &dir_windows_temp.stbl<br />   use &dir_windows_temp.stbl<br />   sele stbl<br />   go top<br />   strtofile('if !file("'+alltr(tbl)+'.dbf")'+chr(13),out,.t.)</p>
<p>   cmd=chr(9)+'CREATE TABLE '+allt(Table_name)+'(;'+chr(13)+chr(9)+' '<br />   strtofile(cmd,out,.t.)<br />    cmd1=allt(Field_name) +' '+;<br />     allt(Field_type)+;<br />     iif(Field_type='M','','('+;<br />     allt(str(Field_len))+;<br />     iif (Field_type='N',','+allt(str(Field_dec))+')',')')+;<br />     iif(!empty(field_null),' NULL','')+;<br />     iif(!empty(field_defa),' default '+allt(field_defa),''))<br />    strtofile(cmd1,out,.t.)<br />    cmd2=''<br />    do while !eof('stbl')<br />     skip<br />     if !empty(Field_name)<br />      cmd2=cmd2+',;'+chr(13)+chr(9)+' '+;<br />       allt(Field_name) +' '+;<br />       allt(Field_type)+;<br />       iif(Field_type='M','','('+;<br />       allt(str(Field_len))+;<br />       iif (Field_type='N',','+allt(str(Field_dec))+')',')')+;<br />       iif(!empty(field_null),' NULL','')+;<br />       iif(!empty(field_defa),' default '+allt(field_defa),''))<br />     endif <br />    enddo<br />    strtofile(cmd2,out,.t.)</p>
<p>    strtofile(')'+chr(13),out,.t.)<br />    strtofile(chr(9)+'reindex'+tbl+'()'+chr(13),out,.t.)<br />   strtofile('endif'+chr(13),out,.t.)</p>
<p>   *** create indexes<br />   strtofile('function reindex'+tbl+chr(13),out,.t.)</p>
<p>   use "&dbcfile" in 0 alias dbctable again<br /> *  strtofile(chr(9)+'use '+alltr(tbl)+' in 0 excl'+chr(13),out,.t.)<br />   select objectname from dbctable;<br />    where UPPER(objecttype)='INDEX' and parentid=objid;<br />   into cursor objindex<br />   use in dbctable<br />   do while !eof('objindex')<br />    strtofile(chr(9)+'index on '+alltr(objindex.objectname)+' tag '+alltr(objindex.objectname)+chr(13),out,.t.)<br />    skip in 'objindex'<br />   enddo<br />   strtofile('return'+chr(13),out,.t.)<br />   ****************<br />   skip in dbccursor<br />  enddo<br /> endif<br /> *use in dbctable<br /> use in dbccursor<br /> use in objindex</p></div>
<div id="sol_avtor">Автор: oc3</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4451">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4451">Serguei Otchirov</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Serguei Otchirov" href="https://foxclub.ru/account/?user=4451">
				<img alt='' src='https://secure.gravatar.com/avatar/ea39f7f61ef93529fcf04380b36b5f2c?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ea39f7f61ef93529fcf04380b36b5f2c?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 16-05-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/generacziya-koda-programmy-sozdayushhej-tabliczy-bazy-dannyh-na-osnove-uzhe-sozdannoj-bazy-dannyh/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/mini-tree-v-grid/</link>
					<title><![CDATA[Мини Tree в Grid]]></title>
                    					    <author><![CDATA[AlexK]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:27 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Мини Tree в Grid</h1>
													</header>
													<div id="sol_opis">Иногда необходимо представлять данные в Grid в виде дерева. Конечно это не "полное дерево" а только один открытый узел</div>
<div id="sol_body">Запустите форму tgrid.scx Подход следующий: 1. формируем по Id записи список Id записей источника отображающих структуру дерева  2. выполняем запрос к источнику используя список этих Id  Данный пример для свободных таблиц  Также включен пример просмотра и редактирования prg-кода </div>
<div id="sol_avtor">Автор: AlexK</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4764">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 10 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4764">AlexK</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="AlexK" href="https://foxclub.ru/account/?user=4764">
				<img alt='' src='https://secure.gravatar.com/avatar/1fb49e8f115e8786c485b8112a62a69e?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1fb49e8f115e8786c485b8112a62a69e?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 9<i class="rcli fa-calendar-check-o"></i>Регистрация: 11-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/mini-tree-v-grid/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/interpretator-komand-udobnyj-dlya-raboty-programmista-u-polzovatelya-i-resajzer/</link>
					<title><![CDATA[Интерпретатор команд, удобный для работы программиста у пользователя и ресайзер]]></title>
                    					    <author><![CDATA[Serguei Otchirov]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:27 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Интерпретатор команд, удобный для работы программиста у пользователя и ресайзер</h1>
													</header>
													<div id="sol_opis">Часто бывает нужно, находясь у пользователя, выполнить несколько команд, известных только тебе, а устанавливать фоксовскую среду нехорошо. Представляемый класс, именуемый &quot;MicroFox&quot;, исполнит  ваши желания, если его внедрить в тело проекта в какое-нибудь меню &quot;Сервис&quot; или на скрытую комбинацию клавиш. Здесь же реализован ресайзинг (он листбоксы ресайзит с шириной колонок и любые вложенные объекты)  </div>
<div id="sol_body">
<h3>Интерпретатор команд, удобный для работы программиста у пользователя</h3>
<p> Запуск:<br /> set classlib to microfox additive<br /> oMicroFox=createobject('execcmd')<br /> oMicroFox.show()    </div>
<div id="sol_avtor">Автор: oc3</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4451">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4451">Serguei Otchirov</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Serguei Otchirov" href="https://foxclub.ru/account/?user=4451">
				<img alt='' src='https://secure.gravatar.com/avatar/ea39f7f61ef93529fcf04380b36b5f2c?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ea39f7f61ef93529fcf04380b36b5f2c?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 16-05-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/interpretator-komand-udobnyj-dlya-raboty-programmista-u-polzovatelya-i-resajzer/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/primer-ispolzovaniya-winsock/</link>
					<title><![CDATA[Пример использования WinSock.]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:26 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Пример использования WinSock.</h1>
													</header>
													<div id="sol_opis">Две программы: клиент и сервер. К серверу возможно одновременное подключение до 65000 клиентов.</div>
<div id="sol_body">
<h3>Пример использования WinSock.</h3>
<p> Две программы: клиент и сервер. К серверу возможно одновременное подключение до 65000 клиентов. Обе программы на VFP. Нужен WinSock ActiveX control. Будут вопросы, пишите на емайл. С удовольствием отвечу. 🙂 Если знаю.  </p></div>
<div id="sol_avtor">Автор: ВВК</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/primer-ispolzovaniya-winsock/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/poluchenie-informaczii-o-vinchestere-provereno-v-win2k-i-win9x/</link>
					<title><![CDATA[Получение информации о винчестере. Проверено в Win2K и Win9x]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Mon, 21 Nov 2022 09:05:47 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Получение информации о винчестере. Проверено в Win2K и Win9x</h1>
													</header>
													<div id="sol_opis">Получает серийный номер диска только для IDE</div>
<div id="sol_body">&amp;&amp; Программа получает серийный номер диска &amp;&amp; OS Win9x WinNT Win2000 WinXp &amp;&amp; для Win98 необходимо скопировать файл smartvsd.vxd в директории C:WindowsSystemIOSubSys &amp;&amp; по умолчанию он находится в C:WindowsSystem &amp;&amp; после копирования перезагрузить компьютер</div>
<div id="sol_avtor">Автор: Samsonov</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/poluchenie-informaczii-o-vinchestere-provereno-v-win2k-i-win9x/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Система]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/neskolko-neobychnyj-menedzher-proektov/</link>
					<title><![CDATA[Несколько необычный менеджер проектов.]]></title>
                    					    <author><![CDATA[Nikolai Kremko]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:26 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Несколько необычный менеджер проектов.</h1>
													</header>
													<div id="sol_opis">Сделан для облегчения тяжкого труда програмеров 🙂 Особенно если приходится вести проекты написанные в разных версиях VFP.  Просто и удобно. Надеюсь и вам пригодится.</div>
<div id="sol_body">
<h3>Несколько необычный менеджер проектов. Надеюсь вам понравиться</h3>
<p> Требования к установке -- VFP с runtime обязательно не ниже VFP6 !)<br /> Работает со ВСЕМИ версиями VFP!!! от 3 до 8 проверено.</p>
<p> Решил я написать данное средство после прочтения FAQ на сайте. Точнее, после прочтения «Советы начинающим » от Владимира Максимова. Вот ссылка на тот раздел советов, который меня собственно и убедил взяться за работу: http://www.foxclub.ru/kb/index.php?sid=46732&aktion=artikel&rubrik=004&id=5&lang=ru#OpenProject</p>
<p> Описанный В.Максимовым метод запуска проекта считаю одним из самых удобных и надежных, самое важное, не надо запоминать, в какой версии VFP написан проект. Разные проекты запускаются  с разными конфигурационными файлами «config.fpw» и в отдельных окнах, что исключает многие ошибки, связанные с настройками среды. </p>
<p> Но создание нового проекта и ссылки на него занимало хоть и не слишком много времени – но сильно раздражало меня. И вот решился упростить эту задачу.<br /> Во время разработки решил сделать и мастер создания нового проекта, и мастер добавления. </p>
<p> Итак, как этот менеджер использовать?<br /> 1.	Загружаем архив с сайта<br /> 2.	запускаем Setup.prg в той версии VFP runtime к которой у вас установлен (обязательно не ниже VFP6 !)<br /> 3.	после запуска у вас на рабочем столе и в папке “Мои документы” появиться ссылка на папку «Управление проектами VFP» ,открыв которую вы и увидите <br /> две ссылки. Первая - _CreateNewProject – для создания нового проекта.<br /> Вторая - _AddProject – соответственно для добавления быстрой ссылки на существующий проект.</p>
<p> Буду очень признателен за любые отзывы и комментарии. Если встретите ошибки – пишите, буду исправлять.</p>
<p> Появятся пожелания – пишите.          </div>
<div id="sol_avtor">Автор: Nikolai Kremko</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4704">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4704">Nikolai Kremko</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Nikolai Kremko" href="https://foxclub.ru/account/?user=4704">
				<img alt='' src='https://secure.gravatar.com/avatar/feccfbadff7edf982a892026fe4dd003?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/feccfbadff7edf982a892026fe4dd003?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 30-08-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/neskolko-neobychnyj-menedzher-proektov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/eshhe-odin-samopisnyj-combobox/</link>
					<title><![CDATA[Еще один самописный ComboBox]]></title>
                    					    <author><![CDATA[Петров Андрей]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:23 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Еще один самописный ComboBox</h1>
													</header>
													<div id="sol_opis">Увидел в очередной раз ComboBox в IExplorer-e и подумал - Хочу такой-же с возможностью поиска и т.д.</div>
<div id="sol_body">Увидел в очередной раз ComboBox в IExplorer-e и подумал - Хочу такой-же с возможностью поиска и т.д.  Написал но не до конца. Есть глюки. Поэтому, чтобы быстрее их отловить выкладываю на форум. Например не убирается список подсказок при нажатии Tab на поле ввода.  А из плюсов вот: Сделал поле ввода - EditBox с появляющимися полосами прокрутки при вводе. Возможно использовать символы * ?. (Т.к. использовал Like()) Интерактивная подстановка значений из справочника по первым введенным буквам. Если значение не найдено - подсвечевается красным и при Valid срабатывает пользовательская процедура AddNew.  Не судите строго - задумка хорошая, но не доделанная 🙂  А да, в архиве - таблица (выдернул из своего проекта) из швейной фабрики 🙂 На ней и тестировал.  28.05.04 Выложил новую версию. </div>
<div id="sol_avtor">Автор: Петров Андрей</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5063">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5063">Петров Андрей</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Петров Андрей" href="https://foxclub.ru/account/?user=5063">
				<img alt='' src='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 14<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-04-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/eshhe-odin-samopisnyj-combobox/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/poluchenie-informaczii-o-vinchestere-provereno-v-win2k/</link>
					<title><![CDATA[Получение информации о винчестере. Проверено в Win2K]]></title>
                    					    <author><![CDATA[Петров Андрей]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:26 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Получение информации о винчестере. Проверено в Win2K</h1>
													</header>
													<div id="sol_opis">Библиотека для получения SN Модели а также Revision Number винчестеров сканируемого компьютера</div>
<div id="sol_body">
<h3>Получение информации о винчестере. Проверено в Win2K</h3>
<p> Пример лежит в архиве.</p>
<p> Собственно поменяйте метод My_Id_Hdd.FindHDD и будет вам счастье 🙂</p>
<p> Программа сделана по мотивам С++ кода (файл IdeShowB.ZIP) но не до конца переведена на VFP. Так как в С исходниках осталось еще много кода то рискну предположить что не получится с ней работать под Win98. Но не тестил пока...  </p></div>
<div id="sol_avtor">Автор: Петров Андрей</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5063">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5063">Петров Андрей</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Петров Андрей" href="https://foxclub.ru/account/?user=5063">
				<img alt='' src='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 14<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-04-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/poluchenie-informaczii-o-vinchestere-provereno-v-win2k/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Система]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/sinhronizacziya-struktury-bd-s-ispolzovaniem-speczialnogo-slovarya/</link>
					<title><![CDATA[Синхронизация структуры БД с использованием специального словаря.]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:26 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Синхронизация структуры БД с использованием специального словаря.</h1>
													</header>
													<div id="sol_opis">Утилита позволяет создавать словарь структуры БД FoxPro и корректировать структуру в соответстви с этим словарем. Поддерживаются изменения в структуре таблиц (включая все их свойства и свойства полей), индексов, хранимых процедур, связей и RI-ограничений.</div>
<div id="sol_body">
<h3>Синхронизация структуры БД с использованием специального словаря.</h3>
<p> Нередко возникает ситуация - изменения в приложении затронули структуру базы данных, например добавились новые поля, индексы или изменен код хранимой процедуры и надо внести эти изменения в рабочие БД установленные на компьютерах клиентов.<br /> Можно, конечно, каждый раз писать небольшую программу выполняющую конкретные модификации, но в этом случае разработчик вынужден очень внимательно следить за вносимыми изменениями.<br /> Предлагаемая утилита предназначена для простого решения этой проблемы. Сперва разработчик с помощью утилиты создает словарь - файл в котором содержится эталонная структура БД. Затем на рабочих БД выполняется процедура обновления в соответствии с этим эталоном. В данной версии утилита способна учитывать следующие объекты и свойства контейнера базы данных:<br /> 1. Таблицы<br />    1.1 Имя файла таблицы и ее относительный путь, имя таблицы.<br />    1.2 Триггеры и правила<br />    1.3 Комментарии<br /> 2. Поля таблиц<br />    2.1 Имя поля, тип, длина, флаги NOT NUL, NO CP TRANS<br />    2.1 Правило поля, обработчик ошибки правила поля, значение по умолчанию<br />    2.3 Заголовок, комментарии<br /> 3. Индесы CDX<br />    3.1 Имя тега, Индексное выражение<br />    3.2 Предложение FOR<br />    3.3 Тип индекса (PRIMARY, CANDIDATE, REGULAR)<br />    3.4 Настройку COLLATE<br /> 4. Постоянные связи между таблицами<br /> 5. Хранимые процедуры<br /> 6. Дополнительную информацию используемую стандартным построителем отношений<br />    ссылочной целостности (RI).<br /> Т.о. свойства перечисленных объектов утены полностью. <br /> Программа содержит все необходимые проверки, корректно обрабатывает взаимозависимые объекты и может использоваться как для синхронизации структур так и для создания пустой БД. Результаты работы выводятся в log-файл.<br /> Утилита расчитана на работу с контейнером DBC. Свободные таблицы не поддерживаются. Разрабатывалась и тестировалась на VFP6.0 SP5. Для работы необходимо, чтобы на компьютере была установлена Run-time часть Visual Fox Pro.  </div>
<div id="sol_avtor">Автор: matod</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/sinhronizacziya-struktury-bd-s-ispolzovaniem-speczialnogo-slovarya/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/preobrazovanie-formata-tekstovogo-fajla/</link>
					<title><![CDATA[Преобразование формата текстового файла.]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:26 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Преобразование формата текстового файла.</h1>
													</header>
													<div id="sol_opis">Обработка текстового файла, содержащего Enterы в конце каждой строки. Enterы удаляются. Оставляются только в конце абзаца. После обработки текст можно перенести в Word и там его переформатировать. </div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: timo</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/preobrazovanie-formata-tekstovogo-fajla/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ispolzovanie-form-v-foxpro/</link>
					<title><![CDATA[Использование форм в FoxPro]]></title>
                    					    <author><![CDATA[stranger]]></author>
                    										    <pubDate>Sat, 19 Nov 2022 17:31:52 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Использование форм в FoxPro</h1>
													</header>
													<p>В этой статье :</p>
<p><a href="#StartForm">1. Запуск формы</a><br />
<a href="#Names">2. Именование форм</a><br />
<a href="#Events">3. Последовательность событий в форме</a><br />
<a href="#Datasession">4. Сессии данных</a><br />
<a href="#ModalAndModeless">5. Модальность и немодальность</a><br />
<a href="#Parameters">6. Передача параметров между формами и методами</a><br />
<a href="#Delegate">7. Делегирование методов</a><br />
<a href="#Closing">8. Закрытие формы</a><br />
<a href="#HotKeys">9. Горячие клавиши на формах</a></p>
<p>В большинстве случаев основным звеном программы является форма. Именно посредством форм пользователь оперирует данными – вводит и модифицирует их. По большому счёту, форма – вот и всё что видит пользователь проводимое за работой с программой время. Поэтому создатель программы должен уделять формам достойное внимание. Рассмотрим поподробнее работу с формами, свойства, методы и события форм, а также связанные с этим неочевидные подробности. Итак, приступим.</p>
<p><b><a name="StartForm"></a>1. Запуск формы</b></p>
<p>Обычно запуск форм осуществляется посредством тривиальной команды <b>DO FORM &lt;имя_формы&gt;</b> из кода программы или же в командном окне среды разработки VFP, а также путём выбора нужной формы в менеджере проектов на закладке <b>Documents</b> и нажатием кнопки <b>Run</b> (или же из меню среды разработки). </p>
<p>Вот тут и может возникнуть одна “тонкость”. Конечно, форма в самом простом случае может быть независимой от других объектов создаваемого приложения или иных условий. Но это только в самом простом случае. Зачастую ситуация складывается совсем по другому - форма запускается из меню или из другой формы. Формы должны уметь “разговаривать” друг с другом, обмениваться информацией. В общем случае запуск формы ставиться в зависимость от ряда условий, параметров или от других форм. Вот тут и приходит на помощь метод известный как принцип свободных связей. Конечно, это не есть панацея и не является обязательным для применения во всех случаях, но это стоит взять на вооружение как хорошую технику программирования. Заключается он в том, что форма должна иметь возможность запуска не только в конкретном месте с конкретными условиями, но и сама по себе (хотя бы в случае тестирования) вне зависимости от требований, налагаемых приложением и уметь функционировать в чрезвычайных ситуациях. Как пример рассмотрим возможную организацию вашего приложения:</p>
<ol>
<li>В приложении имеется некоторый “менеджер” форм, который отвечает за запуск форм, их состоянием, доступностью, закрытием и т.п.</li>
<li>Этот менеджер имеет некий метод DoForm() для запуска и установки связей между формами и самим приложением</li>
<li>Менеджер всегда устанавливает ссылочную связь для того, чтобы легко можно было обмениваться данными или сообщениями между формами и самим менеджером посредством передаваемых параметров.</li>
</ol>
<p>Для того чтобы осуществить такой замысел, как вы понимаете <u>стоит завести класс формы с методом</u> <b>DoForm()</b>, который будет передавать имя формы и другие необходимые параметры менеджеру форм, сообщать ему, какую форму требуется запустить. Вполне допустимо передавать не только имя формы , но и саму ссылку на форму, для этого можно смело использовать слово <i><b>THISFORM.</b></i></p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">  
 * Init() Method  
  LPARAMETERS toFormManager  
  IF toFormManager) = ""O""  
    ThisForm.oFormManger = toFormManager  
  ENDIF  
    
 * DoForm() Method  
  LPARAMETERS tcFormName, tuParm1, tuParm2  
  IF VARTYPE(ThisForm.oFormManager) = ""O"" ;  
  AND NOT ISNULL(ThisForm.oFormManager)  
    ThisForm.oFormManger.DoForm(tcFormName,tuParm1,tuParm2)  
  ELSE  
    DO CASE  
      CASE PCOUNT() = 1  
        DO FORM (tcFormName) WITH .NULL.  
      CASE PCOUNT() = 2  
        DO FORM (tcFormName) WITH .NULL., tuParm1  
      CASE PCOUNT() = 3  
        DO FORM (tcFormName)WITH .NULL.,tuParm1,tuParm2  
     ENDCASE  
  ENDIF  
</pre>
</td>
</tr>

</table>
<p>Вся изюминка тут заключается в том, что форма может запускаться, используя этот менеджер форм, но в тоже время способна работать и без него. Этот пример показателен тем, как можно строить универсальные, на предмет зависимости от внешних условий , формы. Разработчик должен достаточно серьёзно относиться к этому вопросу хотя бы потому, что обычно на этапе разработки формы делаются в некой очередности, и не всегда до конца, но любая из них нуждается в независимом от других форм тестировании, которые могут к данному моменту или не существовать, или быть весьма “сыры”.</p>
<p><b><a name="Names"></a>2. Именование форм.</b><br />
По умолчанию запущенная форма принимает имя файла с расширением <i>.scx</i> в котором она собственно хранится. Однако внутри приложения, если не принять специальных мер, она известна по этому имени <u>только в коллекции форм переменной</u> <b>_SCREEN</b>. Но это имя можно изменить, явно указав имя командой при запуске формы.</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">  DO FORM MyForm NAME frmMyForm  
</pre>
</td>
</tr>

</table>
<p>причём выполнив команду</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">  DO FORM MyForm NAME frmMyForm2   
</pre>
</td>
</tr>

</table>
<p>получим второй экземпляр формы, но с другим именем.<br />
Необходимо обратить внимание на ещё один аспект команды <b>DO FORM</b> – выполнение её с ключевым словом <b>LINKED</b>:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">  DO FORM MyForm NAME frmMyForm2 LINKED  
</pre>
</td>
</tr>

</table>
<p>В этом случае <i>форма</i> <b>MyForm</b> <u>ассоциируется</u> с <i>переменной</i> <b>frmMyForm2</b>, и теперь обращаться к свойствам и методам формы можно посредством этой переменной:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">  frmMyForm2.Caption =’Это заголовок формы’  
</pre>
</td>
</tr>

</table>
<p>Особенностью такого запуска является то, что форма <i>MyForm</i> будет закрыта при освобождении переменной <i>frmMyForm2</i>. Часто такую переменную определяют как <i>public</i> еще до запуска формы. При этом, если из формы вышли обычным способом, для ясности нужно или очистить переменную или также освободить ее – выполнить <b>RELEASE frmMyForm2</b>.</p>
<p>Если переменная локальна, то закрытие формы гарантируется после окончания выполнения метода или процедуры , в котором создавалась переменная. Следует однако заметить, что форма (равно как и любой объект) <b><u>не может быть закрыта</u></b> пока не окончено выполнение какого либо её метода или же имеется ссылка на неё в каком то из объектов приложения. Определения <i>public</i> или <i>local</i> сразу для всех вызванных позднее форм позволяют не следить, какая форма вызвана первой, а какая после нее, и тем самым облегчают организацию обмена между формами.</p>
<p>Рассмотрим так же ситуацию, когда форма не модальна и запущена без ассоциаций из метода (или события) какой либо формы:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">  DO FORM MyForm NAME MyStartedForm  
</pre>
</td>
</tr>

</table>
<p>Переопределим имя вновь запущенной формы в пределах этого метода (поскольку переменная <i>MyStartedForm</i> будет освобождена после исполнения метода и станет недоступной)</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">  MyStartedForm.Name="MyFormWithNewName"  
</pre>
</td>
</tr>

</table>
<p>Теперь, для того чтобы получить доступ к этой запущенной форме обратимся к коллекции форм объекта <b>_Screen</b> и выполним поиск:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">  LOCAL lnFormCount, lnFindForm  
  lnFindForm=0  
    
  FOR lnFormCount = 1 TO _SCREEN.FORMCOUNT  
  	IF _SCREEN.FORMS(lnFormCount).NAME = "MyFormWithNewName"  
  		lnFindForm= lnFormCount  
  		EXIT  
  	ENDIF  
  ENDFOR  
</pre>
</td>
</tr>

</table>
<p>Если форма найдена и <i>lnFindForm&gt;0</i> , можно обращаться к форме через элемент коллекции <i>_Screen</i> :</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">  _SCREEN.FORMS(lnFindForm).Caption=”Та самая форма”  
  _SCREEN.FORMS(lnFindForm).SomeMethod()  
</pre>
</td>
</tr>

</table>
<p>Эти операции по поиску формы в коллекции через её имя можно выделить в отдельную процедуру или метод объекта приложения (если таковой имеется) в собственном наборе классов или же в уже упомянутом менеджере форм. Стоит учесть, что поиск формы необходимо производить <u>непосредственно</u> перед обращением к ней, поскольку индекс формы в коллекции динамически изменяется при запуске или закрытии форм в приложении.</p>
<p>Иногда бывают ситуации, когда нужно обратиться к форме в отрыве от её контекста, например в методе глобального объекта приложения или при обращении из кнопки тулбара, когда обращение <b><i>THISFORM</i></b> не может быть применено. В этом случае также можно обратиться к форме через коллекцию _Screen :</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">  _Screen.ActiveForm.Caption=”Это и есть активная форма”  
  _Screen.ActiveForm.SomeMethod()  
</pre>
</td>
</tr>

</table>
<p>Раз уж упомянут тулбар, ясно , что в нем могут быть разные клавиши с разной функциональностью - сохранить, отменить, новая запись, найти и другие. Все эти клавиши аналогичным образом могут вызывать методы активной в данное время формы. Однако, далеко не все формы являются однотипными, какие то могут быть только формами поиска без возможности ввода, другие напротив, только вводить информацию. Поэтому во избежании ошибочной ситуации кнопки тулбара должны уметь проверить, а есть ли на активной в данное время форме нужный им для работы метод, скажем так –</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">  If type( ‘_Screen.ActiveForm’)=’O’ and pemstatus(_Screen.ActiveForm,’DoSomthing’,5)  
  	_Screen.ActiveForm.DoSomething  
  endif  
</pre>
</td>
</tr>

</table>
<p>В форме, требующей параметров, в методе <b>Init()</b> производят их описание командой <b>LPARAMETERS.</b><br />
Именно туда попадают параметры , переданные при запуски формы с опцией <i>WITH</i>. Запуск такой формы выглядит следующим образом :</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">  * метод Init() формы MyForm  
  LPARAMETERS lcNewCaption  
  If !empty(lcNewCaption)  
  	Thisform.Caption= lcNewCaption  
  Endif   
    
 * запуск формы  
  DO FORM MyForm WITH “Новый заголовок формы”  
</pre>
</td>
</tr>

</table>
<p>Иногда нужно запустить форму, но до наступления определённых условий она должна быть скрыта.Например, такое требуется при запуске модальной формы, когда сразу после ее вызова, но до реального появления на экране, нужно вызвать некоторые методы этой формы или сразу изменить значения каких либо свойств. Это позволяет одну и ту же форму сделать более гибкой , работающей и в режиме модальности и способной быть немодальной, а следовательно и избежать изготовления большего числа близких по виду форм. Используйте для этого опцию <b><i>NOSHOW</i></b></p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">  DO FORM MyForm NOSHOW  
</pre>
</td>
</tr>

</table>
<p>При запуске формы из меню бывает необходимо исключить повторный её запуск. Для этого можно применить такой трюк – если в опциях пункта меню в раделе <i><b>Skip For</b></i> написать <b><i>WEXIST ('имя_формы')</i></b>, то при запуске формы пункт меню станет недоступным до её закрытия. Таким образом исключается повторный запуск желаемой формы. Правда стоит учитывать то, что если в процессе выполнения программы имя формы измениться, пункт восстановит свою доступность. Хотя мне кажется, что таких трюков стоит избегать, если хочется иметь по-настоящему мульти документный интерфейс.</p>
<p><b><a name="Events"></a>3. Последовательность событий в форме.</b></p>
<p>Форма в чистом виде, без элементов управления и данных, которыми она должна манипулировать, интереса не представляет. Поэтому любая форма создаётся именно с целью оперирования данными с помощью элементов управления, включаемых в форму. Данные в VFP хранятся, естественно, в таблицах и подключаются к форме с помощью специального объекта <i>Data environment</i>. Рассмотрим последовательность событий при запуске формы, но останавливая внимание пока только на событиях самой формы.</p>
<p><b>Объект - Событие</b><br />
Data environment - BeforeOpenTables<br />
Form set - Load<br />
Form - Load<br />
Data environment cursor(s) - Init<br />
Data environment - Init<br />
Objects - Init<br />
Form - Init<br />
Form set - Init<br />
Form set - Activate<br />
Form - Activate<br />
Object - When<br />
Form - GotFocus<br />
Object - GotFocus<br />
Form - QueryUnload<br />
Form - Destroy<br />
Object - Destroy<br />
Form - Unload<br />
Form set - Unload<br />
Data environment - AfterCloseTables<br />
Data environment - Destroy<br />
Data environment cursor(s) - Destroy</p>
<ul>
<li>Load() – первое в последовательности событий объекта форма. В этом событии ни один элемент лежащий на форме еще не родился и там бессмысленно помещать код вроде <i>this.text1.value=’я’</i>. Это событие рекомендуется использовать для выполнения настроек среды окружения. Особенно это актуально при использовании приватных сессий данных (этот вопрос рассмотрим ниже). Также, тут имеет смысл осуществить открытие таблиц и баз данных, не включаемых в объект <i>Data environment</i>.<br />
<b>RETURN .F.</b> в событии <b>Load()</b> отменяет дальнейшую загрузку формы. Если форма имеет <i>private data session</i> все открытые таблицы и полученные курсоры закрываются.</li>
<li>Init() – событие при создании формы. Следует учесть, что элементы управления, помещённые на форму, <u>создаются раньше формы</u>, то есть событие Init() элементов происходит раньше, и поэтому в событии <b>Init()</b> формы уже можно обращаться к элементам управления формы. Включив оператор <b>LPARAMETERS</b> в событие формы, можно осуществить возможность передачи в неё параметров. Стоит заметить, что видимость этих переменных-параметров дальше события Init() не распространяется. Поэтому в случае необходимости стоит <u>присвоить значения параметров созданным вами свойствам формы</u>. Приведем пример достаточно типовой ошибки, переменные переданные в Init() используются в выражении для фильтра на какую либо таблицу , участвующую в работе формы. Естественно, после срабатывания события переменных уже нет, и фильтр становиться не работоспособным, так как его значение вычисляется в момент перемещения по записям. Если необходимо, <u>создание</u> и соответственно <u>запуск</u> формы можно прекратить, выполнив команду <b>RETURN .F.</b> Это удобно, например, для организации допуска к формам разным пользователям или проверки верности условий запуска формы, без правильности которых, далее форма не сможет верно функционировать.</li>
<li>Activate() – активирование формы действиями пользователя, таким как щелчок мышью , или же когда вызывается метод <i>SHOW()</i> формы. Это событие при работе формы может срабатывать много раз, и иногда код, помещенный в него, может доставить разные проблемы. Скажем, там будет написан какой либо <i>sql select</i><br />
Выполнили из формы печать отчета, вернулись в форму, событие снова отработало, и явно помешало работе элементов формы, скажем гриду, чьим источником может быть курсор <i>sql select</i>. Рекомендуем, если нет возможности помещения кода в это событие, проверять необходимость повторного запуска кода в нем, скажем, таким образом -</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">  If not this.old  
     This.DoSomething  
     This.old=.t.  
  endif   
</pre>
</td>
</tr>

</table>
<p>Не менее коварным может быть и элементарный код , помещенный в антипода упомянутого события – <b>DEACTIVATE</b> - которое тоже может многократно сработать. Куда смещается фокус из формы- в тулбар, просмотр отчета или в иное место, в этом событии неизвестно. Вот в отчете неожиданно становится видна одна запись вместо нескольких, а все потому, что в указанном событии написали всего одну строку - <i>SELECT MyTable</i>. Особенно кишат такими проблемами страничные формы, с кодами в указанных событиях на страницах: хотели указать алиас при смене страницы, когда пользователь остается на форме, а он в отчет пошел, и выбил у него табуретку из под него этим кодом.</p>
</li>
<li>GotFocus() – получение фокусаДалее форма работает, и на ней могут срабатывать самые разные события, как то: нажатие клавиш, обновление содержания, перерисовка и другие. Пока опустим описание этих событий. При разгрузке формы формы происходят другие события</li>
<li>QueryUnload() – это событие происходит при выполнении команд <b>CLEAR WINDOWS, RELEASE WINDOWS или QUIT</b>, <b><u>а также при нажатии на крестик окна формы</u></b>. Стоит отметить, что это событие <u><b>не происходит</b></u> при выполнении метода <b>RELEASE()</b> формы. Для того чтобы предотвратить закрытие формы исходя из необходимых разработчику условий , достаточно выполнить команду <b>NODEFAULT</b> в этом событии.</li>
<li>Destroy() – происходит при уничтожении объекта</li>
<li>Unload() – это последнее из событие в последовательности перед уничтожением формы, происходит после освобождения всех объектов включённых в форму. Все элементы управления, включённые в форму, в этом событии формы <b>уничтожены и недоступны</b>.<br />
При использовании <i>Default data session</i> в форме именно в этом событии стоит закрыть таблицы, открытые с использованием команды <b>USE</b> , а также полученные курсоры.<br />
Если форма модальна, используя команду <b>RETURN</b> можно вернуть значение переменной из формы</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">  DO FORM MyForm TO VarName  
</pre>
</td>
</tr>

</table>
<p><b><a name="Datasession"></a>4. Сессии данных</b></p>
<p>Тем, кто знаком с программированием в процедурных языках (таких как FoxPro 2.6), известно, каких трудов стоило создание форм с моделированием независимых друг от друга сессий. В VFP все это легко решается при помощи <i>private data session</i> (приватных сессий данных). Приватные сессии позволяют открывать таблицы, представления, индексные файлы, создавать связи, делать всевозможные настройки в окружении, совершенно не заботясь о том, что в какой то из другой форм аналогичные манипуляции выполняются с этими же таблицами. Каждая приватная сессия совершенно не зависима в этом плане от остальных. Приватная сессия подобна окружение данных на одной отдельной машине. Поэтому, если разработчик собирается создавать приложение с многодокументным интерфейсом, следует взять за правило строить формы на основе приватных сессий данных. Действительно, в одной форме могут участвовать несколько таблиц , связанными разными реляциями, в другой нечто подобное отчету - часть этих же таблиц без реляций, в третьей - они же, но с другой реляцией. Если использовать общую сессию, то нужно либо все время перестраивать реляции, менять запись, либо давать одним и тем же таблицам в разных формах разные названия.<br />
Действительно , в форме накладных можем находиться на 30-той записи накладных, в отчете оборотная ведомость - сканировать записи, а справочники вообще находиться на разных записях. Если открыто одновременно 5-6 разных форм, то с названиями алиасов будет полный хаос. При частной сессии формы не видят окружения друг друга, одни и те же таблицы можно открыть с одним и тем же именем, связать их разными реляциями, находиться на разных записях одних и тех же таблиц. Следует обратить внимание на то, что <b><u>по умолчанию в форме установлена Default data session (1)</u></b> – общая сессия данных, что часто сбивает начинающих разработчиков с толку и заставляет их прибегать к изощрённым способам программирования MDI форм и многопользовательских приложений. Этого ложного пути легко избежать, установив <b>в базовом классе формы <i>Private data session (2)</i></b>. Однако не стоит забывать о том , что приватные сессии данных требуют дополнительных настроек среды, потому как настройки, производимые скажем в главном модуле программы действуют только в общей сессии данных (<i>Default data session</i>). То есть в этом типе (<i>Private data session</i>) сессии игнорируются общие настройки приложения и их необходимо выполнить повторно, а именно явно указать необходимые вам настройки из перечисленных:</p>
<p>SET ANSI<br />
SET AUTOSAVE<br />
SET BLOCKSIZE<br />
SET CARRY<br />
SET CENTURY<br />
SET COLLATE<br />
SET CONFIRM<br />
SET CURRENCY<br />
SET DATABASE<br />
SET DATE<br />
SET DECIMALS<br />
SET DELETED<br />
SET DELIMITERS<br />
SET EXACT<br />
SET EXCLUSIVE<br />
SET FIELDS<br />
SET FIXED<br />
SET HOURS<br />
SET LOCK<br />
SET MARK TO<br />
SET MEMOWIDTH<br />
SET MULTILOCKS<br />
SET NEAR<br />
SET NULL<br />
SET POINT<br />
SET REPROCESS<br />
SET SAFETY<br />
SET SECONDS<br />
SET SEPARATOR<br />
SET SYSFORMATS<br />
SET TALK<br />
SET UNIQUE</p>
<p>Особо обратите внимание на настройки выделенные цветом – они чаще всего становятся причиной разбитых лбов начинающих разработчиков.<br />
Ввиду вышесказанного, стоит организовать в базовом классе формы некий метод, назовём его <i><b>SetSession()</b></i> в котором и производить соответствующие настройки среды окружения. <br />
Вызывать этот метод из события <b>Load()</b> формы. Если метод переопределяется в конкретной форме, используйте команду <b>DODEFAULT()</b>, чтобы выполнить метод родителя – базового класса формы, в котором выполняются настройки. </p>
<p>Для переключения между сессиями данных используется команда <b>SET DATASESSION</b>. Но пользоваться ей рекомендуется только на этапе разработки приложения для отладки форм, потому, что некоторые элементы ведут себя непредсказуемо и очень болезненно реагируют на смену сессии данных в момент выполнения программы, а при программной смене сессий некоторые элементы управления просто теряют свои источники данных. Пример, к combobox подключен источник данных в качестве алиаса таблицы или ее полей. При смене сессии это алиас может оказаться временно невидимым , и возникнет ошибка- <i>can not access selected tables</i>. </p>
<p>Нужно отметить, что последовательность вызова таких настроек может оказаться важной. Скажем, в <b>LOAD</b> формы выполняется <i>sql select</i>. Если сначала нет <b>SET TALK OFF</b>, то форма начинает рассказывать о своей работе по выполнению запроса, при этом может портится и изображение формы. Если вы забыли про <b>SET DELETED ON</b>, то с удивлением можете обнаружить в такой форме уже стертые ранее записи. Если забыли про <b>SET DECIMAL</b> , то при расчете сумм можете потерять точность.<br />
Одной из особенностей форм с <i>private data session</i> является способность закрывать таблицы из окружения (<i>Data Environment</i>), таблиц , открытых при помощи команд <b>USE</b> (то есть так сказать “вручную”) и созданных во время выполнения программы курсоров. Это очень удобно – если в процессе открытия формы появились служебные курсоры или же при ее работе, то заботиться об их закрытии не нужно, они закроются <u>автоматически</u>.</p>
<p>Прочтя это, естественно возникает вопрос – а каким же тогда образом формы могут обмениваться данными между собой ? Для таких дел предусмотрен принцип дочерних форм . Использовать его можно двояко. В первом случае родительская (немодальная) форма с приватной сессией запускает дочернюю модальную с общей сессией. Такой способ хорош для использования при создании справочников. Например, запущенная дочерняя модальная форма приобретает ту же сессию, что и родительская и все данные в дочерней форме ей легко доступны. Сессии ,помимо номера, имеют наименование, по умолчании совпадающее с именем запущенной формы. Так вот при таком подходе, сессия вначале имеет имя родительской формы, после запуска дочерней оно меняется на имя дочерней формы. После закрытия же дочерней формы имя сессии становится неопределённым - <i><b>Unknown</b></i>. Хотя разработчики и предупреждаются о том , что при закрытии дочерней формы имя сессии теряется, это не мешает с успехом использовать такой подход при создании приложений. Сделано это все с благой целью. Если вы из форм с частной сессией вызываете диалоговые формы к примеру с вопросом об удалении записи, или форму для запуска отчетов, то естественно в них видите те же самые таблицы на тех же записях, что были и в вызвавшей их форме с частной сессией. Поэтому советуем избегать открытия в окружение таких производных форм таблиц, которые уже открыты в форме с частной сессией. Также и в отчетах не следует в таких случаях класть эти таблицы в окружение. Иначе при вызове отчета вместо записи видимой на форме, увидим первую запись этой же таблицы.<br />
Второй способ заключается в том, что дочерняя форма является немодальной с приватной сессией данных. Для запуска таким способом используется команда <b>DO FORM … NAME … LINKED</b>. Используйте вновь созданное свойство формы, скажем, назвав его <i>oChildForm</i>. Исполнив команду из метода родительской формы:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">  DO FORM  NAME ThisForm.oChildForm LINKED  
</pre>
</td>
</tr>

</table>
<p>Получим ссылку в родительской форме на дочернюю через свойство <i>oChildForm</i> и свободно можно таким образом обратиться из родительской формы к методам и свойствам дочерней. Кроме того, при закрытии родительской формы будет уничтожена и дочерняя потому как она ассоциирована со свойством родительской формы (о чём говорилось ранее). Конечно, не стоит забывать о ссылках и незавершённых методах, т.е. при закрытии родительской формы для полной уверенности выполнить:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">  ThisForm.oChildForm=.NULL.  
</pre>
</td>
</tr>

</table>
<p><b><a name="ModalAndModeless"></a>5. Модальность и немодальность</b></p>
<p>Большинство форм в приложении обычно немодальны. Но модальные формы тоже имеют право на жизнь. Появляться им конечно же стоит в нужном месте и в нужное время – там где необходимо прервать выполнение программы для выполнения обязательных операций или получения необходимых данных. Отличие модальной формы от не модальной в том, что при запуске модальной формы программа останавливается на строке <i>DO FORM</i> и ждёт до тех пор пока форма не будет закрыта, немодальная же форма не вызывает такой задержки и код продолжает исполнятся после её запуска. Модальная форма также используется для возвращения какого либо значения из формы:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">  DO FORM MyFormName TO MyVariable  
</pre>
</td>
</tr>

</table>
<p>Модальность формы определяется свойством <b>WindowType</b>. Но это свойство доступно для изменения только на этапе разработки формы. Изменить модальность запущенной формы при необходимости можно, прибегнув к такой операции:</p>
<p>допустим форма MyFormName создана как немодальная форма в дизайнере и запускается таким образом</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">  PUBLIC oForm  
  DO FORM MyFormName NAME oForm NOSHOW  
</pre>
</td>
</tr>

</table>
<p>т.е. форма запущена , но скрыта, затем возникает необходимость отобразить её, причём сделать её модальной:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">  oForm.Show(1)	  
</pre>
</td>
</tr>

</table>
<p>форма отобразится и примет статус модальной .</p>
<p><b><a name="Parameters"></a>6. Передача параметров между формами и методами.</b></p>
<p>Наряду с тем, что некоторые данные в формах могут сохраняться в виде свойств формы, возможно передавать их в вызываемых методах и как параметры . Этот способ передачи представляется более гибким при вызове методов одной формы из другой формы. Но этот способ чреват тем, что передаваемые данные изолируются от других методов формы, т.е. передаваемые таким образом данные доступны только в вызывающем и вызываемом методах форм. Всегда существует вероятность того, что данные, используемые в двух методах разных форм, могут потребоваться и в третьем. Если такая ситуация не исключена, стоит присвоить их свойствам формы. И прежде чем написать <i>LPARAMETERS</i> в методе формы, подумайте, насколько вероятна такая ситуация. Пересылка данных между методами в виде параметров скорее “ситуационная” техника, во многом зависящая от конкретного случая, а не для повсеместного использования. Потому как в объектно-ориентированном программировании (в отличие от процедурного) <b>методы и свойства неотделимы от объекта</b> (<i>принцип инкапсуляции</i>) и для объекта нет большой разницы работать ли ему с переменными памяти или же со своими собственными свойствами, которые так или иначе тоже хранятся в памяти.</p>
<p><b><a name="Delegate"></a>7. Делегирование методов.</b></p>
<p>Программируя в объектно-ориентированном языке, которым является VFP, должно понимать, что гораздо легче распределить выполнение некоторой задачи между множеством методов, нежели выполнять кучу условий и проверок в одном месте, чтобы как можно шире охватить всевозможные варианты развития событий. К примеру, если в коде часто использованы конструкции <i>IF-ENDIF</i>, <i>CASE-ENDCASE</i> и он перегружен этими проверками – можно разделить его на более мелкие участки и вынести их исполнение в отдельные методы ; если код метода родителя зачастую переопределяется в наследнике, стоит подумать о расширении его функциональности в родителе ; если в метод передаётся слишком большое количество параметров – это свидетельствует о слишком узкой его направленности, возможно, что необходимо исключить его из родителя и перенести в методы наследника. Подход, при котором вся функциональность формы перекладывается на несколько элементов формы, зачастую не правильный. Нужно чётко представлять, что форма предназначена для того, чтобы отобразить информацию и неким способом обработать её. Совершенно не обязательно в методе <i>Click()</i> какой-нибудь кнопки писать несколько страниц кода по выполнению некоторой обработки представленных на форме данных. Необходимо структурировать их и разделить задачу на несколько этапов. Затем представить эти этапы в виде методов. Во-первых, это повысит читабельность, кода, а во вторых облегчит наследование и переопределение этих методов. Делегирование методов - это интерпретирование наполеоновского принципа “разделяй и властвуй” в объектно-ориентированном программировании 😉<br />
Рассмотрим пример для иллюстрации делегирования методов:</p>
</li>
<li>Пусть на форме имеется грид, источником которого является таблица, открытая с буферизацией 5 (оптимистическая буферизация таблицы). В гриде идёт правка записей таблицы.</li>
<li>На форме имеется кнопка <i>“Записать изменения” Cmd_Save</i>Заведем на форме метод <i>Save()</i><br />
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">  Select MyTable  
  Return TableUpdate(.T.)  
</pre>
</td>
</tr>

</table>
<p>В <i>Click()</i> кнопки <i>“Записать изменения”</i></p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> If !thisform.Save()  
     Messagebox(‘Не удалось сохранить изменения !’,48, this.caption)  
     Return .F.  
  Endif   
  Return .T.  
</pre>
</td>
</tr>

</table>
<p>В событии <i>QueryUnload</i> формы</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">  This.Cmd_Save.Click()  
</pre>
</td>
</tr>

</table>
<p>Такое построение методов и событий является типичным примером <i>делегирования</i>.</p>
<p><b><a name="Closing"></a>8. Закрытие формы</b></p>
<p>Закрытие формы осуществляется методом <b>RELEASE()</b>. Если при выполнении закрытия формы нужно соблюсти некоторые условия – их можно прописать в этом методе. Перед закрытием формы лучше вручную очистить все ссылки на неё в дочерних формах, явно присвоив им значение <i>.NULL.</i>, иначе форма не будет закрыта. Обычно на форму помещается кнопка в методе <i>Click()</i> которой и вызывается <b>Release()</b> формы. Эту кнопку можно сделать по умолчанию ассоциированной с <i>Escape</i>, назначив её свойство <i>Cancel=.T.</i> Тогда при нажатии кнопки <i>Escape</i> на клавиатуре выполнится метод <i>Click()</i> элемента управления “кнопка” на форме и форма закроется. Однако есть ещё одно “но” – <u>закрытие по нажатию “крестика”</u> на форме. При таких действиях выполняется событие <b>QueryUnload</b> формы. Надо заметить, что метод <b>Release()</b> и событие <b>QueryUnload</b> взаимонезависимы, то есть при <i>Release()</i> не происходит <i>QueryUnload</i>, а событие <i>QueryUnload</i> закрывает форму минуя <i>Release()</i>, что довольно часто и сбивает с толку. Чтобы отменить закрытие формы исходя из условий, достаточно выдать <b>NODEFAULT</b> в этих методах.</p>
<p><b><a name="HotKeys"></a>9. Горячие клавиши на формах</b></p>
<p>Помимо стандартного – “мышиного” манипулирования объектами формы принято организовывать так называемые “горячие” клавиши, при нажатии на которые выполняются некоторые действия (обычно часто повторяемые пользователями во время работы с программой). Считается, что пользователь в совершенстве владеет программой, если он способен работать с ней не прибегая к помощи мыши. Поэтому “горячие” клавиши – непременный атрибут любого грамотно построенного приложения. Нажатие клавиш на клавиатуре обрабатывается событием <b>KeyPress</b>. Сразу замечу, что этим событием <u>не могут</u> быть обработаны любые комбинации с клавишей <i>Alt</i>. Не забывайте об этом. Событие <b>KeyPress</b> формы происходит в следующих случаях :</p>
</li>
<li>На форме нет элементов управления, либо эти элементы управления невидимы или недоступны ( свойства <i>Visible и Enabled</i>).</li>
<li>Когда элемент не может обработать нажатие какой-то клавиши</li>
<li>Когда свойство KeyPreview формы установлено в .T.<br />
В последнем случае именно форма сначала обрабатывает событие <i>KeyPress</i>, и только затем выполняется событие <i>KeyPress элемента</i> управления, находящегося в фокусе на форме. Это очень удобно, так как позволяет поместить код обработки горячих клавиш в одном единственном месте, независимо от того, где находится фокус ввода. Иначе бы пришлось писать код обработки буквально в каждом элементе формы. Иными словами, если вы хотите обработать некоторые нажатия клавиш на форме (<u>именно на форме</u>), установите свойство <b>KeyPreview в .T.</b> При этом , чтобы отсечь всяческую реакцию системы на эти нажатия, а оставить только запрограммированную вами, примените команду <b>NODEFAULT</b> в самом начале обработки нажатий. Если вы желаете продолжить обработку нажатия определённой комбинации клавиш помимо формы и в элементе управления формы (если он находится в фокусе), выполните <b>DODEFAULT(nKeyCode, nShiftAltCtrl)</b>. Если не указать последней команды, то форма может потерять возможность навигации между элементами на ней, а при вводе будет вводиться всего один символ. Советуем осторожнее работать в этом событии с обработкой клавиш ввод и табуляция (коды 13,10), иначе могут быть проблемы с кодом в событиях <i>VALID</i> и переходом с элементом на элемент. Другими словами, эти клавиши не слишком подходят на роль горячих. Не будут пойманы нажатия клавиш, которые вы определили до формы в командах типа <b>ON KEY LABEL</b> .</li>
</ul>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4648">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4648">stranger</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="stranger" href="https://foxclub.ru/account/?user=4648">
				<img alt='' src='https://secure.gravatar.com/avatar/5b833cf24362d1553992a364d89a06cd?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/5b833cf24362d1553992a364d89a06cd?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-10-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ispolzovanie-form-v-foxpro/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Статьи]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/formirovanie-programmnogo-koda-otkrytiya-i-zakrytiya-tablicz-opisannyh-vizualno-v-de-formy/</link>
					<title><![CDATA[Формирование программного кода открытия и закрытия таблиц, описанных визуально в DE формы]]></title>
                    					    <author><![CDATA[Александр Жевелев]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:26 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Формирование программного кода открытия и закрытия таблиц, описанных визуально в DE формы</h1>
													</header>
													<div id="sol_opis">Формирование, кода методов LOAD, DESTROY, заменяющих "нарисованный " Dataenvironment (DE)формы в текстовый файл для использования вместо DE</div>
<div id="sol_body">
<h3>Формирование программного кода открытия и закрытия таблиц, описанных визуально в DE формы</h3>
<p> На этапе разработки формы очень удобно использовать Dataenvironment (DE) формы, однако при наличии большого числа таблиц в DE, форма очень долго открывается при модификации, кроме того многие разработчики предпочитают все писать "ручками".<br /> Предлагаемое решение позволяет производить проектирование формы с использованием DE и всех его визуальных возможностей, а затем получить программный код открытия таблиц (с установкой индексов, фильтров, связей, и т.д.) и закрытия таблиц, "нарисованных" в DE. После помещения сформированного текста в методы (Load,Destroy)  в DE таблицы нужно удалить. В решении приводятся все исходные тексты, коментарии, проект  </div>
<div id="sol_avtor">Автор: Александр Жевелев</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4832">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4832">Александр Жевелев</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Александр Жевелев" href="https://foxclub.ru/account/?user=4832">
				<img alt='' src='https://secure.gravatar.com/avatar/c26484fb4cb3d558afb40c4ada19085c?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c26484fb4cb3d558afb40c4ada19085c?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 09-10-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/formirovanie-programmnogo-koda-otkrytiya-i-zakrytiya-tablicz-opisannyh-vizualno-v-de-formy/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kompaktnyj-colorpicker-i-analogovye-chasy/</link>
					<title><![CDATA[Компактный ColorPicker и аналоговые часы.]]></title>
                    					    <author><![CDATA[Sergey Filimonoff]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:26 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Компактный ColorPicker и аналоговые часы.</h1>
													</header>
													<div id="sol_opis">Возможно наручные часы уже не нужны, если кругом полно часов и будут еще эти 🙂 ColorPicker удобен для раскраски обьектов интерфейса, если кому это нужно.</div>
<div id="sol_body">
<h3>Компактный ColorPicker и аналоговые часы.</h3>
<p> Часы могут иметь римские цифры и фоновую картинку.<br /> Для коррекции времени можно вызвать: run/n Control "TIMEDATE.cpl"</p>
<p> Для ColorPicker, по левому клику на Image создаются градации данного цвета.<br /> По правому градации случайным образом, движок внизу определяет насыщенность цвета для этого.<br /> Клик по градации делает собственно закраску.<br /> Пример раскраски текущего активного компонента,<br /> в методе Color1.Cset() пишем:</p>
<p> Parameter c<br /> Local o<br /> o=iif(Type('This.Parent.ActiveControl')='O',This.Parent.ActiveControl,This.Parent)<br /> if o.BaseClass='Listbox'<br /> 	o.ItemBackColor=c<br /> else<br /> 	o.BackColor=c<br /> endif<br /> Эти классы конечно не предел совершенства и больше для примера.    </div>
<div id="sol_avtor">Автор: Sergey Filimonoff</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4566">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4566">Sergey Filimonoff</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Sergey Filimonoff" href="https://foxclub.ru/account/?user=4566">
				<img alt='' src='https://secure.gravatar.com/avatar/674ca040589c674ff037d847bf52bdf4?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/674ca040589c674ff037d847bf52bdf4?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 15-01-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kompaktnyj-colorpicker-i-analogovye-chasy/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/szhatie-form-i-otchetov-v-vfp6/</link>
					<title><![CDATA[Сжатие форм и отчетов в VFP6]]></title>
                    					    <author><![CDATA[Foxtrot]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:26 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Сжатие форм и отчетов в VFP6</h1>
													</header>
													<div id="sol_opis">Исходники двух программ для удаления лишней (никому НЕнужной) информации из файлов: форм и отчетов</div>
<div id="sol_body">
<h3>Сжатие форм и отчетов в VFP6</h3>
<p> При просмотре файлов форм-SCX мною было замечено, что VFP6 прописывает "интересные" свойства объектам, которые ну никак не влияют на логику программ и вообще "психологию" СУБД VFP.<br /> Например, у объекта DataSession есть свойства Left,Top,Width,Height. Кто-нибудь в клубе знает для чего они нужны ентому объекту? Или может кто-нибудь их использует в своих программах? Поделитесь опытом, плиз.<br /> Таких "удивительных" свойств объектов я нашел не так много, но тем не менее. И что самое интересное, все эти свойства далее компилируются для последующего использования в ран-тайме! И чем больше Ваш ехе-шник, тем больше килобайт ненужной информации.<br /> Путем удаления ненужных строк мои программы облегчились на несколько байт. Резонно заметить, что мол парочка килобайт не испортит программу и овчинка того не стОит. Но ведь если известно, что эти килобайты никогда не отработают, тогда зачем их раздавать налево и направо?<br /> Буду благодарен, ежели кто-нибудь дополнит список ненужных свойств объектов.<br /> ЗЫ: резервное копирование файлов никто не отменял   </div>
<div id="sol_avtor">Автор: Foxtrot</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4782">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4782">Foxtrot</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Foxtrot" href="https://foxclub.ru/account/?user=4782">
				<img alt='' src='https://secure.gravatar.com/avatar/14af643bd13aa7e300bf3487d9a2cdc5?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/14af643bd13aa7e300bf3487d9a2cdc5?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-04-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/szhatie-form-i-otchetov-v-vfp6/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-iv/</link>
					<title><![CDATA[Советы начинающим Часть IV]]></title>
                    					    <author><![CDATA[Владимир Максимов]]></author>
                    										    <pubDate>Sun, 20 Nov 2022 05:55:56 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Советы начинающим Часть IV</h1>
													</header>
													<p>В этой статье :</p>
<p><strong><a href="#TypeData">Типы данных</a></strong></p>
<div style="padding-left: 40px;"><a href="#Precision">Точность расчета</a></div>
<div style="padding-left: 40px;"><a href="#Numeric">Numeric</a></div>
<div style="padding-left: 40px;"><a href="#Currency">Currency</a></div>
<div style="padding-left: 40px;"><a href="#Memo">Memo</a></div>
<div style="padding-left: 40px;"><a href="#General">General</a></div>
<div style="padding-left: 40px;"><a href="#Binary">Binary</a></div>
<div style="padding-left: 40px;"><a href="#AutoIncrement">AutoIncrement</a></div>
<p><strong><a href="#Delete">Удаление записей в таблице</a></strong></p>
<div style="padding-left: 40px;"><a href="#ReUse">При создании новых записей использовать записи ранее помеченные как удаленные</a></div>
<div style="padding-left: 40px;"><a href="#ProcPack">Вынести выполнение команды PACK в специальные служебные процедуры по обслуживанию базы данных</a></div>
<div style="padding-left: 40px;"><a href="#IndexDeleted">Следует ли создавать индекс по выражению Deleted()</a></div>
<div style="padding-left: 40px;"><a href="#Zap">Команда ZAP</a></div>
<p><strong><a href="#Stored">Хранимые процедуры</a></strong></p>
<div style="padding-left: 40px;"><a href="#TaskStored">Для чего нужны хранимые процедуры</a></div>
<div style="padding-left: 40px;"><a href="#WorkStored">Особенности работы с хранимыми процедурами</a></div>
<div style="padding-left: 40px;"><a href="#Relation">Связи и отношения между таблицами</a></div>
<div style="padding-left: 40px;"><a href="#PersistentRelationship">Постоянная связь (persistent relationship)</a></div>
<div style="padding-left: 40px;"><a href="#OrdinaryRelationship">Связь (обычная)</a></div>
<div style="padding-left: 40px;"><a href="#WhenRelationship">Когда следует использовать связь</a></div>
<h2 align="center"><b><a name="TypeData"></a>Типы данных</b></h2>
<p>Цель данного раздела - это не ознакомление со всеми существующими в FoxPro типами данных, а описание некоторых особенностей использования тех или иных типов данных. Понимание этих особенностей позволит упростить выбор типа данных при проектировании таблиц. А также уменьшить количество ошибок в программе.</p>
<p>Прежде всего, следует понимать, что существуют типы данных переменных памяти и типы данных полей таблиц. Это далеко не одно и то же. Например, если Вы используете в таблице поле типа Character, то количество символов в таком поле всегда ограничено некоторым числом не превышающем 254 символа. Но переменная памяти имеет значительно больший размер, ограниченный количеством символов 16,777,184</p>
<p>Особенность FoxPro заключается в том, что в нем в большинстве случаев происходит автоматическая конвертация типов данных (если это возможно). При этом никаких сообщений об ошибках не возникает, хотя фактически происходит логическая ошибка. Например, если Вы попытаетесь записать в поле Character(10) символьную строку длиной более 10 символов, то ошибки это не вызовет. Просто в таблицу будут записаны только первые 10 символов указанной строки.</p>
<p>Ниже я буду описывать некоторые типы данных полей таблиц, по мере необходимости давая их же описание как переменных памяти</p>
<p>&nbsp;</p>
<h3><b><a name="Precision"></a>Точность расчета</b></h3>
<p>Прежде чем говорить собственно о типах данных следует обратить внимание на точность расчета в FoxPro. В системных ограничениях FoxPro указано, что точность расчета ограничена 16 значащими цифрами.</p>
<p><b>Значащие цифры</b> - это все цифры числа, считая слева направо, исключая ведущие и завершающие нули (если есть), но включая цифры после символа разделителя целой и дробной части. Для чисел от 0 до 1, значащие цифры - это все цифры, начиная с нуля перед символом разделителем целой и дробной части, но исключая завершающие нули (если есть)</p>
<p>Например, у числа</p>
<p>00010203.4050600</p>
<p>есть 10 значащих цифр, начиная с цифры 1 и заканчивая цифрой 6. А у числа</p>
<p>0.004050600</p>
<p>есть 8 значащих цифр, начиная с цифры 0 перед точкой и заканчивая цифрой 6.</p>
<p>Опираясь на собственный опыт работы с FoxPro, могу сказать, что 16 - это не точность расчета, а просто количество знаков, с которыми работает FoxPro при математических расчетах. Между этими понятиями есть разница. Более того, судя по всему, на точность расчета могут оказывать влияние какие-то системные ограничения как самой операционной системы, так и "железа". Выполните такую проверку</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  CREATE CURSOR test (test N(20))  
  INSERT INTO test VALUES (1234567890123456)  
  INSERT INTO test VALUES (12345678901234567)  
  INSERT INTO test VALUES (123456789012345678)  
  INSERT INTO test VALUES (1234567890123456789)  
  INSERT INTO test VALUES (12345678901234567890)  
  BROWSE NOWAIT  
  </pre>
</td>
</tr>

</table>
<p>На разных компьютерах этот простой тест может давать несколько отличные результаты. При наихудшем раскладе, реально окажутся заполненными только первые 14 разрядов, а остальные разряды окажутся заполненными нулями. При наилучшем раскладе, реально заполненными будут первые 16 разрядов, а остальные - также заполнены нулями.</p>
<p>Таким образом, применительно к FoxPro можно говорить о том, что доверять можно только первым 14 значащим цифрам. Еще 2 цифры будут содержать сомнительные (но близкие к реальным) данные. А вот все значащие цифры, начиная с 17, будут недостоверны. Т.е. будут заполнены случайными данными.</p>
<p>&nbsp;</p>
<h3><b><a name="Numeric"></a>Numeric</b></h3>
<p>Numeric и Float - это два разных названия для одного и того же типа данных. В дальнейшем, я буду говорить о типе данных Numeric. По умолчанию, любая переменная памяти, содержащая число интерпретируется как переменная типа Numeric, если тип переменной не был указан явно каким-либо способом.</p>
<p>Очень важным для понимания особенностей типа данных Numeric является то обстоятельство, что физически эти данные хранятся как символьные данные. Т.е. каждая цифра, а также символ разделитель целой и дробной части физически хранятся как обычные символы. Если Вы откроете файл DBF как обычный текстовый файл (например, с помощью программы "Блокнот" ("Notepad")), то Вы увидите, что число 1234.56 прямо так и записано. Нет какого-либо преобразования.</p>
<p>Как следствие, ничто не мешает вместо дробной части записать целую часть числа. И действительно, если Вы определите размерность поля, например, как Numeric(5,2), то в такое поле можно записать данные до значения 99999, а не 99.99 как предполагается из заданной размерности. Т.е. указание дробной части носит скорее рекомендательный, чем обязательный характер и вся дробная часть (включая символ разделитель) в случае необходимости может быть использована для записи целой части числа.</p>
<p>Выполните такую проверку</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  CREATE CURSOR test (test N(5,2))  
  INSERT INTO test VALUES (12.34)  
  INSERT INTO test VALUES (12345)  
  BROWSE NOWAIT  
  </pre>
</td>
</tr>

</table>
<p>Фактически, работая с полями типа Numeric, если у них задана дробная часть, то Вы всегда имеет некоторый запас размерности на количество знаков дробной части плюс один знак на символ разделитель.</p>
<p>&nbsp;</p>
<h3><b><a name="Currency"></a>Currency</b></h3>
<p>Это специальный формат, для хранения "денежных" типов данных. Но прежде, чем использовать его в своей программе следует учесть ряд особенностей по работе с этим типом данных.</p>
<p>Прежде всего, следует понимать, несмотря на то, что данный тип данных также относится к "числовым" данным (т.е. в нем хранятся числа), но это все-таки не тип данных Numeric. Как следствие, прямое сравнение данных типа Currency и Numeric может дать неожиданный результат. Например:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  ?268435456.3=NTOM(268435456.3)  
  ?268435456.4=NTOM(268435456.4)  
  </pre>
</td>
</tr>

</table>
<p>Первое сравнение, как и ожидалось, вернет .T., а вот второе совершенно неожиданно возвращает .F. Почему? Это знают только разработчики FoxPro. Но с практической точки зрения отсюда следует вывод, что перед сравнением разных числовых типов данных их следует приводить к одному типу данных. Причем приведение к типу Numeric требует дополнительного округления. Например:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  nNum=268435456.4  
  yCur=$268435456.4  
  ?nNum=yCur  
  ?nNum=MTON(yCur)  
  ?NTOM(nNum)=yCur  
  ?nNum=ROUND(MTON(yCur),4)  
  </pre>
</td>
</tr>

</table>
<p>Символ "$" говорит о том, что далее идет число типа Currency. Его использование аналогично явному преобразованию через функцию NTOM(). Как видите, первые 2 сравнения вернут .F., в то время как последние 2 - .T.</p>
<p>Другая особенность типа данных Currency связана со способом округления результатов промежуточных вычислений. Сравните:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  ?4/3*3  
  ?$4/3*3  
  </pre>
</td>
</tr>

</table>
<p>Откуда взялось расхождение в четвертом знаке после запятой? А это как раз следствие особенностей округления промежуточных результатов расчета.</p>
<p>Дело в том, что как было сказано ранее, по умолчанию, все числовые переменные памяти считаются имеющие тип данных Numeric. Опять же, как было сказано ранее, FoxPro выполняет расчеты с точностью до 16 значащих цифр.</p>
<p>Т.е. в памяти, результат деления 4/3=1.333333333333333 - до 16 значащих цифр. А результат деления $4/3=1.3333 - до 4 знаков после запятой, поскольку тип Currency больше не хранит.</p>
<p>Теперь, когда этот промежуточный результат снова умножается на 3, получается: для типа Numeric - 3.999999999999999, а для типа Currency - 3.9999.</p>
<p>Завершающее действие - это округление результата до некоторого фиксированного количества знаков после запятой. В данном случае, выражение типа Numeric будет округлено до 2 знаков после запятой и получится 4.00, а тип Currency округляется до 4 знаков после запятой и остается те же 3.9999</p>
<p>Т.е. в принципе, использовать тип Currency можно, но следует иметь в виду приведенные выше особенности его работы, чтобы получать точные результаты. Но если Ваша программа предполагает сложные денежные расчеты, то лучше использовать типа данных Numeric(18,2) вместо Currency.</p>
<p>&nbsp;</p>
<h3><b><a name="Memo"></a>Memo</b></h3>
<p>Данный тип предназначен для хранения символьных данных неопределенной длины. Точнее для символьных данных, для которых точно известно, что они могут содержать более 254 символов. А вот верхний предел ограничен числом 2ГБ (2 миллиарда символов - девять нулей) на размер файла с расширением FPT. В этом файле собственно и хранится содержимое полей типа Memo и General.</p>
<p>Особенность работы с мемо-полями заключается в том, что при <u>любой</u> модификации мемо-поля файл FPT увеличивается на некоторое количество байт кратное определенному значению. Это значение определяется настройкой SET BLOCKSIZE. По умолчанию, оно равно 64 байта. Т.е. даже если Вы просто стерли и тут же вставили один символ, то размер файла FPT тем не менее увеличится на 64 байта, а не останется неизменным как ожидалось. Проверьте:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  CREATE TABLE test FREE (test M)  
  =ADIR(aTest,"test.fpt")  
  ?aTest[1,2]  
  INSERT INTO test VALUES (space(1))  
  =ADIR(aTest,"test.fpt")  
  ?aTest[1,2]  
  USE  
  DELETE FILE test.*  
  </pre>
</td>
</tr>

</table>
<p>Как видите, я добавил в мемо-поле только один пробел, но размер файла FPT увеличился на 64 байта, а не на 1 как ожидалось.</p>
<p>А что же содержится в остальных 63 записанных байтах? А ничего! Это пустое место, которое уже никак, никоим образом не может быть использовано.</p>
<p>Таким образом, при интенсивной работе с мемо-полями в них скапливается достаточно большое количество пустого места. Для удаления этого пустого пространства необходимо периодически давать команду PACK. Или, если не хочется удалять записи помеченные как удаленные, PACK MEMO.</p>
<p>Проблема в том, что для выполнения команды PACK необходимо открыть таблицу в режиме EXCLUSIVE, что при работе в многопользовательском приложении - проблематично. Разумно вынести эту команду в специальную процедуру по регулярной очистке база данных, которую периодически запускает администратор или сам пользователь. Более подробно об этой стратегии описано в разделе <a href="/sovety-nachinayushhim-chast-iv/">Удаление записей в таблице</a></p>
<p>&nbsp;</p>
<h3><b><a name="General"></a>General</b></h3>
<p>Данный тип предназначен для хранения OLE-объектов. Ну, например, в нем можно хранить файл Excel или результат работы MS Graph</p>
<p>Для работы с данными полями есть всего 2 команды</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  APPEND GENERAL  
  MODIFY GENERAL  
  </pre>
</td>
</tr>

</table>
<p>Чтобы очистить поле General от содержимого надо просто дать команду APPEND GENERAL, не указав имени файла.</p>
<p>Причем описание опции LINK в команде APPEND GENERAL вводит в заблуждение в том смысле, что исходный файл будет скопирован в поле General в любом случае. Какие бы опции Вы не использовали.</p>
<p>Т.е. если Вы подумали, что при использовании опции LINK файл не копируется в General-поле, то Вы ошиблись. Вам ни в коем случае не удастся сэкономить дисковое пространство и уменьшить размер файл FPT (в нем хранится содержимое поля General)</p>
<p>А опция LINK в данном случае используется для того, чтобы синхронизировать изменения в оставшейся внешней копии файла и в той его копии, которая находится внутри поля General. Синхронизация происходит в момент открытия поля.</p>
<p>Можете провести простой эксперимент. Создайте в WinWord любой файл, например, test.doc. Теперь сделайте следующее:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  CREATE CURSOR test (testGen G)  
  APPEND BLANK  
  APPEND GENERAL testGen FROM "C:\Мои документы\test.doc" LINK  
  MODIFY GENERAL testGen  
  </pre>
</td>
</tr>

</table>
<p>Как видите, я задал опцию LINK, чтобы связать содержимое поля General и OLE-объект. Если Вы сделаете теперь изменения в файле "test.doc" открыв его в WinWord, то при очередном открытии этого поля General все изменения тут же в нем и отобразятся. Соответственно, верно и обратное. Изменения сделанные через вызов OLE-объекта в поле General попадут в исходный файл. Без опции LINK эти взаимные изменения не работают.</p>
<p>А теперь удалите файл "test.doc". Просто переместить его или переименовать недостаточно. Каким-то образом поле General найдет его под новым именем и на новом месте. Нужно именно удалить файл.</p>
<p>Открываем поле General и видим наш не существующий файл! Т.е. он таки записан в поле General несмотря на опцию LINK. Хотя модифицировать его уже не получится. При попытке сделать модификацию Вы получите сообщение об ошибке OLE.</p>
<p>Впрочем, в том, что файл OLE-объекта будет записан в поле General, можно убедиться, просто посмотрев размер файла FPT до вставки и после (для этого надо создать не курсор, а именно таблицу). Он увеличится примерно на размер вставляемого файла.</p>
<p>Другая особенность заключается в том, что поле General не предназначена для программной манипуляции с ее содержимым. Предполагается, что всю нужную обработку должен выполнять OLE-объект, а назначение поля General - это просто принять результаты изменения.</p>
<p>Частично проблему манипуляции содержимым решает опция DATA команды APPEND GENERAL, но это опять же не прямое, а опосредованное редактирование. Изменения DATA должен обработать OLE-объект, если он это умеет. Например с ними может работать такое OLE-объект, как MS Graph (для отображения графиков). Пример его использования можете посмотреть в стандартном проекте примеров Solution.pjx, который поставляется вместе с FoxPro (формы OleGraph.scx и Sctock.scx)</p>
<p>Поэтому, если Вы захотите, например, программно сохранить содержимое поля General как отдельный файл, то у Вас просто нет для этого никаких инструментов!</p>
<p>Таким образом, при использовании полей General Вы непомерно "раздуваете" базу данных (очень быстро растет размер файла FPT) данными, которыми Вы практически не можете манипулировать. Можно сказать, "архивом".</p>
<p>В связи с этими особенностями полей типа General я не рекомендовал бы использовать данный тип поля на постоянной основе. Т.е. как поле каких-либо основных таблиц базы данных</p>
<p>Собственно файлы OLE-объектов лучше хранить именно как файлы. В отдельной директории. А если их надо "прокачать" через поле типа General, то лучше создавать временную табличку или курсор непосредственно на момент исполнения приложения. В большинстве случаев хватает курсора, содержащего одну запись и одно единственное поле типа General.</p>
<p>Если Вы, тем не менее, твердо желаете сохранить файлы в базе данных, чтобы их не было на диске, то используйте для их хранения поля типа Memo(binary) примерно так:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  CREATE CURSOR test (testMemo M NOCPTRANS)  
  APPEND BLANK  
  APPEND MEMO testMemo FROM "C:\Мои документы\test.doc" OVERWRITE  
  </pre>
</td>
</tr>

</table>
<p>А чтобы извлечь файл обратно:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  COPY MEMO testMemo TO "C:\Мои документы\test.doc"  
  </pre>
</td>
</tr>

</table>
<p>Преимущества хранения файлов в поле типа Memo(binary) именно в том, что ими можно программно манипулировать. Чего нельзя сказать о поле General.</p>
<p>Кроме всего перечисленного не следует забывать, что, по сути, поле General - это особый вид Memo-поля. Соответственно на него распространяются те же особенности модификации, что и на Memo-поле описанные в разделе посвященному <a href="/sovety-nachinayushhim-chast-iv/#Memo">Memo</a>. Т.е. требуется периодически давать команду PACK или PACK MEMO для очистки файла FPT от пустого пространства.</p>
<p>&nbsp;</p>
<h3><b><a name="Binary"></a>Binary</b></h3>
<p><b>Binary</b> - это не тип поля, а реквизит поля. Может использоваться только с символьными полями. Т.е. возможны Character (binary) и Memo (binary). При программном создании полей данное свойство указывается при помощи ключевого слова "NOCPTRANS".</p>
<p>Для чего, собственно нужен этот реквизит.</p>
<p>Дело в том, что обычно предполагается, что в символьных полях хранится некоторый текст, записанный в одной из поддерживаемых FoxPro кодовых страниц. Соответственно, при чтении таких полей FoxPro автоматически транслирует содержимое таких полей в текущую кодовую страницу. Благодоря этому механизму Вы можете совершенно спокойно открыть в Visual FoxPro таблицу созданную в FoxPro for DOS в кодовой странице 866, и текст будет выглядеть нормально, а не как набор закорючек.</p>
<p>Однако в некоторых случаях этот автоматический механиз трансляции необходимо отключить. Т.е. нужно, чтобы транслировались данные из всех прочих символьных полей, а вот из этих - не надо. В принципе, это можно сделать программно, используя команду SET NOCPTRANS. Но уж больно это утомительно. Лучше указать это непосредственно в реквизитах таких полей.</p>
<p>В каких же случаях может возникнуть необходимость в запрете автотрансляции символов.</p>
<p>А в тех, когда в этих полях не содержится текст, который пользователь должен смотреть и править.</p>
<p>Ну, например, в разделе посвященном типу поле <a href="/sovety-nachinayushhim-chast-iv/#General">General</a>, я привел пример записи файла с расширением DOC в поле типа Memo(Binary). Разумеется, пытаться прочитать такое содержимое как обычный текст бессмысленно.</p>
<p>Собственно и название "binary"(двоичный) говорит о том, что содержимое данных полей следует воспринимать не как текст, а как набор двоичных кодов, для расшифровки которых требуется какой-то нестандартный алгоритм. Нестандартный в том смысле, что это не просто другая кодовая страница.</p>
<p>А возможно данные коды и вообще не предназначены для расшифровки и применяются "как есть". Например, идентификатор записи. Хотя для FoxPro - это не очень хорошее решение.</p>
<p>&nbsp;</p>
<h3><b><a name="AutoIncrement"></a>AutoIncrement</b></h3>
<p><b>AutoIncrement</b> - это не тип поля, а реквизит поля. Может использоваться исключительно с полем типа Integer. В одной и той же таблице может быть несколько полей со свойством AutoInc.</p>
<p>Это свойство является нововведением 8 версии FoxPro. В более ранних версиях его просто не было.</p>
<p>Более подробно о свойствах полей, использующих данное свойство можно почитать в статье "Autoincrementing Field Values in Tables" из Help к VFP8. В этой статье достаточно подробно описаны особенности его использования. Вкратце, перечень особенностей сводится к следующему:</p>
<ul>
<li>В заголовке таблицы в описании данного поля хранится очередное (не использованное) значение и шаг автоинкремента. При добавлении новой записи изменяется очередное значение в заголовке таблицы. Посмотреть очередное значение и шаг автоинкремента можно, используя функцию AFIELDS(). 17 и 18 столбец создаваемого массива соответственно (в более ранних версиях функция AFIELDS() создавала массив из 16 столбцов).</li>
<li>Шаг автоинкремента может принимать значения от 1 до 255. Он не может принимать нулевое или отрицательное значение.</li>
<li>Поля с данным свойством не могут редактироваться. Будет ли попытка отредактировать данное поле вызывать сообщение об ошибке, регулируется настройкой SET AUTOINCERROR</li>
<li>В буферизированных таблицах процесс добавления новой записи примерно на 35% медленнее по сравнению с таблицами, не имеющими автоинкрементных полей</li>
<li>FoxPro никак не контролирует появление "дыр" в последовательности автоинкремента. "Дыры" могут появляться, например, при удалении ранее созданных записей. Значение новой записи берется из заголовка таблицы, а не на основе какого-либо расчета.</li>
<li>В случае буферизации таблицы, при работе нескольких пользователей одновременно также могут образовываться "дыры" в последовательности автоинкремента, если один из пользователей не принял внесенные изменения (TableRevert())</li>
<li>При использовании Local View новое значение поля с автоинкрементом отобразится только после выполнения перезапроса (Requery()).</li>
</ul>
<p>Можно заметить, что при неаккуратном создании автоинкрементного поля можно вызвать ошибку переполнения данных, если задать величину очередного значения близкую к предельно допустимому для типа Integer (2,147,483,647). В этом случае Вы можете при создании новой записи получить сообщение о переполнении типа данных.</p>
<p>Следует понимать, что свойство <i>AutoIncrement</i> не обеспечивает уникальность значения поля, на которое это свойство распространяется. Это просто не его задача. На первый взгляд, это может показаться странным. Раз поле нельзя редактировать и значение нового поля получается путем прибавления некоторого значения к предыдущему, то где же тут взяться возможным повторам?</p>
<p>Ну, например, предположим, что изначально Вы создали простое поле типа Integer и создали несколько записей. Затем Вы решили, что лучше вместо типа Integer использовать тип Integer(Autoincrement) и модифицировали структуру уже существующей таблицы. Если Вы проявили неаккуратность и при настройке свойств автоинкремента оставили очередное значение автоинкремента равным 1, то новая запись будет создана со значением равным 1, несмотря на то, что возможно запись с таким значением уже существовала.</p>
<p>В связи с этим, если принципиально важным является именно уникальность значения поля с автоинкрементом, например, если Вы хотите использовать его как <a href="/sovety-nachinayushhim-chast-ii/#KeyTypes" target="_blank" rel="noopener noreferrer">суррогатный ключ</a>, то необходимо добавить такой контроль. Например, создав индекс типа Primary или Candidat. И не надеяться на то, что повторов "не может быть, потому что не может быть никогда". Повторюсь, свойство AutoIncrement не имеет никаких функций по контролю уникальности значения.</p>
<p>Пример использование полей типа AutoIncrement можно посмотреть в новой базе данных NorthWind.dbc из поставки VFP8. Эта база используется как пример "внешней" базы для уяснения работы с новым объектом FoxPro CursorAdapter</p>
<p>Свойство AutoIncrement является нововведением 8 версии FoxPro. И судя по всему, даже сами разработчики FoxPro не очень-то представляют, как его можно использовать.</p>
<p>Напрашивается решение использовать такое поле как уникальный идентификатор записи при генерации <a href="http://www.foxclub.ru/articles/art33.php#KeyTypes" target="_blank" rel="noopener noreferrer">суррогатного ключа</a>. Однако в "старых" стандартных примерах это свойство не используется. При генерации <a href="/sovety-nachinayushhim-chast-ii/#KeyTypes" target="_blank" rel="noopener noreferrer">суррогатного ключа</a> по-прежнему используют специальную функцию NewId() и хранение последнего использованного значения во временной таблице.</p>
<p>По большому счету, это можно списать на консерватизм программистов. Например, в примерах от FoxPro по-прежнему в качестве ключевого поля используется тип данных Character, хотя собственно значение - это автоинкрементное число, но записанное как символьная строка.</p>
<p>Да, есть ситуации, когда использование в качестве <a href="/sovety-nachinayushhim-chast-ii/#KeyTypes" target="_blank" rel="noopener noreferrer">суррогатного ключа</a> типа данных Character предпочтительнее, чем Integer. Но это задачи особой сложности, с которыми большинству программистов не придется сталкиваться (репликация).</p>
<p>Аналогично есть ситуации, когда использование функции для генерации уникального ключа (NewId()) предпочтительнее использования AutoIncrement (обновляемые Local View по подчиненным таблицам с одновременным редактированием нескольких записей главной таблицы). Но! Я бы не сказал, что такие задачи невозможно решить при использовании автоинкрементных полей. Хотя я согласен, при определенных обстоятельствах, использование автоинкрементых полей может потребовать несколько более сложного программирования, чем использование функции для генерации уникального ключа (NewId())</p>
<p>Здесь не место для подробного обсуждения решения подобных проблем, но вкратце решение сводится к следующему:</p>
<ul>
<li>Если главная таблица - это также Local View, то она должна иметь обязательно строковую буферизацию, а таблица-источник должна находится в табличной буферизации</li>
<li>При создании новой записи в главном Local View немедленно делаем сброс в буфер таблицы-источника</li>
<li>Поскольку в буфере таблицы-источника новое значение автоинкрементного поля уже создано, то можно тут же его прочитать и использовать для создания ссылки в подчиненном Local View</li>
<li>Найти новую запись в буфере таблицы-источника можно по максимальному значению автоинкрементного поля</li>
<li>По окончании редактирования осуществляется сброс буфера сначала из главной таблицы, потом из подчиненного Local View. Или же осуществляется откат, в случае отмены внесенных изменений</li>
</ul>
<p>А вот чего не следует делать при работе с автоинкрементыми полями, так это опираться на очередное значение, хранимое в заголовке таблицы. Т.е. то значение, которое возвращается в 17 столбце массива, создаваемого функцией AFIELDS().</p>
<p>Дело в том, что функция AFIELDS() считывает данные из буфера таблицы, а при добавлении новой записи новое значение автоинкремента берется непосредственно из таблицы-источника. Но это могут оказаться разные значения.</p>
<p>Представим себе ситуацию, когда два пользователя одновременно добавляют запись в таблицу. Причем таблицы находятся в режиме табличной буферизации. Предположим, что изначально в таблице не было ни одной записи и очередное значение автоинкрементного поля было равно 1</p>
<ul>
<li>Первый пользователь добавил новую запись в буфер. Значение в новой записи равно 1. Очередное значение автоинкремента в буфере таблицы равно 2 и очередное значение автоинкремента собственно в таблице равно 2.</li>
<li>Второй пользователь добавил новую запись в буфер. Значение в новой записи равно 2. Очередное значение автоинкремента в буфере таблицы равно 3 и очередное значение автоинкремента собственно в таблице равно 3.</li>
<li>А у первого пользователя очередное значение автоинкремента в буфере таблицы по-прежнему равно 2, хотя очередное значение автоинкремента собственно в таблице равно уже 3. И при создании новой записи будет использовано именно значение 3.</li>
</ul>
<p>Поэтому, при работе с автоинкрементыми полями в общем случае невозможно предсказать, какое значение будет у новой записи. Можно только прочитать это значение сразу после создания новой записи. А чтобы не перепутать записи, созданные разными пользователями, следует создавать новые записи, наложив на таблицу-источник табличную буферизацию.</p>
<p>Проще всего найти новую запись, опираясь на максимальное значение автоинкрементного поля, особенно, если по нему построен индекс:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  select MyTab  
  SET ORDER TO FieldAuto  
  GO BOTTOM  
  </pre>
</td>
</tr>

</table>
<p>В результате, указатель записи окажется на той записи, которая имеет максимальное значение ключа в соответствии с выражением индекса FieldAuto. А если выражение этого индекса состоит только из имени поля, то Вы и попадете на последнюю созданную запись.</p>
<p>Если же индекса нет, то можно найти новую запись, опираясь на тот факт, что новая запись физически добавляется в конец файла. Т.е. если отключить главный индекс, то новая запись будет самой последней</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  select MyTab  
  SET ORDER TO 0  
  GO BOTTOM  
  </pre>
</td>
</tr>

</table>
<p><i><u>К сведению</u></i></p>
<p>Существует команда, которая добавляет запись не в конец файла, а в указанное место. Это старая команда еще из DOS-версий FoxPro, которая называется INSERT (не надо путать ее с INSERT-SQL). Но данная команда оставлена только для совместимости с более ранними версиями и ее использование сопряжено с большим количеством ограничений. Так что, лучше ее не использовать.</p>
<h2 align="center"><b><a name="Delete"></a>Удаление записей в таблице</b></h2>
<p>Таблицы FoxPro - это прямые наследники формата DBASE. В этом формате процесс удаления записей разбит на 2 этапа. Сначала записи помечаются как удаленные, но физически все еще сохраняются в таблице. А для их физического удаления необходимо дать специальную команду. Причем физическое удаление требует эксклюзивного (единоличного) доступа к таблице.</p>
<p>Под термином "<b>удаление</b>" в FoxPro понимается именно установка метки на удаление, а не физическое удаление записи в таблице. Т.е. команды DELETE, DELETE-SQL физически не удаляют записи; триггер DELETE срабатывает при установке метки на удаление; триггер INSERT срабатывает при снятии метки на удаление (ну, и при физическом создании новой записи)</p>
<p>Чтобы записи, помеченные как удаленные, не отображались при работе с таблицами, используют специальную глобальную настройку</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  <b>SET DELETED ON</b>  
  </pre>
</td>
</tr>

</table>
<p>Здесь несколько "нелогичная" настройка: ON - прячет записи, помеченные как удаленные (учитывает такие записи), а OFF - наоборот, отображает такие записи (игнорирует, не учитывает такие записи).</p>
<p>Следует помнить, что при использовании <i>Private DataSession</i> настройка SET DELETED сбрасывается в значение по умолчанию (OFF). Т.е. при открытии <i>Private DataSession</i> необходимо позаботиться о корректной настройке среды данных.</p>
<p>Для физического удаления записей ранее помеченных как удаленные, используется специальная команда "<b>PACK</b>". Следует помнить, что в отличие от команд на удаление (DELETE, DELETE-SQL) данная команда требует открытия таблицы в режиме EXCLUSIVE. Что, как правило, недопустимо при работе в сетевом режиме. Для преодоления этого противоречия используется одна из 2 стратегий программирования:</p>
<ul>
<li><b>При создании новых записей использовать записи ранее помеченные как удаленные</b></li>
<li><b>Вынести выполнение команды PACK в специальные служебные процедуры по обслуживанию базы данных</b></li>
</ul>
<h3><b><a name="ReUse"></a>При создании новых записей использовать записи ранее помеченные как удаленные</b></h3>
<p>В принципе, тут возможны два варианта решения: восстанавливать ранее удаленные записи (командой RECALL) или вместо удаления записей по команде DELETE менять содержимое специально созданного для этой цели поля, как раз и определяющего - удалена запись или нет.</p>
<p>В любом случае, данная стратегия предполагает отказ от целого ряда команд и функций которые так или иначе могут автоматически создавать новые записи (APPEN BLANK, APPEND FROM, INSERT-SQL, буферизация, обновляемые Local View и т.п.). А создание новых записей осуществлять через специальную функцию, которая сначала ищет запись, помеченную как удаленная, и использует ее как новую запись.</p>
<p>К недостаткам данного способа следует еще отнести относительную сложность процедуры вставки новой записи. Тут недостаточно сделать просто LOCATE + RECALL. Все несколько сложнее. Достаточно много нюансов блокировки при работе в многопользовательском режиме.</p>
<p>Попробуйте, например, прикинуть какие потребуются действия, чтобы при создании новой записи "одновременно" двумя пользователями не произошло затирание информации, введенной одним из пользователей. Т.е. два пользователя "одновременно" сделали LOCATE, но RECALL естественно сделал только один из них. Как заставить другого пользователя отказаться от притязаний на обладание найденной записью в пользу первого, сделавшего RECALL? Разумеется, задача решаемая. Я просто хочу показать, что она достаточно не тривиальна.</p>
<p>Кроме того, данная стратегия фактически запрещает использовать Memo-поля. Почему? Да потому, что при работе с Memo-полями время от времени необходимо давать команду PACK. Это связано с особенностью работы с <a href="/sovety-nachinayushhim-chast-iv/#Memo">memo-полями</a>. Подробнее об этих особенностях читайте в разделе "<a href="/sovety-nachinayushhim-chast-iv/#TypeData">Типы данных</a>". Ну а если все равно приходится давать команду PACK, то какой смысл во всех этих сложностях?</p>
<p>Итого, получается, что использование данной стратегии накладывает значительные ограничения на программиста.</p>
<p>После всех этих рассуждений, возникает вопрос, который следовало бы задать с самого начала. А когда реально нет возможности выполнить команду PACK?</p>
<p>Нет возможности выполнить команду PACK, когда приложение работает в многопользовательском режиме и невозможно его остановить даже на профилактику, хотя бы на полчаса раз в год.</p>
<p>Разумеется, такие задачи тоже существуют. Но! Если у Вас стоит именно такая задача, то выбор в качестве хранилища данных таблиц DBASE - это весьма странный выбор. Дело тут не в том, что такую задачу сложно решить при помощи таблиц DBASE, а в том, что такие задачи предъявляют повышенные требования, как к надежности, так и к объему (количеству записей) базы данных. Т.е. в большинстве случаев требования таких задач заведомо превышают физические возможности формата хранения данных в таблицах DBASE.</p>
<h3><b><a name="ProcPack"></a>Вынести выполнение команды PACK в специальные служебные процедуры по обслуживанию базы данных</b></h3>
<p>А вот это стандартный способ решения данной проблемы. Имеется в виду, что в Вашем приложении будет специальный пункт меню (или отдельная программка), которая так и называется "Очистка базы данных". И время от времени, либо сам пользователь, либо системный администратор будут запускать ее на выполнение.</p>
<p>Казалось бы, есть более простое решение: давать команду PACK при каждом входе (выходе) из программы. Однако это лишь кажущаяся простота.</p>
<p>Если Вы разрабатываете программу для одного пользователя, то в принципе такая стратегия оправдана. Но при работе в сетевом (многопользовательском) режиме данная стратегия приведет к тому, что часть пользователей просто не сможет с первого раза войти в программу, поскольку в этот момент другой пользователь будет "держать" таблицы в режиме EXCLUSIVE.</p>
<p>Кроме того, нет особой необходимости физически удалять записи, помеченные как удаленные, непосредственно в момент (или в том сеансе данных) когда произошла установка метки на удаление. При наличии небольшого количества записей помеченных как удаленные скорость работы (выполнения запросов, поиск данных) упадет незначительно. Ну, будет немного "мусора", ну и что?</p>
<p>Т.е. необходимость в физическом удалении записей ранее помеченных как удаленные возникает только тогда, когда их количество превышает некоторый предел. В результате, приложение начинает работать заметно медленнее - заметно для пользователя. Оценить этот предел достаточно проблематично, поскольку он зависит от многих факторов. Поэтому логично просто безо всяких проверок и оценок с определенной периодичностью (раз в месяц, раз в квартал, раз в полгода) запускать процедуру очистки базы данных. Периодичность запуска этой процедуры зависит от интенсивности удаления записей в Вашей программе.</p>
<p>Еще замечу, что если открыть в режиме EXCLUSIVE собственно базу данных, то другой пользователь не сможет открыть ни одну из таблиц базы данных. Это упрощает создание такой процедуры очистки базы данных.</p>
<p>&nbsp;</p>
<p>Вывод однозначен. <b>Использование специальной процедуры очистки базы данных от записей помеченных как удаленные предпочтительнее во всех смыслах перед повторным использованием ранее удаленных записей.</b></p>
<h3><b><a name="IndexDeleted"></a>Следует ли создавать индекс по выражению Deleted()</b></h3>
<p>О чем вообще речь? Дело в том, что для ускорения выборок данных в FoxPro используется специальная технология, называемая Rushmore - оптимизация. Что это такое в данном случае не важно. Важным является тот факт, что данная технология для ускорения выборки использует индексы. Без индексов она просто не работает.</p>
<p>Так вот, факт наличия удаленных записей в таблице хотя и отсекается настройкой SET DELETED ON, но, тем не менее, влияет на факт оптимизации запроса. По существу, настройка SET DELETED ON - это специфический фильтр, накладываемый на таблицу или дополнительное (неявное) условие выборки записей. Ну, а раз есть условие, но по нему нет индекса, то это приводит к снижению уровня Rushmore-оптимизации.</p>
<p>В связи с этим, в литературе советуют создавать индекс по выражению Deleted() примерно такого вида</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> INDEX ON Deleted() TAG Udal</pre>
</td>
</tr>

</table>
<p>Так вот, несмотря на то, что создание такого индекса приведет к улучшению Rushmore - оптимизации, но в подавляющем большинстве случаев это приведет к <u>замедлению</u> получения выборки. Подробнее о причинах такого поведения читайте в разделе <a href="/sovety-nachinayushhim-chast-iii/#HowMuch" target="_blank" rel="noopener noreferrer">Сколько и каких индексов надо создавать</a></p>
<p>Т.е. я бы <u>НЕ</u> рекомендовал Вам создавать подобный индекс.</p>
<h3><b><a name="Zap"></a>Команда ZAP</b></h3>
<p>Для физического удаления записей в таблице существует еще одна команда: ZAP. Данная команда предназначена для физического удаления вообще всех записей таблицы. Т.е. ее использование по результатам действия эквивалентно такой последовательности команд:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  select MyTab  
  DELETE ALL  
  PACK  
  </pre>
</td>
</tr>

</table>
<p>Однако есть и отличия. Дело в том, что при использовании команды DELETE срабатывают все связанные с данной операцией триггеры на удаление. Если, например, триггер на удаление запретит удаление какой-либо записи, то она и не сможет быть удалена.</p>
<p>Так вот, команда ZAP не вызывает срабатывание триггеров на удаление. Просто удаляет все записи таблицы без каких-либо проверок. В связи с такой особенностью, FoxPro при использовании данной команды обязательно попросит подтвердить Ваше решение удалить все записи. Подавить выдачу такого системного подтверждения, можно сделав настройку SET SAFETY OFF.</p>
<p>Также как и команда PACK, команда ZAP требует открытия таблицы в режиме EXCLUSIVE.</p>
<h2 align="center"><b><a name="Stored"></a>Хранимые процедуры</b></h2>
<p><b>Хранимые процедуры - это те процедуры, которые хранятся в <a href="/sovety-nachinayushhim-chast-i/#DataBase" target="_blank" rel="noopener noreferrer">контейнере базы данных</a>.</b></p>
<p>Под словом "хранятся" здесь понимается именно физическое расположение. Т.е. хранимые процедуры физически расположены в <a href="/sovety-nachinayushhim-chast-i/#DataBase" target="_blank" rel="noopener noreferrer">контейнере базы данных</a>.</p>
<p>Если интересно, где именно они хранятся, то можете открыть базу данных как таблицу и увидеть, что текст "хранимых процедур" хранится в Memo-поле "Code". В строке со значением поля ObjectName = "StoredProceduresSource" исходный текст "хранимых процедур", а в строке со значением поля ObjectName = "StoredProceduresObject" - откомпилированный текст. В принципе, если Вы желаете скрыть от слишком "продвинутого" пользователя исходный текст "хранимых процедур", то Вы можете смело очистить содержимое поля Code для строки со значением поля ObjectName = "StoredProceduresSource", поскольку в процессе работы используется не исходный, а откомпилированный текст "хранимых процедур".</p>
<p>"Хранимые процедуры" становятся доступны в момент открытия <a href="/sovety-nachinayushhim-chast-i/#DataBase" target="_blank" rel="noopener noreferrer">контейнера базы данных</a>, а <a href="/sovety-nachinayushhim-chast-i/#DataBase" target="_blank" rel="noopener noreferrer">контейнер базы данных</a> автоматически открывается при открытии любой таблицы включенной в базу данных. Таким образом, "Хранимые процедуры" можно использовать сразу после открытия таблицы без каких-либо дополнительных команд типа SET PROCEDURE.</p>
<p>&nbsp;</p>
<h3><b><a name="TaskStored"></a>Для чего нужны хранимые процедуры</b></h3>
<p>А зачем вообще понадобилось хранить какие-то процедуры внутри <a href="/sovety-nachinayushhim-chast-i/#DataBase" target="_blank" rel="noopener noreferrer">контейнера базы данных</a>? Разве недостаточно использовать обычные процедурные файлы?</p>
<p>Причина здесь в том, что требуется обеспечить доступ к определенным процедурам вне зависимости от того, запущено приложение или нет. Например, если была создана некоторая процедура, которая проверяет допустимость операции создания новой записи (триггер на вставку), то эта процедура должна быть запущена, в момент попытки вставить новую запись, вне зависимости от того запущено ли соответствующее приложение или нет. В противном случае, например, на этапе отладки, Вы рискуете серьезно нарушить целостность и непротиворечивость Вашей базы данных.</p>
<p>Исходя из данного предназначения хранимых процедур, становится ясно, какие именно процедуры и функции стоит в ней хранить, а какие нет.</p>
<hr />
<blockquote><p><b>Если процедура или функция обеспечивает целостность и непротиворечивость данных вне зависимости от приложения, то такую процедуру или функцию следует хранить в "Хранимых процедурах"</b></p></blockquote>
<hr />
<p>Определение получилось несколько мудреное. Если сказать то же самое проще, то в "Хранимых процедурах" должны хранится те процедуры и функции, вызов которых прописывается в свойствах таблиц или контейнера базы данных. Имеется в виду, что когда Вы вызываете режим модификации таблицы, то там есть ряд мест, где можно написать вызов функции (Rule, Triggers, Default). Вот те функции, которые там вызываются и должны быть записаны в "хранимых процедурах".</p>
<p>"Хранимые процедуры" - это обычные процедуры и функции FoxPro. Т.е. из них может быть организован вызов других процедур и функций. Так вот, эти "подчиненные" процедуры и функции также должны хранится внутри "хранимых процедур". Вообще, крайне нежелательно изнутри "хранимых процедур" обращаться во вне <a href="/sovety-nachinayushhim-chast-i/#DataBase">базы данных</a>. Ведь основное назначение "хранимых процедур" - это обеспечение некоторых действий вне зависимости от "внешнего мира"</p>
<p>&nbsp;</p>
<h3><b><a name="WorkStored"></a>Особенности работы с хранимыми процедурами</b></h3>
<p>Поскольку физически "хранимые процедуры" хранятся в <a href="/sovety-nachinayushhim-chast-iv/#Memo">Memo-полях</a>, то в связи с определенными особенностями по работе с <a href="/sovety-nachinayushhim-chast-iv/#Memo">Memo-полями</a> после внесения исправлений в "хранимые процедуры" следует выполнить <a href="/sovety-nachinayushhim-chast-i/#DataBase" target="_blank" rel="noopener noreferrer">очистку базы данных</a> для уменьшения размера файла DCT и удаления неиспользуемого пространства.</p>
<p>"Хранимые процедуры" можно выгрузить в текстовый файл командой COPY PROCEDURES и соответственно загрузить командой APPEND PROCEDURES. Т.е. в принципе, можно динамически добавлять/удалять хранимые процедуры, хотя я не советовал бы заниматься этим новичкам. Слишком велик риск, разрушить все правила целостности базы данных.</p>
<p>Список имен всех "хранимых процедур" текущей базы данных можно получить по команде DISPLAY PROCEDURES (или LIST PROCEDURES)</p>
<h2 align="center"><b><a name="Relation"></a>Связи и отношения между таблицами</b></h2>
<p>Как обычно, в FoxPro существует путаница и с этим понятиями. Точнее так, эта путаница возникла при включении в среду FoxPro такого объекта как <a href="/sovety-nachinayushhim-chast-i/#DataBase" target="_blank" rel="noopener noreferrer">Контейнер базы данных</a>. Впрочем, по порядку.</p>
<p>Итак, в FoxPro термин "связь" или "отношение" применяется в следующих случаях</p>
<ul>
<li><b>Постоянная связь</b> - это некоторый графический объект, визуально отображающий взаимосвязь двух таблиц между собой в <a href="/sovety-nachinayushhim-chast-i/#DataBase" target="_blank" rel="noopener noreferrer">контейнере базы данных</a></li>
<li><b>Связь</b> - это некоторая настройка, накладываемая на две таблицы и определяющая положение указателя записи в подчиненной таблице при перемещении указателя записи в главной таблице</li>
<li><b>Связь</b> - это некоторый графический объект, визуально отображающий взаимосвязь таблиц в предыдущем смысле, но отображаемая в DataEnvironment формы или отчета</li>
</ul>
<p>Ну, третий вариант термина "связь" я здесь рассматривать не буду, поскольку это фактически просто визуализация термина "связь" во втором его смысле. Поэтому подробно рассмотрю только первые два определения</p>
<p>&nbsp;</p>
<h3><b><a name="PersistentRelationship"></a>Постоянная связь (persistent relationship)</b></h3>
<p>Повторю здесь еще раз свое определение термина "постоянная связь"</p>
<p><b>Постоянная связь</b> - это некоторый графический объект, визуально отображающий взаимосвязь двух таблиц между собой в <a href="/sovety-nachinayushhim-chast-i/#DataBase" target="_blank" rel="noopener noreferrer">контейнере базы данных</a></p>
<p>Обращаю внимание на то, что это именно "графический объект". Он не несет за собой никакого физического смысла.</p>
<p>Но если "постоянная связь" не имеет физического смысла, то для чего же она используется? Вероятно, точнее, следовало бы определить "постоянную связь", как некоторый шаблон, который используется при создании других объектов. Собственно, я знаю только о трех применениях "постоянной связи"</p>
<ul>
<li>Для настройки и создания определенного вида триггеров в <a href="/sovety-nachinayushhim-chast-v/#ReferentialIntegrity">Referential Integrity</a></li>
<li>Автоматически предлагает создать обычную связь между таблицами, при включении их в DataEnvironment формы или отчета</li>
<li>Автоматически предлагает взаимосвязь нужного вида JOIN при включении таблиц в дизайнер запросов (Query или Local View)</li>
</ul>
<p>Обратите внимание, что связь в DataEnvironment (или в дизайнере запросов) уже не имеет никакого отношения к "постоянной связи" в <a href="/sovety-nachinayushhim-chast-i/#DataBase" target="_blank" rel="noopener noreferrer">контейнере базы данных</a>.</p>
<p>Да, она может быть создана автоматически на основе существующей "постоянной связи", но это будет исключительно рекомендация, с которой Вы можете согласиться или НЕ согласиться и удалить ее из DataEnvironment (или в дизайнере запросов)</p>
<p>Программно "постоянная связь" настраивается через команду ALTER TABLE, используя ключевое слово REFERENCES. "Постоянная связь" всегда устанавливает связь между тэгами структурных индексных файлов связываемых таблиц. Причем хотя бы в одной из таблиц этот тэг должен иметь тип "Primary". Т.е. связь должна быть либо один-к-одному, либо один-ко-многим. Но никак не много-ко-многим.</p>
<p>Связь вообще и "постоянную связь" в частности нельзя настроить дважды между одними и теми же таблицами. Пусть и по разным критериям. В FoxPro такое недопустимо, даже если связь осуществляется через таблицы посредники.</p>
<p>Т.е. если уж вы настроили связь между двумя таблицами, то другую связь между этими же таблицами Вы можете создать только взамен существующей, но никак не одновременно с ней. Попытка организации такой связи вызовет сообщение об ошибке.</p>
<p>"Постоянная связь" может быть настроена "сама на себя". Т.е. можно установить постоянную связь между двумя индексами одной и той же таблицы. Это имеет смысл, если таблица имеет "древовидную" структуру и Вы хотите установить <a href="/sovety-nachinayushhim-chast-v/#Trigger">триггер</a> на удаление по типу "Restrict" (установить <a href="/sovety-nachinayushhim-chast-v/#Trigger">триггер</a> на удаление по типу "Cascade" - не получится, точнее он не будет работать, поскольку в FoxPro запрещена рекурсия триггеров).</p>
<p>Конечно, можно использовать "постоянную связь" и в качестве визуализации взаимоотношений таблиц в <a href="/sovety-nachinayushhim-chast-i/#DataBase" target="_blank" rel="noopener noreferrer">контейнере базы данных</a>. Я имею в виду, что когда Вы открываете <a href="/sovety-nachinayushhim-chast-i/#DataBase" target="_blank" rel="noopener noreferrer">контейнер базы данных</a> на модификацию, то Вы видите некоторую картинку структуры базы данных. Вы можете передвинуть объекты так, чтобы визуально проще было понять структуру <a href="/sovety-nachinayushhim-chast-i/#DataBase">базы данных</a>.</p>
<p>Так-то оно так, да вот FoxPro имеет весьма слабый инструментарий для полноценного проектирования базы данных. Вот и эта картинка. Физически она хранится в файле ресурсов FoxUser.dbf (fpt). Т.е. если Вы переносите проект на новое место (в другую папку, на другой компьютер), то чтобы картинка не сбилась, надо будет захватить и файл ресурсов. Подробнее о том, как это сделать читайте в разделе <a href="/sovety-nachinayushhim-chast-i/#MainDirectory">Содержимое главной директории проекта</a></p>
<p>Проблема в том, что файл ресурсов время от времени приходится удалять или хотя бы чистить. Т.е. есть серьезный риск, что через месяц другой, картинка все-таки собьется. После двух...трех таких восстановлений останется только плюнуть на эту возню и заняться чем-то более полезным.</p>
<p>Для полноценного проектирования базы данных лучше использовать другие продукты, которые имеют общее название: <i>Case - средства для проектирования базы данных</i>. Из наиболее известных это:</p>
<ul>
<li>Power Designer - считается самым лучшим</li>
<li>ERWin - пожалуй, самый известный в паре с BPWin</li>
<li>Visio - знаменит тем, что это продукт MicroSoft, который был русифицирован, и можно найти бесплатную версию в Internet</li>
</ul>
<p>В принципе была попытка создать полноценное средство для проектирования базы данных в FoxPro. Этот продукт получил название FoxCase. Но ни широкого распространения, ни полноценного развития он так и не получил.</p>
<p>&nbsp;</p>
<h3><b><a name="OrdinaryRelationship"></a>Связь (обычная)</b></h3>
<p>В принципе, в противовес "постоянной связи" этот вид связи следовало бы назвать "временная связь". В том смысле, что данный тип связи устанавливается "по требованию". Т.е. вот надо мне в этом месте организовать связь, я тут же ее и организовываю, используя команду SET RELATION. Отпала в ней надобность - тут же и удаляю. Или она сама удалится при закрытии одной из связанных таблиц.</p>
<p>Это так надо бы было назвать, но дело в том, что данный вид связи исторически появился раньше, чем "постоянная связь". Еще в версии FoxPro for DOS. Когда "постоянной связи" еще в проекте не было. А поскольку не было необходимости этот вид связи от чего-то отличать, то его так и назвали "связь". Без каких-либо уточняющих прилагательных.</p>
<p>Поэтому, когда в FoxPro используют термин "связь", то, скорее всего, речь идет именно об этой связи. Если же говорят о "постоянной связи", то обязательно добавляют уточняющее прилагательное "постоянная".</p>
<p>Итак, что же такое "связь" в FoxPro</p>
<hr />
<p><b>Связь</b> - это некоторая настройка, накладываемая на две таблицы и определяющая положение указателя записи в подчиненной таблице при перемещении указателя записи в главной таблице</p>
<hr />
<p>Все. На этом функции связи заканчиваются. Более того, связь действует только до тех пор, пока вы находитесь в рабочей области главной таблицы. Стоит Вам перейти в рабочую область подчиненной таблицы, как всякие ограничения перестают действовать, и Вы можете спокойно переместить указатель записи на абсолютно любую запись.</p>
<p>Можно сказать, что связь - это взгляд на подчиненную таблицу со стороны главной. Не то, что есть подчиненная таблица на самом деле, а то, как ее видит главная таблица. Изменяя "точку зрения" (текущую рабочую область) мы по-другому видим и подчиненную таблицу.</p>
<p>Между парой таблиц нельзя установить несколько связей одновременно. Неважно, сколько таблиц посредников было использовано. Попытка установить дублирующую связь вызовет сообщение об ошибке. Ну, действительно, если бы было настроено сразу две связи, то на какую запись в подчиненной таблице надо было бы установить указатель записей при перемещении в главной таблице? Вот возникновение данной неопределенности и является причиной подобного запрета.</p>
<p>В отличие от "постоянной связи", обычная связь не требует наличия <a href="/sovety-nachinayushhim-chast-iii/#Index" target="_blank" rel="noopener noreferrer">индекса</a> в главной таблице, но вот в подчиненной таблице <a href="/sovety-nachinayushhim-chast-iii/#Index" target="_blank" rel="noopener noreferrer">индекс</a> должен быть и более того, этот <a href="/sovety-nachinayushhim-chast-iii/#Index" target="_blank" rel="noopener noreferrer">индекс</a> должен быть главным. Одна из распространенных ошибок - это переключение главного <a href="http://www.foxclub.ru/articles/art35.php#Index" target="_blank" rel="noopener noreferrer">индекса</a> в подчиненной таблице. При этом настроенная связь не разрывается, но вот результат ее действия становится весьма неопределенным.</p>
<p>Еще одна тонкость заключается в том, что связь можно настроить не по полному, а по частичному (по первым символам) совпадению ключа. Разумеется, если используется настройка SET EXACT OFF (это настройка по умолчанию).</p>
<p>Например, если подчиненная таблица имеет 2 поля ParentID и NickName и требуется упорядочить записи в пределах каждого значения ParentID в алфавитном порядке NickName, то в подчиненной таблице строится примерно такой индекс:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> INDEX ON ParentID+NickName TAG SortOrd</pre>
</td>
</tr>

</table>
<p>Здесь я предполагаю, что ParentID - это поле символьного типа. Тогда в главной таблице настраивается связь по выражению только ParentID</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode"> SET RELATION TO ParentID INTO ChildTab</pre>
</td>
</tr>

</table>
<p>В результате, связь между таблицами будет настроена по значению поля ParentID, но в пределах одного значения ParentID в подчиненной таблице записи буду упорядочены в алфавитном порядке значений поля NickName</p>
<p>Строго говоря, команда SET RELATION TO устанавливает связь по типу один-к-одному. Т.е. если реально связь имеет вид один-ко-многим, то Вы не увидите этих "многих". Отображаться будет только первая попавшаяся запись дочерней таблицы. Для установки связи один-ко-многим после команды SET RELATION TO следует дать команду SET SKIP TO. В подавляющем большинстве случаев использовать команду SET SKIP TO нет необходимости. Надобность в ней возникает только в случае визуального отображения связи вида один-ко-многим. Если речь идет о программировании, то стоит ограничиться только командой SET RELATION TO</p>
<p>Если Вы работаете с DataEnvironment формы или отчета, то установка связи между таблицами фактически означает команду SET RELATION. А установка значения свойства объекта Relation.OneToMany = .T. фактически означает команду SET SKIP TO. Еще раз напомню, для правильной работы связи просто необходимо установить главный индекс в подчиненной таблице. Т.е. свойство Order соответствующего объекта Cursor. Индекс главной таблицы на работу связи никак не влияет.</p>
<p><b>Особенности работы SET RELATION в Grid (Browse - окне)</b></p>
<p>Если главную таблицу Вы отображаете в одном Grid, а подчиненную в другом, то только одна команда SET RELATION TO (без дополнительной команды SET SKIP TO) даст эффект отображения данных вида один-ко-многим. Т.е. при перемещении указателя записей в главном Grid в подчиненном автоматически будут отображаться только записи соответствующие текущей записи главной таблицы. Без каких-либо дополнительных настроек и программирования.</p>
<p>Если данные и главной и подчиненной таблицы Вы отображаете в одном Grid, то требуется дать команду SET SKIP TO для визуализации связи один-ко-многим. При этом строки главной таблицы, которым соответствует "много" записей в подчиненной таблице будут отображать свое содержимое только для первой записи подчиненной таблицы, а содержимое остальных строк будет отображаться в виде "квадратиков"</p>
<p>В Grid существует набор свойств, которые позволяют организовать связь с главной таблицей, если в Grid отображается содержимое подчиненной таблица (ChildOrder, LinkMaster, RelationExp). Но я не советовал бы их использовать, поскольку их настройка "наложится" на настройку объекта Relation в DataEnvironment и результат выйдет совершенно непредсказуемый. Лучше настраивать связь в том объекте, который для этого собственно и предназначен.</p>
<p><b>Особенности работы SET RELATION в отчетах (Report)</b></p>
<p>Если таблицы имеют связь вида один-ко-многим, то для печати в отчете этих "многих" обязательно следует использовать команду SET SKIP TO (для DataEnvironment настроить Relation.OneToMany = .T.). В этом случае строки главной таблицы, которые имеют несколько записей в подчиненной таблице "размножатся"</p>
<p>&nbsp;</p>
<h3><b><a name="WhenRelationship"></a>Когда следует использовать связь</b></h3>
<p>Ну, с "постоянной связью" все относительно просто. Ее следует использовать, если Вы собираетесь построить <a href="/sovety-nachinayushhim-chast-v/#ReferentialIntegrity">Referential Integrity</a>. Просто все остальные способы использования "постоянных связей" не стоят усилий по их созданию.</p>
<p>А вот с "обычной" связью все не так однозначно.</p>
<p>Дело в том, что связь имеет смысл при отображении данных (Grid, Browse, Report), а при программировании зачастую удобнее пользоваться прямым поиском в дочерней таблице через LOCATE или SEEK() (не всегда, но "как правило").</p>
<p>Да и при просмотре не все так гладко. Есть несколько проблем, которые в принципе решаемы при помощи связей, но приводят к заметному (для пользователя) "притормаживанию" приложения:</p>
<ul>
<li>На подчиненную таблицу требуется наложить дополнительный фильтр</li>
<li>Необходимо иметь возможность изменения сортировки подчиненной таблицы</li>
</ul>
<p>Эти и ряд других проблем решаются с помощью создания выборок (Select-SQL) или Local View. Когда отображается не вся таблица, а только нужная ее часть. Некое подобие клиент-серверной технологии. Но в этом случае фактически отпадает надобность в установке связи, поскольку вся необходимая информация и так отбирается в запросе или Local View.</p>
<p>В результате получается, что связи имеют смысл, только когда не требуется никакой дополнительной обработки подчиненной таблицы. А в современных задачах это достаточно редкая ситуация. Попробуйте объяснить пользователю, почему это он не может отсортировать Grid, щелкнув по заголовку столбца. Какая еще связь нарушится? А мне хочется!</p>
<p>Так что же, связи вообще не нужны? Ну, почему же. Просто они, как и индексы для сортировки (имею в виду индексы, необходимые для <i>отображения</i> информации в нужном порядке) перешли в разряд "второстепенных" инструментов и используются не на основных таблицах, а на временных выборках и Local View.</p>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4899">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4899">Владимир Максимов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Владимир Максимов" href="https://foxclub.ru/account/?user=4899">
				<img alt='' src='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 65<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-iv/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Статьи]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/indeksy-bystrogo-prigotovleniya/</link>
					<title><![CDATA[Индексы быстрого приготовления]]></title>
                    					    <author><![CDATA[GoodMan]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:26 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Индексы быстрого приготовления</h1>
													</header>
													<div id="sol_opis">Эти функции пригодятся, когда нужно на скорую руку построить индексы в произвольном нарастании/убывании, по полям разных типов в VFP или FPD, или почему-то "правильный" индекс не работает.</div>
<div id="sol_body">
<h3>Индексы быстрого приготовления</h3>
<p> *******************************************************************<br /> *           Индексы быстрого приготовления                        *<br /> *                                                                 *<br /> * 1.   Назначение                                                 *<br /> * Нередко возникает задача создания сложного индекса, содержащего *<br /> * поля таблицы  разных типов.  В общем случае эта задача не имеет *<br /> * однозначного решения, зато в ней  имеются забавные подвохи.     *<br /> *    Предлагаемое  решение  позволяет  строить индексы,  даже  не *<br /> * зная  типов  используемых  переменных  и  полей  таблицы.  Плюс *<br /> * произвольно  назначать  нарастание/убывание  для  любого  поля, *<br /> * входящего в индекс. При желании  можно  оптимизировать исходные *<br /> * функции   для   собственных   целей.   Для   маломерных  таблиц *<br /> * оптимизация и не потребуется.                                   *<br /> *                                                                 *<br /> * 2.   Структура программы                                        *<br /> * 2.1. Создаются вспомогательные константы.                       *<br /> * 2.2. Синтезируется тестовая таблица на 100 000 записей,         *<br /> *      заполненная случайными значениями.                         *<br /> * 2.3. Таблица индексируется.                                     *<br /> * 2.4. Индексированная таблица копируется во вторую таблицу для   *<br /> *      удобства просмотра.                                        *<br /> * 2.5. Тестовые файлы и папка удаляются.                          *<br /> *                                                                 *<br /> * 3.   Прочее                                                     *<br /> * 3.1. Предусмотрена работа под FoxPRO 2...8                      *<br /> *                                                                 *<br /> * 4. Благодарности принимаютсяна ник GoodMan                      *<br /> *                                                                 *<br /> *                                                                 *<br /> ******************** 13 апреля 2004 *******************************</p>
<p> SET CENTURY ON<br /> SET TALK OFF<br /> SET ECHO OFF<br /> SET DATE ANSI<br /> SET HOURS TO 24<br /> SET BLOCKSIZE TO 64<br /> SET PROCEDURE TO myindex<br /> PUBLIC records_in_sample<br /> records_in_sample=100000  &&  число записей в тестовой таблице</p>
<p> DO dbfsample   &&  изготовление тестовой таблицы<br /> DO charset     &&  подготовка вспомогательных символьных констант </p>
<p> SET DEFAULT TO C:_myindex<br /> SELECT 1</p>
<p> INDEX ON (descend1("char_1")+ascend1("logic_1")+descend1("numer_1"));<br />                                                                     ;<br />                                             TO myindex.cdx COMPACT</p>
<p> COPY TO dbf2<br /> SELECT 2<br /> USE dbf2<br /> CLEAR<br /> BROWSE LAST</p>
<p> DO goodby  && удаление тестовых файлов и папки C:_MYINDEX</p>
<p> *QUIT</p>
<p> *--ASCEND1***********************************<br /> * преобразование аргумента в текстовую      *<br /> * константу с характеристикой ASCENDING     *<br /> *********************************************<br /> FUNCTION ascend1<br /> PARAMETER cur_obj<br /> PRIVATE cur_obj, obj_type, obj_value<br /> obj_type=TYPE(cur_obj)<br /> DO CASE<br />    CASE (obj_type $ "CM")   && идентификация аргументов CHAR и MEMO<br />      obj_value=LEFT(ALLTRIM(LEFT(&cur_obj,254)),20)<br />    CASE (obj_type $ "NY")   && идентификация аргументов NUMERIC и CURRENCY<br />      Cur_obj=&cur_obj<br />      DO CASE<br />         CASE cur_obj>0   <br />           Obj_value=PADL(STR(LOG(cur_obj)+3000,12,7),12,"0")<br />         CASE cur_obj=0<br />           Obj_value="2000.0000000"<br />         CASE cur_obj0   <br />          Obj_value=PADL(STR(-LOG(cur_obj)+1000,12,7),12,"0")<br />        CASE cur_obj=0<br />          Obj_value="2000.0000000"+REPLICATE("0",12)<br />        CASE cur_obj= 3)<br /> * Делаем тестовую таблицу для VFP 3...8...<br /> CREATE TABLE  MYINDEX    ;<br />      ( logic_1  L( 1),   ;<br />        char_1    C( 10), ;<br />        numer_1 N(15,3),  ;<br />        curren_1 Y( 8),   ;<br />        memo_1    M     , ;<br />        date_1     D( 4), ;<br />        datetime_1  T( 8) )</p>
<p> USE C:_myindexmyindex</p>
<p> tmp=RAND(-1)<br /> i1=1</p>
<p> DO WHILE i1 																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/updated-sql_grid-klass-grida-pozvolyayushhij-sochetat-moshh-skvoznyh-zaprosov-pass-through-k-sql-subd-ili-k-drugim-odbc-istochnikam-s-udobstvom-raboty-prevyshayushhim-udobstva-raboty-s-udal/</link>
					<title><![CDATA[Updated! SQL_Grid &#8211; класс Grid&#8217;а, позволяющий сочетать мощь сквозных запросов (pass-through) к SQL СУБД (или к другим ODBC-источникам) с удобством работы, превышающим удобства работы с удал. предст-ми]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:26 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Updated! SQL_Grid &#8211; класс Grid&#8217;а, позволяющий сочетать мощь сквозных запросов (pass-through) к SQL СУБД (или к другим ODBC-источникам) с удобством работы, превышающим удобства работы с удал. предст-ми</h1>
													</header>
													<div id="sol_opis">Updates: исправлена мелкая ошибка, иногда возникавшая при удалении - обновление не отправлялось на сервер.   Аналогично удаленным представлениям, на стороне клиента работа с данными сводится к операциям с локальным буферизированным курсором, полученным с SQL-сервера. Все изменения в курсоре могут автоматически или принудительно переданы на SQL-сервер с помощью модифицирующих SQL-выражений, записанных в специальных свойствах. Все выражения независимы друг от друга и могут содержать любые корректные для конкретного SQL-сервера команды (выборки, вызовы процедур и т.п.) Может использоваться также как обычный GRID  источников данных, требующих закрытия/открытия источника данных. Также содержит возможность подсветки строки. Подсветка производится любым объектом, производным от базового класса Shape и расположенным в том же родительском контейнере, что и объект, производный от класса Sql_Grid.  Создан в VFP 5.0</div>
<div id="sol_body">Аналогично удаленным представлениям, на стороне клиента работа с данными сводится к операциям с локальным буферизированным курсором, полученным с SQL-сервера. Все изменения в курсоре могут автоматически или принудительно переданы на SQL-сервер с помощью модифицирующих SQL-выражений, записанных в специальных свойствах. Все выражения независимы друг от друга и могут содержать любые корректные для конкретного SQL-сервера команды (выборки, вызовы процедур и т.п.) </p>
<p> Может использоваться также как обычный GRID  источников данных, требующих закрытия/открытия источника данных (в обычном GRID'е после переоткрытия данные будут не видны) - методы <b>Save_DS</b> (применяется перед закрытием) и <b>Rest_DS</b> (применяется после переоткрытия источника данных). </p>
<p> Также содержит возможность подсветки строки. Подсветка производится любым объектом, производным от базового класса <b>Shape</b> и расположенным в том же родительском контейнере, что и объект, производный от класса <b>Sql_Grid</b>. Для ссылка на такой объект используется свойство <b>Hlt_Shape</b>. Внутри библиотеки <b>sql_grid.vcx</b> содержится специальный класс <b>Hlt_Shape</b>, для использования в качестве строки подсветки и класс <b>Hlt_Text</b> - textbox для лучшего использования строки подстветки. Хотя их использование и не обязательно (подробнее в соответствующем разделе).</p>
<p>  <b><u>Кратко о возможностях:</b></u> </p>
<ul>
<li>5 свойств для автоматических операций с данными, содержащих SQL-выражения:
<ul>
<li><b>SqlInitSelect</b> - строка SQL-выражения для инициализации курсора,
<li> <b>SqlSelect</b> - строка SQL-выражения  для получения/обновления данных в курсоре (это же выражение будет использовано для инициализации курсора, если свойство <b>SqlInitSelect</b> не заполнено),
<li> <b>SqlInsert</b> - строка SQL-выражения, передаваемого на сервер  для новых строк из курсора,
<li> <b>SqlUpdate</b> - строка SQL-выражения, передаваемого на сервер  для измененных строк в курсоре,
<li> <b>SqlDelete</b> - строка SQL-выражения, передаваемого на сервер  для удаленных строк в курсоре
<li> <b>SqlRefresh</b> - строка SQL-выражения  для обновления строки курсора данными с SQL-сервера после передачи обновлений на сервер, </ul>
<li>упрощенная запись параметров-полей курсора в SQL-выражениях;
<li>автоматическое открытие буферизированного курсора;
<li>автоматическое закрытие курсора при уничтожении объекта;
<li>автоматическое или принудительное обновление данных на сервере (будет исполнено для всех измененных, добавленных или удаленных строк);
<li>автоматическая посылка подтверждения (Commit) после посылки обновления данных;
<li>метод, исполняющий любые SQL-выражения - аналог <b>SqlExec</b> с выдачей ошибок;
<li>свойство-признак измененности данных в курсоре - <b>SqlModified </b>;
<li>предупреждение о наличии не сохраненных данных в курсоре при уничтожении объекта (проверку можно вызвать принудительно). </ul>
<p>  Полное описание - в файле sql_classes.rtf  </p></div>
<div id="sol_avtor">Автор: Алексей Кирпичев</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/updated-sql_grid-klass-grida-pozvolyayushhij-sochetat-moshh-skvoznyh-zaprosov-pass-through-k-sql-subd-ili-k-drugim-odbc-istochnikam-s-udobstvom-raboty-prevyshayushhim-udobstva-raboty-s-udal/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/poluchenie-ikonki-iz-lyubogo-fajla-i-sohranenie-v-bmp-proizvolnogo-razmera/</link>
					<title><![CDATA[Получение иконки из любого файла и сохранение в .BMP произвольного размера.]]></title>
                    					    <author><![CDATA[Sergey Filimonoff]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:26 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Получение иконки из любого файла и сохранение в .BMP произвольного размера.</h1>
													</header>
													<div id="sol_opis">Может пригодится например для ListBox и пр.</div>
<div id="sol_body">
<h3>Получение иконки из любого файла и сохранение в .BMP произвольного размера.</h3>
<p> DECLARE INTEGER GetDC IN Win32API INTEGER HWND<br /> DECLARE INTEGER CreateCompatibleDC IN Win32API INTEGER<br /> *DECLARE INTEGER CreateCompatibleBitmap IN Win32API INTEGER,INTEGER,INTEGER<br /> DECLARE INTEGER GetObject IN Win32API AS GetObject2 INTEGER,INTEGER,STRING<br /> DECLARE INTEGER SelectObject IN Win32API INTEGER hdc,INTEGER<br /> DECLARE DeleteObject IN Win32API INTEGER<br /> *DECLARE INTEGER ReleaseDC IN Win32API INTEGER,INTEGER<br /> DECLARE INTEGER DeleteDC IN Win32API INTEGER</p>
<p> DECLARE INTEGER ExtFloodFill IN Win32API INTEGER,INTEGER,INTEGER,INTEGER,INTEGER<br /> *DECLARE INTEGER DrawIcon IN Win32API INTEGER,INTEGER,INTEGER,INTEGER<br /> DECLARE INTEGER DrawIconEx IN Win32API INTEGER,INTEGER,INTEGER,INTEGER,;<br /> 	INTEGER,INTEGER,INTEGER,INTEGER,INTEGER<br /> DECLARE INTEGER ExtractAssociatedIcon IN Shell32 INTEGER,STRING @,INTEGER @<br /> #define DI_MASK         0x0001<br /> #define DI_IMAGE        0x0002<br /> #define DI_NORMAL       0x0003<br /> #define DI_COMPAT       0x0004<br /> #define DI_DEFAULTSIZE  0x0008</p>
<p> Local ih,n,ic,hdc,mem1,x1,y1,ob,hb<br /> s='example.doc' && любой выбранный файл по This.Value<br /> n=0<br /> * загружаем любой файл-шаблон .BMP например с размерами 20x20,<br /> * чтобы не создавать новый по CreateCompatibleBitmap()<br /> ic=LOADPICTURE('pap24.bmp') <br /> ih=ExtractAssociatedIcon(GetFocus(),@s,@n) && получаем иконку файла</p>
<p> hdc=GetDC(GetFocus())<br /> mem1=CreateCompatibleDC(hdc) && заводим еще аналогичный HDC для копирования<br /> hb=ic.Handle<br /> SelectObject(mem1,hb) && выбираем в него обьект-шаблон<br /> ob=Space(100)<br /> GetObject2(hb,100,@ob) && получение размеров битмапа<br /> x1=ASC(SUBSTR(ob,6,1))*256+ASC(SUBSTR(ob,5,1))<br /> y1=ASC(SUBSTR(ob,10,1))*256+ASC(SUBSTR(ob,9,1))<br /> ExtFloodFill(mem1,0,0,0xffff,0) && красим шаблон в белый цвет<br /> *=StretchBlt(mem1,0,0,20,20,mem,0,0,32,32,13369376)</p>
<p> DrawIconEx(mem1,0,0,ih,x1,y1,0,0,DI_NORMAL) && копируем иконку на шаблон<br /> SAVEPICTURE(ic,'temp.bmp') && пишем шаблон в .BMP<br /> DeleteDC(hdc)<br /> DeleteDC(mem1) && удаляем HDCы<br /> *DeleteObject(ih)<br /> *DeleteObject(hb) && по хорошему и обьекты тоже</p>
<p> Может пригодится например для ListBox и пр.<br /> CLEAR RESOURCES &&[FileName] очистка кэша картинок, к сожалению раб. не всегда, даже в 7ке?!<br /> o.Picture='temp.bmp'<br /> o.Requery</p>
<p> Комментарий:<br /> Если бы можно было добратся до Handle картинок тех-же Itemов, не пришлось бы так изгаляться 🙁</p></div>
<div id="sol_avtor">Автор: Sergey Filimonoff</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4566">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4566">Sergey Filimonoff</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Sergey Filimonoff" href="https://foxclub.ru/account/?user=4566">
				<img alt='' src='https://secure.gravatar.com/avatar/674ca040589c674ff037d847bf52bdf4?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/674ca040589c674ff037d847bf52bdf4?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 15-01-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/poluchenie-ikonki-iz-lyubogo-fajla-i-sohranenie-v-bmp-proizvolnogo-razmera/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/otpravka-pochty-smtp-s-ispolzovanie-winsockets/</link>
					<title><![CDATA[Отправка почты SMTP с использование WinSockets]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:26 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Отправка почты SMTP с использование WinSockets</h1>
													</header>
													<div id="sol_opis">Отправка почты из программ, написанных на FoxPro, без использования MAPI и других сторонних программ.</div>
<div id="sol_body">
<h3>Отправка почты SMTP с использование WinSockets</h3>
<p> Очень часто возникала задача простой отправки почты.<br /> Я очень долго мучался с MAPI и в конце-концов решил, что свое лучше,<br /> свое всегда можно изменить, да и повысить свой уровень тоже неплохо... 🙂<br /> В итоге остановился на WinSock... </p>
<p> Следующий класс следует использовать только с VFP8.</p>
<p> Пример использования:</p>
<p> thisform.addobject('mail','SendMail')</p>
<p> thisform.mail.addfile('c:boot.ini')</p>
<p> thisform.mail.remotehost='smtp.host.ru'<br /> thisform.mail.remoteport=25<br /> thisform.mail.addressfromwho='zonner@mail.ru'<br /> thisform.mail.addresstowho='ivan@mail.ru'<br /> thisform.mail.namefromwho='Игорь'<br /> thisform.mail.nametowho='Иван'<br /> thisform.mail.addressreplyto='petr@list.ru'<br /> thisform.mail.namereplyto='Петр'<br /> thisform.mail.subject='Просто письмо'<br /> thisform.mail.message='Содержание письма'<br /> thisform.mail.include=''<br /> thisform.mail.send()</p></div>
<div id="sol_avtor">Автор: wyvern</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/otpravka-pochty-smtp-s-ispolzovanie-winsockets/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/grid-so-strokoj-podsvetki-na-baze-shape/</link>
					<title><![CDATA[Грид со строкой подсветки на базе Shape]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:26 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Грид со строкой подсветки на базе Shape</h1>
													</header>
													<div id="sol_opis">Для тех, кто пока не работает в VFP 8.  Строка подсветки на базе Shape более функциональна чем подсветка на базе DynamicBackColor: есть режим инверсии, можно использовать BackColor и  DynamicBackColor для других целей.</div>
<div id="sol_body">Основное назначение этого класса - Sql_Grid другое, строка подсветки прилагается как опция. Подробное описание см. в решении: <a href="http://www.foxclub.ru/sol/index.php?act=view&id=380" target="_blank" rel="noopener noreferrer">Sql_Grid</a>  <b>Краткое описание</b><br /> В качестве строки подсветки для <b>sql_grid</b>'а может использоваться любой объект, производный от класса <b>Shape</b>. Достаточно положить его в тот же контейнер (форму, страницу PageFrame и т.д.), что и объект, производный от <b>sql_grid</b> и в свойстве <b>hlt_shape</b> этого объекта указать имя объекта <b>Shape</b>.<br /> <u>Недостатки:</u> </p>
<ul>
<li>объект в активной колонке получает фокус и располагается поверх строки подсветки;
<li>когда строка подсветки располагается поверх <b>Grid</b>'а, не возможно передать события мыши и получить фокус объекта, расположенного под <b>Shape</b>. </ul>
<p>  Эти недостатки устраняются с помощью классов, содержащихся в поставляемой библиотеке: </p>
<ul>
<li><b>Hlt_Shape</b> – Shape, настроенный  для использования в качестве строки подсветки: <b>DrawMode</b> установлен в  Merge Pen Not (14), события мыши (MouseDown, MouseUp, MouseMove, Click, DblClick) передаются в объект, расположенный под ним. Для передачи событий в Grid имеет свойство <b>LinkedGrid</b>, в которое нужно внести имя объекта класса sql_grid. Таким образом, для согласованной работы <b>Sql_Grid</b>'а и строки подсветки класса <b>Hlt_Shape</b> необходимо сделать перекрестные ссылки друг на друга в свойствах <b>Hlt_shape</b> (в объекте класса  <b>Sql_Grid</b>) и <b>LinkedGrid</b> (в объекте класса <b>Hlt_Shape</b>)
<li><b>Hlt_Text</b> – класс, производный от <b>TextBox</b>. Специально создан для использования со строкой подсветки в объекте класса <b>Sql_grid</b>. Представляет из себя обычный textbox, но при получении фокуса вызывает метод <b>BringHighLight</b> родительского объекта <b>sql_grid</b>, т.е. фокуса он не получает – подходит только для отображения данных в Grid'е, без изменения прямо в нем (мне это подходит, т.к. все изменения данных я делаю в отдельных формах) При использовании этих классов совместно с <b>Sql_Grid</b> строка подсветки работает без указанных недостатков.</div>
<div id="sol_avtor">Автор: Алексей Кирпичев</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/grid-so-strokoj-podsvetki-na-baze-shape/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/predprosmotr-otchetov-report/</link>
					<title><![CDATA[Предпросмотр отчетов Report.]]></title>
                    					    <author><![CDATA[Syberex]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:26 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Предпросмотр отчетов Report.</h1>
													</header>
													<div id="sol_opis">Имеется меню на правую кнопку, прокрутка листа клавишами и специальный тулбар управления отчетом. Показ окна просмотра идет в SCREEN или TopLevelForm приложения.</div>
<div id="sol_body">
<pre> Идею нашел на этом сайте в решениях (автор Aries). Обычный просмотр не дает возможности себя контролировать, тулбар просмотра не управляем... В моем решении отчет выводится в "окно вывода отчета", которое показывается внутри "окна просмотра". "Окно просмотра" лекго показывается внутри SCREEN или TopLevelForm приложения. Main_Window=... - можно задать ссылку на главное окно в глобавльной переменной.  Имеется меню на правую кнопку, прокрутка листа клавишами и специальный тулбар управления отчетом.  Для открытия просмотра используется код:  PUBLIC go_rep1 IF TYPE('go_rep1.Name')='C' 	go_rep1.Release() ENDIF go_rep1=CREATEOBJECT('form_report', 'Report1', 0)    && 0/1 - portrait/landsc (A4) go_rep1.Caption=go_rep1.Caption+' '+"Название отчета(кот. будет показано в заголовке)" go_rep1.Show() </pre>
<p>  <b>Дополняю 16/03/2004</b><br /> Если использовать тулбар в приложении, то для форм можно сделать OpenReport(). При наличии этого метода у формы - становится активной кнопка "Просмотр отчета" в тулбаре. В метод OpenReport() надо записать код открытия отчета, тогда при нажатии на эту кнопку, пользователю будет открываться отчет для активной формы. В рещении это реализовано. (Тогда необязательно прятать тулбар, как пишет Перьминов Игорь) </div>
<div id="sol_avtor">Автор: Syberex</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4749">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4749">Syberex</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Syberex" href="https://foxclub.ru/account/?user=4749">
				<img alt='' src='https://secure.gravatar.com/avatar/3575a3e6d812a3bc6213378083787328?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/3575a3e6d812a3bc6213378083787328?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 19-01-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/predprosmotr-otchetov-report/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-iii/</link>
					<title><![CDATA[Советы начинающим Часть III]]></title>
                    					    <author><![CDATA[Владимир Максимов]]></author>
                    										    <pubDate>Sun, 20 Nov 2022 05:54:23 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Советы начинающим Часть III</h1>
													</header>
													<p>В этой статье :</p>
<p><a href="#Index">Индекс</a><br />
<a href="#TypeIndex">Типы (виды) индексов</a><br />
<a href="#Collate">Режим сортировки индексов (Collate)</a><br />
<a href="#Segmentation">Метод половинного деления</a><br />
<a href="#Show">Использование индексов для отображения данных</a><br />
<a href="#CheckUnique">Контроль уникальности данных при помощи индекса</a><br />
<a href="#NameIndex">Название индексных тегов</a><br />
<a href="#HowMuch">Сколько и каких индексов надо создавать</a><br />
<a href="#WorkIndex">Собственно работа с индексами</a></p>
<h2 align="center"><b><a name="Index"></a>Индекс</b></h2>
<p>Важнейшим элементом любой системы управления базами данных является наличие средств ускоренного поиска данных, поскольку поиск - это самая распростарненная операция в системах обработки данных. Но простое сканирование исходной таблицы в поисках нужной записи - это относительно медленная операция. В предельном случае, необходимо будет просканировать все записи таблицы, чтобы найти нужную запись или убедится, что такой записи не существует. Чтобы уменьшить количество просматриваемых записей, как правило, создают специальный файл, который содержит в себе нечто вроде списка пар: значение записи - номер запись. Т.е. в этом файле, перечисленны все значения некоторого поля или функции полей таблицы и указаны идентификаторы соответсвующих записей Этот специальный файл называют <b>индексным файлом</b>, а имя поля или функцию полей, на основе которого вычисляется значение записи - <b>индексным ключем</b></p>
<p>В FoxPro различают 2 вида индексных файлов</p>
<p><b>Простой (обычный) индексный файл</b> - это файл с расширением IDX, который содержит в себе только один индексный ключ</p>
<p><b>Мультииндексный файл</b> - это файл с расширением CDX, который может содержать в себе несколько индексных ключей. По существу, мультииндексный файл - это объединение в одном файле нескольких простых (обычных) индексных файлов. Каждый отдельный индекс в этом файле за неимением лучшего термина называют <b>тегом</b> (от английского TAG - этикетка, метка)</p>
<p>Кроме того, выделяют еще особый <b>структурный индексный файл</b> - это обычный мультииндексный файл, но его имя совпадает с именем файла DBF по полям которого и строятся индексные ключи</p>
<p>Структурный индексный файл отличается тем, что он автоматически открывается при открытии соответствующей таблицы и его невозможно закрыть, пока открыта таблица (хотя можно сделать не главным)</p>
<p><b>Главный индекс</b> - это тот индексный ключ, под управлением которого в данный момент находится таблица. Таблица не может быть отсортирована по нескольким индексным ключам одновременно. Хотя, если одна и та же таблица открыта одновременно в нескольких рабочих областях, то у каждой копии таблицы может быть назначен свой главный индекс.</p>
<p>После всех этих определений наконец-то можно сказать, что же подразумевается в большинстве случаев под словом <b>индекс</b> в FoxPro</p>
<hr />
<p><b>Индекс</b> - это один тег структурного индексного файла</p>
<hr />
<p>&nbsp;</p>
<h2><b><a name="TypeIndex"></a>Типы (виды) индексов</b></h2>
<p>В FoxPro в настоящий момент различают четыре типа (вида) индексов</p>
<table border="1" width="100%" cellspacing="1" cellpadding="7">

<tr>
<td valign="top"><b>Candidat</b></td>
<td>Данный тип индекса предполагает, что по указанному индексному ключу во всей таблице нет повторяющихся значений. Попытка ввода в таблицу значения, которое уже есть в какой-либо записи таблицы, приведет к сообщению об ошибке. При этом наложенные на таблицу фильтры игнорируются. Следует заметить, что записи, помеченные как удаленные, также учитываются при контроле уникальности значения. Попытка ввода значения типа NULL также вызовет сообщение об ошибке.</p>
<p>Очень много недоразумений возникает из-за контроля уникальности данных в индексе типа Candidat. Типичные ошибки, заключаются в следующем:<br />
-) Пустое значение (одни пробелы) - это тоже значение, поэтому невозможно создать 2 записи с пустыми значениями. Это будет воспринято как попытка ввода 2 одинаковых значений.<br />
-) Установка ограничения SET DELETED ON - не есть физическое удаление записей помеченных как удаленные. Это всего-лишь наложение специфичекого фильтра, который делает такие записи "невидимыми", но тем не менее они по прежнему существуют в таблице. Поэтому попытка ввода новой записи со значениями, которые есть в одной из записей помеченных как удаленная также будет рассматриваться как ввод дублирующего значения.</td>
</tr>
<tr>
<td valign="top"><b>Primary</b></td>
<td>Можно сказать, что данный тип - это частный случай индекса типа <b>Candidat</b>. Он обладает всеми свойствами индекса типа Candidat, но с дополнительными ограничениями. Данный тип индекса может быть только один в каждой таблице и данный тип индекса может быть только у таблиц включенных в базу данных. Если таблица с индексом типа Primary исключается из базы данных, то индекс типа Primary автоматически конвертируется в тип Candidat.</p>
<p>Строго говоря, никакой дополнительной функциональности, с точки зрения целостности данных индекс типа Primary по сравнению с индексом типа Candidat не дает. Однако факт его наличия облегчает процесс <i>проектирования базы данных</i>. Дело в том, что по умолчанию предполагается, что индекс типа Primary построен по ключевому полю таблицы. Соответственно в тех визуальных средствах программирования, где необходимо указание ключевого поля (например, View Designer на закладке Update Criteria) FoxPro автоматически предлагает считать ключевым то поле, по которому построен индекс типа Primary.</td>
</tr>
<tr>
<td valign="top"><b>Regular</b></td>
<td>Это самый распространенный тип индексов. Его использование не предполагает никаких особых ограничений на содержимое таблицы. Можно сказать, что это обычный (простой) индекс</td>
</tr>
<tr>
<td valign="top"><b>Unique</b></td>
<td>Данный тип индекса не запрещает ввод в таблицу одинаковых значений, однако учитывает (отображает) только одно (самое первое) из введенных одинаковых значений. Можно сказать, что это своеобразный фильтр, который отсекает повторяющиеся значения.</td>
</tr>

</table>
<p>Отдельного упоминания заслуживает использование команды APPEND BLANK применительно к таблицам, по которым построены индексы типа Primary или Candidat.</p>
<p>По умолчанию, команда APPEND BLANK создает новую запись, где все поля имеют пустое значение. Но пустое значение - это тоже значение. Поэтому, если Вы дадите две команды APPEND BLANK подряд, то получите сообщение о нарушении уникальности индекса. Чтобы этого избежать необходимо создавать новую запись с не пустым и уже уникальным значением. Это можно сделать одним из следующих способов:</p>
<ul>
<li>Вместо APPEND BLANK использовать INSERT-SQL указав заранее созданные уникальные значения</li>
<li>Использовать специальную функцию, генерирующую новые уникальные значения, вызов которой организовать из DEFAULT поля, по которому создан индекс типа Primary или Candidat.</li>
</ul>
<p>Контроль уникальности в триггерах не сработает, поскольку проверка уникальности индекса выполняется ДО проверки триггеров. Т.е. проверять в триггерах в этом случае уже поздно.</p>
<p>&nbsp;</p>
<h2><b><a name="Collate"></a>Режим сортировки индексов (Collate)</b></h2>
<p>Настройка SET COLLATE определяет режим сортировки символьных строк. Иными словами, какой символ надо поставить первым, а какой вторым, при упорядочивании.</p>
<p>По умолчанию, в FoxPro используется режим сортировки MACHINE. Это такой порядок сортировки, когда символы выстраиваются в соответствии с их ASCII-кодами. Чтобы понять что это означает (т.е. в каком порядке будут сортироваться символьные данные) посмотрите таблицу ASCII кодов. Это можно сделать так:</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  CREATE CURSOR curASCII (nASC   I, cCHR   C(1))  
  FOR m.lnI=1 TO 255  
         INSERT INTO curASCII (nASC,cCHR) VALUES (m.lnI, CHR(m.lnI))  
  ENDFOR  
  BROWSE NOWAIT  
  </pre>
</td>
</tr>

</table>
<p>Обратите внимание, что сначала идут большие буквы и только потом маленькие. Кроме того, применительно к буквам русского алфавита, выпадает буква "<b>ё</b>" (ASCII-код 184) и "<b>Ё</b>" (ASCII-код 168). Именно в таком порядке и будут следовать символьные строки.</p>
<p>Если используется какой-нибудь национальный режим сортировки, например RUSSIAN, то различия между большими и маленькими буквами игнорируются и все буквы национального языка выстраиваются по алфавиту без разрывов. Чтобы понять как изменится порядок сортировки выполните следующий код, используя полученный ранее курсор</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  SET COLLATE TO 'RUSSIAN'  
  select curASCII  
  INDEX ON cCHR TAG cCHR  
  BROWSE NOWAIT  
  </pre>
</td>
</tr>

</table>
<p>Как видите, буквы русского языка выстроились строго по алфавиту игнорируя разделение на большие и маленькие буквы и буква "<b>Ё</b>" заняла надлежащее ей место после "<b>Е</b>". Можно заметить и другие отличия, но здесь я их рассматривать не буду.</p>
<p>Какое отношение ко всему этому имеют индексы? Самое непосредственное. Дело в том, что каждый индекс в отдельности запоминает тот режим сортировки при котором он был создан и при модификации данных автоматически упорядочивает записи именно в этом сохраненном режиме сортировки.</p>
<p>Таким образом внутри одного индексного файла могут быть индексы созданные в разных режимах сортировки. Проверить режим сортировки в котором был создан индекс можно при помощи функции IDXCOLLATE()</p>
<p>Однако я бы не советовал на первых порах экспериментировать с SET COLLATE. Оставьте эту настройку в режиме по умолчанию, т.е. SET COLLATE TO 'MACHINE'. Этому есть причины.</p>
<ul>
<li>В версиях FoxPro младше 6 ServicePack 5 запросы Select-SQL теряли некоторые числовые значения если была установлена сортировка отличная от MACHIN. Т.е. эта ошибка сохранялась вплоть до Visual FoxPro 6 Service Pack 4 и была исправлена только с выходом Service Pack 5 к 6 версии.</li>
<li>При использовании Private DataSession установка SET COLLATE - это одна из тех установок, которая сбрасывается в значение по умолчанию. Вследствии чего, ее надо устанавливать повторно каждый раз при открытии Private DataSession<br />
Полный список настроек, сбрасываемых в значения по умолчанию при использовании Private DataSession можно почитать в описании к команде SET DataSession</li>
<li>При оптимизации используются только те индексы, которые созданы в том же режиме сортировки, что и текущий режим сортировки системы.</li>
<li>В подавляющем большинстве случаев, вместо использования режима сортировки SET COLLATE TO 'RUSSIAN' можно использовать режим сортировки MACHINE с индексным ключем UPPER(MyField) или LOWER(MyField). Применительно к русским буквам эффект будет тот же (за исключением букв "<b>ё</b>" и "<b>Ё</b>")</li>
</ul>
<p>&nbsp;</p>
<h2><b><a name="Segmentation"></a>Метод половинного деления</b></h2>
<p>Чтобы понять, как наличие индексного файла позволяет ускорить поиск рассмотрим примерную схему работы наиболее распространенного способа поиска методом половинного деления</p>
<p>Предположим, что у нас есть некая таблица, содержащая ряд числовых значений:</p>
<table border="1" cellspacing="1" cellpadding="7">

<tr>
<td><b>Запись</b></td>
<td><b>Значение</b></td>
</tr>
<tr>
<td>1</td>
<td>500</td>
</tr>
<tr>
<td>2</td>
<td>300</td>
</tr>
<tr>
<td>3</td>
<td>200</td>
</tr>
<tr>
<td>4</td>
<td>400</td>
</tr>
<tr>
<td>5</td>
<td>100</td>
</tr>

</table>
<p>Теперь предположим, что необходимо найти запись имеющую значение 200. В случае отсутствия индексного файла есть только один способ - сканирование всех записей таблицы, пока не будет найдено искомое значение или не будет достугнут конец файла. В данном случае можно считать повезло, поскольку сканирование закончится на 3 записи таблицы. Т.е. необходимо будет сделать как минимум 3 перехода.</p>
<p>Если будет создан индексный файл у которого в качестве индексного ключа будет указано просто имя поля, содержащего значение, то внутри этого индексного файла будет создано нечто вроде следующего списка</p>
<table border="1" cellspacing="1" cellpadding="7">

<tr>
<td><b>Значение</b></td>
<td><b>Запись</b></td>
</tr>
<tr>
<td>100</td>
<td>5</td>
</tr>
<tr>
<td>200</td>
<td>3</td>
</tr>
<tr>
<td>300</td>
<td>2</td>
</tr>
<tr>
<td>400</td>
<td>4</td>
</tr>
<tr>
<td>500</td>
<td>1</td>
</tr>

</table>
<p>А теперь посмотрим как поиск записи со значением 200 приблизительно будет выглядеть в индексе в случае использования метода половинного деления.</p>
<p>-) На первом этапе определяются начальные и конечные значения. В данном случае - это 100 и 500. Значение 200 находится между ними.</p>
<p>-) Вычисляется среднее арифметическое от граничных значений: (100+500)/2=300 и берется ближайшее значение из списка значений к вычисленному среднему. В данном случае это то же самое значение 300</p>
<p>-) Теперь смотрим в какой половине находится искомое значение 200. Оно находится в интервале от 100 до 300</p>
<p>-) Вычисляется среднее арифметическое этого нового интервала: (100+300)/2=200 и берется ближайшее значение из списка значений к вычисленному среднему. В данном случае это то же самое значение 200.</p>
<p>-) Поскольку одно из граничных значений равно искомому значению, то цикл половинного деления прерывается. Определяется, что данное значение имеет запись с номером 3 и осуществляем переход на найденную запись</p>
<p>А теперь сравним, сколько шагов необходимо сделать в случае простого сканирования и в случае использования метода половинного деления</p>
<p>Предельно допустимое количество записей в DBF-таблице - это 1 миллирад (1 billion) записей (это единица и девять нулей). Значит при прямом сканировании таблицы в предельном случае может понадобиться просканировать весь миллирад записей. Т.е. сделать миллиард операций.</p>
<p>А в случае половинного деления количество операций определяется значением степени в которую следует возвести число 2, чтобы превысить миллирад (логарифм от миллиарда по основанию 2). Это число 30, поскольку 2**30=1,073,741,824. Т.е. в предельном случае для поиска значения в индексе потребуется не более 30 шагов</p>
<p>Выигрыш в производительности очевиден: миллирад против тридцати.</p>
<p><b>Замечание:</b> Подчеркну еще раз: приведенный алгоритм - это всего лишь общая схема. В реальности и способ хранения данных в индексном файле и способ поиска несколько отличаются</p>
<p>&nbsp;</p>
<h2><b><a name="Show"></a>Использование индексов для отображения данных</b></h2>
<p>До сих пор, я рассматривал индекс только как способ ускорения поиска нужной информации, но ведь индекс может быть еще использован и как способ <b>отображения</b> информации в нужной последовательности.</p>
<p>Проблема здесь в том, что как правило, пользователь не работает напрямую с исходной таблицей по причине ее больших размеров (слишком много записей, чтобы охватить их "одним взглядом"). Всегда делается некая выборка. Наложение фильтров на исходные таблицы не приветствуется, поскольку такая технология замедляет работу (переход от записи к записи происходит заметно медленнее)</p>
<p>Т.е. создание индексов для упорядочивания записей в структурном индексном файле исходной таблицы не имеет смысла, поскольку собственно исходная таблица и не отображается.</p>
<p>Однако это вовсе не означает, что индексы для упорядочивания записей не используются. Дело в том, что <b>любая</b> таблица используемая в FoxPro может быть проиндексирована. Это относится как к обычным таблицам, так и к результатам выполнения команд Select-SQL, Local View и Remote View.</p>
<p>Другое дело, что такие индексы не имеет смысла хранить в базе данных. Их надо будет создавать заново каждый раз при создании соответсвующих временных таблиц или курсоров. Поскольку временные таблицы для того и создаются, чтобы получить некую выборку из исходных таблиц, то, как правило, они имеют относительно небольшое количество записей и их индексация не требует много времени.</p>
<p>Некоторые особенности создания индексов для временных таблиц</p>
<ul>
<li>Если курсор, созданный командой Select-SQL имеет статус Read-Only, то для него можно построить только один индексный тэг.<br />
По умолчанию, курсор созданный командой Select-SQL всегда имеет статус Read-Only, чтобы это изменить необходимо использовать опцию READWRITE (она появилась только в 7 версии). А для более младших версий курсор следует переоткрыть. Подробнее об этом читайте в разделе <a href="/sovety-nachinayushhim-chast-ii/#Cursor">Курсор</a></li>
<li>Индексация View возможна только если он находится в 3 режиме буферизации (оптимистическая буферизация строк). Если View находится в 5 режиме буферизации (оптимистическая буферизация таблиц), то при попытке индексации Вы получите сообщение об ошибке.</li>
<li>Обновление содержимого View по команде Requery() также обновит и содержимое всех созданных для него индексов.</li>
<li>Если Вы создали структурный индексный файл к курсору или View, то он будет автоматически удален в момент закрытия этого курсора или View</li>
</ul>
<p>&nbsp;</p>
<h2><b><a name="CheckUnique"></a>Контроль уникальности данных при помощи индекса</b></h2>
<p>Индекс типа Candidat по самой своей природе не допускает ввода повторяющихся значений. В связи с этим возникает искущение не писать специальных триггеров за контролем уникальности данных, а переложить эту работу на индекс. Посмотрим, какие преимущества и недостатки это дает</p>
<p>Прежде всего, следует заметить, что индекс типа Candidat в "чистом" виде нас не устаивает по той причине, что в большинстве случаев задача контроля уникальности формулируется так: В таблице должны быть уникальны значения, если они удовлетворяют некоторым дополнительным условиям</p>
<p>Ну например, Вы хотите контролировать уникальность только среди записей не помеченных как удаленные.</p>
<p>Это можно сделать добавив в индекс FOR-условие, которое в данном случае будет выглядеть так: FOR .NOT.Deleted()</p>
<p>Но добавление FOR-условия в выражение индекса автоматически исключает его из списка индексов, участвующих в оптимизации. Т.е. для ускорения выборок понадобиться создать еще один индекс с тем же выражением индексного ключа, но без FOR-условия. Чтобы этот новый индекс не контролировал уникальность, он должен быть типа Regular</p>
<p>Как следствие, получаем "раздувание" индексного файла на "лишний" индекс.</p>
<p>Кроме того, следует помнить, что проверка уникальности данных в индексах типа Candidat происходит сразу же при попытке внесения изменений, даже в буферизированных данных еще до сброса буфера. В то время, как триггер срабатывает только в момент сброса буфера. Эту особенность, следует учитывать при написании обработчика ошибок в приложении.</p>
<p>С другой стороны, если написать триггер для контроля уникальности, то при определенных условиях, можно написать один общий триггер на все таблицы базы данных куда в качестве параметра передается выражение, уникальность которого следует проконтролировать и дополнительное условие отбора контролируемых записей. Здесь выражение "при определенных условиях" не случайно. Написать такой универсальный триггер "на все случаи жизни" мне представляется затруднительным, но если придерживаться некоторых правил и ограничений при проектировании базы данных, то это становится возможным.</p>
<p>Есть еще одно соображение, не столь принципиального характера. В случае внесения изменений в правило контроля уникальности если речь идет об индексе, то потребуется удалить старый индекс и создать новый, а если речь идет о триггере, то надо будет просто заменить файлы базы данных (DBC, DCX, DCT) на новые (с новым триггером)</p>
<p><b>Итого</b>, контроль уникальности данных при помощи индекса типа Candidat с FOR-условием по сравнению с триггером проще в реализации, но приводит к значительно большему увеличению объема базы данных (в байтах) и изменению логики обработчика ошибок при редактировании данных.</p>
<p>&nbsp;</p>
<h2><b><a name="NameIndex"></a>Название индексных тегов</b></h2>
<p>Если Вы создаете индекс, где в качестве индексного ключа выступает только одно поле таблицы то желательно назвать индекс также как и поле таблицы, поскольку это значительно упростит процесс программирования.</p>
<p>Поскольку существует системное ограничение на количество символов в названии индексного тега (он не может превышать 10 символов), то и не следует давать полям, по которым будут построены такие индексы, названия, превышающие 10 символов. Это не так сложно, как может показаться на первый взгляд.</p>
<p>&nbsp;</p>
<h3><b><a name="HowMuch"></a>Сколько и каких индексов надо создавать</b></h3>
<p>Вопрос крайне неоднозначный и сильно зависит от конкретной задачи, однако некоторые рекомендации все-таки можно сделать.</p>
<ul>
<li>Прежде всего, Вам следует определиться в каком режиме сортировки (SET COLLATE) Вы будете работать. Дело в том, что индекс запоминает тот режим сортировки в котором он был создан и в оптимизации запросов участвуют только те индексы, которые были созданы в том же режиме сортировки, что и используемый на момент выполнения запроса.
<p>Например, если Вы создали индекс в режиме сортировки MACHINE, а запрос выполняется при настройке RUSSIAN, то индекс использоваться не будет, хотя казалось бы он есть. Проверить в каком режиме сортировки был создан тот или иной индекс можно используя функцию IDXCOLLATE(). При этом следует иметь в виду, что изменить режим сортировки индекса невозможно. Необходимо будет удалить "неправильный" индекс и создать новый в нужном режиме сортировки</p>
</li>
<li>По ключевому полю постройте индекс типа Primary. Индекс не должен содержать никаких FOR-условий, а выражение индексного ключа должно состоять только из имени ключевого поля. Очень желательно, чтобы имя этого индекса совпадало с именем ключевого поля, поскольку это серьезно упростит процесс программирования.</li>
<li>По всем внешним ключам (т.е. полям, содержащим ссылку на другую таблицу) следует построить простые индексы типа Regular. Индекс не должен содержать никаких FOR-условий, а выражение индексного ключа должно состоять только из имени поля. Очень желательно, чтобы имя этого индекса совпадало с именем поля, поскольку это серьезно упростит процесс программирования.</li>
</ul>
<p>Это были очевидные рекомендации связанные с поиском данных, поскольку и ключевое поле и внешние ключи будут использоваться очень часто и в самых разных условиях. Теперь рассмотим менее очевидные ситуации.</p>
<p>Индексы используются для ускорения получения выборок в так назваемой Rushmore-оптимизации. Что это такое и как оно работает я здесь объяснять не будут. С точки зрения создания индексов нас интересует следующая особенность работы Rushmore-оптимизации:</p>
<p>Если выражение оптимизируемое, то сначала выборка производится в индексе и только затем отбираются найденные в индексе записи. Если выражение не оптимизируемое, то выборка производится непосредственно в исходной таблице.</p>
<p>Следствием этой особенности работы является следующий вывод</p>
<hr />
<blockquote><p><b>Если объем информации (в байтах) НЕ удовлетворяющей условию выборки меньше, чем размер индекса (в байтах) по данному условию выборки, то в общем случае оптимизация приведет к <u>замедлению</u> выборки</b></p></blockquote>
<hr />
<p>В виде формулы это можно записать так. Оптимизация приведе к замедлению выборки если:</p>
<p><b>Объем информации НЕ удовлетворяющей условию &lt; Объем индекса</b></p>
<p><b>Объем информации НЕ удовлетворяющей условию</b> - это произведение количества записей не попадающих в выборку на объем в байтах одной записи.</p>
<p><b>Объем индекса</b> - это сумма размеров индексных тэгов, участвующих в оптимизации.</p>
<p>Проблема здесь именно в том, как определить размер одного индексного тэга. Очень грубо и приблизительно, его можно оценить как количество символов получающееся в результате расчета индексного ключа умноженное на общее количество записей в таблице. Это очень грубая оценка, поскольку способ хранения индекса сильно отличается от линейного списка пар: значение ключа - код записи.</p>
<p>Однако даже при такой грубой оценке можно сделать вывод, что индекс по логическим полям в большинстве случаев приведет к замедлению, а не к ускорению выборки.</p>
<p>Причина здесь в том, что логические поля в большинстве случаев работают как признак некой исключительной (т.е. достаточно редкой) ситуации, а запрос строится по принципу отобрать все, кроме этих заведомо редких случаев. Т.е. заранее можно сказать, что объем информации НЕ удовлетворяющий условию выборки будет очень небольшим (если вообще будет).</p>
<p>Пожалуй, индекс по логическим полям имеет смысл, только в случае, если значения .T. и .F. распределены примерно равномерно по таблице. Предельный случай - две трети и одна треть.</p>
<p>Частным случаем индекса по логическому выражению является индекс по выражению Deleted(). Этот индекс используется в случае настройки SET DELETED ON для того, чтобы оптимизировать выборку на предмет отсечения записей помеченных как удаленные. Как уже было сказано чуть выше, если количество удаленных записей относительно невелико, то данный индекс приведе не к ускорению, а к замедлению выборки.</p>
<p>Значительно сложнее определить необходимость прочих индексов. Да, есть некоторые правила, которые говорят, что если построить такой и такой индекс, то запрос будет оптимизирован. Даже есть функция SYS(3054) при помощи которой можно установить используется ли данный индекс при оптимизации или нет (да и то не всегда из-за несовершенства функции SYS(3054)). Но как было замечено ранее: оптимизация далеко не всегда приводит к ускорению получения выборки.</p>
<p>Поэтому фактически единственным критерием остается практика: если факт наличия индекса приводит к заметному (в разы) ускорению получения выборки, то его стоит создавать.</p>
<p>Но даже факт ускорения получения выборки не может являтся единственным критерием необходимости создания индекса. Еще одним не маловажным критерием является вопрос о том, насколько часто используется эта выборка.</p>
<p>Например, если речь идет о составлении квартального отчета, то особо гнаться за скоростью здесь не требуется. Пользователь вполне может подождать и воспримет это с пониманием. Но вот если в процессе открытия основной рабочей формы, программа будет задумывать на несколько минут, то ничего кроме раздражения со стороны пользователя это не вызовет.</p>
<p>Замечу еще, что индексы содержащие FOR-условия в оптимизации не участвуют</p>
<p>&nbsp;</p>
<h3><b><a name="WorkIndex"></a>Собственно работа с индексами</b></h3>
<ul>
<li>В FoxPro не поддерживается значение индексного ключа переменной длины. Т.е. если в качестве выражения индексного ключа Вы напишите AllTrim(MyField), то хотя ошибки это и не вызовет, но фактически будут удалены только ведущие пробелы, а общая длина каждого значения будет дополнена концевыми пробелами до некоторой фиксированной величины. В данном случае до длины поля MyField. Поэтому, чтобы избежать различных недоразумений, лучше в таких сложных случаях самостоятельно явно указывать длину индексного ключа, например PADR(AllTrim(MyField),50)</li>
<li>По возможности, старайтесь избегать сложных выражений индексного ключа для тегов структурного индексного файла. Чем проще выражение индексного ключа - тем лучше. В идеале, лучше иметь индексный ключ состоящий из названия одного поля.</li>
<li>Индекс "запоминает" режим сортировки (SET COLLATE) при котором он был создан и при модификации исходных таблиц автоматически сортирует новые значения в "запомненном" режиме сортировки вне зависимости от текущей настройки SET COLLATE. Проверить в каком режиме сортировки был создан тот или другой тег можно функцией IDXCOLLATE()</li>
<li>На результат поиска по индексному выражению влияет настройка SET EXACT, а внутри команды SELECT-SQL аналогичная ей настройка SET ANSI<br />
Эти настройки определяют как будет осуществлятся поиск в случае если заданный критерий поиска отличается по длине от длины индексного ключа. По умолчанию, если заданный критерий поиска меньше длины индексного ключа, то будут найдены записи, где заданный критерий - это первые символы индексного ключа. Фактически поиск ведется по первым символам, а не по всему ключу.<br />
Если необходимо избежать влияния этих настроек на результат поиска (т.е. требуется строгое соответствие), то дополняйте критерий поиска нужным количеством пробелов справа используя функцию PADR(KeyValue,10)</li>
<li>Следует помнить, что изменения данных в исходной таблице приводит к немедленному изменению всех открытых в данный момент индексов и перестроению в соответствии с главным индексом. Это значит, что крайне нежелательно модифицировать те поля, которые входят в выражение индексного ключа главного индекса, поскольку это может привести к непредсказуемым последствиям. Предварительно надо или переглючится на другой индекс или вообще отключить главный индекс (SET ORDER TO 0)
<p>Рассмотрим следующий пример</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  CREATE CURSOR test (testID I)  
  INSERT INTO test (testID) VALUES (2)  
  INSERT INTO test (testID) VALUES (1)  
  INDEX ON testID TAG testID  
  </pre>
</td>
</tr>

</table>
<p>Предположим, необходимо увеличить значение поля TetsID в каждой записи таблицы на 10. Для чего используем цикл SCAN</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  SELECT test  
  SCAN  
        REPLACE testID WITH testID+10  
  ENDSCAN  
  </pre>
</td>
</tr>

</table>
<p>Так вот, в данном случае произойдет модификация только одной записи. Механизм здесь следующий:</p>
<p>-) На первом шаге цикла SCAN указатель записей будет установлен на первую запись в соответсвии с главным индексом. Это запись со значением поля testID=1</p>
<p>-) По команде REPLACE значение поля TestID первой записи будет увеличено на 10 и примет значение 11. Немедленно произойдет модификация индексного файла и его перестроение. Теперь эта же самая запись оказывается не первой, а самой последней</p>
<p>-) На команде ENDSCAN будет предпринята попытка перейти на следующую запись, но в соответствии с новым значением индекса текущая запись уже последняя. Поэтому цикл будет завершен и запись со значением testID=2 так и останется не измененной.</p>
<p>Для исправления этой ситуации необходимо перед началом цикла сбросить главный индекс</p>
<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center" bgcolor="#fbfaf7">

<tr>
<td>
<pre class="bbcode">   
  SELECT test  
  <b>SET ORDER TO 0</b>  
  SCAN  
        REPLACE testID WITH testID+10  
  ENDSCAN  
  </pre>
</td>
</tr>

</table>
</li>
<li>Индексный файл - это все-таки отдельный (другой) файл. Поэтому если индексный файл не открыт (командой SET INDEX или опцией ORDER в команде USE), то изменения сделанные в исходной таблице не отразятся в индексе. Это может привести к серьезным недоразумениям - запись введена, но ее не видно.
<p>Исключением в этом смысле является структурный индексный файл, который открыт всегда, пока открыта таблица, но для не структурных индексов за этим надо следить отдельно. Фактически, если используются не структурные индексные файлы, то необходимо либо сразу после их подключения давать команду REINDEX, либо вообще их не хранить и создавать каждый раз заново.</p>
</li>
<li>Курсор, созданный командами CREATE CURSOR или SELECT ... INTO CURSOR можно индексировать. Однако если курсор созданный командой SELECT ... INTO CURSOR имеет статус Read-Only (т.е. не была указана опция ReadWrite или он не был переоткрыт), то для такого курсора можно будет создать только один индексный тег. Если Вы создадите структурный индексный файл для таких курсоров, то этот файл будет автоматически удален в момент закрытия курсора</li>
<li>Local View и Remote View также можно индексировать если они находятся в режиме оптимистической буферизации строк (3). В режиме оптимистической буферизации таблиц (5) индексирование невозможно. Обновление содержимого View по команде Requery() также обновит и структурный индексный файл созданный для данного View. Закрытие View автоматически уничтожит и структурный индексный файл.</li>
</ul>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4899">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4899">Владимир Максимов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Владимир Максимов" href="https://foxclub.ru/account/?user=4899">
				<img alt='' src='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 65<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-iii/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Статьи]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii_/</link>
					<title><![CDATA[Советы начинающим Часть II]]></title>
                    					    <author><![CDATA[Владимир Максимов]]></author>
                    										    <pubDate>Sun, 15 Jan 2023 02:47:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Советы начинающим Часть II</h1>
													</header>
													<p>В этой статье :</p>
<p><a href="#Table">Таблица</a></p>
<ul>
<li><a href="#NameTable">Название таблицы</a></li>
<li><a href="#TableLocation">Расположение таблицы</a></li>
<li><a href="#TableWork">Собственно работа с таблицами</a></li>
<li><a href="#TableWorkArea0">Рабочая область с номером 0</a></li>
<li><a href="#BigTable">Большая таблица</a>
<p><a href="#Cursor">Курсор</a></p>
</li>
<li><a href="#CursorDBF">Курсор как образ файл DBF</a></li>
<li><a href="#CursorTmp">Курсор как временная таблица</a></li>
<li><a href="#GetCursorSQL">Формирование имени курсора в команде Select-SQL</a>
<p><a href="#Fields">Поля таблицы</a></p>
</li>
<li><a href="#FieldsNames">Название полей таблицы</a></li>
<li><a href="#FieldsWork">Собственно работа с полями таблицы</a>
<p><a href="#KeyField">Ключевое поле</a></p>
</li>
<li><a href="#KeyTypes">Естесственные или Суррогатные ключи</a></li>
<li><a href="#KeyDataTypes">Какой тип данных использовать: Character или Integer</a></li>
<li><a href="#KeyFieldsNeed">Надо ли использовать ключевое поле во всех без исключения таблицах</a></li>
<li><a href="#KeyFieldName">Название ключевого поля</a></li>
</ul>
<p><a href="#KeyFieldWork">Собственно работа с ключевыми полями таблицы<br />
</a></p>
<p>&nbsp;</p>
<h2 align="center"><b><a name="Table"></a>Таблица</b></h2>
<p>Это термин, который очень часто употребляется в FoxPro и также часто он употребляется совсем не в том смысле, как его понимают новички. Можно сказать, что у этого термина есть два определения (как и у термина "база данных")</p>
<p><b>Таблица</b> - это файл с расширением <i>DBF</i> и связанные с ним файлы с тем же именем, но с расширением <i>FPT</i> (файл для хранения полей типа <i>Memo и General</i>) и с расширением <i>CDX</i> (структурный индексный файл)</p>
<p>Формально, это абсолютно правильное определение. Проблема только в том, что в подавляющем большинстве случаев, когда в FoxPro употребляют термин <i>"таблица"</i>, то под этим подразумевают вовсе не это. Точнее, <i>не совсем это</i>.</p>
<p><b>Таблица</b> - это некий <i>образ файла</i> с расширением <i>DBF</i> открытый в указанной <i>сессии данных</i> и в указанной <i>рабочей области</i>.</p>
<p>Со стремлением американцев все сокращать они не потрудились придумать соответствующий термин. Поэтому постоянно возникает путаница. Уместнее было бы использовать вместо термина <i>"таблица"</i> термины <i>"курсор"</i> или <i>"алиас"</i>, поскольку они более точно отображают суть. И действительно, в некоторых случаях эти термины именно в таком смысле и употребляются, чем только окончательно все запутывают, поскольку они используются также и в других смыслах.</p>
<p><b>Алиас</b> (<i>alias</i>) - это <i>"псевдоним" файла DBF</i> открытого в какой-либо рабочей области. Как правило, алиас совпадает с именем файла DBF. Однако это не всегда так. Дело в том, что в одном сеансе данных не может быть двух одинаковых алиасов. Поэтому, если алиас таблицы не указан явно при ее открытии (опция ALIAS в команде USE, или каким-либо другим способом), то FoxPro самостоятельно назначит уникальный алиас для таблицы, начав разумееется с алиаса совпадающего с именем файла DBF если это возможно.</p>
<p>Имейте в виду, что в абсолютном <b>большинстве случаев</b> под термином <i>"таблица"</i> подразумевается именно <i>"образ файла"</i>, т.е. файл уже открытый через команду USE (или каким-либо еще способом) в среде FoxPro. Если же подразумевается именно файл DBF, то как правило это оговаривается особо.</p>
<p>В версиях FoxPro 2.x в том смысле, в котором используется термин <i>"таблица"</i> использовался термин <i>"база данных"</i> (видимо отсюда пошло расширение - первые буквы английской фразы <i>DataBase File</i>), поскольку в тех версиях еще не существовало файла DBC. Соответственно, когда программисты переходят на версию Visual FoxPro, то их бывает достаточно трудно понять из-за этой путаницы с терминами.</p>
<p>Следует всегда помнить, что таблицы открываются в так называемых <i>"рабочих областях"</i>. Что это такое нигде внятно не объясняется (дескать, и так понятно). Попробую определить это так</p>
<p><b>Рабочая область</b> (<i>Work area</i>) - это некий числовой идентификатор, который может быть присвоен таблице. Если у Вас был опыт программирования в других языках, то можно сказать, что рабочая область - это "<i>хэндл</i>" или "<i>дескриптор</i>" таблицы внутри среды FoxPro</p>
<p>Одновременно одной рабочей области может соответствовать только одна таблица, в то время как одной таблице может соответствовать несколько рабочих областей. Другими словами, одну и ту же таблицу <i>можно одновременно открыть в нескольких рабочих областях</i>, но в одной конкретной рабочей области может быть открыта только одна таблица.</p>
<p>До тех пор, пока таблица не будет открыта в какой-либо рабочей области она для FoxPro как бы не существует. Точнее с ней нельзя производить никакие операции по чтению/модификации данных используя штатные команды и функции.</p>
<p>Кроме понятия "рабочая область" в FoxPro введено понятие <b>"сеанс данных"</b> (<i>DataSession</i>)</p>
<p><b>Сеанс данных (DataSession)</b> - это некоторая динамическая копия среды FoxPro. Открывая среду FoxPro Вы автоматически открываете сеанс данных, который автоматически же и завершается при выходе из FoxPro. Но внутри собственно FoxPro Вы имеете возможность сделать как бы копию среды FoxPro используя так называемые <i>"частные сеансы данных" (Private DataSession)</i></p>
<p>Что собственно дает эти <b>"частные сеансы данных"</b>? А дает это возможность симулировать внутри одного приложения FoxPro работу нескольких, независимых друг от друга пользователей.</p>
<p>В результате таблицы открытые в одном сеансе данных "не видны" в другом сеансе данных. И соответственно манипуляции (не все) производимые с таблицами в одном сеансе данных не влияют на другие сеансы данных.</p>
<p>Самый распростарненный случай применения <i>Private DataSession</i> - это одновременное открытие нескольких форм, рассматривающих один и тот же документ с разных сторон. Как правило, для этой цели между таблицами устанавливается связь по <i>SET RELATION</i>. Если открыть подобные формы в одном сеансе данных, то зачастую это становится большой проблемой, поскольку в одной форме требуется наложить на таблицы одни индексы и связи, а в другой - другие. И переключение из одной формы в другую приводит к непредсказуемым изменениям содержимого.</p>
<h3><b><a name="NameTable"></a>Название таблицы</b></h3>
<p>Файл таблицы, как и любой другой файл в системе Windows может содержать до 128 символов, содержать пробелы, русские символы, цифры и некоторые спец.символы. Однако для упрощения работы в FoxPro я бы порекомендовал следующие ограничения в наименовании файла таблицы</p>
<p></p>
<ul>
<li>Не использовать в названии русские символы - причина этой рекомендации в том, что FoxPro разрабатывался прежде всего для англоязычных пользователей и использование в нем символов другого языка - это уже последующее дополнение. Как следствие, велик риск, что чего-то, где-то недосмотрели и при определенных ситуациях русские буквы в имени вызовут неожиданные глюки</li>
<li>Не использовать в названии пробелы - в принципе, ошибок использование пробелов не вызовет, но несколько усложнит сам процесс программирования, поскольку имена и пути доступа, содержащие пробелы необходимо заключать в кавычки. Просто добавит лишней заботы - не забывать кавычки. А зачем усложнять себе жизнь, когда без этого легко можно обойтись.</li>
<li>Ограничивайте длину названия 8 символами и не используйте в названии цифр и спец.символов - в отличии от аналогичной рекомендации в отношении наименования файла <i>база данных</i> этому есть причина. Причина не настолько явная, чтобы ее описать в двух словах. Но цепочка рассуждений приведшая к этой рекомендации основана на рекомендации по наименованию <i>ключевых полей</i> таблиц и наименований индексных тэгов. Прочтя эти разделы Вам станет понятна причина этой рекомендации.</li>
<li>Не называйте таблицу также как и одно из его полей - разумеется ошибки это не вызовет, но усложнит понимание написанного кода самим программистом. Не всегда с ходу можно однозначно определить, что речь идет именно о таблице, а не о поле таблицы. А если еще и их названия совпадают, то совсем тяжело становится.</li>
<li>Не используйте для названия одно из зарезервированных в FoxPro слов - опять же, ошибки это не вызовет, но резко снизит "читабельность" кода. Ведь зарезервированные слова автоматически подсвечиваются опеределенным цветом (если Вы используете стандартный текстовый редактор FoxPro) и с ходу становится проблематично отличить опцию или команду от имени таблицы</li>
<li>Не используйте псевдонимы таблицы внутри базы данных - в данном случае речь идет о том, что внутри базы данных можно присвоить таблице псевдоним, отличный от имени файла DBF. Речь  <u>не идет</u> об опции <i>ALIAS</i> в команде <i>USE</i>. Это несколько другое. Если Вы войдете в режим модификации структуры таблицы, и перейдете на закладку <b>"Table"</b>, то увидите, что в опции <b>"Name"</b> стоит имя, совпадающее с именем файла <i>DBF</i>. Вот это-то имя и можно изменить, присвоив таблице некоторый <i>"псевдоним"</i> по которому и будут обращаться к указанной таблице. Лично я не рекомендовал бы новичкам использование подобных псевдонимов, поскольку это может внести путаницу в сам процесс программирования.</li>
</ul>
<h3><b><a name="TableLocation"></a>Расположение таблицы</b></h3>
<p></p>
<ul>
<li>Как для файла базы данных, так и вообще для всех рабочих таблиц использующихся в проекте следует выделять специальную папку (директорию). Эта рекомендация относится как к этапу разработки проекта, так и к поставке готового приложения клиентам.
<p>Причины этой рекомендации подробно изложены в разделе <i>Где расположить файлы проекта</i>. Вкратце, суть сводится к тому, что в противном случае возрастает риск непреднамеренной порчи файлов данных и соответственно потере данных. А также облегчается поиск нужных файлов и создание резервной копии.</p>
</li>
<li>Желательно файл базы данных располагать в той же папке, где и включенные в него файлы DBF
<p>По большому счету, конечно можно держать файл базы данных в одной директории, а включенные в него файлы DBF в другой. Но это усложняет сам процесс разработки проекта. Например, создание резервной копии в простейшем случе заключается в простом копировании директории с рабочими файлами в другое место. Если же рабочие файлы отделены от файла базы данных, то потребуется уже копирование 2-х директорий. Соответственно усложнится код.</p>
<p>Кроме того, в этом случае несколько увеличится размер файла базы данных (точнее файла DCT - мемо-файла), поскольку непосредственно в нем хранится относительный путь к включенным в него таблицам. Если таблицы расположены в той же директории, что и сам файл базы данных, то этого относительного пути просто нет. Справедливости ради, следует заметить, что относительный путь к базе данных хранится и в заголовках таблиц, которые в эту базу данных включены. Но на размер таблиц это не влияет, поскольку под этот относительный путь всегда выделяется фиксированное место вне зависимости от факта его наличия.</p>
<h3><b><a name="TableWork"></a>Собственно работа с таблицами</b></h3>
</li>
</ul>
<p>У объекта <i>Grid</i> при указании значения для <i>RecordSourceType</i> под термином <b>"таблица"</b> <i>(Table)</i> подразумевают как раз-таки именно файл <i>DBF</i>, а под термином <b>"алиас"</b> <i>(Alias)</i> - образ файла. Что вызывает огромное количество проблем у новичков с этим объектом. Ни в коем случае <u>не используйте</u> в качестве <i>RecordSourceType</i> указание <i>"Table"</i> - это приведет к непредсказуемому поведению данного объекта. Оставьте значение по-умолчанию <i>"Alias"</i></p>
<p>[li]Как уже было замечено выше, таблицы всегда открываются в конкретной рабочей области и для перехода в нужную рабочую область есть 2 способа адресации: либо по номеру этой рабочей области, либо по имени алиаса (alias) таблицы открытой в этой рабочей области.</p>
<p>Так вот, я бы рекомендовал всегда адресоваться к рабочей области именно по имени алиаса (alias) таблицы, а не по номеру.</p>
<p>Причина этой рекомендации в том, что конкретной рабочей области абсолютно все-равно, какая именно таблица в ней открыта. А при определенных условиях таблица может быть переоткрыта, но уже в другой рабочей области. Соответственно, адресуясь к рабочей области по ее номеру невозможно быть до конца уверенным, что в ней открыта именно нужная таблица. Да и вообще, что в ней открыта хоть какая-нибудь таблица. С другой стороны, обращение по алиасу с большей вероятностью укажет на нужную таблицу (тут тоже могут быть варианты, но это уже более экзотические случаи)</p>
<p>
Крайне нежелательно динамически в процессе работы модифицировать таблицы или добавлять/удалять таблицы в базе данных. Это сопряжено с большими проблемами и значительным усложнением программного кода.</p>
<h3><b><a name="TableWorkArea0"></a>Рабочая область с номером 0</b></h3>
<p>Отдельного упоминания заслуживает нулевая рабочая область. Ссылка на нулевую рабочую область означает ссылку на первую свободную рабочую область. Т.е. рабочую область, которая в настоящий момент не связана ни с какой таблицей</p>
<p>Такая адресация позволяет делать несколько вещей</p>
<p>Во-первых, это позволяет открывать новые таблицы не заботясь о том, не занята ли текущая рабочая область другой таблицей. Т.е. дается команда вида</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">     USE MyTable IN 0</pre>
</td>
</tr>

</table>
<p>Указание нулевой рабочей области необходимо потому, что в противном случае таблица будет открыта в текущей рабочей области одновременно закрыв таблицу, которая могла бы быть в ней открыта. А в таком синтаксисе открытие новой таблицы никак не повлияет на ранее открытые таблицы</p>
<p>Другое применение нулевой рабочей области - это настройки по умолчанию.</p>
<p>Например, Вы вероятно уже знаете, что любое <i>View</i> по-умолчанию открывается в режиме <b>оптимистической буферизации строк (3)</b>, но если Вам необходимо использовать его в режиме <b>оптимистической буферизации таблиц (5)</b>, то необходимо после его открытия сделать это переключение используя функцию <i>CursorSetProp()</i> примерно так</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   USE MyView IN 0  
  =CursorSetProp('buffering',5,'MyView') </pre>
</td>
</tr>

</table>
<p>Однако используя нулевую рабочую область можно сделать глобальную настройку для открытия всех талиц в 5 режиме буферизации примерно так:</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   =CursorSetProp('buffering',5,0)  
  USE MyView IN 0 </pre>
</td>
</tr>

</table>
<p>Правда использовать такие глобальные настройки надо с осторожностью, поскольку это именно глобальная, т.е. действующая на все рабочие области без исключения.</p>
<p>Замечу еще, что глобальная настрока нулевой рабочей области никак не затронет рабочие области, в которых уже есть открытые таблицы. Она влияет только на пока не используемые рабочие области.</p>
<h3><b><a name="BigTable"></a>Большая таблица</b></h3>
<p>Очень часто в конференциях проскакивает словосочетание <i>"большая таблица"</i>.</p>
<p>Я бы сказал, что понятие <i>"большая таблица"</i> весьма субъективно. По моим наблюдениям, в большинстве случаев, под "большой" понимают такую таблицу, выполнение операций чтения/записи с которой занимает ощутимо заметное время. Заметное для пользователя.</p>
<p>Одним из важнейших критериев, влияющих на время выполнения любой операции с таблицей является количество записей в этой таблице. Но тогда встает вопрос: <i>большая таблица - это сколько записей</i>?</p>
<p>Предельно допустимое количество записей, которое может содержаться в одной таблице - это <b>1 миллиард записей (1 billion)</b>. Т.е. единица и девять нулей. Так вот, <i>"большой"</i> можно считать таблицу содержащую не менее <i>нескольких миллионов записей</i>.</p>
<p>Но опять-таки термин "большая" всплывает не тогда, когда оценивают просто количество записей, а когда оцениваю время выполнения некоторых операций с такими таблицами. Но ведь есть множество причин влияющих на время чтения/записи. Соответственно, та таблица, которая считается "большой" в одном случае в другом уже не такая "большая".</p>
<h2 align="center"><b><a name="Cursor"></a>Курсор</b></h2>
<p>В очередной раз вспоминается лень американцев и их стремление все сокращать (впрочем русские здесь ушли еще дальше - могут сказать почти все используя только несколько специфических слов). Термин <i>"курсор"</i> употребляется сразу в нескольких смыслах в зависимости от контекста.</p>
<p><b>Курсор</b> - это образ файла DBF открытого в одной из рабочих областей</p>
<p><b>Курсор</b> - это временная таблица являющаяся результатом выполнения команды <i>Select-SQL</i></p>
<p><b>Курсор</b> - это <i>указатель</i> положения индикатора ввода текста с клавиатуры</p>
<p>Ну, последнее определение не очень-то интересно. В том смысле, что здесь все ясно, кроме того, почему этот термин был использован еще и для временных таблиц, ведь слово <i>"cursor"</i> собственно и переводится как <i>"указатель"</i>.</p>
<h3><b><a name="CursorDBF"></a>Курсор как образ файл DBF</b></h3>
<p>Опять же такое краткое определение не совсем точно, поскольку в этом смысле используется некий специфический объект. Введение этого объекта объясняется необходимостью визуализации <i>таблицы</i> при проектировании форм и отчетов.</p>
<p>Замечу еще, что курсор, как объект, используется не только как образ файлов DBF, но и как образ <i>View</i>. А View и таблица - <u>это не одно и то же</u>.</p>
<h3><b><a name="CursorTmp"></a>Курсор как временная таблица</b></h3>
<p>Вот это наиболее употребительное использование данного термина. Собственно есть 2 способа создания таких курсоров</p>
<p><u>Первый способ</u> - это использование команды <i>CREATE CURSOR</i>. Созданный таким способом курсор будет редактируемым. И это будет именно временная таблица, т.е. она будет автоматически уничтожена в момент закрытия. Ну про этот способ сказать особо нечего. Здесь нет каких-то проблем и особенностей</p>
<p><u>Второй способ</u> - это использование опции <i>CURSOR</i> в команде <i>SELECT-SQL</i>. Примерно в следующем синтаксисе</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   SELECT * FROM MyTable INTO CURSOR TmpTable</pre>
</td>
</tr>

</table>
<p>Вот этот-то TmpTable и есть <i>курсор</i></p>
<p>В зависимости от различных условий этот курсор может иметь разное физическое "воплощение" и разные свойства</p>
<p>Если SQL-запрос полностью оптимизируем, то вместо создания нового файла будет просто открыта та же самая таблица с наложенным на нее фильтром. Зачастую это очень неприятная неожиданность. Проверить, чем же физически является сформированный курсор, можно используя функцию DBF()</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   SELECT * FROM MyTable INTO CURSOR TmpTable  
  ?DBF('TmpTable')</pre>
</td>
</tr>

</table>
<p>Если будет возвращено имя файла с расширением DBF, то данный курсор является той же самой исходной таблицей с наложенным на нее фильтром.</p>
<p>Если Вы хотите при любых запросах быть уверенными, что курсор - это именно временная таблица, а не исходная таблица с наложенным фильтром, то Вам следует добавить опцию <b><i>NOFILTER</i></b></p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   SELECT * FROM MyTable INTO CURSOR TmpTable NOFILTER</pre>
</td>
</tr>

</table>
<p>Эта опция появилась <u>только</u> в 5 версии Visual FoxPro, хотя там она еще не была документирована. В более ранних версиях необходимо добавлять фиктивные условия или признаки группировки, чтобы исключить возможность оптимизации.</p>
<p>Однако если курсор - это <u>временная таблица</u>, то это еще не значит, что эта временная таблица будет непременно физически расположена на диске. Вполне возможно, что вся временная таблица целиком поместится в оперативную память. Т.е. функция <i>DBF('TmpTable')</i> будет исправно показывать некий временный файл, но попытка найти его физически на диске окончится неудачей и функция <i>FILE(DBF('TmpTable'))</i> вернет <b>.F.</b></p>
<p>Правда расположение временной таблицы целиком в памяти ни в коем случае не помешает работе с этой временной таблицей. Собственно, в подавляющем большинстве случаев Вас и не должно заботить где физически расположена та или иная таблица.</p>
<p>Еще один немаловажный вопрос связан с тем, что полученные таким образом курсоры нельзя редактировать. <u>Они доступны только на чтение</u>. Начиная с 7 версии Visual FoxPro для решения этой проблемы появилась специальная опция <b>ReadWrite</b></p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   SELECT * FROM MyTable INTO CURSOR TmpTable NOFILTER READWRITE</pre>
</td>
</tr>

</table>
<p>Использование этой опции позволяет создавать курсор, который <b>можно редактировать</b>. Для более младших версий FoxPro для того, чтобы курсор можно было редактировать его следует переоткрыть</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   SELECT * FROM MyTable INTO CURSOR TmpReadTable NOFILTER  
  USE (DBF('TmpReadTable')) IN 0 AGAIN ALIAS TmpWriteTable  
  USE IN TmpReadTable</pre>
</td>
</tr>

</table>
<p>Переоткрытый таким образом курсор <i>TmpWriteTable</i> уже можно будет редактировать</p>
<p>Курсоры можно индексировать также как и обычные таблицы. Правда если курсор открыт в режиме только для чтения, то Вы сможете создать для него только один индексный тэг.</p>
<p>Все созданные таким образом курсоры автоматически удаляются с диска (если временный файл физически был создан на диске) в момент их закрытия. Если Вы создали для такого курсора структурный индексный файл, то этот файл также будет автоматически удален в момент закрытия курсора.</p>
<h3><b><a name="GetCursorSQL"></a>Формирование имени курсора в команде Select-SQL</b></h3>
<p>Это не такой простой вопрос, как может показаться. Проблема здесь в том, что имя курсора - это фактически алиас (alias) временной таблицы. Но в FoxPro в одном сеансе данных не может быть открыто 2 таблиц с одинаковыми алиасам.</p>
<p>Курсор всегда создается на машине клиента, поэтому конфликтов с другими пользователями можно не опасаться. Более того, даже если запущен дважды один и тот же проект на одной машине все-равно не будет конфликат связанного с одинаковыми именами курсоров, поскольку они открыты в разных сеансах данных. Конфликт возможен если Вы создаете несколько курсоров с одним и тем же именем в одном сеансе данных</p>
<p>Ну например, Вы открыли 2 формы использующих <i>Default DataSession</i> и в обоих создали курсор с одинаковым именем. В этом случае, курсор созданный позднее затрет курсор созданный ранее. При этом настройка <i>SET SAFETY</i> не играет никакой роли. Курсор будет пересоздан молча. Без каких-либо дополнительных запросов.</p>
<p>Избежать подобных конфликтов можно несколькими способами</p>
<p></p>
<ul>
<li>Открывать формы и отчеты только в Private DataSession</li>
<li>Самостоятельно следить за уникальностью имен курсоров</li>
<li>Использовать функцию для генерации уникальных имен файлов<br />
Последний вариант кажется наиболее предпочтительным. Однако тут следует быть осторожным. Дело в том, что в описании к FoxPro для генерации уникальных имен файлов предлагается использовать следующую функцию</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   lcCursorName=SubStr(SYS(2015),3,10)</pre>
</td>
</tr>

</table>
<p>Проблема в том, что функция <i>SYS(2015)</i> может содержать в возвращаемом значении как буквы, так и цифры. Это значит, что при использовании выделения строки по SubStr() Вы вполне можете получить первым символом цифру. А использование в качестве имени переменной цифры в синтаксисе FoxPro недопустимо и Вы неожиданно получите сообщение о синтаксической ошибке. Чтобы этого избежать следует либо принудительно подмешать букву</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   lcCursorName='t'+SubStr(SYS(2015),3,10)</pre>
</td>
</tr>

</table>
<p>Либо вообще не выделять строку</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   lcCursorName=SYS(2015)</pre>
</td>
</tr>

</table>
<p>Соответсвенно выполнение запроса станет выглядеть так:</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   LOCAL lcCursorName  
  lcCursorName=SYS(2015)  
  SELECT * FROM MyTable INTO CURSOR &amp;lcCursorName NOFILTER</pre>
</td>
</tr>

</table>
<p>Такой способ создания уникальных имен курсоров действительно обеспечит уникальность, но это очень неудобный способ из-за необходимости при обращении к такому курсору постоянного использовать макроподстановки. Поэтому по возможности желательно его избегать.</p>
<h2 align="center"><b><a name="Fields"></a>Поля таблицы</b></h2>
<p>Поле таблицы - это столбец который Вы видите каждый раз открывая таблицу на просмотр.</p>
<h3><b><a name="FieldsNames"></a>Название полей таблицы</b></h3>
<p>Поле таблицы, включенной в {базу данных} может содержать до 128 символов, содержать русские символы, цифры и некоторые спец.символы. Однако для упрощения работы в FoxPro я бы порекомендовал следующие ограничения в наименовании файла таблицы</p>
</li>
<li>Не использовать в названии русские символы - причина этой рекомендации в том, что FoxPro разрабатывался прежде всего для англоязычных пользователей и использование в нем символов другого языка - это уже последующее дополнение. Как следствие, велик риск, что чего-то, где-то недосмотрели и при определенных ситуациях русские буквы в имени вызовут неожиданные глюки.</li>
<li>Не использовать в названии цифры и спец.символы - в принципе, ошибок использование цифр и спец.символов не вызовет. Причина этой рекомендации в повышении сложности восприятия названия.
<p>Ну, например, если в таблице необходимо указать сумму платежа и сумму налога, то Вы конечно можете создать 2 поля <i>Platezh1</i> и <i>Platezh2</i>. Но в этом случае, вам каждый раз придется вспоминать, что собственно обозначает цифра 1, а что цифра 2. Если Вы работаете постоянно только с одним проектом, то это не страшно, как-нибудь да запомните. Но если Вы отложили этот проект и вернулсь к нему через несколько месяцев, то напряженные размышления на тему - а что это собственно такое? - Вам обеспечены. Гораздо разумнее дать значимые имена: <i>Platezh</i> и <i>Nalog</i></p>
</li>
<li>Если по данному полю Вы создаете простой индексный тэг, выражение которого состоит только из имени поля, то ограничивайте название поля 10 символами - причина здесь в том, что количество символов в названии индексного тэга не может быть больше 10. Это значит, что Вам придется указать в качестве названия индексного тэга что-то отличное от названия поля, по которому этот индекс построен. В принципе, ничего страшного. Однако если имя тэга и имя поля совпадают, то это сильно упрощает процесс программирования и позволяет в некоторых случаях создавать универсальный программный код не зависящий от использования конкретной таблицы.</li>
<li>Не называйте таблицу также как и одно из его полей - разумеется ошибки это не вызовет, но усложнит понимание написанного кода самим программистом. Не всегда с ходу можно однозначно определить, что речь идет именно о таблице, а не о поле таблицы. А если еще и их названия совпадают, то совсем тяжело становится.</li>
<li>Не используйте для названия одно из зарезервированных в FoxPro слов, в особенности те слова, которые используются в команде Select-SQL - это может вызвать сообщение о синтаксической ошибке, для подавления которой придется сильно усложнить программный код. Кроме того, это снизит "читабельность" кода. Ведь зарезервированные слова автоматически подсвечиваются опеределенным цветом (если Вы используете стандартный текстовый редактор FoxPro) и с ходу становится проблематично отличить опцию или команду от имени поля таблицы.
<p>Если воображение Вам напрочь отказывает и Вы не знаете как по другому назвать поле кроме как например <i>"Order"</i> или <i>"Group"</i>, то добавьте в качестве первого символа букву, обозначающую тип данных, используемых в данном поле. Например, <i>"nOrder"</i> или <i>"cGroup"</i></p>
</li>
<li>В некоторых книгах рекомендуется в качестве первого символа имени поля всегда указывать букву, обозначающую тип данных, использующийся в данном поле. Я бы не рекомендовал этого делать, по той причине, что FoxPro - это регистро-независимый язык. Т.е. ему все-равно большие или маленькие буквы используются в именах. Как следствие, все команды и функции FoxPro возвращающие какие-либо имена возвращают их либо в верхнем (большими буквами), либо в нижнем (маленькими буквами) регистре. При таком написании название воспринимается как одно целое слово без смыслового разбиения. Т.е. первая буква не воспринимается как тип данных, а воспринмается просто как начало слова.<br />
<h3><b><a name="FieldsWork"></a>Собственно работа с полями таблицы</b></h3>
</li>
<li>Крайне нежелательно динамически в процессе работы модифицировать поля таблицы или добавлять/удалять поля. Это сопряжено с большими проблемами и значительным усложнением программного кода.</li>
<li>Желательно при использовании полей таблиц всегда дописывать алиас таблицы для их однозначной идентификации. Разумеется, кроме случаев, когда отсутствие алиаса обусловлено логикой программы.
<p>Дело в том, что если алиас не указан, то FoxPro предполагает, что речь идет о поле таблицы, расположенной в текущей рабочей области. А если у таблицы в текущей рабочей области нет такого поля, то о переменной памяти с тем же именем. Но при написании относительно сложной программы далеко не всегда можно с уверенностью сказать, что мы находимся в нужной рабочей области. Явное указание алиаса таблицы снимает эту проблему.</p>
</li>
<li>Заполняйте раздел <i>"Comment"</i> для всех полей таблицы в дезайнере таблиц. Написание комментариев, хотя бы минимальное, в любом случае очень полезная вещь. Этот текст автоматически отображается в окне самого проекта (<i>Project</i>), когда указатель встает на соответствующее поле таблицы. Да и документирование базы данных упрощается. Можно использовать этот текст (через функцию <i>DBGetProp()</i>) при выдаче сообщений об ошибках.<br />
<h2><b><a name="KeyField"></a>Ключевое поле</b></h2>
<p>Это одно из важнейших понятий, используемое при работе с таблицами и базами данных</p>
<p><b>Ключевое поле</b> - это такое поле (или набор полей) по содержимому которого можно однозначно идентифицировать запись таблицы. Т.е. по значению ключевого поля всегда однозначно можно сказать о какой записи идет речь и не может существовать 2 записей с одинаковыми значениями ключевого поля.</p>
<p><b>Внешний ключ</b> - это поле таблицы, содержащее в себе значение ключевого поля другой таблицы. Т.е. просто ссылка на запись другой таблицы.</p>
<p>Начну сразу с вывода:<br />
<b>Для большинства задач в FoxPro удобно использовать в качестве ключевого поля суррогатный ключ типа Integer. Ключевое поле желательно вводить для всех без исключения таблиц базы данных</b></p>
<p>Ну а теперь рассмотрим как же я дошел до выводов таких</p>
<h3><b><a name="KeyTypes"></a>Естесственные или Суррогатные ключи</b></h3>
<p>До сих пор не утихают споры о том, что лучше использовать: суррогатные или естесственные ключи.</p>
<p><i>Естесственный ключ</i> - это поле или набор полей, которые имеют некий физический смысл. Ну например, табельный номер, номер паспорта, и т.п.</p>
<p><i>Суррогатный ключ</i> - это поле которое не имеет никакого физического смысла и введено исключительно с целью однозначной идентификации записи. Информация, которая в нем содержится никак логически не связана с информацией из прочих полей той же таблицы.</p>
<p>Рассмотрим какие преимущества и недостатки имеют естесственные и суррогатные ключи</p>
<p>Фактически самый главный и определяющий критерий по которому можно судить о том, пригодно ли данное поле для использования его в качестве ключевого или нет - это однозначность идентификации записи. Здесь имеется в виду, действительно ли значение выбранного поля для каждой записи уникально?</p>
<p>Ну с суррогатным ключем все понятно - мы сами формируем его значение без участия со стороны пользователя, поэтому можем проследить за уникальностью, а вот как тут у естесственного ключа?</p>
<p>На первый взгляд кажется, что тоже все в порядке. Разве может номер паспорта быть не уникальным? Или табельный номер? Оказывается еще как может!</p>
<p>Во-первых, любая информация вводимая пользователем заведомо может содержать ошибки. Ну не могут люди не ошибаться. Кто-то ошибается чаще, кто-то реже, но ошибаются все. Часть ошибок безусловно можно отловить программно, но далеко не все.</p>
<p>Например, если речь идет о некотором цифро-буквенном номере (номер паспорта) и пользователь ввел "123 АБВ", а надо было "423 АБВ", то синтаксически это правильно, но по содержанию - это ошибка. Если впоследствии окажется что теперь надо ввести новый номер паспорта, но уже "123 АБВ", то программа откажется это сделать, поскольку такой номер уже есть. А на что его исправить неизвестно, поскольку документов, с которых он был введен уже нет.</p>
<p>Во-вторых (и это пожалуй более существенно), информация имеет тенденцию меняться. Например, не так давно был произведена замена паспортов в Российской Федерации и если бы программа опиралась в качестве идентификатора на его номер, то теперь все пришло в большой беспорядок в связи с этой заменой</p>
<p>Опять же, не так давно в Российской Федерации были введены так называемые "Идентификационные Номера Налогоплательщика". Так называемые "ИНН". Ну казалось бы, ну вот он уникальный идентификатор контрагента. Но наша родная бюрократия и здесь сумела все испортить. Оказалось, что ИНН нарушает все критерии уникальности, в связи с некоторыми особенностями его формирования</p>
<p>В одной из конференций, один из посетителей выразился по этому поводу достаточно эмоционально</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   1. ИНН может быть одинаковым у разных организаций. Не верите? Я тоже не верил...   
  2. ИНН может быть разным у одной и той же организации.   
  3. У одного и того же человека может быть два разных номера паспорта.   
  4. У одного и того же человека могут быть разные фамилии.   
  5. У одной и той же организации могут быть разные наименования (в разное время года :) )   
  6. Количество детей, конечностей, зубов и даже папилярные линии... МОГУТ ИЗМЕНЯТЬСЯ!!!</pre>
</td>
</tr>

</table>
<p>Я отдаю предпочтение СК просто потому, что СК предоставляет возможность пользователю решать, Иванов И.И. и Петров И.И. - один и тот же человек или разные. Может быть, он сменил фамилию, может быть даже пол, может быть он сменил и тип паспорта, и его номер. Может быть, он сменил гражданство, вернулся с войны без рук, ног и головы, наплодил детей, сделал пластическую операцию по изменению веса... Но от этого он не перестал быть самим собой.</p>
<p>Таким образом, в общем случае, естесственный ключ не обеспечивает главного - однозначности идентификации записи по значению ключевого поля. А если все-таки обеспечивает, то он перестает быть естесственным в первоначальном смысле этого слова, поскольку вынуждает пользователя приспосабливаться и изворачиваться.<br />
Так почему же, несмотря на столь явные аргументы против, все равно есть достаточно большое количество приверженцев использования естесственного ключа?</p>
<p>На мой взгляд, здесь существует явное непонимаение того, что суррогатный ключ - это информация, которая нигде, никоим образом не предоставляется пользователю. Суррогатный ключ - это некоторая скрытая, невидимая пользователем "внутренняя" механика.</p>
<p>Дело в том, что главным аргументом приверженцев естесственного ключа является его "понятность" пользователю. Т.е. предполагается, что пользователь что-то ищет опираясь на значение ключевого поля. Иными словами, пользователь сам вводит, исправляет и просматирвает значение ключевого поля.</p>
<p>Но в отношении суррогатного ключа - такое его использование просто недопустимо! Ну не должен пользователь знать как там внутри программы все "тикает". Пользователю интересно показание часов, а не вские там "шестеренки". Если Вы хотите предоставить пользователю некую аббревиатуру (краткое название, "ник"), то это ни в коем случае не должен быть суррогатный ключ. Введите для этой цели еще одно дополнительное поле.<br />
Есть и еще один, более хитрый аргумент, в пользу хотя бы частичного использования естесственных ключей. Дело в том, что очень часто возникает необходимость в некоторой внутренней классификации. Ну например, если речь идет о документах, то они могут находится в некоторых взаимоисключающих сотояниях:</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   1 - Получено  
  2 - Отложено  
  3 - Утверждено</pre>
</td>
</tr>

</table>
<p>Есть очень большое искушение не делать дополнительную таблицу с этими 3 записями, а просто использовать коды 1,2,3 Ну действительно, ну не может же пользователь изменить количество и название состояний. Вот тут приверженцы естесственного ключа и поднимают голос - дескать, что говорят программисту какие-то цифирки, пускай уж сразу слова пишет</p>
<p>В данном случае лично я рекомендовал бы не поддаваться искушению "упростить" базу данных и ввести-таки дополнительную служебную табличку с 3 записями состояния. Пусть даже пользователь и не имеет возможность ее редактировать. Вы сами убедитесь, насколько она окажется уместна, а в некоторых случаях просто незаменима при написании Вами программы.<br />
Вывод однозначен - суррогатные ключи предпочтительнее по всем критериям перед естесственными ключами</p>
<h3><b><a name="KeyDataTypes"></a>Какой тип данных использовать: <i>Character</i> или <i>Integer</i></b></h3>
<p>Раньше, когда для хранения числовых данных в FoxPro существовали только поля типа <i>Numeric</i> перевес в аргументации склонялся в пользу использования полей типа <i>Character</i>, но с появлением полей типа <i>Integer</i> все стало не так однозначно</p>
<p>При сравнении способа хранения ключевого поля в символьном или числовом формате выдвигаются 3 аргумента</p>
</li>
<li>В числовых полях легче формировать новое значение</li>
<li>Символьные поля "экономичнее", т.е. можно уместить больше значений в том же размере</li>
<li>Символьные поля "универсальнее" при так назваемых задачах репликации, т.е. объединении не связанных между собой баз данных
<p><b>Числовые поля легче формировать</b></p>
<p>Тут числовые поля вне конкуренции, поскольку стандартным способом формирования числовых ключевых полей является "максимальное значение плюс один". В случае же символьных полей, как правило используется некий генератор псевдо-случайных чисел. Здесь не место, для обсуждения способа генерации символьных ключей, но используемые процедуры обычно достаточно сложны из-за сложности обеспечения действительно уникального значения.</p>
<p>Замечу еще, что не стоит для генерации нового значения ключа использовать именно определение максимального значения в текущей таблице. Это хорошо в однопользовательском режиме, но в многопользовательском Вы рискуете получить 2 одинаковых значения ключа при одновременном добавлении новой записи двумя пользователями одновременно. Обычно используют специальную служебную таблицу, хранящуюю значение последнего использованного (или первого не использованного) значения ключа. Примеры использования такой таблицы приведены в стандартных проектах примеров FoxPro: <i>Solution.pjx</i> (форма <i>NewID.scx</i>) и <i>TasTrade.pjx</i>. А в 8 версии FoxPro появились <b>автоинкрементные поля</b>, которые совсем упростили данную задачу.</p>
<p><b>Символьные поля "экономичнее", т.е. можно уместить больше значений в том же размере</b></p>
<p>Начнем с вопроса, а сколько вообще необходимо значений для идентификации вообщех всех записей таблицы?</p>
<p>Из системных ограничений известно, что предельно допустимое количество записей в DBF-таблице - это <b>1 миллиард записей (1 billion)</b>. Т.е. это единица и девять нулей</p>
<p>Поле типа Integer может принимать знаячение в диапазоне от -2,147,483,647 до 2,147,483,647. Ну, отрицательные значения как правило не используются, но и положительные значения в 2 раза больше, чем максимально возможное количество записей. С учетом возможного удаления записей - в самый раз.</p>
<p>Поскольку поле типа <i>Integer</i> физически занимает 4 байта (4 символа), то посмотрим, сколько же значений может быть присвоено при таком же размере для символьного поля</p>
<p>В одном байте может быть записано 256 значений, т.е. это составит 256**4=4,294,967,296. Но поскольку некоторые значения нельзя использовать по ряду соображений (например, символ перевода строки, Esc и т.п.), то получается, что в смысле количества значений поля типа <i>Integer</i> ничуть не уступает полю типа <i>Caracter(4)</i>, даже пожалуй несколько превосходит</p>
<p><u>Замечание</u></p>
<p>Следует заметить, что в FoxPro поля типа <i>Numeric</i> храняться как символьные поля, т.е. для хранения каждой цифры нужен один байт. Это значит, что если предполагаемое количество значений в данной таблице не превышает тысячи (меньше 4 символов), то возникает искушение "сэкономить" и вместо типа <i>Integer</i> ввести скажем поле типа N(2)</p>
<p>Так вот, я бы не советовал этого делать по следующим соображениям:</p>
</li>
<li>В современных компьютерах физический объем таблиц (в байтах) уже не играет столь принципального значения как раньше. Можно позволить себе особо не экономить дисковое пространство.</li>
<li>Если все ключевые поля во всех таблицах имеют один и тот же тип данных и размерность, то это значительно упрощает сам процесс программирования. Не надо мучительно вспоминать какой именно тип и размерность использовался в той или иной таблице. Иногда это имеет принципиальное значение.
<p><b>Символьные поля "универсальнее" при так назваемых задачах репликации</b></p>
<p><b>Репликация</b> - это объединение информации из двух не связанных между собой баз данных, например, из двух филиалов одной организации территориально удаленных друг от друга</p>
<p>Да, действительно, в подобных задачах удобнее пользоваться символьными полями, хотя даже в такой, казалось бы заведомо проигрышной ситуации числовым полям есть что "возразить"</p>
<p>Здесь не место для обсуждения данной проблемы в связи с ее обширностью, поэтому замечу только, что для очень большого круга задач сама задача репликации не актуальна. Либо используется файл-серверная технология, либо объединение необходимо только в одну сторону для получения справок и отчетов<br />
Вывод не столь категоричен, как в случае с суррогатными ключами:</p>
</li>
<li>генерация нового значения числового ключа проще, чем символьного</li>
<li>количество значений ключа для типа <i>Integer</i> и <i>Chracter(4)</i> практически одинаково</li>
<li>при решении сложных задач репликации удобнее пользоваться символьными ключевыми полями<br />
Но поскольку большинству программистов не придется сталкиваться с задачами репликации, то можно смело использовать для ключевых полей тип <i>Integer</i>.</p>
<p><b><a name="KeyFieldsNeed"></a>Надо ли использовать ключевое поле во всех без исключения таблицах</b></p>
<p>На первый взгляд, вопрос может показаться странным. Разве можно без ключевого поля? Оказывается, в некоторых случаях можно.</p>
<p>Например, для организации связи много-ко-многим стандартным способом является создание таблицы-посредника. Что имеется в виду?</p>
<p>Допустим, у Вас есть список контрагентов и список банков. Разумеется, один и тот же контрагент может иметь счет в нескольких банках. Но верно и обратное - один банк работает с несколькими контрагентами. В этом случае Вы не можете сделать внешний ключ банка в таблице контрагента или внешний ключ контрагента в таблице банков. Вам необходимо ввести таблицу-посредник, которая будет хранить в себе внешний ключ банка и внешний ключ контрагента.</p>
<p>При такой организации, каждая запись в этой таблице посреднике однозначно идентифицирется парой значений: код контрагента-код банка. Поэтому возникает искушение не вводить еще одно поле для суррогатного ключа этой таблицы-посредника.</p>
<p>Однако я настоятельно рекомендовал бы Вам вводить-таки собственное ключевое поле для всех таблиц базы данных. Почему? Ну потому, что любая программа имеет "привычку" развиваться.</p>
<p>Если вернуться к примеру с контрагентами и банками, то легко заметить, что я обошел вниманием тот момент, что один контрагент может иметь несколько счетов в одном и том же банке. Этот самый реквизит (счет контрагента в банке) невозможно прицепить ни к банку, ни к контрагенту. Но он очень удачно подходит к этой таблице-посреднику. Если бы для идентификации записи в этой таблице Вы опирались бы на пару: код банка - код контрагента, то Вам пришлось бы серьезно переделывать значительную часть программы. А в случае существования собственного кода записи никаких проблем. Ну добавили еще одно поле, ну и что?</p>
<p>В данном случае я рассмотрел достаточно очевидный случай, но зачастую кажется, что по другому быть не может и уж вот здесь-то собственный идентификатор записи не нужен. Не обольщайтесь. Если Вам кажется, что чего-то не может быть - это всего-лишь значит, что Вы чего-то не знаете.<br />
Вывод - используйте собственное ключевое поле во всех без исключения таблицах. Даже если Вам кажется, что без него можно обойтись.</p>
<h3><b><a name="KeyFieldName"></a>Название ключевого поля<br />
</b></h3>
<p>Поскольку <b>ключевое поле - это обычное поле таблицы</b>, то на него распространяются все рекомендации приведенные в разделе <i>"Поля таблицы"</i>. Однако поскольку это все-таки очень специфическое поле, то для него я бы добавил следующие рекомендации</p>
</li>
<li>Образуйте название ключевого поля таблицы добавив к имени таблицы 2 буквы "ID" (от слова identifier - идентификатор), отбросив букву "s" если имя таблицы - это слово во множественном числе - Например, если вы назвали таблицу контрагентов "Partners", то ключевое поле будет назваться "PartnerID". При таком способе наименования однозначно можно сказать к какой таблице относится ключевое. Но не стоит назвать ключевое поле также как и собственно таблицу, поскольку в некоторых случаях станет весьма проблематично сходу определить о чем идет речь - о поле или собственно о таблице</li>
<li>Называйте внешние ключи также как и соответствующие ключевые поля - такой способ наименования внешних ключей очень облегчает понимание о чем собственно идет речь при написании программы.</li>
<li>Ограничивайте название ключевого поля 10 символами - причина здесь в том, что количество символов в названии индексного тэга не может быть больше 10. А по ключевому полю обязательно следует построить индекс. Если количество символов в ключевом поле будет больше 10, то название индексного тэга будет отличаться от названия ключевого поля. А это не очень хорошо в том смысле, что серьезно затруднит программирование, поскольку использовать этот индекс Вы будете сплошь и рядом.
<p>Кстати, из этой рекомендации вместе с самой первой рекомендацией по наименованию ключевых полей вытекает, что количество символов в имени таблицы не должно превышать 8 (или 9, если название таблицы - это множественное число)</p>
<h3><b><a name="KeyFieldWork"></a>Собственно работа с ключевыми полями таблицы<br />
</b></h3>
</li>
<li>Значение ключевого поля должно присваиваться один раз в момент создания записи и не меняться все время существования этой записи. Крайне нежелательно модифицировать значение ключевого поля. Лучше строить программу таким образом, чтобы не возникало необходимости в подобной модификации. Более того, я бы не рекомендовал использовать значения ключевых полей удаленных записей (умерла, так умерла).
<p>Такая стратегия сильно облегчает отлов ошибок пользователей, поскольку в большинстве случаев, если пользователь делает ошибку в документе, то он не исправляет ошибочный документ, а удаляет его и создает заново! Вот и докажи потом, что это не программа плохая!</p>
<p>Кроме того, такая стратегия позволяет с меньшими проблемами интегрировать несколько баз данных в один комплекс если в этом возникает необходимость.</p>
</li>
<li>Ни в коем случае не давайте пользователям возможность самостоятельно изменять значение ключевых полей. Более того, пользователь вообще не должен подозревать об их существовании. Это должен быть исключительно внутренний механизм обеспечения целостности базы данных.
<p>Дело в том, что любая информация, которую вводит пользователь по определению является не надежной и как бы Вы ни защищали информацию, пользователь найдет как ее обойти или просто заставит Вас это сделать! А то, о чем он не подозревает и испортить не может.</p>
</li>
<li>Не пытайтесь навесить на ключевые поля какие-либо еще функции кроме однозначной идентификации записи.
<p>Например, в некоторых случаях возникает соблазн использовать ключевые поля еще и как порядковый номер элемента в списке. Так вот, не надо этого делать. Введите для реализации этой функциональности дополнительное поле. Также не следует использовать ключевое поле, как краткое название элемента</p>
<p>Если Вы навесите на ключевое поле еще какую-либо функциональность, кроме однозначной идентификации записей, то просто создадите себе массу проблем (сильно усложнится программный код). А в качестве преимуществ только некоторая экономия дискового пространства. Думаю, оно того не стоит.</p>
</li>
</ul>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4899">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4899">Владимир Максимов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Владимир Максимов" href="https://foxclub.ru/account/?user=4899">
				<img alt='' src='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 65<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii_/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Статьи]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii/</link>
					<title><![CDATA[Советы начинающим Часть II]]></title>
                    					    <author><![CDATA[Владимир Максимов]]></author>
                    										    <pubDate>Sun, 27 Nov 2022 10:21:37 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Советы начинающим Часть II</h1>
													</header>
													
<p>В этой статье :</p>
<p><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii/#Table">Таблица</a></p>
<ul>
<li><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii/#NameTable">Название таблицы</a></li>
<li><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii/#TableLocation">Расположение таблицы</a></li>
<li><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii/#TableWork">Собственно работа с таблицами</a></li>
<li><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii/#TableWorkArea0">Рабочая область с номером 0</a></li>
<li><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii/#BigTable">Большая таблица</a>
<p><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii/#Cursor">Курсор</a></p>
</li>
<li><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii/#CursorDBF">Курсор как образ файл DBF</a></li>
<li><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii/#CursorTmp">Курсор как временная таблица</a></li>
<li><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii/#GetCursorSQL">Формирование имени курсора в команде Select-SQL</a>
<p><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii/#Fields">Поля таблицы</a></p>
</li>
<li><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii/#FieldsNames">Название полей таблицы</a></li>
<li><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii/#FieldsWork">Собственно работа с полями таблицы</a>
<p><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii/#KeyField">Ключевое поле</a></p>
</li>
<li><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii/#KeyTypes">Естесственные или Суррогатные ключи</a></li>
<li><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii/#KeyDataTypes">Какой тип данных использовать: Character или Integer</a></li>
<li><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii/#KeyFieldsNeed">Надо ли использовать ключевое поле во всех без исключения таблицах</a></li>
<li><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii/#KeyFieldName">Название ключевого поля</a></li>
</ul>
<p><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii/#KeyFieldWork">Собственно работа с ключевыми полями таблицы<br /></a></p>
<p></p>
<h2 align="center"><b><a name="Table" tabindex="-1"></a>ТАБЛИЦА</b></h2>
<p>Это термин, который очень часто употребляется в FoxPro и также часто он употребляется совсем не в том смысле, как его понимают новички. Можно сказать, что у этого термина есть два определения (как и у термина "база данных")</p>
<p><b>Таблица</b> - это файл с расширением <i>DBF</i> и связанные с ним файлы с тем же именем, но с расширением <i>FPT</i> (файл для хранения полей типа <i>Memo и General</i>) и с расширением <i>CDX</i> (структурный индексный файл)</p>
<p>Формально, это абсолютно правильное определение. Проблема только в том, что в подавляющем большинстве случаев, когда в FoxPro употребляют термин <i>"таблица"</i>, то под этим подразумевают вовсе не это. Точнее, <i>не совсем это</i>.</p>
<p><b>Таблица</b> - это некий <i>образ файла</i> с расширением <i>DBF</i> открытый в указанной <i>сессии данных</i> и в указанной <i>рабочей области</i>.</p>
<p>Со стремлением американцев все сокращать они не потрудились придумать соответствующий термин. Поэтому постоянно возникает путаница. Уместнее было бы использовать вместо термина <i>"таблица"</i> термины <i>"курсор"</i> или <i>"алиас"</i>, поскольку они более точно отображают суть. И действительно, в некоторых случаях эти термины именно в таком смысле и употребляются, чем только окончательно все запутывают, поскольку они используются также и в других смыслах.</p>
<p><b>Алиас</b> (<i>alias</i>) - это <i>"псевдоним" файла DBF</i> открытого в какой-либо рабочей области. Как правило, алиас совпадает с именем файла DBF. Однако это не всегда так. Дело в том, что в одном сеансе данных не может быть двух одинаковых алиасов. Поэтому, если алиас таблицы не указан явно при ее открытии (опция ALIAS в команде USE, или каким-либо другим способом), то FoxPro самостоятельно назначит уникальный алиас для таблицы, начав разумееется с алиаса совпадающего с именем файла DBF если это возможно.</p>
<p>Имейте в виду, что в абсолютном <b>большинстве случаев</b> под термином <i>"таблица"</i> подразумевается именно <i>"образ файла"</i>, т.е. файл уже открытый через команду USE (или каким-либо еще способом) в среде FoxPro. Если же подразумевается именно файл DBF, то как правило это оговаривается особо.</p>
<p>В версиях FoxPro 2.x в том смысле, в котором используется термин <i>"таблица"</i> использовался термин <i>"база данных"</i> (видимо отсюда пошло расширение - первые буквы английской фразы <i>DataBase File</i>), поскольку в тех версиях еще не существовало файла DBC. Соответственно, когда программисты переходят на версию Visual FoxPro, то их бывает достаточно трудно понять из-за этой путаницы с терминами.</p>
<p>Следует всегда помнить, что таблицы открываются в так называемых <i>"рабочих областях"</i>. Что это такое нигде внятно не объясняется (дескать, и так понятно). Попробую определить это так</p>
<p><b>Рабочая область</b> (<i>Work area</i>) - это некий числовой идентификатор, который может быть присвоен таблице. Если у Вас был опыт программирования в других языках, то можно сказать, что рабочая область - это "<i>хэндл</i>" или "<i>дескриптор</i>" таблицы внутри среды FoxPro</p>
<p>Одновременно одной рабочей области может соответствовать только одна таблица, в то время как одной таблице может соответствовать несколько рабочих областей. Другими словами, одну и ту же таблицу <i>можно одновременно открыть в нескольких рабочих областях</i>, но в одной конкретной рабочей области может быть открыта только одна таблица.</p>
<p>До тех пор, пока таблица не будет открыта в какой-либо рабочей области она для FoxPro как бы не существует. Точнее с ней нельзя производить никакие операции по чтению/модификации данных используя штатные команды и функции.</p>
<p>Кроме понятия "рабочая область" в FoxPro введено понятие <b>"сеанс данных"</b> (<i>DataSession</i>)</p>
<p><b>Сеанс данных (DataSession)</b> - это некоторая динамическая копия среды FoxPro. Открывая среду FoxPro Вы автоматически открываете сеанс данных, который автоматически же и завершается при выходе из FoxPro. Но внутри собственно FoxPro Вы имеете возможность сделать как бы копию среды FoxPro используя так называемые <i>"частные сеансы данных" (Private DataSession)</i></p>
<p>Что собственно дает эти <b>"частные сеансы данных"</b>? А дает это возможность симулировать внутри одного приложения FoxPro работу нескольких, независимых друг от друга пользователей.</p>
<p>В результате таблицы открытые в одном сеансе данных "не видны" в другом сеансе данных. И соответственно манипуляции (не все) производимые с таблицами в одном сеансе данных не влияют на другие сеансы данных.</p>
<p>Самый распростарненный случай применения <i>Private DataSession</i> - это одновременное открытие нескольких форм, рассматривающих один и тот же документ с разных сторон. Как правило, для этой цели между таблицами устанавливается связь по <i>SET RELATION</i>. Если открыть подобные формы в одном сеансе данных, то зачастую это становится большой проблемой, поскольку в одной форме требуется наложить на таблицы одни индексы и связи, а в другой - другие. И переключение из одной формы в другую приводит к непредсказуемым изменениям содержимого.</p>
<h3><b><a name="NameTable"></a>НАЗВАНИЕ ТАБЛИЦЫ</b></h3>
<p>Файл таблицы, как и любой другой файл в системе Windows может содержать до 128 символов, содержать пробелы, русские символы, цифры и некоторые спец.символы. Однако для упрощения работы в FoxPro я бы порекомендовал следующие ограничения в наименовании файла таблицы</p>
<ul>
<li>Не использовать в названии русские символы - причина этой рекомендации в том, что FoxPro разрабатывался прежде всего для англоязычных пользователей и использование в нем символов другого языка - это уже последующее дополнение. Как следствие, велик риск, что чего-то, где-то недосмотрели и при определенных ситуациях русские буквы в имени вызовут неожиданные глюки</li>
<li>Не использовать в названии пробелы - в принципе, ошибок использование пробелов не вызовет, но несколько усложнит сам процесс программирования, поскольку имена и пути доступа, содержащие пробелы необходимо заключать в кавычки. Просто добавит лишней заботы - не забывать кавычки. А зачем усложнять себе жизнь, когда без этого легко можно обойтись.</li>
<li>Ограничивайте длину названия 8 символами и не используйте в названии цифр и спец.символов - в отличии от аналогичной рекомендации в отношении наименования файла <i>база данных</i> этому есть причина. Причина не настолько явная, чтобы ее описать в двух словах. Но цепочка рассуждений приведшая к этой рекомендации основана на рекомендации по наименованию <i>ключевых полей</i> таблиц и наименований индексных тэгов. Прочтя эти разделы Вам станет понятна причина этой рекомендации.</li>
<li>Не называйте таблицу также как и одно из его полей - разумеется ошибки это не вызовет, но усложнит понимание написанного кода самим программистом. Не всегда с ходу можно однозначно определить, что речь идет именно о таблице, а не о поле таблицы. А если еще и их названия совпадают, то совсем тяжело становится.</li>
<li>Не используйте для названия одно из зарезервированных в FoxPro слов - опять же, ошибки это не вызовет, но резко снизит "читабельность" кода. Ведь зарезервированные слова автоматически подсвечиваются опеределенным цветом (если Вы используете стандартный текстовый редактор FoxPro) и с ходу становится проблематично отличить опцию или команду от имени таблицы</li>
<li>Не используйте псевдонимы таблицы внутри базы данных - в данном случае речь идет о том, что внутри базы данных можно присвоить таблице псевдоним, отличный от имени файла DBF. Речь  <u>не идет</u> об опции <i>ALIAS</i> в команде <i>USE</i>. Это несколько другое. Если Вы войдете в режим модификации структуры таблицы, и перейдете на закладку <b>"Table"</b>, то увидите, что в опции <b>"Name"</b> стоит имя, совпадающее с именем файла <i>DBF</i>. Вот это-то имя и можно изменить, присвоив таблице некоторый <i>"псевдоним"</i> по которому и будут обращаться к указанной таблице. Лично я не рекомендовал бы новичкам использование подобных псевдонимов, поскольку это может внести путаницу в сам процесс программирования.</li>
</ul>
<h3><b><a name="TableLocation"></a>РАСПОЛОЖЕНИЕ ТАБЛИЦЫ</b></h3>
<ul>
<li>Как для файла базы данных, так и вообще для всех рабочих таблиц использующихся в проекте следует выделять специальную папку (директорию). Эта рекомендация относится как к этапу разработки проекта, так и к поставке готового приложения клиентам.
<p>Причины этой рекомендации подробно изложены в разделе <i>Где расположить файлы проекта</i>. Вкратце, суть сводится к тому, что в противном случае возрастает риск непреднамеренной порчи файлов данных и соответственно потере данных. А также облегчается поиск нужных файлов и создание резервной копии.</p>
</li>
<li>Желательно файл базы данных располагать в той же папке, где и включенные в него файлы DBF
<p>По большому счету, конечно можно держать файл базы данных в одной директории, а включенные в него файлы DBF в другой. Но это усложняет сам процесс разработки проекта. Например, создание резервной копии в простейшем случе заключается в простом копировании директории с рабочими файлами в другое место. Если же рабочие файлы отделены от файла базы данных, то потребуется уже копирование 2-х директорий. Соответственно усложнится код.</p>
<p>Кроме того, в этом случае несколько увеличится размер файла базы данных (точнее файла DCT - мемо-файла), поскольку непосредственно в нем хранится относительный путь к включенным в него таблицам. Если таблицы расположены в той же директории, что и сам файл базы данных, то этого относительного пути просто нет. Справедливости ради, следует заметить, что относительный путь к базе данных хранится и в заголовках таблиц, которые в эту базу данных включены. Но на размер таблиц это не влияет, поскольку под этот относительный путь всегда выделяется фиксированное место вне зависимости от факта его наличия.</p>
<h3><b><a name="TableWork"></a>СОБСТВЕННО РАБОТА С ТАБЛИЦАМИ</b></h3>
</li>
</ul>
<p>У объекта <i>Grid</i> при указании значения для <i>RecordSourceType</i> под термином <b>"таблица"</b> <i>(Table)</i> подразумевают как раз-таки именно файл <i>DBF</i>, а под термином <b>"алиас"</b> <i>(Alias)</i> - образ файла. Что вызывает огромное количество проблем у новичков с этим объектом. Ни в коем случае <u>не используйте</u> в качестве <i>RecordSourceType</i> указание <i>"Table"</i> - это приведет к непредсказуемому поведению данного объекта. Оставьте значение по-умолчанию <i>"Alias"</i></p>
<p>[li]Как уже было замечено выше, таблицы всегда открываются в конкретной рабочей области и для перехода в нужную рабочую область есть 2 способа адресации: либо по номеру этой рабочей области, либо по имени алиаса (alias) таблицы открытой в этой рабочей области.</p>
<p>Так вот, я бы рекомендовал всегда адресоваться к рабочей области именно по имени алиаса (alias) таблицы, а не по номеру.</p>
<p>Причина этой рекомендации в том, что конкретной рабочей области абсолютно все-равно, какая именно таблица в ней открыта. А при определенных условиях таблица может быть переоткрыта, но уже в другой рабочей области. Соответственно, адресуясь к рабочей области по ее номеру невозможно быть до конца уверенным, что в ней открыта именно нужная таблица. Да и вообще, что в ней открыта хоть какая-нибудь таблица. С другой стороны, обращение по алиасу с большей вероятностью укажет на нужную таблицу (тут тоже могут быть варианты, но это уже более экзотические случаи)</p>
<p>Крайне нежелательно динамически в процессе работы модифицировать таблицы или добавлять/удалять таблицы в базе данных. Это сопряжено с большими проблемами и значительным усложнением программного кода.</p>
<h3><b><a name="TableWorkArea0"></a>РАБОЧАЯ ОБЛАСТЬ С НОМЕРОМ 0</b></h3>
<p>Отдельного упоминания заслуживает нулевая рабочая область. Ссылка на нулевую рабочую область означает ссылку на первую свободную рабочую область. Т.е. рабочую область, которая в настоящий момент не связана ни с какой таблицей</p>
<p>Такая адресация позволяет делать несколько вещей</p>
<p>Во-первых, это позволяет открывать новые таблицы не заботясь о том, не занята ли текущая рабочая область другой таблицей. Т.е. дается команда вида</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">     USE MyTable IN 0</pre>
</td>
</tr>

</table>
<p>Указание нулевой рабочей области необходимо потому, что в противном случае таблица будет открыта в текущей рабочей области одновременно закрыв таблицу, которая могла бы быть в ней открыта. А в таком синтаксисе открытие новой таблицы никак не повлияет на ранее открытые таблицы</p>
<p>Другое применение нулевой рабочей области - это настройки по умолчанию.</p>
<p>Например, Вы вероятно уже знаете, что любое <i>View</i> по-умолчанию открывается в режиме <b>оптимистической буферизации строк (3)</b>, но если Вам необходимо использовать его в режиме <b>оптимистической буферизации таблиц (5)</b>, то необходимо после его открытия сделать это переключение используя функцию <i>CursorSetProp()</i> примерно так</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   USE MyView IN 0  
  =CursorSetProp('buffering',5,'MyView') </pre>
</td>
</tr>

</table>
<p>Однако используя нулевую рабочую область можно сделать глобальную настройку для открытия всех талиц в 5 режиме буферизации примерно так:</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   =CursorSetProp('buffering',5,0)  
  USE MyView IN 0 </pre>
</td>
</tr>

</table>
<p>Правда использовать такие глобальные настройки надо с осторожностью, поскольку это именно глобальная, т.е. действующая на все рабочие области без исключения.</p>
<p>Замечу еще, что глобальная настрока нулевой рабочей области никак не затронет рабочие области, в которых уже есть открытые таблицы. Она влияет только на пока не используемые рабочие области.</p>
<h3><b><a name="BigTable"></a>БОЛЬШАЯ ТАБЛИЦА</b></h3>
<p>Очень часто в конференциях проскакивает словосочетание <i>"большая таблица"</i>.</p>
<p>Я бы сказал, что понятие <i>"большая таблица"</i> весьма субъективно. По моим наблюдениям, в большинстве случаев, под "большой" понимают такую таблицу, выполнение операций чтения/записи с которой занимает ощутимо заметное время. Заметное для пользователя.</p>
<p>Одним из важнейших критериев, влияющих на время выполнения любой операции с таблицей является количество записей в этой таблице. Но тогда встает вопрос: <i>большая таблица - это сколько записей</i>?</p>
<p>Предельно допустимое количество записей, которое может содержаться в одной таблице - это <b>1 миллиард записей (1 billion)</b>. Т.е. единица и девять нулей. Так вот, <i>"большой"</i> можно считать таблицу содержащую не менее <i>нескольких миллионов записей</i>.</p>
<p>Но опять-таки термин "большая" всплывает не тогда, когда оценивают просто количество записей, а когда оцениваю время выполнения некоторых операций с такими таблицами. Но ведь есть множество причин влияющих на время чтения/записи. Соответственно, та таблица, которая считается "большой" в одном случае в другом уже не такая "большая".</p>
<h2 align="center"><b><a name="Cursor"></a>КУРСОР</b></h2>
<p>В очередной раз вспоминается лень американцев и их стремление все сокращать (впрочем русские здесь ушли еще дальше - могут сказать почти все используя только несколько специфических слов). Термин <i>"курсор"</i> употребляется сразу в нескольких смыслах в зависимости от контекста.</p>
<p><b>Курсор</b> - это образ файла DBF открытого в одной из рабочих областей</p>
<p><b>Курсор</b> - это временная таблица являющаяся результатом выполнения команды <i>Select-SQL</i></p>
<p><b>Курсор</b> - это <i>указатель</i> положения индикатора ввода текста с клавиатуры</p>
<p>Ну, последнее определение не очень-то интересно. В том смысле, что здесь все ясно, кроме того, почему этот термин был использован еще и для временных таблиц, ведь слово <i>"cursor"</i> собственно и переводится как <i>"указатель"</i>.</p>
<h3><b><a name="CursorDBF"></a>КУРСОР КАК ОБРАЗ ФАЙЛ DBF</b></h3>
<p>Опять же такое краткое определение не совсем точно, поскольку в этом смысле используется некий специфический объект. Введение этого объекта объясняется необходимостью визуализации <i>таблицы</i> при проектировании форм и отчетов.</p>
<p>Замечу еще, что курсор, как объект, используется не только как образ файлов DBF, но и как образ <i>View</i>. А View и таблица - <u>это не одно и то же</u>.</p>
<h3><b><a name="CursorTmp"></a>КУРСОР КАК ВРЕМЕННАЯ ТАБЛИЦА</b></h3>
<p>Вот это наиболее употребительное использование данного термина. Собственно есть 2 способа создания таких курсоров</p>
<p><u>Первый способ</u> - это использование команды <i>CREATE CURSOR</i>. Созданный таким способом курсор будет редактируемым. И это будет именно временная таблица, т.е. она будет автоматически уничтожена в момент закрытия. Ну про этот способ сказать особо нечего. Здесь нет каких-то проблем и особенностей</p>
<p><u>Второй способ</u> - это использование опции <i>CURSOR</i> в команде <i>SELECT-SQL</i>. Примерно в следующем синтаксисе</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   SELECT * FROM MyTable INTO CURSOR TmpTable</pre>
</td>
</tr>

</table>
<p>Вот этот-то TmpTable и есть <i>курсор</i></p>
<p>В зависимости от различных условий этот курсор может иметь разное физическое "воплощение" и разные свойства</p>
<p>Если SQL-запрос полностью оптимизируем, то вместо создания нового файла будет просто открыта та же самая таблица с наложенным на нее фильтром. Зачастую это очень неприятная неожиданность. Проверить, чем же физически является сформированный курсор, можно используя функцию DBF()</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   SELECT * FROM MyTable INTO CURSOR TmpTable  
  ?DBF('TmpTable')</pre>
</td>
</tr>

</table>
<p>Если будет возвращено имя файла с расширением DBF, то данный курсор является той же самой исходной таблицей с наложенным на нее фильтром.</p>
<p>Если Вы хотите при любых запросах быть уверенными, что курсор - это именно временная таблица, а не исходная таблица с наложенным фильтром, то Вам следует добавить опцию <b><i>NOFILTER</i></b></p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   SELECT * FROM MyTable INTO CURSOR TmpTable NOFILTER</pre>
</td>
</tr>

</table>
<p>Эта опция появилась <u>только</u> в 5 версии Visual FoxPro, хотя там она еще не была документирована. В более ранних версиях необходимо добавлять фиктивные условия или признаки группировки, чтобы исключить возможность оптимизации.</p>
<p>Однако если курсор - это <u>временная таблица</u>, то это еще не значит, что эта временная таблица будет непременно физически расположена на диске. Вполне возможно, что вся временная таблица целиком поместится в оперативную память. Т.е. функция <i>DBF('TmpTable')</i> будет исправно показывать некий временный файл, но попытка найти его физически на диске окончится неудачей и функция <i>FILE(DBF('TmpTable'))</i> вернет <b>.F.</b></p>
<p>Правда расположение временной таблицы целиком в памяти ни в коем случае не помешает работе с этой временной таблицей. Собственно, в подавляющем большинстве случаев Вас и не должно заботить где физически расположена та или иная таблица.</p>
<p>Еще один немаловажный вопрос связан с тем, что полученные таким образом курсоры нельзя редактировать. <u>Они доступны только на чтение</u>. Начиная с 7 версии Visual FoxPro для решения этой проблемы появилась специальная опция <b>ReadWrite</b></p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   SELECT * FROM MyTable INTO CURSOR TmpTable NOFILTER READWRITE</pre>
</td>
</tr>

</table>
<p>Использование этой опции позволяет создавать курсор, который <b>можно редактировать</b>. Для более младших версий FoxPro для того, чтобы курсор можно было редактировать его следует переоткрыть</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   SELECT * FROM MyTable INTO CURSOR TmpReadTable NOFILTER  
  USE (DBF('TmpReadTable')) IN 0 AGAIN ALIAS TmpWriteTable  
  USE IN TmpReadTable</pre>
</td>
</tr>

</table>
<p>Переоткрытый таким образом курсор <i>TmpWriteTable</i> уже можно будет редактировать</p>
<p>Курсоры можно индексировать также как и обычные таблицы. Правда если курсор открыт в режиме только для чтения, то Вы сможете создать для него только один индексный тэг.</p>
<p>Все созданные таким образом курсоры автоматически удаляются с диска (если временный файл физически был создан на диске) в момент их закрытия. Если Вы создали для такого курсора структурный индексный файл, то этот файл также будет автоматически удален в момент закрытия курсора.</p>
<h3><b><a name="GetCursorSQL"></a>ФОРМИРОВАНИЕ ИМЕНИ КУРСОРА В КОМАНДЕ SELECT-SQL</b></h3>
<p>Это не такой простой вопрос, как может показаться. Проблема здесь в том, что имя курсора - это фактически алиас (alias) временной таблицы. Но в FoxPro в одном сеансе данных не может быть открыто 2 таблиц с одинаковыми алиасам.</p>
<p>Курсор всегда создается на машине клиента, поэтому конфликтов с другими пользователями можно не опасаться. Более того, даже если запущен дважды один и тот же проект на одной машине все-равно не будет конфликат связанного с одинаковыми именами курсоров, поскольку они открыты в разных сеансах данных. Конфликт возможен если Вы создаете несколько курсоров с одним и тем же именем в одном сеансе данных</p>
<p>Ну например, Вы открыли 2 формы использующих <i>Default DataSession</i> и в обоих создали курсор с одинаковым именем. В этом случае, курсор созданный позднее затрет курсор созданный ранее. При этом настройка <i>SET SAFETY</i> не играет никакой роли. Курсор будет пересоздан молча. Без каких-либо дополнительных запросов.</p>
<p>Избежать подобных конфликтов можно несколькими способами</p>
<ul>
<li>Открывать формы и отчеты только в Private DataSession</li>
<li>Самостоятельно следить за уникальностью имен курсоров</li>
<li>Использовать функцию для генерации уникальных имен файлов<br />Последний вариант кажется наиболее предпочтительным. Однако тут следует быть осторожным. Дело в том, что в описании к FoxPro для генерации уникальных имен файлов предлагается использовать следующую функцию
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   lcCursorName=SubStr(SYS(2015),3,10)</pre>
</td>
</tr>

</table>
<p>Проблема в том, что функция <i>SYS(2015)</i> может содержать в возвращаемом значении как буквы, так и цифры. Это значит, что при использовании выделения строки по SubStr() Вы вполне можете получить первым символом цифру. А использование в качестве имени переменной цифры в синтаксисе FoxPro недопустимо и Вы неожиданно получите сообщение о синтаксической ошибке. Чтобы этого избежать следует либо принудительно подмешать букву</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   lcCursorName='t'+SubStr(SYS(2015),3,10)</pre>
</td>
</tr>

</table>
<p>Либо вообще не выделять строку</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   lcCursorName=SYS(2015)</pre>
</td>
</tr>

</table>
<p>Соответсвенно выполнение запроса станет выглядеть так:</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   LOCAL lcCursorName  
  lcCursorName=SYS(2015)  
  SELECT * FROM MyTable INTO CURSOR &amp;lcCursorName NOFILTER</pre>
</td>
</tr>

</table>
<p>Такой способ создания уникальных имен курсоров действительно обеспечит уникальность, но это очень неудобный способ из-за необходимости при обращении к такому курсору постоянного использовать макроподстановки. Поэтому по возможности желательно его избегать.</p>
<h2 align="center"><b><a name="Fields"></a>ПОЛЯ ТАБЛИЦЫ</b></h2>
<p>Поле таблицы - это столбец который Вы видите каждый раз открывая таблицу на просмотр.</p>
<h3><b><a name="FieldsNames"></a>НАЗВАНИЕ ПОЛЕЙ ТАБЛИЦЫ</b></h3>
<p>Поле таблицы, включенной в {базу данных} может содержать до 128 символов, содержать русские символы, цифры и некоторые спец.символы. Однако для упрощения работы в FoxPro я бы порекомендовал следующие ограничения в наименовании файла таблицы</p>
</li>
<li>Не использовать в названии русские символы - причина этой рекомендации в том, что FoxPro разрабатывался прежде всего для англоязычных пользователей и использование в нем символов другого языка - это уже последующее дополнение. Как следствие, велик риск, что чего-то, где-то недосмотрели и при определенных ситуациях русские буквы в имени вызовут неожиданные глюки.</li>
<li>Не использовать в названии цифры и спец.символы - в принципе, ошибок использование цифр и спец.символов не вызовет. Причина этой рекомендации в повышении сложности восприятия названия.
<p>Ну, например, если в таблице необходимо указать сумму платежа и сумму налога, то Вы конечно можете создать 2 поля <i>Platezh1</i> и <i>Platezh2</i>. Но в этом случае, вам каждый раз придется вспоминать, что собственно обозначает цифра 1, а что цифра 2. Если Вы работаете постоянно только с одним проектом, то это не страшно, как-нибудь да запомните. Но если Вы отложили этот проект и вернулсь к нему через несколько месяцев, то напряженные размышления на тему - а что это собственно такое? - Вам обеспечены. Гораздо разумнее дать значимые имена: <i>Platezh</i> и <i>Nalog</i></p>
</li>
<li>Если по данному полю Вы создаете простой индексный тэг, выражение которого состоит только из имени поля, то ограничивайте название поля 10 символами - причина здесь в том, что количество символов в названии индексного тэга не может быть больше 10. Это значит, что Вам придется указать в качестве названия индексного тэга что-то отличное от названия поля, по которому этот индекс построен. В принципе, ничего страшного. Однако если имя тэга и имя поля совпадают, то это сильно упрощает процесс программирования и позволяет в некоторых случаях создавать универсальный программный код не зависящий от использования конкретной таблицы.</li>
<li>Не называйте таблицу также как и одно из его полей - разумеется ошибки это не вызовет, но усложнит понимание написанного кода самим программистом. Не всегда с ходу можно однозначно определить, что речь идет именно о таблице, а не о поле таблицы. А если еще и их названия совпадают, то совсем тяжело становится.</li>
<li>Не используйте для названия одно из зарезервированных в FoxPro слов, в особенности те слова, которые используются в команде Select-SQL - это может вызвать сообщение о синтаксической ошибке, для подавления которой придется сильно усложнить программный код. Кроме того, это снизит "читабельность" кода. Ведь зарезервированные слова автоматически подсвечиваются опеределенным цветом (если Вы используете стандартный текстовый редактор FoxPro) и с ходу становится проблематично отличить опцию или команду от имени поля таблицы.
<p>Если воображение Вам напрочь отказывает и Вы не знаете как по другому назвать поле кроме как например <i>"Order"</i> или <i>"Group"</i>, то добавьте в качестве первого символа букву, обозначающую тип данных, используемых в данном поле. Например, <i>"nOrder"</i> или <i>"cGroup"</i></p>
</li>
<li>В некоторых книгах рекомендуется в качестве первого символа имени поля всегда указывать букву, обозначающую тип данных, использующийся в данном поле. Я бы не рекомендовал этого делать, по той причине, что FoxPro - это регистро-независимый язык. Т.е. ему все-равно большие или маленькие буквы используются в именах. Как следствие, все команды и функции FoxPro возвращающие какие-либо имена возвращают их либо в верхнем (большими буквами), либо в нижнем (маленькими буквами) регистре. При таком написании название воспринимается как одно целое слово без смыслового разбиения. Т.е. первая буква не воспринимается как тип данных, а воспринмается просто как начало слова.<br />
<h3><b><a name="FieldsWork"></a>СОБСТВЕННО РАБОТА С ПОЛЯМИ ТАБЛИЦЫ</b></h3>
</li>
<li>Крайне нежелательно динамически в процессе работы модифицировать поля таблицы или добавлять/удалять поля. Это сопряжено с большими проблемами и значительным усложнением программного кода.</li>
<li>Желательно при использовании полей таблиц всегда дописывать алиас таблицы для их однозначной идентификации. Разумеется, кроме случаев, когда отсутствие алиаса обусловлено логикой программы.
<p>Дело в том, что если алиас не указан, то FoxPro предполагает, что речь идет о поле таблицы, расположенной в текущей рабочей области. А если у таблицы в текущей рабочей области нет такого поля, то о переменной памяти с тем же именем. Но при написании относительно сложной программы далеко не всегда можно с уверенностью сказать, что мы находимся в нужной рабочей области. Явное указание алиаса таблицы снимает эту проблему.</p>
</li>
<li>Заполняйте раздел <i>"Comment"</i> для всех полей таблицы в дезайнере таблиц. Написание комментариев, хотя бы минимальное, в любом случае очень полезная вещь. Этот текст автоматически отображается в окне самого проекта (<i>Project</i>), когда указатель встает на соответствующее поле таблицы. Да и документирование базы данных упрощается. Можно использовать этот текст (через функцию <i>DBGetProp()</i>) при выдаче сообщений об ошибках.<br />
<h2><b><a name="KeyField"></a>КЛЮЧЕВОЕ ПОЛЕ</b></h2>
<p>Это одно из важнейших понятий, используемое при работе с таблицами и базами данных</p>
<p><b>Ключевое поле</b> - это такое поле (или набор полей) по содержимому которого можно однозначно идентифицировать запись таблицы. Т.е. по значению ключевого поля всегда однозначно можно сказать о какой записи идет речь и не может существовать 2 записей с одинаковыми значениями ключевого поля.</p>
<p><b>Внешний ключ</b> - это поле таблицы, содержащее в себе значение ключевого поля другой таблицы. Т.е. просто ссылка на запись другой таблицы.</p>
<p>Начну сразу с вывода:<br /><b>Для большинства задач в FoxPro удобно использовать в качестве ключевого поля суррогатный ключ типа Integer. Ключевое поле желательно вводить для всех без исключения таблиц базы данных</b></p>
<p>Ну а теперь рассмотрим как же я дошел до выводов таких</p>
<h3><b><a name="KeyTypes"></a>ЕСТЕССТВЕННЫЕ ИЛИ СУРРОГАТНЫЕ КЛЮЧИ</b></h3>
<p>До сих пор не утихают споры о том, что лучше использовать: суррогатные или естесственные ключи.</p>
<p><i>Естесственный ключ</i> - это поле или набор полей, которые имеют некий физический смысл. Ну например, табельный номер, номер паспорта, и т.п.</p>
<p><i>Суррогатный ключ</i> - это поле которое не имеет никакого физического смысла и введено исключительно с целью однозначной идентификации записи. Информация, которая в нем содержится никак логически не связана с информацией из прочих полей той же таблицы.</p>
<p>Рассмотрим какие преимущества и недостатки имеют естесственные и суррогатные ключи</p>
<p>Фактически самый главный и определяющий критерий по которому можно судить о том, пригодно ли данное поле для использования его в качестве ключевого или нет - это однозначность идентификации записи. Здесь имеется в виду, действительно ли значение выбранного поля для каждой записи уникально?</p>
<p>Ну с суррогатным ключем все понятно - мы сами формируем его значение без участия со стороны пользователя, поэтому можем проследить за уникальностью, а вот как тут у естесственного ключа?</p>
<p>На первый взгляд кажется, что тоже все в порядке. Разве может номер паспорта быть не уникальным? Или табельный номер? Оказывается еще как может!</p>
<p>Во-первых, любая информация вводимая пользователем заведомо может содержать ошибки. Ну не могут люди не ошибаться. Кто-то ошибается чаще, кто-то реже, но ошибаются все. Часть ошибок безусловно можно отловить программно, но далеко не все.</p>
<p>Например, если речь идет о некотором цифро-буквенном номере (номер паспорта) и пользователь ввел "123 АБВ", а надо было "423 АБВ", то синтаксически это правильно, но по содержанию - это ошибка. Если впоследствии окажется что теперь надо ввести новый номер паспорта, но уже "123 АБВ", то программа откажется это сделать, поскольку такой номер уже есть. А на что его исправить неизвестно, поскольку документов, с которых он был введен уже нет.</p>
<p>Во-вторых (и это пожалуй более существенно), информация имеет тенденцию меняться. Например, не так давно был произведена замена паспортов в Российской Федерации и если бы программа опиралась в качестве идентификатора на его номер, то теперь все пришло в большой беспорядок в связи с этой заменой</p>
<p>Опять же, не так давно в Российской Федерации были введены так называемые "Идентификационные Номера Налогоплательщика". Так называемые "ИНН". Ну казалось бы, ну вот он уникальный идентификатор контрагента. Но наша родная бюрократия и здесь сумела все испортить. Оказалось, что ИНН нарушает все критерии уникальности, в связи с некоторыми особенностями его формирования</p>
<p>В одной из конференций, один из посетителей выразился по этому поводу достаточно эмоционально</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   1. ИНН может быть одинаковым у разных организаций. Не верите? Я тоже не верил...   
  2. ИНН может быть разным у одной и той же организации.   
  3. У одного и того же человека может быть два разных номера паспорта.   
  4. У одного и того же человека могут быть разные фамилии.   
  5. У одной и той же организации могут быть разные наименования (в разное время года :) )   
  6. Количество детей, конечностей, зубов и даже папилярные линии... МОГУТ ИЗМЕНЯТЬСЯ!!!</pre>
</td>
</tr>

</table>
<p>Я отдаю предпочтение СК просто потому, что СК предоставляет возможность пользователю решать, Иванов И.И. и Петров И.И. - один и тот же человек или разные. Может быть, он сменил фамилию, может быть даже пол, может быть он сменил и тип паспорта, и его номер. Может быть, он сменил гражданство, вернулся с войны без рук, ног и головы, наплодил детей, сделал пластическую операцию по изменению веса... Но от этого он не перестал быть самим собой.</p>
<p>Таким образом, в общем случае, естесственный ключ не обеспечивает главного - однозначности идентификации записи по значению ключевого поля. А если все-таки обеспечивает, то он перестает быть естесственным в первоначальном смысле этого слова, поскольку вынуждает пользователя приспосабливаться и изворачиваться.<br />Так почему же, несмотря на столь явные аргументы против, все равно есть достаточно большое количество приверженцев использования естесственного ключа?</p>
<p>На мой взгляд, здесь существует явное непонимаение того, что суррогатный ключ - это информация, которая нигде, никоим образом не предоставляется пользователю. Суррогатный ключ - это некоторая скрытая, невидимая пользователем "внутренняя" механика.</p>
<p>Дело в том, что главным аргументом приверженцев естесственного ключа является его "понятность" пользователю. Т.е. предполагается, что пользователь что-то ищет опираясь на значение ключевого поля. Иными словами, пользователь сам вводит, исправляет и просматирвает значение ключевого поля.</p>
<p>Но в отношении суррогатного ключа - такое его использование просто недопустимо! Ну не должен пользователь знать как там внутри программы все "тикает". Пользователю интересно показание часов, а не вские там "шестеренки". Если Вы хотите предоставить пользователю некую аббревиатуру (краткое название, "ник"), то это ни в коем случае не должен быть суррогатный ключ. Введите для этой цели еще одно дополнительное поле.<br />Есть и еще один, более хитрый аргумент, в пользу хотя бы частичного использования естесственных ключей. Дело в том, что очень часто возникает необходимость в некоторой внутренней классификации. Ну например, если речь идет о документах, то они могут находится в некоторых взаимоисключающих сотояниях:</p>
<table cellspacing="2" cellpadding="2" width="90%" align="center" bgcolor="#fbfaf7" border="0">

<tr>
<td>
<pre class="bbcode">   1 - Получено  
  2 - Отложено  
  3 - Утверждено</pre>
</td>
</tr>

</table>
<p>Есть очень большое искушение не делать дополнительную таблицу с этими 3 записями, а просто использовать коды 1,2,3 Ну действительно, ну не может же пользователь изменить количество и название состояний. Вот тут приверженцы естесственного ключа и поднимают голос - дескать, что говорят программисту какие-то цифирки, пускай уж сразу слова пишет</p>
<p>В данном случае лично я рекомендовал бы не поддаваться искушению "упростить" базу данных и ввести-таки дополнительную служебную табличку с 3 записями состояния. Пусть даже пользователь и не имеет возможность ее редактировать. Вы сами убедитесь, насколько она окажется уместна, а в некоторых случаях просто незаменима при написании Вами программы.<br />Вывод однозначен - суррогатные ключи предпочтительнее по всем критериям перед естесственными ключами</p>
<h3><b><a name="KeyDataTypes"></a>КАКОЙ ТИП ДАННЫХ ИСПОЛЬЗОВАТЬ: <i>CHARACTER</i> ИЛИ <i>INTEGER</i></b></h3>
<p>Раньше, когда для хранения числовых данных в FoxPro существовали только поля типа <i>Numeric</i> перевес в аргументации склонялся в пользу использования полей типа <i>Character</i>, но с появлением полей типа <i>Integer</i> все стало не так однозначно</p>
<p>При сравнении способа хранения ключевого поля в символьном или числовом формате выдвигаются 3 аргумента</p>
</li>
<li>В числовых полях легче формировать новое значение</li>
<li>Символьные поля "экономичнее", т.е. можно уместить больше значений в том же размере</li>
<li>Символьные поля "универсальнее" при так назваемых задачах репликации, т.е. объединении не связанных между собой баз данных
<p><b>Числовые поля легче формировать</b></p>
<p>Тут числовые поля вне конкуренции, поскольку стандартным способом формирования числовых ключевых полей является "максимальное значение плюс один". В случае же символьных полей, как правило используется некий генератор псевдо-случайных чисел. Здесь не место, для обсуждения способа генерации символьных ключей, но используемые процедуры обычно достаточно сложны из-за сложности обеспечения действительно уникального значения.</p>
<p>Замечу еще, что не стоит для генерации нового значения ключа использовать именно определение максимального значения в текущей таблице. Это хорошо в однопользовательском режиме, но в многопользовательском Вы рискуете получить 2 одинаковых значения ключа при одновременном добавлении новой записи двумя пользователями одновременно. Обычно используют специальную служебную таблицу, хранящуюю значение последнего использованного (или первого не использованного) значения ключа. Примеры использования такой таблицы приведены в стандартных проектах примеров FoxPro: <i>Solution.pjx</i> (форма <i>NewID.scx</i>) и <i>TasTrade.pjx</i>. А в 8 версии FoxPro появились <b>автоинкрементные поля</b>, которые совсем упростили данную задачу.</p>
<p><b>Символьные поля "экономичнее", т.е. можно уместить больше значений в том же размере</b></p>
<p>Начнем с вопроса, а сколько вообще необходимо значений для идентификации вообщех всех записей таблицы?</p>
<p>Из системных ограничений известно, что предельно допустимое количество записей в DBF-таблице - это <b>1 миллиард записей (1 billion)</b>. Т.е. это единица и девять нулей</p>
<p>Поле типа Integer может принимать знаячение в диапазоне от -2,147,483,647 до 2,147,483,647. Ну, отрицательные значения как правило не используются, но и положительные значения в 2 раза больше, чем максимально возможное количество записей. С учетом возможного удаления записей - в самый раз.</p>
<p>Поскольку поле типа <i>Integer</i> физически занимает 4 байта (4 символа), то посмотрим, сколько же значений может быть присвоено при таком же размере для символьного поля</p>
<p>В одном байте может быть записано 256 значений, т.е. это составит 256**4=4,294,967,296. Но поскольку некоторые значения нельзя использовать по ряду соображений (например, символ перевода строки, Esc и т.п.), то получается, что в смысле количества значений поля типа <i>Integer</i> ничуть не уступает полю типа <i>Caracter(4)</i>, даже пожалуй несколько превосходит</p>
<p><u>Замечание</u></p>
<p>Следует заметить, что в FoxPro поля типа <i>Numeric</i> храняться как символьные поля, т.е. для хранения каждой цифры нужен один байт. Это значит, что если предполагаемое количество значений в данной таблице не превышает тысячи (меньше 4 символов), то возникает искушение "сэкономить" и вместо типа <i>Integer</i> ввести скажем поле типа N(2)</p>
<p>Так вот, я бы не советовал этого делать по следующим соображениям:</p>
</li>
<li>В современных компьютерах физический объем таблиц (в байтах) уже не играет столь принципального значения как раньше. Можно позволить себе особо не экономить дисковое пространство.</li>
<li>Если все ключевые поля во всех таблицах имеют один и тот же тип данных и размерность, то это значительно упрощает сам процесс программирования. Не надо мучительно вспоминать какой именно тип и размерность использовался в той или иной таблице. Иногда это имеет принципиальное значение.
<p><b>Символьные поля "универсальнее" при так назваемых задачах репликации</b></p>
<p><b>Репликация</b> - это объединение информации из двух не связанных между собой баз данных, например, из двух филиалов одной организации территориально удаленных друг от друга</p>
<p>Да, действительно, в подобных задачах удобнее пользоваться символьными полями, хотя даже в такой, казалось бы заведомо проигрышной ситуации числовым полям есть что "возразить"</p>
<p>Здесь не место для обсуждения данной проблемы в связи с ее обширностью, поэтому замечу только, что для очень большого круга задач сама задача репликации не актуальна. Либо используется файл-серверная технология, либо объединение необходимо только в одну сторону для получения справок и отчетов<br />Вывод не столь категоричен, как в случае с суррогатными ключами:</p>
</li>
<li>генерация нового значения числового ключа проще, чем символьного</li>
<li>количество значений ключа для типа <i>Integer</i> и <i>Chracter(4)</i> практически одинаково</li>
<li>при решении сложных задач репликации удобнее пользоваться символьными ключевыми полями<br />Но поскольку большинству программистов не придется сталкиваться с задачами репликации, то можно смело использовать для ключевых полей тип <i>Integer</i>.
<p><b><a name="KeyFieldsNeed"></a>Надо ли использовать ключевое поле во всех без исключения таблицах</b></p>
<p>На первый взгляд, вопрос может показаться странным. Разве можно без ключевого поля? Оказывается, в некоторых случаях можно.</p>
<p>Например, для организации связи много-ко-многим стандартным способом является создание таблицы-посредника. Что имеется в виду?</p>
<p>Допустим, у Вас есть список контрагентов и список банков. Разумеется, один и тот же контрагент может иметь счет в нескольких банках. Но верно и обратное - один банк работает с несколькими контрагентами. В этом случае Вы не можете сделать внешний ключ банка в таблице контрагента или внешний ключ контрагента в таблице банков. Вам необходимо ввести таблицу-посредник, которая будет хранить в себе внешний ключ банка и внешний ключ контрагента.</p>
<p>При такой организации, каждая запись в этой таблице посреднике однозначно идентифицирется парой значений: код контрагента-код банка. Поэтому возникает искушение не вводить еще одно поле для суррогатного ключа этой таблицы-посредника.</p>
<p>Однако я настоятельно рекомендовал бы Вам вводить-таки собственное ключевое поле для всех таблиц базы данных. Почему? Ну потому, что любая программа имеет "привычку" развиваться.</p>
<p>Если вернуться к примеру с контрагентами и банками, то легко заметить, что я обошел вниманием тот момент, что один контрагент может иметь несколько счетов в одном и том же банке. Этот самый реквизит (счет контрагента в банке) невозможно прицепить ни к банку, ни к контрагенту. Но он очень удачно подходит к этой таблице-посреднику. Если бы для идентификации записи в этой таблице Вы опирались бы на пару: код банка - код контрагента, то Вам пришлось бы серьезно переделывать значительную часть программы. А в случае существования собственного кода записи никаких проблем. Ну добавили еще одно поле, ну и что?</p>
<p>В данном случае я рассмотрел достаточно очевидный случай, но зачастую кажется, что по другому быть не может и уж вот здесь-то собственный идентификатор записи не нужен. Не обольщайтесь. Если Вам кажется, что чего-то не может быть - это всего-лишь значит, что Вы чего-то не знаете.<br />Вывод - используйте собственное ключевое поле во всех без исключения таблицах. Даже если Вам кажется, что без него можно обойтись.</p>
<h3><b><a name="KeyFieldName"></a>НАЗВАНИЕ КЛЮЧЕВОГО ПОЛЯ<br /></b></h3>
<p>Поскольку <b>ключевое поле - это обычное поле таблицы</b>, то на него распространяются все рекомендации приведенные в разделе <i>"Поля таблицы"</i>. Однако поскольку это все-таки очень специфическое поле, то для него я бы добавил следующие рекомендации</p>
</li>
<li>Образуйте название ключевого поля таблицы добавив к имени таблицы 2 буквы "ID" (от слова identifier - идентификатор), отбросив букву "s" если имя таблицы - это слово во множественном числе - Например, если вы назвали таблицу контрагентов "Partners", то ключевое поле будет назваться "PartnerID". При таком способе наименования однозначно можно сказать к какой таблице относится ключевое. Но не стоит назвать ключевое поле также как и собственно таблицу, поскольку в некоторых случаях станет весьма проблематично сходу определить о чем идет речь - о поле или собственно о таблице</li>
<li>Называйте внешние ключи также как и соответствующие ключевые поля - такой способ наименования внешних ключей очень облегчает понимание о чем собственно идет речь при написании программы.</li>
<li>Ограничивайте название ключевого поля 10 символами - причина здесь в том, что количество символов в названии индексного тэга не может быть больше 10. А по ключевому полю обязательно следует построить индекс. Если количество символов в ключевом поле будет больше 10, то название индексного тэга будет отличаться от названия ключевого поля. А это не очень хорошо в том смысле, что серьезно затруднит программирование, поскольку использовать этот индекс Вы будете сплошь и рядом.
<p>Кстати, из этой рекомендации вместе с самой первой рекомендацией по наименованию ключевых полей вытекает, что количество символов в имени таблицы не должно превышать 8 (или 9, если название таблицы - это множественное число)</p>
<h3><b><a name="KeyFieldWork"></a>СОБСТВЕННО РАБОТА С КЛЮЧЕВЫМИ ПОЛЯМИ ТАБЛИЦЫ<br /></b></h3>
</li>
<li>Значение ключевого поля должно присваиваться один раз в момент создания записи и не меняться все время существования этой записи. Крайне нежелательно модифицировать значение ключевого поля. Лучше строить программу таким образом, чтобы не возникало необходимости в подобной модификации. Более того, я бы не рекомендовал использовать значения ключевых полей удаленных записей (умерла, так умерла).
<p>Такая стратегия сильно облегчает отлов ошибок пользователей, поскольку в большинстве случаев, если пользователь делает ошибку в документе, то он не исправляет ошибочный документ, а удаляет его и создает заново! Вот и докажи потом, что это не программа плохая!</p>
<p>Кроме того, такая стратегия позволяет с меньшими проблемами интегрировать несколько баз данных в один комплекс если в этом возникает необходимость.</p>
</li>
<li>Ни в коем случае не давайте пользователям возможность самостоятельно изменять значение ключевых полей. Более того, пользователь вообще не должен подозревать об их существовании. Это должен быть исключительно внутренний механизм обеспечения целостности базы данных.
<p>Дело в том, что любая информация, которую вводит пользователь по определению является не надежной и как бы Вы ни защищали информацию, пользователь найдет как ее обойти или просто заставит Вас это сделать! А то, о чем он не подозревает и испортить не может.</p>
</li>
<li>Не пытайтесь навесить на ключевые поля какие-либо еще функции кроме однозначной идентификации записи.
<p>Например, в некоторых случаях возникает соблазн использовать ключевые поля еще и как порядковый номер элемента в списке. Так вот, не надо этого делать. Введите для реализации этой функциональности дополнительное поле. Также не следует использовать ключевое поле, как краткое название элемента</p>
<p>Если Вы навесите на ключевое поле еще какую-либо функциональность, кроме однозначной идентификации записей, то просто создадите себе массу проблем (сильно усложнится программный код). А в качестве преимуществ только некоторая экономия дискового пространства. Думаю, оно того не стоит.</p>
</li>
</ul>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4899">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4899">Владимир Максимов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Владимир Максимов" href="https://foxclub.ru/account/?user=4899">
				<img alt='' src='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 65<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-ii/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Статьи]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/zapusk-konsolnoj-vklyuchaya-dos-programmy-s-perehvatom-potokov-vvoda-vyvoda-bez/</link>
					<title><![CDATA[Запуск консольной (включая DOS) программы с перехватом потоков ввода/вывода (без &#060; &#062; !)]]></title>
                    					    <author><![CDATA[Петров Андрей]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:25 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Запуск консольной (включая DOS) программы с перехватом потоков ввода/вывода (без &#060; &#062; !)</h1>
													</header>
													<div id="sol_opis">Теперь можно запускать прогу из под VFP и читать из нее данные как из файла (аналогично запись...) Использую функцию CreateProcess.</div>
<div id="sol_body">
<h3>Запуск DOS программы с перехватом потоков ввода/вывода (без < > !)</h3>
<p> Вот код программы - вместо 1.exe напишите то что нуджно вызвать...</p>
<p> #INCLUDE charts.h<br /> DO charts.prg<br /> CLEAR</p>
<p> PRIVATE pb,db,si,pi,hproc,hthread,h_my_input,h_my_output,secattr,r_ph,w_ph<br /> pb='1.exe'<br /> db=SYS(5)+SYS(2003)</p>
<p> IF GetPlatform() # VER_PLATFORM_WIN32_NT<br /> 	pb='COMMAND.COM /c '+pb<br /> ELSE<br /> 	pb='cmd /c '+pb<br /> ENDIF</p>
<p> * Создаем дескрипторы потоков ввода/вывода<br /> m.secattr=REPLICATE(CHR(0),12)<br /> m.secattr=STUFF(m.secattr,1,4,num2dword(12))<br /> m.secattr=STUFF(m.secattr,9,4,num2dword(1))</p>
<p> m.r_ph=0<br /> m.w_ph=0<br /> m.read_len=0<br /> STORE INVALID_HANDLE_VALUE TO h_my_output, h_my_input</p>
<p> *=createpipe(@h_my_input, @h_my_output, secattr, 0)<br /> =createpipe(@r_ph, @h_my_output, secattr, 0)<br /> IF h_my_output = INVALID_HANDLE_VALUE<br /> 	? 'error creating output pipe'<br /> 	RETURN .t.<br /> ELSE<br /> 	? 'h_my_output = ',h_my_output<br /> ENDIF</p>
<p> =createpipe(@h_my_input, @w_ph, secattr, 0)<br /> IF h_my_input = INVALID_HANDLE_VALUE<br /> 	? 'error creating input pipe'<br /> 	RETURN .t.<br /> ELSE<br /> 	? 'h_my_input = ',h_my_input<br /> ENDIF</p>
<p> si=REPLICATE(CHR(0),68)<br /> si=STUFF(si,1,4,num2dword(68))<br /> * Устанавливаем флаги нового процесса<br /> * STARTF_USESTDHANDLES - Выдать дескрипторы 3 потоков ввод, вывод и ошибки<br /> si=STUFF(si,45,4,num2dword(BITOR(STARTF_USESTDHANDLES,STARTF_USESHOWWINDOW)))<br /> si=STUFF(si,49,2,num2word(SW_SHOW))<br /> si=STUFF(si,57,4,num2dword(m.h_my_input))<br /> si=STUFF(si,61,4,num2dword(m.h_my_output))</p>
<p> pi=REPLICATE(CHR(0),16)<br /> m.r=createprocess(null,pb,null,null,1,CREATE_NEW_CONSOLE,null,db,@si,@pi)<br /> IF m.r=0<br /> 	? 'CreateProcess failed'<br /> ELSE<br /> 	m.hproc=dword2num(SUBSTR(pi,1,4))<br /> 	m.hthread=dword2num(SUBSTR(pi,5,4))<br /> 	? 'HProcess   = ',hproc<br /> 	? 'HThread    = ',hthread<br /> 	=CloseHandle(m.HThread)<br /> 	* Действия с процессом<br /> 	m.str='Привет Всем !!!'+CHR(13)+CHR(10)<br /> 	m.writtenbytes=0<br /> 	m.overlapped=REPLICATE(CHR(0),20)<br /> 	=setlasterror(0)<br /> 	m.r=writefile(m.w_ph,m.str,LEN(m.str),@writtenbytes,null)<br /> 	? 'WriteFile = ',m.r#0<br /> 	? getsystemerror()<br /> 	? 'ОБМЕН ДАННЫМИ'<br /> 	m.o_res=dword2num(SUBSTR(m.overlapped,1,4))<br /> 	IF !EMPTY(o_res)<br /> 		m.buf=SPACE(100)<br /> 		? 'Overlapped Internal = ',m.o_res,' - ',getsystemerror(m.o_res)<br /> 	ENDIF<br /> 	m.buf=REPLICATE(CHR(0),100)<br /> 	m.read_bytes=0<br /> 	? 'ЗАПИСАНО БАЙТ = ',writtenbytes<br /> 	=setlasterror(0)<br /> 	DO WHILE WaitForSingleObject(m.hProc, 50) # WAIT_OBJECT_0<br /> 		DO WHILE (PeekNamedPipe(m.r_ph, null, 0, 0, @read_len, 0)#0 AND (read_len > 0))<br /> 			IF readfile(m.r_ph,@buf,100,@read_len,null)#0<br /> 				? getsystemerror()<br /> 				? SUBSTR(m.buf,1,m.read_len)<br /> 				? 'ПРОЧИТАНО БАЙТ = ',read_len<br /> 			ENDIF<br /> 		ENDDO<br /> 	ENDDO<br /> 	* ====================<br /> ENDIF<br /> =CloseHandle(m.hproc)<br /> =CloseHandle(m.h_my_input)<br /> =CloseHandle(m.h_my_output)<br /> =closehandle(m.r_ph)<br /> =closehandle(m.w_ph)</p>
<p> * Функция перевода числа в integer символьного вида - взял из vfp2tray Сергея Титова<br /> FUNCTION num2dword<br /> LPARAMETERS n1<br /> RETURN CHR(BITAND(m.n1, 0xFF)) + ;<br /> 		CHR(BITRSHIFT(BITAND(m.n1, 0xFF00), 8)) + ;<br /> 		CHR(BITRSHIFT(BITAND(m.n1, 0xFF0000), 16)) + ;<br /> 		CHR(BITRSHIFT(BITAND(m.n1, 0xFF000000), 24))</p>
<p> FUNCTION num2word<br /> LPARAMETERS n1<br /> RETURN CHR(BITAND(m.n1, 0xFF)) + ;<br /> 		CHR(BITRSHIFT(BITAND(m.n1, 0xFF00), 8))</p>
<p> * Перевести строку в 4 байтное число <br /> FUNCTION dword2num<br /> LPARAMETERS str<br /> RETURN ASC(SUBSTR(m.str,1,1))+ASC(SUBSTR(m.str,2,1))*256+ASC(SUBSTR(m.str,3,1))*256^2+ASC(SUBSTR(m.str,4,1))*256^3</p>
<p> FUNCTION GetPlatform<br /> PRIVATE OSVersionInfo<br /> OSVersionInfo=REPLICATE(CHR(0),148)<br /> OSVersionInfo=STUFF(OSVersionInfo,1,4,num2dword(148))<br /> =getversionex(@OSVersionInfo)<br /> RETURN dword2num(SUBSTR(OSVersionInfo,17,4))</p>
<p> FUNCTION GetSystemError<br /> LPARAMETERS num<br /> IF PARAMETERS()																		]]>
					</turbo:content>
					<category><![CDATA[Система]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/rabota-s-ikonkami-v-tray-vfp7-v-vide-klassa-vcx/</link>
					<title><![CDATA[Работа с иконками в Tray (VFP7) в виде класса (VCX).]]></title>
                    					    <author><![CDATA[Петров Андрей]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:26 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Работа с иконками в Tray (VFP7) в виде класса (VCX).</h1>
													</header>
													<div id="sol_opis">По мотивам systray.prg Сергея Титова. Добавлено :Анимация через список иконок.</div>
<div id="sol_body">На форуме бывают вопросы о том как работать с иконкой в Tray-е. Вот класс для VFP7> который позволяет это делать. Но в 8 версии, по-моему уже есть systray.vcx. Так что это только для 7 и можно доделать для >7.  Возможности: 1) Кидаем класс my_tray3 на форму и устанавливаем иконку для формы. При зупуске появляется иконка в Tray и к ней прицепляется меню. 2) Добавляем еще 1 иконку и при сворачивании формы иконка в tray меняется. 3) Кидаем на форму my_tray и делаем пункты 1-2. Добавляем еще 10 иконок и говорим my_tray1.play() - получаем анимацию в Tray...  Класс еще сырой - но постараюсь в ближайшее время доделать...  В архиве пример формы :form1. Посмотрите ее методы :Init, Load, Resize  </div>
<div id="sol_avtor">Автор: Петров Андрей</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5063">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5063">Петров Андрей</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Петров Андрей" href="https://foxclub.ru/account/?user=5063">
				<img alt='' src='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 14<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-04-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/rabota-s-ikonkami-v-tray-vfp7-v-vide-klassa-vcx/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Система]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/prosteczkij-setevoj-chat/</link>
					<title><![CDATA[Простецкий сетевой чат]]></title>
                    					    <author><![CDATA[piva]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:26 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Простецкий сетевой чат</h1>
													</header>
													<div id="sol_opis">Запускаем программу на кадой машине  Метод - SendMsg - форма для отправки сообщения указывается имя компьютера без   длина сообщения не более 425 - ограницение mailslot При получении сообщения - окно само выпрыгивает</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Пирожков Вадим</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4821">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4821">piva</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="piva" href="https://foxclub.ru/account/?user=4821">
				<img alt='' src='https://secure.gravatar.com/avatar/0a76ea08e616d2f8a939412913fbb096?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/0a76ea08e616d2f8a939412913fbb096?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-03-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/prosteczkij-setevoj-chat/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/tetris/</link>
					<title><![CDATA[Тетрис]]></title>
                    					    <author><![CDATA[Михаил (Bomber)]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:26 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Тетрис</h1>
													</header>
													<div id="sol_opis">Обычный тетрис</div>
<div id="sol_body">
<h3>Тетрис</h3>
<p> Писанный Морозовым, за что ему спасибо. Ошибки почти все исправил (надеюсь очень), добавил сохранение результатов и прочее.  </p></div>
<div id="sol_avtor">Автор: Михаил</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4475">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4475">Михаил (Bomber)</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Михаил (Bomber)" href="https://foxclub.ru/account/?user=4475">
				<img alt='' src='https://secure.gravatar.com/avatar/4c49dad0201f4672d83e197a9b2ef761?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4c49dad0201f4672d83e197a9b2ef761?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 26-08-2020        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/tetris/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Игры]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/sistema-pozvolyayushhaya-fiksirovat-chto-delali-polzovateli-s-dannymi-v-bd/</link>
					<title><![CDATA[Система, позволяющая фиксировать, что делали пользователи с данными в БД]]></title>
                    					    <author><![CDATA[karly™]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:25 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Система, позволяющая фиксировать, что делали пользователи с данными в БД</h1>
													</header>
													<div id="sol_opis">Несложная система для логирования изменений в таблицах БД. Помогает узнать, кто, когда, какие данные редактировал.</div>
<div id="sol_body">
<h3>Система, позволяющая фиксировать, что делали пользователи с данными в БД</h3>
<p> Никогда не попадали в ситуацию, когда пользователи напортачили в базе, а потом утверждают, что "это ваша программа криво работает" ? Что поделать, не было в Фоксе встроенных средств журналирования...</p>
<p> Теперь есть :))) Конечно, данное решение достаточно простое, и не может служить средством защиты от аппаратных сбоев (как, например, в MS SQL). А вот от "человеческого фактора" защищает очень надежно.</p>
<p> Кроме того, система позволяет получать статистику работы пользователей (например, внесено X новых договоров, Y новых клиентов, Z клиентов отредактировано).</p>
<p> Данный пример легко может быть встроен в уже существующую БД.</p>
<p> Версия 2.0</p>
<p> Т.к. с первой версией ни у кого проблем не возникло ;), система несколько усложнена.<br /> Зато пользоваться ей стало проще 🙂</p>
<p> Протестировано в VFP 6, 7, 8.</p></div>
<div id="sol_avtor">Автор: Igor Ilyin</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4545">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4545">karly™</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="karly™" href="https://foxclub.ru/account/?user=4545">
				<img alt='' src='https://secure.gravatar.com/avatar/58afa4925ba0e3440d31fa4bebc393ae?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/58afa4925ba0e3440d31fa4bebc393ae?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 27-09-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/sistema-pozvolyayushhaya-fiksirovat-chto-delali-polzovateli-s-dannymi-v-bd/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/biblioteka-dlya-raboty-s-rtf-fajlami/</link>
					<title><![CDATA[Библиотека для работы с RTF файлами.]]></title>
                    					    <author><![CDATA[Петров Андрей]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:25 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Библиотека для работы с RTF файлами.</h1>
													</header>
													<div id="sol_opis">Библиотека позволяет формировать RTF файлы без использования MSWord. Т.е. даже если он не установлен Вы сможете создать например отчет в Word.</div>
<div id="sol_body">
<h3>Библиотека для работы с RTF файлами.</h3>
<p> Возможности:<br /> 1) Запись в RTF линий (только горизонтальные и вертикальные)<br /> 2) Запись в RTF закрашенных прямоугольников<br /> 3) Запись в RTF текста<br /> 4) Запись в RTF картинок (BMP, JPEG, GIF, EMF, PCT)<br /> 5) Открытие уже существующего RTF и дозапись в него.</p>
<p> Библиотека делелась на Delphi для генераторов отчетов. После моего предложения Martin Haluza от разработки данной компоненты отказался хотя в состав его отчетов после этого разговора входит возможность переноса отчета в RTF (www.eques.com - XFRX). <br /> Библиотека тестировалалсь мало... Но если кому пригодится то я буду рад.</p>
<p> Вот пример использования:</p>
<p> DECLARE short WritePage IN rtf_lib<br /> DECLARE short WriteImage IN rtf_lib integer, integer, integer, integer, string<br /> DECLARE short WriteRect IN rtf_lib integer, integer, integer, integer, integer, integer, integer<br /> DECLARE short WriteVertLine IN rtf_lib integer, integer, integer, integer, integer<br /> DECLARE short WriteHorizLine IN rtf_lib integer, integer, integer, integer, integer<br /> DECLARE short WriteText IN rtf_lib short, short, short, short, integer, integer, integer, integer, integer, integer, integer, string, string</p>
<p> DECLARE short WriteImage IN rtf_lib integer, integer, integer, integer, string, short</p>
<p> DECLARE short Create IN rtf_lib AS _Create string, short, short, short, short<br /> DECLARE short Open IN rtf_lib AS _Open string, short, short, short, short, short<br /> DECLARE short GetColorID IN rtf_lib short, short, short<br /> DECLARE Integer getrgbcolorid IN rtf_lib short, short, short<br /> DECLARE short Save IN rtf_lib AS _Save</p>
<p> =_Create('1.rtf',0,0,0,0)<br /> =writetext(1,1,1,2,8,GetColorID(255,0,0),GetrgbColorID(0,255,0),2000,2000,1000,1000,'Arial','Тестовая строка')<br /> =writehorizline(7000,7000,4000,getrgbcolorid(0,255,255),100000)<br /> =WritePage()<br /> =writevertline(7000,7000,4000,getrgbcolorid(255,0,255),200000)<br /> =writerect(1000,1000,1000,1000,getrgbcolorid(0,255,0),getrgbcolorid(0,0,255),300000)<br /> =writeimage(2000,2000,1000,1000,'1.jpg',1)<br /> =writeimage(3000,2000,1000,1000,'1.gif',2)<br /> =writeimage(4000,2000,1000,1000,'1.bmp',3)<br /> =writepage()<br /> =writeimage(1000,1000,10000,1000,'1.emf',4)<br /> =writetext(1,1,1,2,8,GetColorID(255,0,0),GetrgbColorID(0,255,0),2000,2000,1000,1000,'Arial','EMF')<br /> =writepage()<br /> =writeimage(1000,1000,10000,1000,'1.pct',0)<br /> =writetext(1,1,1,2,8,GetColorID(255,0,0),GetrgbColorID(0,255,0),2000,2000,1000,1000,'Arial','PCT')<br /> =_Save()</p>
<p> Действия библиотеки основаны на формировании динамического списка при вызове одной из функций =writeXXXX и переброски из списка в файл при вызове _Save().  </p></div>
<div id="sol_avtor">Автор: Петров Андрей</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5063">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5063">Петров Андрей</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Петров Андрей" href="https://foxclub.ru/account/?user=5063">
				<img alt='' src='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 14<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-04-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/biblioteka-dlya-raboty-s-rtf-fajlami/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-i/</link>
					<title><![CDATA[Советы начинающим Часть I]]></title>
                    					    <author><![CDATA[Владимир Максимов]]></author>
                    										    <pubDate>Sun, 20 Nov 2022 05:44:42 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Советы начинающим Часть I</h1>
													</header>
													<p>В этой статье :</p>
<p><a href="#Intro">Советы и рекомендации</a><br />
<a href="#FilesInProject">Расположение файлов проекта</a></p>
<ul>
<li><a href="#FilesInProject1">Расположение файлов внутри проекта</a></li>
<li><a href="#MainDirectory">Содержимое главной директории проекта</a></li>
<li><a href="#CONFIGFPW">Файл конфигурации CONFIG.FPW</a></li>
<li><a href="#OpenProject">Как открыть проект</a></li>
<li><a href="#Path">Пути доступа к файлам проекта</a>
<p><a href="#DataBase">База данных</a></li>
<li><a href="#DataBaseName">Название файла базы данных</a></li>
<li><a href="#DataBaseLocation">Расположение файла базы данных</a></li>
<li><a href="#DataBaseService">Обслуживание файла базы данных</a></li>
<li><a href="#DataBaseNeed">А надо ли вообще использовать файл базы данных?
<p></a></li>
</ul>
<p style="text-align: justify;">Несколько слов о том, о чем собственно пойдет здесь речь и для чего это все было написано. Очень трудно сформулировать это все кратко, но тем не менее я попытаюсь.</p>
<p>Как правило, большинство книг по программированию являются либо пересказом статей Help к языку, либо набором комиксов по типу "нажмите эту кнопочку увидите такую картинку, теперь нажмите эту кнопочку ...". Нельзя сказать, что это плохо или не нужно. Просто между двумя этими крайностями образовался провал, в котором и пропадает множество новичков. Поэтому любая книга, которая хоть как-то его закрывает обычно пользуется повышенным спросом.</p>
<p>О каком "<i>провале</i>" собственно идет речь?</p>
<p><b><i>Первый разрыв</i></b> - это терминология. Определение различным терминам либо вообще не дается (дескать и так все понятно), либо дается строго научное (т.е. очень заумное, лучше бы его и не давали). В результате, читая дальнейшие статьи уже совершенно непонятно о чем собственно идет речь.</p>
<p><b><i>Второй разрыв</i></b> - это когда и что лучше всего применять. Обычно изложение строится таким образом: для решения задачи сделаем так, так и вот так. Но не предпринимается даже попытки объяснить, а почему собственно не иначе, когда есть другой способ? Как следствие, когда новичек узнает о том, что одну и ту же задачу можно решить даже не двумя, а тремя, четыремя и более способами у него в голове начинается полная карусель. Бросает из одной крайности в другую.</p>
<p>Есть и еще одна проблема, связанная с предыдущими двумя. Обычно в FoxPro начинают разбираться люди, уже попробовавшие свои силы в программировании на других языках (чаще всего в Delphi или Basic, да даже программисты работавшие ранее в FoxPro for DOS) и они пытаются применить стиль программирования хорошо (или не очень) им известного языка в Visual FoxPro и очень удивляются сталкиваясь с неожиданными (в смысле - не ожидАемыми) проблемами: вот ведь, в руководстве написано, что это можно, а у меня не выходит! А проблема оказывается в самом стиле программирования. Кое-какие приемы, хорошо работающие в Delphi для FoxPro являются попросту неприменимы.</p>
<p>Вот я и попытаюсь заполнить этот "провал" и описать некоторые рекомендации по программированию на FoxPro, с пояснениями почему собственно желательно делать так, а не иначе.</p>
<h2 align="center"><b><a name="Intro"></a>Советы и рекомендации</b></h2>
<p style="text-align: justify;">
FoxPro - это язык, который очень снисходительно относится к ошибкам программиста: не дали определения переменной - ничего, я сам определю; забыли указать рабочую область - ничего, я сам попытаюсь ее найти. И так во многих случаях, если Вы забыли что-то указать FoxPro самостоятельно попытается это что-то найти.</p>
<p>С одной стороны, это конечно хорошо и облегчает жизнь програмисту, но вот с другой при создании достаточно крупных проектов в результате такой "самодеятельности" со стороны FoxPro могут возникать ошибки, которые очень трудно отловить.</p>
<p>Самая распространенная ошибка - это <i>самоопределение переменных</i>. Если Вы не дали определение переменной в процедуре, то сначала FoxPro попытается найти одноименную переменную определенную в другой процедуре и доступную в данной и если такая переменная существует, то она и будет использована к полному недоумению программиста вовсе не ожидающего такой "подлости"</p>
<p>Со стороны разработчиков FoxPro уже явно наметилась тенденция к ужесточению синтаксиса. Оно и понятно, такие языки программирования и создавать легче, да и библиотеки поддержки будут иметь меньший объем. Но пока это только тенденция, посмотрим, что будет дальше.</p>
<p>С другой стороны, конечно просто замечательно, что FoxPro предоставляет возможность решить одну и ту же проблему несколькими способами, но если в каждом конкретном случае размышлять на тему "что лучше использовать", то Вы никогда не закончите ни одного приложения.</p>
<p>В результате, появились некоторые правила и рекомендации по программированию, которые ни в коем случае не являются абсолютно необходимыми по принципу "делай так и ника иначе". Вы можете нарушить их абсолютно все и тем не менее написать работоспособное приложение. Цель этих рекомендаций - это уменьшить вероятность появления ошибок и облегчить как собственно написание, так и последующее исправление программ</p>
<h2 align="center"><b><a name="FilesInProject"></a>Расположение файлов проекта</b></h2>
<p style="text-align: justify;">
<p>По большому счету, проект - это набор файлов. Возникает вопрос - <b>где</b> и <b>как</b> их расположить? Если у Вас он не возникает, то Вы или очень опытны (это же очевидно!), или наоборот очень неопытны (а разве это важно?).</p>
<p><b>Главным правилом</b> в данном случае выступает <i>разделение</i> рабочих (модифицируемых) файлов и исполняемых (не модифицируемых). Имеется в виду прежде всего их физическое (по разным директориям) разделение.</p>
<p>Причина такого "неравноправия" прежде всего в том, что есть серьезные опасения в порче исполняемых файлов. Пусть случайное и непреднамеренное. Но если рабочие и исполняемые файлы лежат в одной директории, то очень легко ошибиться с выбором и модифицировать не тот файл. В результате - FoxPro или начнет работать с ошибками или вообще перестанет работать.</p>
<p>Другой причиной является возможность быстрого копирования рабочих файлов. Если они расположены компактно в одной директории, то Вы не задумываясь просто копируете эту директорию со всем содержимым и не надо мучительно выискивать, что надо копировать, а что лишнее.</p>
<p>Необходимость копирования объясняется как минимум необходимостью создания резервных копий всех рабочих файлов (есть и другие причины). По самой своей сути программирование - это модификация файлов. А файл можно "модифицировать" так, что мало не покажется. После чего остается только полностью удалить эту "модификацию" и начать все заново. Хорошо, если у Вас есть резервная копия, тогда Вы начнете не с нуля. А если нет?</p>
<p>Еще одной немаловажной причиной хранения файлов проекта отдельно от файлов FoxPro является удобство поиска нужных рабочих файлов. Если они свалены в одну "кучу" с рабочими файлами FoxPro, то становится очень тяжело найти нужный файл.</p>
<p>Итак, файлы Вашего проекта <b>не следует хранить в той директории, где установлен собственно FoxPro</b>. Следовательно, <i>необходимо создать отдельную директорию для Ваших проектов</i>.</p>
<p><b>Нежелательно</b> в именах директорий, где расположен Ваш проект использовать <i>пробелы и русские буквы</i>. Пробелы приведут к некторому усложнению программирования (необходимы будут дополнительные кавычки во всех путях доступа). А русские буквы нежелательны потому, что FoxPro разрабатывалось прежде всего для англоязычных пользователей и все прочие языки - это уже "надстройка". Причем зачастую эта "надстройка" весьма кривовата. Никогда не знаешь где тебе аукнутся русские буквы.</p>
<p>В идеале, хорошо бы давать имена директорий в DOS-формате (т.е. до 8 символов), но это уже перестраховка. Уместитесь в 8 символов - хорошо, нет - ничего страшного.</p>
<h3><b><a name="FilesInProject1"></a>Расположение файлов внутри проекта</b></h3>
<p>Следующий вопрос - это вопрос расположения уже файлов самого проекта. Опять же крайне <b>нежелательно сваливать все файлы в одну директорию</b>. Причины здесь те же - риск порчи, необходимость резервного копирования, сложность поиска. Но уже внутри Вашего проекта.</p>
<p>Прежде всего, <b>обязательно</b> следует выделить отдельную директорию для хранения базы данных. Как правило, эту поддиректорию так и называют "DATA". В этой директории хранится как файл контейнера базы данных (DBC, DCT, DCX), так и файлы собственно таблиц (DBF, FPT, CDX)</p>
<p>Прочие файлы также следует "раскидать" по поддиректориям, но тут уже возможны варианты.</p>
<p>В примерах от MicroSoft рекомендуется хранить файлы по их типам: формы в директории Forms, классы в директории Class и т.п. Однако я предпочитаю хранить файлы по их логическому назначению: главные файлы программы в директории Main, файлы для работы со справочниками в директории SPR, файлы для работы с документами в директории Document и т.п. Какой вариант примете Вы - не так важно. Главное, чтобы у Вас файлы были "раскиданы" по нескольким директориям</p>
<p>Итак, в результате у Вас получится примерно следующая структура каталога Вашего проекта</p>
<pre class="bbcode">C:\ProjVFP 
  C:\ProjVFP\MainProj 
  C:\ProjVFP\MainProj\Class 
  C:\ProjVFP\MainProj\Data 
  C:\ProjVFP\MainProj\Forms 
  C:\ProjVFP\MainProj\Prg </pre>
<p>Здесь каталог <i>C:\ProjVFP</i> - предназначен для хранения многих проектов, которые Вы без сомнения еще напишите. А собственно уже конкретно Ваш проект расположен в директории <i>C:\ProjVFP\MainProj</i></p>
<h3><b><a name="MainDirectory"></a>Содержимое главной директории проекта</b></h3>
<p>Ну хорошо, раскидали мы файлы по разным поддиректориям, а что же остается внутри главной директории проекта?</p>
<p>А вот внутри главной директории остается, во-первых, <b>собственно файл проекта</b> (файлы с расширением <i>PJX, PJT</i>), во-вторых, обязательно <b>файл конфигурации <i>CONFIG.FPW</i></b> (это обычный <i>текстовый файл</i>, о нем чуть ниже) и в-третьх, <b>файлы ресурсов <i>FoxUser.DBF и FoxUser.FPT</i></b> Прочие файлы уже по мере необходимости в конкретном проекте, но как правило, больше ничего здесь храниться не должно.</p>
<p>Вполне естесственное желание, назвать файл проекта тем же имененем, что и директория в которой он расположен, поскольку собственно ради него все это и затевается. <b>Именно так и следует поступить</b> - назвать файл проекта <i>MainProj.pjx</i> (и MainProj.pjt)</p>
<p>Файл ресурсов <i>FoxUser.dbf и FoxUser.fpt</i> можно и не создавать специально, а только сделать специальную запись в файле конфигурации (в этом случае он будет создан автоматически).</p>
<p>Зачем вообще надо тащить этот файл ресурсов в директорию проекта? Дело в том, что файл ресурсов хранит в себе координаты и положения всех когда-либо открываемых окон в среде FoxPro. Это значит, что в случае использования одного и того же файла ресурсов для всех проектов это файл "раздуется" до неимоверных размеров. А ведь в случае копирования проекта домой, желательно захватить с собой и файл ресурсов, чтобы "картинка не сбилась". Удобнее это сделать, если файл ресурсов физически расположен в той же директории, где и сам проект, а не искать его в директории FoxPro.</p>
<p>Определить какой именно файл ресурсов используется и где он находится можно с помощью функции <b>SYS(2005)</b></p>
<h3><b><a name="CONFIGFPW"></a>Файл конфигурации CONFIG.FPW</b></h3>
<p>Теперь важнейший вопрос о файле конфигурации <b>CONFIG.FPW</b>. Это обычный текстовый файл и о нем почему-то крайне редко упоминается в книгах о FoxPro. Этот файл необходимо создать самостоятельно. Автоматически он не создается.</p>
<p>Как правило, используют 2 файла конфигурации - один на этапе создания и отладки проекта и другой - на этапе исполнения собственно готового EXE у клиента. Тот файл конфигурации, который поставляется клиенту можно включить внутрь EXE, но лучше этого не делать. В этом случае он позволяет производить некоторую внешнюю настройку среды FoxPro даже в готовом EXE.</p>
<p>Итак, что же должно быть в том файле конфигурации, который используется на этапе создания и изменения проекта. Вот его примерное содержание</p>
<pre class="bbcode">CODEPAGE=1251  
RESOURCE=FoxUser.dbf  
TITLE=Мой новый проект  
PATH=Data,Forms,Class,Prg  
COMMAND=MODIFY PROJECT MainProj.pjx</pre>
<p><b>CODEPAGE</b> - эта строка должна быть обязательно, если Вы работаете с данными на русском языке. Если этой строки не указать, то может не произойти автоматическая трансляция символов русского языка и вместо них будут отображены какие-то закорючки.</p>
<p><b>RESOURCE</b> - эта опция говорит о том, что в качестве ресурсного файла выступает файл FoxUser.dbf расположенный в директории по умолчанию. Если такого файла там нет, то он будет создан автоматически. В принципе, Вы можете указать абсолютно любое имя для ресурсного файла, но лучше придерживаться принятого стандарта, чтобы не запутаться.</p>
<p><b>TITLE</b> - эта опция задает текст заголовка главного окна FoxPro вместо стандартного "Microsoft Visual FoxPro". Заключать текст заголовка в кавычки не надо.</p>
<p><b>PATH</b> - еще одна очень важная настройка. Она говорит FoxPro о том, где следует искать файлы (в каких директориях) относительно текущей директории. В качестве разделителя можно указывать как просто запятую, так и символ точки с запятой. Подробнее о путях доступа чуть ниже.</p>
<p><b>COMMAND</b> - эта опция задает команду, которую необходимо выполнить в момент открытия среды FoxPro. К сожалению, нельзя указать несколько опций COMMAND. Из них будет выполнена только одна. Но если Вам необходимо выполнить несколько команд при открытии среды FoxPro, то напишите их все в специальном файле PRG и опция будет выглядеть например так:</p>
<pre class="bbcode">COMMAND=DO Start.prg  </pre>
<p>По умолчанию, FoxPro "запоминает" последний открытый проект и пытается его открыть при каждом открытии среды FoxPro. Это удобно, когда Вы работает с одим проектом, но при работе с несколькими проектами это раздражает. Отключить режим автоматического открытия последнего открытого проекта можно в среде FoxPro: Пункт главного меню <b>Tools</b> -&gt; <b>Options</b> -&gt; закладка <b>View</b> -&gt; Снять "птичку" в пункте <i>"Open last project on startup"</i> и сохранить настройки по кнопке <i>"Set As Default"</i>. А для открытия "нужного" проекта при открытии FoxPro как раз и используется опция COMMAND в файле конфигурации.</p>
<p>В файле конфигурации можно сделать еще много различных настроек, но в большинстве случаев это не нужно. Например, большинство команд SET по умолчанию настроены как раз таким образом, который помогает отлаживать проект. Т.е. делать их перенастройку в файле конфигурации просто не имеет смысла.</p>
<p>Следует иметь в виду, что <b>файл конфигурации используется только один раз при запуске среды FoxPro</b>. Поэтому, если Вы внесли изменения в файл конфигурации, то они вступят в силу только после перезагрузки среды FoxPro.</p>
<h3><b><a name="OpenProject"></a>Как открыть проект</b></h3>
<p>Обратите внимание, что я не указал в файле конфигурации директории по умолчанию. В принципе, это можно сделать используя опцию <b>DEFAULT</b> примерно так:</p>
<pre class="bbcode">DEFAULT=C:\ProjVFP\MainProj  </pre>
<p>Однако есть способ лучше. Для открытия проекта создайте ярлык на рабочем столе со следующими реквизитами (у меня VFP6, поэтому пути соответствующие)</p>
<p><i>Командная строка</i></p>
<pre>"C:\Program Files\Microsoft Visual Studio\Vfp98\VFP6.EXE" -T -C"C:\ProjVFP\MainProj\config.fpw"
<i>Директория по умолчанию</i> "C:\ProjVFP\MainProj"</pre>
<p>Ключи запуска можно записать вместе как "-TC". Ключ "-T" говорит о том, что при запуске среды FoxPro не надо отображать заставку-логотип, а ключ "-C" говорит о том, что следом за ним указан полный путь доступа вместе с именем файла конфигурации, который следует использовать при запуске среды FoxPro. Строго говоря здесь можно указать абсолютно любое имя файла конфигурации, но лучше придерживаться принятого стандарта, чтобы не запутаться. В следующей строке Вы указываете и собственно директорию по умолчанию, которой и является та директория в которой расположен Ваш файл проекта.</p>
<p>Если Вы работаете с несколькими проектами, то создайте отдельные ярлыки для каждого проекта и отдельные файлы конфигурации. А сами ярлыки поместите в отдельную папочку на рабочем столе.</p>
<h3><b><a name="Path"></a>Пути доступа к файлам проекта</b></h3>
<p>Итак, если Вы последовали всем приведенным выше рекомендациям, то у Вас должно получится следующее: При запуске среды FoxPro в качестве директории по умолчанию устанавливается директория, где расположен сам файл проекта, а все прочие файлы проекта располагаются в поддиректориях.</p>
<p>Как же в этом случае обратится к рабочим файлам проекта?</p>
<p>Если Вы указали опцию PATH в файле конфигурации, то обращаетесь так, как-будто все файлы проекта лежат в текущей директории, например:</p>
<pre class="bbcode">USE MyTable.dbf  
  DO FORM MyForm.scx </pre>
<p>Несмотря на то, что физически таблица <i>MyTable.dbf</i> находится в папке <i>"DATA"</i>, а файл формы <i>MyForm.scx</i> в папке <i>"Forms"</i> FoxPro тем не менее найдет и запустит нужные файлы, поскольку путь доступа к ним был прописан в опции PATH в файле конфигурации.</p>
<p>Использование путей доступа в настройках файла конфигурации (или же программно в стартовом файле проекта) позволяет в простых случаях легко переносить проект из одной директории в другую. То же самое можно сказать и о данных. Вы спокойно включаете таблицы в <i>DataEnvironment</i> форм и отчетов не заботясь о том, что у клиента эти таблицы физически будут расположены в других директориях. Они все-равно будут найдены, если задан путь доступа к ним.</p>
<p>Разумеется, есть ситуации, когда простого указания путей доступа оказывается недостаточно. Например, когда Вы одновременно работаете с несколькими одноименными таблицами принадлежащими разным базам данных. В таких случаях используются различные приемы принудительного указания абсолютных путей доступа (здесь я их рассматривать не буду). Но в большинстве случаев использование настройки PATH оказывается вполне достаточным.</p>
<p>Следование изложенным здесь рекомендациям позволит облегчить процесс поиска и использования отдельных файлов проекта не только на этапе создания и изменения проекта, но и при распростарнении готовых проектов клиентам.</p>
<p>Кроме того, облегчается процесс создания резервных копий (да и просто копирования) файлов Вашего проекта. А также снижается вероятность порчи рабочих файлов собственно FoxPro.</p>
<h2 align="center"><b><a name="DataBase"></a>База данных</b></h2>
<p>По большому счету, под термином <i>"база данных"</i> понимают <b>совокупность всех данных, а также наложенных на них правил и ограничений, обеспечивающих целостность и непротиворечивость этих даных</b>. Иногда его действительно употребляют именно в этом смысле, однако чаще всего в FoxPro этот термин понимается в более узком смысле</p>
<p><b>База данных</b> - это файл с расширением <i>DBC</i>, а также связанные с ним файлы с тем же именем, но с расширениями <i>DCX и DCT</i></p>
<p>Более правильно было бы применять термин <i>"контейнер базы данных"</i>. Подозреваю, что от него и произошло название расширения (первые буквы в английском <i>DataBase Container</i>). Однако в связи с привычкой американцев все сокращать слово "контейнер" как-то затерялось.</p>
<p>В версиях FoxPro 2.x под термином "база данных" понимали то, что сейчас понимают под термином <i>"таблица"</i>, просто потому, что в этих версих еще не было файла DBC. Из-за чего часто возникают недоразумения и недопонимания.</p>
<p>По своей сути, файл DBC - это обычный файл DBF, только с измененным расширением (как и большинство других файлов используемых в FoxPro). Соответсвенно DCT - это файл мемо-полей (переименованный FPT), а DCX - это структурный индексный файл (переименованный CDX). Отличие от простого файла DBF заключается только в содержимом 28 байта заголовка (считая что первый байт имеет порядковый номер 0). В файле базы данных в этом байте заполнен 3 бит (чего нет в DBF-файлах). Т.е. ASCII код записанного там символа не менее 4 (обычно 7), в то время, как у DBF-файлов его содержимое наоборот не превышает 3.</p>
<p>Поскольку файл базы данных - это обычный файл DBF, то Вы можете открыть его как таблицу и просмотреть содержимое.</p>
<pre class="bbcode">USE MyBase.dbc AGAIN  </pre>
<p>Указывать расширение файла, как и опцию AGAIN в этом случае обязательно. Без указания расширения FoxPro посчитает, что его расширение DBF и ошибется. А опция AGAIN нужна потому, что файл базы данных может быть уже открыт командой OPEN DATABASE и без этой опции Вы также получите сообщение об ошибке</p>
<p>Зачастую, открытие файла базы данных как таблицы в более ранних версих FoxPro был единственной возможностью быстро получить нужную информацию. Например, какие таблицы базы данных имеют поле с заранее известным именем "MyField"? Для ответа на этот вопрос строим SQL запрос примерно следующего содержания:</p>
<pre class="bbcode">SELECT a.ObjectName ;  
        FROM MyBase.dbc a ;  
        INNER JOIN MyBase.dbc b ON a.ObjectID=b.ParentID ;  
        WHERE a.ObjectType='Table' and b.ObjectType='Field' and ;  
               b.ObjectName=PADR(LOWER('MyField'),128)</pre>
<p>Но я бы не рекомендовал пользоваться такими "хакерскими" трюками и использовать штатные функции для работы с файлом базы данных INDBC(), DBGetProp(), ADBObjects() и тому подобное, поскольку в этом случае слишком велик риск непреднамеренной порчи файла базы данных.</p>
<h3><b><a name="DataBaseName"></a>Название файла базы данных</b></h3>
<p>Файл базы данных, как и любой другой файл в системе Windows может содержать до 128 символов, содержать пробелы, русские символы, цифры и некоторые спец.символы. Однако для упрощения работы в FoxPro я бы порекомендовал следующие ограничения в наименовании файла базы данных</p>
<ul>
<li>Не использовать в названии русские символы - причина этой рекомендации в том, что FoxPro разрабатывался прежде всего для англоязычных пользователей и использование в нем символов другого языка - это уже последующее дополнение. Как следствие, велик риск, что чего-то, где-то недосмотрели и при определенных ситуациях русские буквы в имени вызовут неожиданные глюки</li>
<li>Не использовать в названии пробелы - в принципе, ошибок использование пробелов не вызовет, но несколько усложнит сам процесс программирования, поскольку имена и пути доступа, содержащие пробелы необходимо заключать в кавычки. Просто добавит лишней заботы - не забывать кавычки. А зачем усложнять себе жизнь, когда без этого легко можно обойтись.</li>
<li>По возможности, ограничивайте длину названия 8 символами и не используйте в названии цифр и спец.символов - на самом деле я не вижу разумных объяснений этому ограничению. Но дело в том, что подавляющее большинство системных файлов и файлов примеров в FoxPro (да и собственно системы Windows) ограничены как раз-таки именно 8 символами и не используют ни цифры ни спец.символы. Зачастую в ущерб информативности названия. Почему разработчики идут на такое ограничение не понятно, но имеет смысл последовать их примеру. Видимо на это есть какие-то причины, кроме привычки к DOS-нотации</li>
<li>Не называйте файл базы данных также как и один из содержащихся в ней объектов - не обязательно речь идет о таблицах, это может быть совпадение с названием Local View, или индексного тега, или поля таблицы, да мало ли чего еще... Разумеется ошибки это не вызовет, но усложнит понимание написанного кода самим программистом. Не всегда с ходу можно однозначно определить, что речь идет именно о файле базы данных, а не о каком-либо другом объекте. А если еще и их названия совпадают, то совсем тяжело становится.</li>
<li>Не используйте для названия одно из зарезервированных в FoxPro слов - опять же, ошибки это не вызовет, но резко снизит "читабельность" кода. Ведь зарезервированные слова автоматически подсвечиваются опеределенным цветом (если Вы используете стандартный текстовый редактор FoxPro) и с ходу становится проблематично отличить опцию или команду от имени файла базы данных<br />
<h3><b><a name="DataBaseLocation"></a>Расположение файла базы данных</b></h3>
</li>
</ul>
<p>Как для файла базы данных, так и вообще для всех рабочих таблиц использующихся в проекте следует выделять специальную папку (директорию). Эта рекомендация относится как к этапу разработки проекта, так и к поставке готового приложения клиентам.</p>
<p>Причины этой рекомендации подробно изложены в разделе <a href="#FilesInProject">"Расположение файлов проекта"</a><br />
. Вкратце, суть сводится к тому, что в противном случае возрастает риск непреднамеренной порчи файлов данных и соответственно потере данных. А также облегчается поиск нужных файлов и создание резервной копии.</p>
<p>Желательно файл базы данных располагать в той же папке, где и включенные в него файлы DBF</p>
<p>По большому счету, конечно можно держать файл базы данных в одной директории, а включенные в него файлы DBF в другой. Но это усложняет сам процесс разработки проекта. Например, создание резервной копии в простейшем случе заключается в простом копировании директории с рабочими файлами в другое место. Если же рабочие файлы отделены от файла базы данных, то потребуется уже копирование 2-х директорий. Соответственно усложнится код.</p>
<p>Кроме того, в этом случае несколько увеличится размер файла базы данных (точнее файла DCT - мемо-файла), поскольку непосредственно в нем хранится относительный путь к включенным в него таблицам. Если таблицы расположены в той же директории, что и сам файл базы данных, то этого относительного пути просто нет. Справедливости ради, следует заметить, что относительный путь к базе данных хранится и в заголовках таблиц, которые в эту базу данных включены. Но на размер таблиц это не влияет, поскольку под этот относительный путь всегда выделяется фиксированное место вне зависимости от факта его наличия.</p>
<h3><b><a name="DataBaseService"></a>Обслуживание файла базы данных</b></h3>
<p>Собственно, обслуживание файла базы данных заключается в его регулярной "чистке". Поскольку файл базы данных - это обычная DBF-таблица, то и удаление из него происходит так же как и в таблице в 2 этапа: сначала записи только помечаются как удаленные, но физически не удаляются. А для физического удаления необходимо выполнить упаковку файла базы данных.</p>
<p>На этапе разработки для этой цели используется специальный пункт меню в режиме модификации базы данных: пункт главного меню <b>Database</b>-&gt;<b>Clean Up DataBase</b>. Фактически, этот пункт меню выполняет команду <b>PACK</b> для файла базы данных, поэтому требует эксклюзивного открытия базы данных (<i>в режиме <b>EXCLUSIVE</b></i>). Если база данных открыта в режиме <i>SHARED</i>, то этот пункт меню будет недоступен.</p>
<p>Кроме собственно чистки файла базы данных от ранее удаленных записей, выполнение этой операции существенно уменьшает размер файла DCT в котором хранятся в том числе все "хранимые процедуры". Поэтому после внесения изменений в хранимые процедуры также желательно сделать чистку базы данных.</p>
<p>На этапе выполнения у клиента необходимость чистки базы данных возникает только в том случае если Вы динамически добавляете и удаляете какие-либо объекты в базу данных. Например, создаете <i>Local View</i> командой <i>CREATE SQL VIEW</i>. Или модифицируете какие-либо свойств по <i>DBSetProp()</i>. Или модифицируете таблицы по <i>ALTER TABLE</i>.</p>
<p>В этом случае чистка базы данных выполняется с использованием обычной команды <b>PACK</b> примерно таким образом</p>
<pre class="bbcode">SET DATABASE TO MyBase  
  CLOSE DATABASE  
  OPEN DATABASE MyBase EXCLUSIVE  
  SET DATABASE TO MyBase  
  PACK DATABASE  
  CLOSE DATABASE  
  OPEN DATABASE MyBase SHARED  
  SET DATABASE TO MyBase  </pre>
<p>Разумеется, это только общая схема, здесь опущены различные проверки необходимые в полноценном приложении.</p>
<p>Если же Вы никаким образом не модифицируете файл базы данных на этапе работы у клиента, то и нет необходимости в чистке файла базы данных.</p>
<p>Вообще-то, я очень не рекомендую новичкам использовать команды по модификации файла базы данных. Это как раз одни из самых потенциально-опасных операций, могущих привести к необратимой порче всех исходных данных.</p>
<h3><b><a name="DataBaseNeed"></a>А надо ли вообще использовать файл базы данных?</b></h3>
<p>Подобный вопрос очень часто задают программисты, которые раньше работали на FoxPro 2.x, где этого файла просто не было. Да и сам FoxPro вполне способен работать и со свободными таблицами безо всякой базы данных. Отвечу сразу - надо! А теперь попробую объяснить почему.</p>
<ul>
<li>Использование файла базы данных расширяет возможности таблиц DBF.
<p>Например, в файле DBF в принципе нельзя дать полю название содержащее более 10 символов, но если он включен в базу данных, то название поля может уже содержать до 128 символов. Никакие правила (RULE), значения по умолчанию (DEFAULT), триггера и кое-что другое попросту невозможны в файле DBF вне файла базы данных. Точнее так - невозможно их автоматическое выполнение.</li>
<li>Использовании файла базы данных позволяет выполнять операции, которые крайне сложно организовать другими способами
<p>Например, такая операция как "транзакция" может быть реализована только среди таблиц DBF включенных в базу данных. В принципе, этот процесс можно организовать и со свободными таблицами, но это потребует от программиста значительных усилий. А такой замечательный объект как обновляемый Local View - сколько усилий требовалось при программировании в FoxPro 2.x для реализации того, что этот объект делает автоматически!<br />
Вобщем, использование файла базы данных серьезно облегчает жизнь программиста.</li>
</ul>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4899">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4899">Владимир Максимов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Владимир Максимов" href="https://foxclub.ru/account/?user=4899">
				<img alt='' src='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 65<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/sovety-nachinayushhim-chast-i/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Статьи]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/nechetkoe-sravnenie-strok/</link>
					<title><![CDATA[Нечеткое сравнение строк]]></title>
                    					    <author><![CDATA[Петров Андрей]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:25 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Нечеткое сравнение строк</h1>
													</header>
													<div id="sol_opis">Перевод решений о нечетком сравнении строк с www.DelphiKingdom.ru на VFP</div>
<div id="sol_body">
<h3>Нечеткое сравнение строк</h3>
<p> Статьи о нечетком сравнении строк - <br /> http://www.delphikingdom.ru/treasury/compare.htm</p>
<p> Я перевел это в DLL (хотя алгоритмы простые но нету времени в них разобраться и переписать) и выкладываю пример. А так-же нашел еще один сайт с нечетким сравнением строк (код на VFP) - http://lit999.narod.ru/soft/string.html</p>
<p> Предлагаю следующее: Написать свой ComboBox и в нем отлавливать ситуацию когда человек ввел данные которых нет в списке. По этому "событию" запускать (по желанию разработчика) нечеткую выборку и выводить ее в список предложенных значений ComboBox. Предложение риторическое - если дойдут руки доделаю свой ComboBox который в решениях.  </p></div>
<div id="sol_avtor">Автор: Петров Андрей</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5063">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5063">Петров Андрей</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Петров Андрей" href="https://foxclub.ru/account/?user=5063">
				<img alt='' src='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4db1b774eb53ee82006cbbc10e1439e7?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 14<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-04-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/nechetkoe-sravnenie-strok/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/pozdravitelnyj-kalendar/</link>
					<title><![CDATA[Поздравительный календарь]]></title>
                    					    <author><![CDATA[Vladimir_Knyr]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:25 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Поздравительный календарь</h1>
													</header>
													<div id="sol_opis">Еще один календарь для коллекции клуба</div>
<div id="sol_body">Этим календариком можно людям делать приятное </div>
<div id="sol_avtor">Автор: Владимир Кныр</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4754">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4754">Vladimir_Knyr</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Vladimir_Knyr" href="https://foxclub.ru/account/?user=4754">
				<img alt='' src='https://secure.gravatar.com/avatar/7dd8187cfc903829e54ae52b377e8a5a?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7dd8187cfc903829e54ae52b377e8a5a?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 15-12-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/pozdravitelnyj-kalendar/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/prosmotr-risunkov/</link>
					<title><![CDATA[Просмотр рисунков]]></title>
                    					    <author><![CDATA[Vladimir_Knyr]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:25 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Просмотр рисунков</h1>
													</header>
													<div id="sol_opis">Если рисунок большой, то посмотрите и оцените это решение</div>
<div id="sol_body">Класс написан на чистом фоксе, без привлечения сторонних средств. краткое описание и демо пример в архиве прилагаются</div>
<div id="sol_avtor">Автор: Владимир Кныр</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4754">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4754">Vladimir_Knyr</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Vladimir_Knyr" href="https://foxclub.ru/account/?user=4754">
				<img alt='' src='https://secure.gravatar.com/avatar/7dd8187cfc903829e54ae52b377e8a5a?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7dd8187cfc903829e54ae52b377e8a5a?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 15-12-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/prosmotr-risunkov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Графика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/frx-otchyot-iz-grid-v-design-mode/</link>
					<title><![CDATA[FRX-отчёт из Grid в Design-mode]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:25 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>FRX-отчёт из Grid в Design-mode</h1>
													</header>
													<div id="sol_opis">Инструмент для быстрого создания FRX-отчёта в Design-mode из Grid. (VFP 6-8)</div>
<div id="sol_body">
<h3>FRX-отчёт из Grid в Design-mode</h3>
<p> Инструмент для быстрого создания FRX-отчёта в Design-mode из Grid. (VFP 6-8)</p>
<p> Откройте проект.<br /> Откорректируйте файл Init.prg для Вашего пути к проекту.<br /> Запустите Init.prg (т.к. необходима инициализация переменной max_page_of_report для вычисления "всего страниц").<br /> Откройте Form Designer.<br /> Кликните на нужный Grid.<br /> Наберите в Command Window команду do create_report_from_grid in prgcreateRP</p>
<p> Отчёт готов. Его можно отредактировать и "Сохранить как..."    </div>
<div id="sol_avtor">Автор: Er0p</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/frx-otchyot-iz-grid-v-design-mode/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/bystroe-reshenie-dlya-okon-dialogov/</link>
					<title><![CDATA[Быстрое решение для окон диалогов&#8230;]]></title>
                    					    <author><![CDATA[Maestro]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:25 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Быстрое решение для окон диалогов&#8230;</h1>
													</header>
													<div id="sol_opis">Часто нужно создавать окна диалогов.... Визуальные формы я не люблю...пользуюсь таким классом... Внешний вид несколько пострадал после вырезки из него некоторых библиотечных переменных...Но работает и идея понятна...  Два примера использования - PRIMER.prg</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Maestro</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4692">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4692">Maestro</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Maestro" href="https://foxclub.ru/account/?user=4692">
				<img alt='' src='https://secure.gravatar.com/avatar/ca696dd907a4e5d8d991c959b921a2eb?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ca696dd907a4e5d8d991c959b921a2eb?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 14-08-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/bystroe-reshenie-dlya-okon-dialogov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/formtoolbar/</link>
					<title><![CDATA[FormToolBar]]></title>
                    					    <author><![CDATA[Vladimir_Knyr]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:25 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>FormToolBar</h1>
													</header>
													<div id="sol_opis">Панель инструментов для формы</div>
<div id="sol_body">
<h3>FormToolBar</h3>
<p> Работает в отдельно взятой форме.<br /> Демонстрационная форма и файл с описанием находятся в архиве.      </div>
<div id="sol_avtor">Автор: Владимир Кныр</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4754">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4754">Vladimir_Knyr</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Vladimir_Knyr" href="https://foxclub.ru/account/?user=4754">
				<img alt='' src='https://secure.gravatar.com/avatar/7dd8187cfc903829e54ae52b377e8a5a?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7dd8187cfc903829e54ae52b377e8a5a?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 15-12-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/formtoolbar/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/proverka-sootvetstviya-bankovskogo-liczevogo-scheta-i-mfo-banka-proverka-na-korrektnost-mfo-banka-dlya-ukrainskih-bankov/</link>
					<title><![CDATA[Проверка соответствия банковского лицевого счета и МФО банка. Проверка на корректность МФО банка для Украинских банков!]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 04 Nov 2022 14:29:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Проверка соответствия банковского лицевого счета и МФО банка. Проверка на корректность МФО банка для Украинских банков!</h1>
													</header>
													<div id="sol_opis">Собственно все описание в теме и указано.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Kid</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/proverka-sootvetstviya-bankovskogo-liczevogo-scheta-i-mfo-banka-proverka-na-korrektnost-mfo-banka-dlya-ukrainskih-bankov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/posylka-smtp-soobshheniya-cherez-winsock-control/</link>
					<title><![CDATA[Посылка smtp сообщения через winsock control]]></title>
                    					    <author><![CDATA[Crip_]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:25 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Посылка smtp сообщения через winsock control</h1>
													</header>
													<div id="sol_opis">Класс на основе winsock control для посылки сообщений по протоколу smtp. Использует charset windows-1251 для текста. Написан на VFP8?,но будет работать и в VFP6, если не  присоединять файлы, так как для кодирования используется функция strconv, отсутствующая в младших версиях. Могу помочь в написании аналогичной функции для VFP6.</div>
<div id="sol_body">
<h3>Посылка smtp сообщения через winsock control</h3>
<p> В основе лежит библиотека взятая с universalthread.com. Исправлены ошибки и произведена доработка до почти товарного вида. Есть маленькие кривости с таймером но уже не стал исправлять. Вроде и так хорошо работает.<br /> Описание класса можно найти в методе zreadme.<br /> Пример использования:<br /> local loMail<br /> loMail=NEWOBJECT("foxsock")<br /> loMail.host = "MyMailServer"<br /> loMail.message = "Тест"<br /> loMail.recipient = "solochak@land.ru"<br /> loMail.sender = "anonymous@land.ru"<br /> loMail.subject = "SMTP Winsock"<br /> loMail.attachment = "c:TEST1.CAB,c:TEST2.CAB"<br /> loMail.Send()</p></div>
<div id="sol_avtor">Автор: Crip_</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4574">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4574">Crip_</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Crip_" href="https://foxclub.ru/account/?user=4574">
				<img alt='' src='https://secure.gravatar.com/avatar/936143d6e215dbb2e48bc14bd35ff02a?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/936143d6e215dbb2e48bc14bd35ff02a?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 06-10-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/posylka-smtp-soobshheniya-cherez-winsock-control/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-dlya-raboty-s-xml/</link>
					<title><![CDATA[класс для работы с XML]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Tue, 13 Dec 2022 04:43:21 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>класс для работы с XML</h1>
													</header>
													<div id="sol_opis">Класс предназначен для настраиваемого извне формата таблиц для преобразования плоских курсоров в xml</div>
<div id="sol_body">
<h3>класс для работы с XML</h3>
<p>На сайте в конференции обсуждался вопрос "Зачем нужен XML".<br />
Классическое мнение - его используют для передачи данных в многоплатформенных приложениях. Это неоспоримо, хотя на мой взгляд очень много избыточности (теги и прочее), особенно передача через интернет.<br />
Встечаются задачи (и очень часто), когда в таблицу необходимо положить очень много полей, и поля эти могут меняться во времени, как количественно, так и качественно. Вот тут XML и выручает. В таблице выделяется MEMO поле под XML код, и хранится в нем любое количество разнообразных полей, причем для каждой записи в таблице, набор полей в XML коде может быть разный. Для работы с таким полем предлагается следующий класс, позволяющий получать XML код из именованного массива и упаковывать данные массива в XML код.<br />
Для распаковки XML используется Microsoft.XMLDom.<br />
Пример</p>
<pre><pre class='bbcode'>    LOCAL oXML oXML = NEWOBJECT('xml_object', 'xml_object.vcx')   
 ***Создание таблицы CREATE CURSOR TestXML (Id I, TextXML M)   
 ***Добавление свойств в объект oXML   
  oXML.Set_property('Text_1', 'Тестовый текст 1')   
  oXML.Set_property('Text_2', 'Тестовый текст 2')   
  oXML.Set_property('Text_3', 'Тестовый текст 3')   
  oXML.Set_property('Integer_1', 123)   
  oXML.Set_property('Integer_2', 456)   
  oXML.Set_property('Integer_3', 789)   
  oXML.Set_property('Numeric_1', 1.23)   
  oXML.Set_property('Numeric_2', 4.56)   
  oXML.Set_property('Numeric_3', 7.89)   
  oXML.Set_property('Logic_1', .T.)   
  oXML.Set_property('Logic_2', .F.)   
 ***Добавление записи в таблицу (идентификатор и MEMO поле с XML данными)   
  APPEND BLANK replace Id WITH 1, TextXML WITH oXML.get_xml()   
  ?TestXML.TextXML    
 ***То что хранится в поле TextXML: ***   
 ***Тестовый текст 1   
 ***Тестовый текст 2   
 ***Тестовый текст 3   
 ***123.00 ***456.00   
 ***789.00   
 ***1.23   
 ***4.56   
 ***7.89   
 ***1   
 ***0 ***    
 ***Очистка объекта oXML (удаление всех ранее добавленных свойств)   
  oXML.RemoveAll()   
 ***Загрузка XML кода в объект oXML   
  oXML.load_xml(TestXML.TextXML)   
 ***Получение данных из объекта oXML   
  ?oXML.get_property('Text_1')   
  ?oXML.get_property('Text_2')   
  ?oXML.get_property('Text_3')   
  ?oXML.get_property('Integer_1')   
  ?oXML.get_property('Integer_2')   
  ?oXML.get_property('Integer_3')   
  ?oXML.get_property('Numeric_1')   
  ?oXML.get_property('Numeric_2')   
  ?oXML.get_property('Numeric_3')   
  ?oXML.get_property('Logic_1')   
  ?oXML.get_property('Logic_2')   
  USE IN TestXML   
</pre></pre>
</div>
<div id="sol_avtor">Автор: Владимир Хитяев</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-dlya-raboty-s-xml/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/primer-ispolzovaniya-wmi/</link>
					<title><![CDATA[Пример использования WMI]]></title>
                    					    <author><![CDATA[Петров Андрей]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:25 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Пример использования WMI</h1>
													</header>
													<div id="sol_opis">Возможности (кратко) 1) Получение списков запущеных процессов 2) Получение данных по оборудованию (sn model ...) 3) Получение данных об установленном SoftWare + много чего еще + возможность получения данных с удаленного компьютера сети.</div>
<div id="sol_body">
<h3>Пример использования WMI</h3>
<p> Здравствуйте все.</p>
<p> Захотелось добавить в решения очень полезную вещь - WMI. Странно почему-то ее мло кто использовал из тех кто на этом сайте бывает на форуме. Может это решение изменит положение 🙂</p>
<p> Возможности (кратко)<br /> 1) Получение списков запущеных процессов<br /> 2) Получение данных по оборудованию (sn model ...)<br /> 3) Получение данных об установленном SoftWare<br /> + много чего еще<br /> + возможность получения данных с удаленного компьютера сети.</p>
<p> Более подробно:<br /> 1) Спсобы работы<br /> Я видел 2 - один из них работает мягко говоря странно. Вот он:</p>
<p> 1.1)Коннектимся к объекту winmgmts с параметрами. Я если честно вижу такое применение GETObject впервые.</p>
<p> strComputer = "."<br /> objWMIService = GETOBJECT("winmgmts:{impersonationLevel=impersonate}!"+strComputer+"rootcimv2")</p>
<p> Где strComputer - имя сетевого компьютера. "." - означает текущий компьютер.</p>
<p> Далее идет рабоита с objWMIService. Язык WMI очень похож на SQL (скорее всего это он и есть) поэтому не пугайтесь.</p>
<p> colSettings = objWMIService.ExecQuery("Select * from Win32_Processor",,48)</p>
<p> Здесь colsettings - объект с набором информации и методами !!! Короче то что нам и нужно<br /> Самое важное здесь Win32_Processor - данные о процессоре(ах). Вся соль заключается именно в этом слове! Суть в том что данным на компьютере соответствует свое название Win32_XXX</p>
<p> Например :<br /> Данные о работающих процессах Win32_Process<br /> Данные о винчестере Win32_DiskDrive<br /> и т.д.</p>
<p> К концу решения Вы сами сможете определить что чему соответствует.</p>
<p> Ну и вытягивание данных из colSettings</p>
<p> colItems = objWMIService.ExecQuery("Select * from Win32_VideoController",,48)<br /> For Each objItem in colItems<br />     ?  "VideoMfr: ", objItem.AdapterCompatibility<br />     ?  "VideoRAM: ", objItem.AdapterRAM<br />     ?  "VideoAdapter: ", objItem.Name<br />     ?  "VideoProcessor: ", objItem.VideoProcessor<br /> Next</p>
<p> Как я уже писал выше colSettings - набор объектов со свойствами. Здась представлены некоторые свойства объекта Win32_VideoController</p>
<p> Вот и все. Просто и красиво.</p>
<p> 1.2) Второй способ отличается только подключением. Его мне подсказал Vit*.</p>
<p> m.strcomputer='.'<br /> loSWbemLocator = CREATEOBJECT("WbemScripting.SWbemLocator")  <br /> loSWbemService = loSWbemLocator.ConnectServer(strcomputer)<br /> colSettings = loSWbemService.ExecQuery("Select * From Win32_DiskDrive Where InterfaceType='IDE'",,48)<br /> FOR EACH ObjItem IN colSettings<br /> 	? ObjItem.PNPDeviceID<br /> 	? get_sn(ObjItem.PNPDeviceID)<br /> NEXT</p>
<p> Короче суть таже самая что и в первом варианте. Но этот вариант работает практически всегда в отличие от первого. Т.е. у меня были глюки с переносом программы с одного компьютера на другой На одном все работает а на другом не хочет - выдет ошибку. А второй вариант работал у меня всегда.</p>
<p> 2) Об описании WMI<br /> Все описание идет в поставке с Windows - как я понял. Т.е. если у Вас русский Windows то и описание на русском. СУПЕР!!!</p>
<p> Чтобы определить что чему соответствует скачайте WMITools и запустите WMI Object Browser. Он сначала представит <br /> Вам номера версий каких-то.<br /> Далее выдастся строчка connect to Namespace (rootcimv2) Здесь можно поставить имя компьютера с которого хотим получить данные<br /> Например work6rootcimv2<br /> Жмем OK<br /> Получаем окошко с заданием имени пользователя и пароля. Жмем OK. Если Вы получили окошко "Отказано в доступе" - Вы не администратор и НЕКОТОРЫЕ данные Вам не доступны. Но не все...<br /> Получаем окошко в IE написанное на VBScript, помоему.</p>
<p> Далее один (или 2) элемент класса Win32_ComputerSystem<br /> Раскрываем его и ищем Win32_SystemDevices - это список всего оборудования компа.<br /> Раскрываем его и ищем например Win32_DiskDrive - это список всех жестких дисков со свойствами...</p>
<p> 3) Помощь</p>
<p> Выбираем нужный объект и щелкаем на вопросительный знак в правом верхнем углу. А вот и описание всех свойств на РУССКОМ.</p>
<p> 4) Немного об своих нароботках<br /> 4.1) SN винчестера<br /> Меня тут запрегли на военной кафедре написать прогу по учету компов. К ним приезжает ФСБ и устанавливает норму секретности. Но за эту норму надо бабок выложить. Чтобы этого не делать надо представить список компов с описанием...<br /> В описании надо указывать SN Model и т.д. всего к чему можно прицепить жучек.</p>
<p> Ну так вот, о чем это я. А да проблема в том что серийники просто так не найдешь даже через WMI.<br /> Можно найти на<br /> Память (только он практически всегда не задан)<br /> Процессор (расшифрованная информация ASM -> CPUID)<br /> И чего - то там еще.</p>
<p> Я накопал что можно найти и SN винчестера. Т.к. больше я нигде не нашел этой информации в Inet то раньше думал что можно это сделать только при помощи обращений к портам винчестера. Кстати привожу в архиве пример на Pascal-е<br /> Задавал вопросы на форуме но увы.</p>
<p> Ну так вот все оказалось тупо до безобразия. SN хранится в свойстве PNPDeviceID класса Win32_DiskDrtive</p>
<p> Привожу функцию его получения которую использовал выше в примере</p>
<p> FUNCTION get_sn<br /> LPARAMETERS str<br /> PRIVATE x,k<br /> m.x=RAT('',m.str)<br /> m.k=''<br /> IF m.x#0<br /> 	m.str=SUBSTR(m.str,m.x+1)<br /> 	if at('&',m.str)=0<br /> 		DO WHILE !EMPTY(m.str)<br /> 			m.k=m.k+CHR(hextobyte(SUBSTR(m.str,3,2)))+CHR(hextobyte(SUBSTR(m.str,1,2)))<br /> 			m.str=SUBSTR(m.str,5)<br /> 		ENDDO<br /> 		RETURN ALLTRIM(m.k)<br /> 	endif<br /> ENDIF<br /> RETURN ''</p>
<p> FUNCTION hextobyte<br /> LPARAMETERS str<br /> PRIVATE a,k,r<br /> m.str=UPPER(m.str)<br /> m.a=SUBSTR(m.str,1,1)<br /> m.k=ASC(m.a)-IIF(m.a																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/eshhyo-odin-varint-skanirovani-katalogov/</link>
					<title><![CDATA[Ещё один варинт сканировани каталогов.]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 04 Nov 2022 14:30:03 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Ещё один варинт сканировани каталогов.</h1>
													</header>
													<div id="sol_opis">Используются рекурсивные вызовы функции для определения вложенных каталогов.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Timo</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/eshhyo-odin-varint-skanirovani-katalogov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/nettest-2-perekompiliroval-v-vfp6sp5/</link>
					<title><![CDATA[NETTEST 2 (Перекомпилировал в VFP6SP5)]]></title>
                    					    <author><![CDATA[AlexK]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:24 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>NETTEST 2 (Перекомпилировал в VFP6SP5)</h1>
													</header>
													<div id="sol_opis">Проверка слабых звеньев в сети.</div>
<div id="sol_body">
<h3>NETTEST 2 (Перекомпилировал в VFP6SP5)</h3>
<p> простая, старая программа тестирования сети <br /> Перекомпилировал в VFP6SP5</p></div>
<div id="sol_avtor">Автор: abil</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4764">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 10 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4764">AlexK</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="AlexK" href="https://foxclub.ru/account/?user=4764">
				<img alt='' src='https://secure.gravatar.com/avatar/1fb49e8f115e8786c485b8112a62a69e?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1fb49e8f115e8786c485b8112a62a69e?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 9<i class="rcli fa-calendar-check-o"></i>Регистрация: 11-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/nettest-2-perekompiliroval-v-vfp6sp5/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/testnet-prostaya-staraya-programma-testirovaniya-seti-fpd26/</link>
					<title><![CDATA[TESTNET &#8211; простая, старая программа тестирования сети (fpd26).]]></title>
                    					    <author><![CDATA[abil]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:24 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>TESTNET &#8211; простая, старая программа тестирования сети (fpd26).</h1>
													</header>
													<div id="sol_opis">Проверка слабых звеньев в сети.</div>
<div id="sol_body">
<h3>TESTNET - простая, старая программа тестирования сети (fpd26).</h3>
<p> Как-то работал в большой конторе - несколько файловых серверов, <br /> полторы сотни клиентских компьютеров и несколько приложений на FPD и VFP <br /> разных версий - все работает, изредка индексы разрушаются, в общем, нормальная текучка. </p>
<p> Потом пошли проблемы по нарастающей. <br /> Мало того, что индексы стали падать по 3 раза на дню, <br /> так в сами данные (dbf) портиться начали. <br /> Сисадмины и техники клянутся, что у них все нормально, сеть работает прекрасно. <br /> Программисты тоже понять ничего не могут. </p>
<p> Вот тогда и написал TESTNET - незамысловатую программу, которая тупо создает файл, <br /> а затем пишет туда мегабайты тестовых строк на низком уровне, чтобы потом их прочитать и сравнить.</p>
<p> Программу разместили на серверах и запустили со всех клиентов. <br /> Сразу нашлось 14 штук компьютеров с дефектными сетевыми платами, вернее драйверы сетевых карт были глючные. <br /> С тех пор много воды утекло - dbf нету (все данные находятся на SQL серверах), <br /> но папка TESTNET, гордо лежит в на дисках всех серверов конторы. А техники, наблюдая за счетчиками<br /> программы, научились распознавать потенциальные проблемы в сети.</p>
<p> - рекомендую создать Standalone Extended приложение. В архив решения не вложил в виду ограничения на 500к.</p>
<p> - fpd26 не распознаёт UNC, поэтому необходимо назначить букву диска к сетьевому ресурсу на, котором находится<br />   папака TESTNET. Значения параметров по умолчанию расчитанны на 10мбит сеть. Для других скоростей сети количество<br />   созданных записей можно изменить.</p>
<p> abil - Билецкий Анатолий Викторович.</p></div>
<div id="sol_avtor">Автор: abil</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4589">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4589">abil</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="abil" href="https://foxclub.ru/account/?user=4589">
				<img alt='' src='https://secure.gravatar.com/avatar/66bc8fc7dc47a27c51c73c330aa63633?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/66bc8fc7dc47a27c51c73c330aa63633?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 01-12-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/testnet-prostaya-staraya-programma-testirovaniya-seti-fpd26/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/avtomaticheskoe-obnovlenie-versij/</link>
					<title><![CDATA[Автоматическое обновление версий]]></title>
                    					    <author><![CDATA[karly™]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:24 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Автоматическое обновление версий</h1>
													</header>
													<div id="sol_opis">Даже если у вас всего два пользователя, бывает очень утомительно каждый раз копировать им на рабочие станции обновления своей программы. Что же говорить, если пользователей несколько десятков, и расположены они в разных концах здания... </div>
<div id="sol_body">
<h3>Автоматическое обновление версий</h3>
<p> Скопируйте файлы ChkNew.exe и ChkNew.ini в директорию со своей программой, сделайте необходимые настройки в ini-файле, и запустите.</p>
<p> Программа скомпилирована в VFP8 без SP1. Она вполне работоспособна для VFP7, но ее придется перекомпилировать.  </p></div>
<div id="sol_avtor">Автор: Игорь Ильин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4545">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4545">karly™</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="karly™" href="https://foxclub.ru/account/?user=4545">
				<img alt='' src='https://secure.gravatar.com/avatar/58afa4925ba0e3440d31fa4bebc393ae?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/58afa4925ba0e3440d31fa4bebc393ae?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 27-09-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/avtomaticheskoe-obnovlenie-versij/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Распространение программ]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/samodelnyj-grid/</link>
					<title><![CDATA[Самодельный Грид]]></title>
                    					    <author><![CDATA[Andy]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:24 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Самодельный Грид</h1>
													</header>
													<div id="sol_opis">По ближе познакомившись с Гридом, понял, что он как был Browse – ом, так им и остался. Научился только занимать не все окно целиком. В свое время на FPD было огромное количество броузов собственной разработки, которые работали, как хотелось программисту, а не Б.Г. Здесь почему-то не встритил ни одного. Значит буду первым. Может кому и сгодиться на что. В движке присутствуют некоторые досовские приемы, довольно сложно перестроится. В частности класс не визуальный. </div>
<div id="sol_body">
<h3>Самодельный Грид</h3>
<p> Чего умеет:<br /> -Перемещение клавишами по базе - вверх, вниз, home, end, pageup,pagedown. <br /> -Перемещение мышкой по базе – вертикальный ScrollBar (по одной записи и страницами).	<br /> -Перемещение мышкой по базе – кликая на нужной строке.<br /> -Инкриментальный поиск.Сбрасывает поисковую строку после ухода с найденой записи<br /> -Контекстный поиск. Вхождение части слова в запись (SELECT - LIKE)<br /> -Сортировки по любой колонке кликая мышкой на заголовке или клавишами влево, вправо.<br /> -Красит цветом активный заголовок колонки<br /> -Любой цвет букв и фона. У каждой колонки может быть свой цвет.<br /> -В зависимости от условий может выделять цветом любую строку на экране<br /> -Указатель текущей записи (курсор), выделяет всю запись целиком.<br /> -Курсор в каждой колонке может иметь свой цвет.<br /> -Понимает фильтры записей.</p>
<p> Чего не умеет:<br /> -Быть визуальным классом (при желании может им стать)<br /> -Не делает горизонтальный скроллинг (делать не собираюсь так как не вижу необходимости)<br /> -Не умеет замораживать колонки<br /> -Нет авто повтора при использовании горизонтального scrollbar мышью<br /> -Печатать заголовок в 2 строки<br /> -Устанавливать для заголовка каждой колонки свой шрифт(только один на все колонки) 	<br /> -Редактировать записи прямо в  таблице(можно научить немного изменив классы на основании которых создается таблица)<br /> -Перемещение в базе клавишами проигрывает по скорости обычному гриду – Чем больше строк и колонок тем медленней работает. При инкриментальном поиске летает P2-333	</p>
<p> Глюки :<br /> -НЕНАВИДИТ пустую таблицу с удаленными записями. В одном месте используется RECCOUNT(), который не понимает удаленных записей<br /> - Если количество записей меньше чем количество строк – то мышкой можно встать на несуществуюшие строки<br /> -Не уходит “Focus” с клавиш навигации, поэтому при нажатии на Enter иногда получаются самонепроизвольные движения в базе(борюсь)</p>
<p> Как подключать: <br /> Класс не визуальный – со всеми вытекающими<br /> Прописывается в Init формы<br /> В форме установить KeyPreview и KeyPress обрабатывать клавиши<br /> Необходимые методы<br /> 	Spis_info 		– Аналог AfrerRowColChange<br /> 	Real_search		- Управляет поиском<br /> Необходимые свойства<br /> 	Anseek 		- суда пишется что искать<br /> Необходимые объекты<br /> 	Sh_seek(textbox) 	- выводит в форму чего ищем</p>
<p> Не очень необходимые методы<br />         One_step_zapr – Надо для контекстного поиска и запросов по сложному ключу</p>
<p> 	Edit_back	 - Управляет редактированием<br /> 	Edit_cancel      - -//-<br /> 	Edit_in		- -//-<br /> 	Edit_save	- -//-</p>
<p> Не очень необходимые свойства – нужны при редактировании записей<br />         Data_change 	- Признак что изменились данные при редактировании<br />         EditMode	-Признак что находимся в режиме редактирования<br />         New_record	-Признак новой записи</p>
<p> Устроен:<br /> Большая таблица из TextBox –ов помещенная в контейнер</p>
<p> Настройка:<br /> В файле AnGrid.prg – собственно сам класс довольно подробно описаны значения свойств настройки<br /> Задается:<br /> -Количетство строк и колонок<br /> -Высота строки и заголовка<br /> -Название основной базы<br /> Для каждой колонки свойства каждой колонки в массиве ColOp[колонка, свойство]<br /> -Ширина колонки<br /> -Источник данных<br /> -класс на основании которого строится колонка<br /> -цвета ячеек	(в демо выделяются все записи где есть буква а)</p>
<p> Запуск Demo:<br /> В проекте фаил Demo где надо прописать пути <br /> 	-К базам<br /> 	-Формам<br /> 	-Программам	<br />         -Папке TMP	<br /> По умолчанию настроен на C:Demo    </div>
<div id="sol_avtor">Автор: Andy</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4568">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4568">Andy</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Andy" href="https://foxclub.ru/account/?user=4568">
				<img alt='' src='https://secure.gravatar.com/avatar/7f3437063b49cdb729ef7b292ee5dde6?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7f3437063b49cdb729ef7b292ee5dde6?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 20-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/samodelnyj-grid/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/avtomaticheskoe-izmenenie-zadannogo-svojstva-dlya-vseh-obektov-formy/</link>
					<title><![CDATA[Автоматическое изменение заданного свойства для всех объектов формы.]]></title>
                    					    <author><![CDATA[ElenaB]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:21 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Автоматическое изменение заданного свойства для всех объектов формы.</h1>
													</header>
													<div id="sol_opis">Класс предназначен для автоматического изменения заданного свойства для всех объектов на форме. Его удобно применять для изменения свойств группы font, цветовых настроек, св-в Enabled, Visible, ReadOnly и т.д. для всех (или части) объектов на форме.</div>
<div id="sol_body"><b>Описание:</b> </p>
<p> Библиотека SET_PROP содержит единственный одноименный класс, предназначенный для автоматического изменения заданного свойства для всех объектов на форме. Его удобно применять для изменения свойств группы font, цветовых настроек, св-в Enabled, Visible, ReadOnly и т.д. для всех (или части) объектов на форме. <br /> Пропяти объектов изменяются по мере выполнения программы. </p>
<p>   <b>Свойства класса:</b> </p>
<p> prop_name	-	Название свойства, значение которого хотим изменить<br /> prop_type	-	Type() свойства: C, N или L<br /> prop_val	-	Новое значение свойства<br /> changebaseclass	-	Базовые классы, кот. включаем (исключаем) в обработку<br /> baseclass_in_out-	.T. - классы, перечисленные в changebaseclass включаем в обработку, .F. - исключаем  </p>
<p> <b>Использование:</b> </p>
<p> Положить класс на форму, в ее Init'е написать - Thisform.set_prop1.set_prop. После программного добавления объектов снова писать Thisform.set_prop1.set_prop, если это необходимо. Ну и, само собой, в процессе выполнения программы можно задавать самые разные настройки.  </p>
<p> <b>Значения свойств по умолчанию:</b> </p>
<p> prop_name = FontCharSet<br /> prop_type = N<br /> prop_val = 204<br /> changebaseclass = ''<br /> baseclass_in_out = .F.</p>
<p>  <b>Примечание:</b> </p>
<p> Обработка ошибок для некорректного задания новых значений для указанного свойства (prop_val) в классе не реализована.  </p>
<table border="1" width="100%" cellspacing="1" cellpadding="4">
<tr>
<td width="25%" valign="top"> 		  <b>Пример 1:</b><br />  			prop_name = BackColor<br /> 			prop_type = N<br /> 			prop_val = 128 			changebaseclass = Form<br /> 			baseclass_in_out = .F.</p>
<p>  			<b>Результат</b> - BackColor всех объектов на форме, кроме самой формы изменят значения на 128.  	   </td>
<td width="25%" valign="top"> 			<b>Пример 2:</b><br />  			prop_name = FontSize<br /> 			prop_type = N<br /> 			prop_val = 12<br /> 			changebaseclass = ''<br /> 			baseclass_in_out = .F.</p>
<p>  			<b>Результат</b> - FontSize всех объектов на форме примет значени 12. 	   </td>
<td width="25%" valign="top"> 			<b>Пример 3:</b><br />  			prop_name = FontName<br /> 			prop_type = C<br /> 			prop_val = Arial<br /> 			changebaseclass = ''<br /> 			baseclass_in_out = .F.</p>
<p>  			<b>Результат</b> - Везде будет использован шрифт 'Ariel' 	    	   </td>
<td width="25%" valign="top"> 			<b>Пример 4:</b><br />  			prop_name = ReadOnly<br /> 			prop_type = L<br /> 			prop_val = T	(допускается .T.)<br /> 			changebaseclass = Textbox Editbox<br /> 			baseclass_in_out = .Т.</p>
<p>  			<b>Результат</b> - Во всех текстбоксах и эдитбоксах формы будет запрещено редактирование данных 	    	   </td>
</tr>
</table></div>
<div id="sol_avtor">Автор: ElenaB</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4639">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4639">ElenaB</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="ElenaB" href="https://foxclub.ru/account/?user=4639">
				<img alt='' src='https://secure.gravatar.com/avatar/c1fd4714bfd8398416a9bbd95b330025?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c1fd4714bfd8398416a9bbd95b330025?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-09-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/avtomaticheskoe-izmenenie-zadannogo-svojstva-dlya-vseh-obektov-formy/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/pravilnoe-upravlenie-beepom-po-notam-eshhe-s-dos/</link>
					<title><![CDATA[Правильное управление BEEPом &#8211; по нотам. Еще с DOS.]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:24 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Правильное управление BEEPом &#8211; по нотам. Еще с DOS.</h1>
													</header>
													<div id="sol_opis">Функция PLAY поет строку с нотами типа "C4DE8F2GAH", где буквы - ноты, а цифры длительность. Если глянете в код - остальное сами поймете...</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Maestro</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/pravilnoe-upravlenie-beepom-po-notam-eshhe-s-dos/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/biblioteka-enisey2-vcx-dlya-avtomaticheskogo-vyravnivaniya-align-na-formah-vfp-i-raboty-s-sql-serverom/</link>
					<title><![CDATA[Библиотека Enisey2.vcx &#8211; для автоматического выравнивания (Align) на формах VFP и работы с SQL сервером.]]></title>
                    					    <author><![CDATA[abil]]></author>
                    										    <pubDate>Fri, 04 Nov 2022 14:30:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Библиотека Enisey2.vcx &#8211; для автоматического выравнивания (Align) на формах VFP и работы с SQL сервером.</h1>
													</header>
													<div id="sol_opis">В любой современной системе программирования элементы формы имеют свойство Align для автоматического размещения и выравнивания элементов на форме при изменении размеров. В Enisey2 реализована такая возможность для VFP.</div>
<div id="sol_body">
<h3>Библиотека Enisey2.vcx - для автоматического выравнивания (Align) на формах VFP и работы с SQL сервером.</h3>
<p>Как работать:</p>
<p>1. формы создавать на основе класса e2_form <br />
для этого в Menu-&gt;Tools-&gt;Options<br />
на закладке Forms - Templates classes Form: установите e2_form(...enisey2.vcx)</p>
<p>2. у класса e2_form есть свойство autoalign Default=.F. , то есть выравнивание выключено<br />
(форма ведет себя стандартно). После создания установите его в .Т. тогда форма в режиме выполнения<br />
будет выравнивать свои элементы. <br />
К сожалению не удалось реализовать Align в режиме дизайна.</p>
<p>3. Свойство Align добавлено ко всем основным классам для, которых может потребоваться выравнивание:<br />
e2_container, e2_grid, e2_treeview, e2_listbox, e2_textbox, e2_button, впрочем, его легко реализовать<br />
для любых визуальных классов.</p>
<p>Может принимать значения:<br />
0 - нет выравнивания (Default)<br />
1 - вверх: элемент будет вверху формы (контейнера)<br />
2 - вниз: элемент будет внизу формы (контейнера)<br />
3 - лево: элемент прижмется к левому краю формы (контейнера)<br />
4 - право: элемент прижмется к правому краю формы (контейнера)<br />
5 - полностью: элемент заполнит оставшееся место формы (контейнера) и должен быть только один.</p>
<p>4. Контейнеры можно вкладывать друг в друга !!!</p>
<p>5. Методы формы никак не контролируют предел уменьшения её размеров, поэтому у формы на основе e2_form<br />
необходимо задать значения свойствам: MinHeight и MinWidth иначе, кода пользователь слишком уменьшит<br />
размер формы появится ошибка.</p>
<p>6. Порядок выравнивания зависит от порядка складывания элементов на форму. При проблемах используйте<br />
Cut(Ctrl+X) и Paste(Ctrl+C) 🙁</p>
<p>В архиве находятся: Билиотека Enisey2.vcx и небольшой проект с демонстрационной формой.<br />
Библиотеку можете использовать, как угодно, сохраняя ссылки на разработчиков имя библиотеки и source code.</p>
<p>Красноярск,<br />
abil(sparrow) - Билецкий Анатолий Викторович, Берковский Олег Леонидович,<br />
2000-2003</p>
</div>
<div id="sol_avtor">Автор: abil</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4589">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4589">abil</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="abil" href="https://foxclub.ru/account/?user=4589">
				<img alt='' src='https://secure.gravatar.com/avatar/66bc8fc7dc47a27c51c73c330aa63633?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/66bc8fc7dc47a27c51c73c330aa63633?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 01-12-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/biblioteka-enisey2-vcx-dlya-avtomaticheskogo-vyravnivaniya-align-na-formah-vfp-i-raboty-s-sql-serverom/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/resizer-avtomat-izmenenie-razmerov-obektov-na-forme/</link>
					<title><![CDATA[Resizer &#8211; автомат. изменение размеров объектов на форме.]]></title>
                    					    <author><![CDATA[ElenaB]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:17 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Resizer &#8211; автомат. изменение размеров объектов на форме.</h1>
													</header>
													<div id="sol_opis">Автоматическое изменение размеров и позиций объектов (ЛЮБОЕ КОЛ-ВО, ЛЮБАЯ ВЛОЖЕННОСТЬ) пропорционально изменениям размера формы. Установка РАЗМЕРОВ ФОРМЫ в зависимости от РАЗРЕШЕНИЯ ЭКРАНА. Есть настройки. Разработано в VFP7, SP1.</div>
<div id="sol_body">Разработано в VFP7, SP1. <br /> Последняя сборка – VFP8, SP1. </p>
<p>  Класс Resizer библиотеки классов Resizer способен пересчитывать размеры и позиции ВСЕХ объектов ЛЮБОЙ ВЛОЖЕННОСТИ, находящихся  на форме. </p>
<p> <b><u>Возможности:</u></b></p>
<p> 1. Установление зависимости размеров формы от размеров экрана монитора. </p>
<p> 2. Сохранять или не сохранять пропорции формы (соотношение высоты и ширины) при изменении размеров формы.</p>
<p>       Resizer1.Lock_proportion = .T.	         	&&  	Сохранять<br />       Resizer1.Lock_proportion = .F.	         	&&  Не сохранять</p>
<p> 3. Можно задать минимальную высоту формы при Resizer1.Lock_proportion = .T.</p>
<p>       Resizer1.min_height = Минимальная высота          	&&  (По умолчанию = 0)</p>
<p> 4. Есть возможность выбора - при изменении размеров объектов пересчитывать FontSize или нет.</p>
<p>       Resizer1.font_size = .T.          &&   Пересчитывать<br />       Resizer1.font_size = .F.           &&   Не пересчитывать</p>
<p>  5. Можно задать список базовых классов (через пробел), для которых запрещено масштабирование. По умолчанию масштабируются все базовые классы.</p>
<p>       Resizer1.FixSizeBaseClass = 'image column'</p>
<p>   6. Можно задать список объектов, запрещенных для масштабирования (через пробел). Будет изменяться только месторасположения этих объектов. Размер и содержимое объектов изменяться не будут. <br />        Resizer1 . ObjNotMove = ‘container1’</p>
<p> 7. Восстановление первоначальных размеров формы</p>
<p>       Resizer1.Reset()</p>
<p> <b><u>Как использовать:</u></b> </p>
<p> 1. Поместить объект класса Resizer на форму (напр., Resizer1)</p>
<p> 2. <b><i>В Init()</i></b> формы написать:</p>
<p>          *   Если задаем список объектов, запрещенный для масштабирования:<br /> Thisform.ObjNotMove = ‘container1’ </p>
<p>           *   Без привязки к размерам экрана<br />  Thisform.Resizer1.get_sizes() <br />  или<br />         * С привязкой к размерам экрана<br />  m.kW = 90       && Желаемый размер вашей формы относительно размера экрана, %.  <br /> Thisform.Resizer1.ToScreen(m.kW) </p>
<p> <i><u>Примечание:</u> </p>
<p> Коэффициент m.kW будет применен к той стороне формы, для которой коэффициент пропорциональности выше, например:<br />       Ширина формы = 500<br />       Высота формы = 400<br />       Ширина экрана = 640<br />       Высота экрана = 480</p>
<p>       Кш = 500/640=0,78125<br />       Кв = 400/480=0,83333</p>
<p>      Кв > Кш => пропорции расчитываются, исходя из значения высоты формы. </i></p>
<p> 3. В <b><i>Resize()</i></b> формы написать - Thisform.Resizer1.set_sizes()</p>
<p>  <b><u>Дополнительная информация по использованию класса:</u></b> </p>
<p> 1. После программного добавления или удаления объектов формы писать - Thisform.Resizer1.get_sizes() </p>
<p> 2. При использовании ресайзера в версиях VFP ниже седьмой необходимо откорректировать класс следующим образом:  </p>
<ul>
<li> в классе использовано свойство объекта Header (в колонках грида) - HeaderHeight, которое появилось только в VFP7. Поэтому, надо убрать код, относящийся к этому свойству:
<p> Метод <b><i>ADDTOARRAY</i></b>, строки: </p>
<p> IF TYPE("oControl.HeaderHeight") = "N"<br />       .aControlStats[nLen,6] = oControl.HeaderHeight<br /> ENDIF</p>
<p> Метод <b><i>SET_SIZES</i></b>, строки:</p>
<p> *	Работаем с заголовками гридов<br /> IF TYPE("oControl.HeaderHeight")="N"<br />       oControl.HeaderHeight = THIS.aControlStats[nPos,6]<br /> ENDIF</p>
</li>
<li> Для VFP5 (для шестой версии - не тестировалось) обнаружено, что команда oControl # Thisform выдает несовпадение типа оператора. Для обхода глюка корректируем следующие коды:
<p> 1.в методе <b><i>Get_sizes</i></b> вместо This.Recurs(Thisform) написать This.Recurs(Thisform, 0) </p>
<p> 2. в методе <b><i>Recurs</i></b> добавить параметр nn - LPARAMETERS oControl, nn </p>
<p> 3. строку метода <b><i>Recurs</i></b> IF oControl # Thisform заменить на IF nn = 1; </p>
<p> 4. конструкцию (тот же метод) </p>
<p> IF TYPE("."+aMems[m.i]) = "O" <br />    this.recurs(oControl) <br /> ENDIF </p>
<p> заменить на <br /> IF TYPE("."+aMems[m.i]) = "O" <br />     nn = 1 <br />     this.recurs(oControl, nn) <br /> ENDIF   </li>
</ul>
<p> <b><u>Глюки:</u></b>  </p>
<p>  1.	<i>Vladimir V. Ten: "При смене RecordSource в гриде слетают Caption введенные заранее руками, а востанавливаются те которые относяться к RecordSource." </i> </p>
<p> Да, оказалось, что ресайзер как-то неадекватно реагирует на изменение RecordSource в гриде. И причина возникает где-то еще при самой первой рекурсии, что из Init'а формы. Даже если дальше нигде не писать Thisform.Resizer1.set_sizes(). </p>
<p> Почему - не знаю, ресайзер при сборе данных об объектах вроде ничего в форме менять не должен. Ошибка - после смены RecordSource реальные объекты в гриде как бы не соответствуют тем данным о них, которые содержатся в массиве ресайзера.  На форме они отражаются правильно, а обратиться программно к ним не получается. Любители шарад и ребусов, подключайтесь - Родина вас не забудет!  </p>
<p> Вообще, от многих слышала, что динамические изменения RecordSource чреваты непредсказуемостями. Лично я предпочитаю при открытии необходимых таблиц присваивать им конкретный псевдоним и указываю его в качестве источника один раз. </p>
<p> Но для этого случая, все-таки хоть и огородами, но выход есть (в проекте пример прилагается - форма pr1_r). Может, со временем, будет что-нибудь более элегантное. </p>
<p> <b><u>Условия использования и распространения:</u></b></p>
<p> Ресайзер опубликован на сайте Visual Foxpro Club в знак глубокой признательности этому сайту и его посетителям за массу ценнейшей информации, идей и советов, полученных и успешно примененных автором этого класса. </p>
<p> Использование класса - бесплатное, распространение - свободное. Следовательно, автор не несет никакой ответственности за последствия применения ресайзера и не гарантирует его идеальной работоспособности :). </p>
<p>   <b><u>Доработки и обновления:</u></b>  </p>
<table width="600" border = 1>
<tr>
<td width="100" valign="top">  29.01.02</td>
<td>Публикация решения.</td>
</tr>
<tr>
<td width="100" valign="top">  27.02.02</td>
<td>Пересмотрена и оптимизирована большая часть кода. Получена возможность работы ресайзера со всеми объектами любой вложенности. Особая благодарность Василию Поторочину за невольную помощь (путем изучения работы его решения "ресайзинг формы") в написании рекурсии.</td>
</tr>
<tr>
<td width="100" valign="top">18.04.02</td>
<td>Добавлено описание метода пересчета размеров формы в зависимости от разрешения монитора.</td>
</tr>
<tr>
<td width="100" valign="top">20.05.02</td>
<td>Устранены недочеты работы ресайзера с колонками гридов. Пропорциональное изменение их ширины теперь достигается в любых условиях. (За выявление недочета спасибо Дмитрию Петрову)</td>
</tr>
<td width="100" valign="top">21.05.02</td>
<td>Оптимизированы некоторые коды, добавлены комментарии к методам, добавлен список базовых классов, для которых запрещено масштабирование. (За идеи, подсказку и критику спасибо Владимиру Максимову) 	   </p>
<p> 	   При работе ресайзера с заголовками гридов (более одной строки) организован пересчет высоты заголовков. (Пожелание Саши из форума)</td>
</tr>
<tr>
<td width="100" valign="top">05.06.02</td>
<td>Выявлен недочет: при установке формы с фреймами в очень маленькие размеры возникала ошибка, что высота фрейма некорректна. <br /> Недочет исправлен путем проверки новых размеров фреймов при изменении размеров формы. Если новая высота (ширина) фрейма меньше допустимой, размеры формы пересчитываются из расчета минимально допустимой высоты (ширины) самого маленького фрейма на форме.</td>
</tr>
<tr>
<td width="100" valign="top">26.08.02</td>
<td> Расчет зависимости размеров формы от размеров экрана оформлен как метод. 	   </p>
<p> 	   Коэффициент m.kW теперь применяется к той стороне формы, для которой коэффициент пропорциональности выше (пожелание Николая, дополнение пользователей) </td>
</tr>
<tr>
<td width="100" valign="top">06.09.02</td>
<td> Добавлено описание корректировки класса для версий VFP ниже, чем седьмая  	   (поднял проблему и протестировал класс в VFP5 Олег Славутин). </td>
</tr>
<tr>
<td width="100" valign="top">25.10.02</td>
<td>Откорректированы недочеты:  	   </p>
<p> 	      -  при установке формы с гридами в очень маленькие размеры возникала ошибка, что высота гридов некорректна.  Исправлено. Если новая высота (ширина грида меньше допустимой, размеры формы пересчитываются из расчета минимально допустимой высоты (ширины) самого маленького грида на форме. Минимально допустимые значения - 30х30 пикселей. (Обнаружил Dmitry Shvaika) </p>
<p>    -  при изменении размера формы высота строк в гриде принимала какое-то странное неизвестно откуда взявшееся значение, одинаковое для любых изменений. Сейчас высота строк в гриде почему-то все-равно не изменяется пропорционально размерам формы, но хотя бы держатся заданные размеры. </p>
<p>    -  При большом увеличении надписи с приличным размером фонтов пересчитывались некорректно. Видимо, это связано с общим ограничением размера шрифта = 127. Допустимые для установки размеры шрифтов = [4,127]. </p>
<p>    -  В методе toscreen введена переменная, по которой предварительно запоминается, а потом восстанавливается свойство Visible формы. Это имеет смысл, если такая форма содержится в наборе форм и мы до поры до времени не хотим ее показывать. (Предложение Валерия.) </td>
</tr>
<tr>
<td width="100" valign="top">10.09.03</td>
<td>Исправлен глюк, возникаюший при переключении режимов экрана. (Решение Малышева Д.А.)  </td>
</tr>
<tr>
<td width="100" valign="top">26.10.03</td>
<td>Добавлена возможность запрещать масштабирование конкретных объектов и их содержимого. (Идея решения Влада)  </td>
</tr>
</table>
<p> Пример использования класса прилагается. </p>
<p> Е.В.Белюкова </p></div>
<div id="sol_avtor">Автор: ElenaB</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4639">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4639">ElenaB</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="ElenaB" href="https://foxclub.ru/account/?user=4639">
				<img alt='' src='https://secure.gravatar.com/avatar/c1fd4714bfd8398416a9bbd95b330025?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c1fd4714bfd8398416a9bbd95b330025?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-09-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/resizer-avtomat-izmenenie-razmerov-obektov-na-forme/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/avtomaticheskoe-zapolnenie-zagolovkov-lok-predstavlenij/</link>
					<title><![CDATA[Автоматическое заполнение заголовков лок. представлений]]></title>
                    					    <author><![CDATA[ElenaB]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Автоматическое заполнение заголовков лок. представлений</h1>
													</header>
													<div id="sol_opis">Утилита, предназначенная для автоматического заполнения заголовков полей в локальных представлениях при разработке базы данных. Названия считывает с заголовков полей в источниках.</div>
<div id="sol_body">
<h3>Автоматическое заполнение заголовков лок. представлений</h3>
<p> Надо открыть дизайнер базы данных, создать представление и запустить следующую утилиту:  </p>
<p> view_name = ''    && имя локального представления, куда хотим поместить заголовки  <br /> DO view_captions.prg WITH view_name </p>
<p> view_captions.prg <br /> ***************** </p>
<p> PARAMETERS view_name  </p>
<p> IF !USED(view_name) <br />    USE &view_name. IN 0 EXCLUSIVE <br /> ENDIF </p>
<p> SELECT(view_name) <br /> nCol = FCOUNT()  </p>
<p> FOR i = 1 TO nCol  <br />   ii = ALLTRIM(STR(i))  <br />     CurField = view_name + '.'+ ALLTRIM(FIELD(i))  <br />     CurUpName =DBGETPROP(CurField,"FIELD","UpdateName")  <br />     CurUpName = RIGHT(CurUpName,LEN(CurUpName)-AT('!',CurUpName))  <br />     CurHead =DBGETPROP(CurUpName,"FIELD","Caption")  <br />       = DBSETPROP(CurField,"FIELD","Caption",CurHead )  <br /> ENDFOR       </div>
<div id="sol_avtor">Автор: ElenaB</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4639">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4639">ElenaB</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="ElenaB" href="https://foxclub.ru/account/?user=4639">
				<img alt='' src='https://secure.gravatar.com/avatar/c1fd4714bfd8398416a9bbd95b330025?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c1fd4714bfd8398416a9bbd95b330025?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-09-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/avtomaticheskoe-zapolnenie-zagolovkov-lok-predstavlenij/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/podklyuchenie-k-mssql-server-2000-s-ispolzovaniem-ado-redaktirovanie-tabliczy-s-ierarhicheskoj-strukturoj-s-ispolzovaniem-activex-treeview-poisk-vstavka-rekursivnoe-udalenie-i-dr-vfp8-sp1/</link>
					<title><![CDATA[Подключение к MSSQL Server 2000 с использованием ADO. Редактирование таблицы с иерархической структурой с использованием ActiveX TreeView, поиск, вставка, рекурсивное удаление и др. VFP8 SP1]]></title>
                    					    <author><![CDATA[bullbonebro]]></author>
                    										    <pubDate>Sun, 06 Nov 2022 05:34:11 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Подключение к MSSQL Server 2000 с использованием ADO. Редактирование таблицы с иерархической структурой с использованием ActiveX TreeView, поиск, вставка, рекурсивное удаление и др. VFP8 SP1</h1>
													</header>
													<div id="sol_opis">Заинтересовал CursorAdapter и ADO, впрочем как и MSSQL Server. Данный пример показывает, как можно использовать ADO-подключение для редактирования данных. Кстати, при построении CursorAdapter-a я воспользовался стандартным builder-ом, в последствии подправив немного Init (установил маленькие TimeOut-ы). В форме для авторизации используется класс для чтения/записи в INI файлы, взятый из примеров VFP8, т.е. в последствии Вам нужно будет набирать только пароль. Транзакции можно и не использовать, а проверять TABLEUPDATE(.t.)=.t., однако вставку и удаление я все таки провожу в начатой Thisform.browser_de.ent_structure.DataSource.ActiveConnection.Be ginTrans() insert... IF TABLEUPDATE(.t.) Thisform.browser_de.ent_structure.DataSource.ActiveConnection.CommitTrans() ... транзакции.</div>
<div id="sol_body">
<p>1). Внимание! Вам потребуется mscomctl.ocx для выполнения проекта (содержит ActiveX TreeView control и ImageList control). Я использовал 6-ые версии. Если будет вылетать ошибка, попробуйте скопировать mscomctl.ocx из SYSTEM32 в SQL_ADO_TESTActiveX и зарегистрировать его там при помощи regsvr32 (Win2k - XP)</p>
<p>2). На MSSQL Server 2000 создайте любую базу. Создайте в ней таблицу с именем ent_structure и с 3-мя полями:</p>
<p>nkey numeric 9<br />
nparent numeric 9<br />
name char 254</p>
<p>создайте уникальный индекс (constraint) по полю nkey (значения в поле не повторяются)</p>
<p>3)Занесите в таблицу 2 строки:</p>
<p>nkey=1, nparent=0, name=СЛУЖЕБНАЯ ПАПКА</p>
<p>nkey=2, nparent=0, name=ПРЕДПРИЯТИЕ</p>
<p>4) При необходимости создайте Юзера с правами записи/чтения на базу</p>
<p>5) В настройках ODBC создайте системный DSN подключения к созданной БД.</p>
<p>6) Открывайте проект и запускайте autorization_form.</p>
</div>
<div id="sol_avtor">Автор: bullbone ie Bykov V. Konstantin</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4664">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4664">bullbonebro</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="bullbonebro" href="https://foxclub.ru/account/?user=4664">
				<img alt='' src='https://secure.gravatar.com/avatar/4975126ec94cac6821d154620ef7c6da?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4975126ec94cac6821d154620ef7c6da?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 09-10-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/podklyuchenie-k-mssql-server-2000-s-ispolzovaniem-ado-redaktirovanie-tabliczy-s-ierarhicheskoj-strukturoj-s-ispolzovaniem-activex-treeview-poisk-vstavka-rekursivnoe-udalenie-i-dr-vfp8-sp1/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/arhivirovanie-dannyh-v-prilozheniyah-na-ms-visual-foxpro-8-v2/</link>
					<title><![CDATA[Архивирование данных в приложениях на MS Visual FoxPro 8 v2]]></title>
                    					    <author><![CDATA[bullbonebro]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:24 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Архивирование данных в приложениях на MS Visual FoxPro 8 v2</h1>
													</header>
													<div id="sol_opis">Под созданием архивов подразумевается создание копий баз данных, таблиц, индексов и прочих файлов в сжатом виде. Использование консольных архиваторов типа PKZIP и PKUNZIP раздражает открытием окна сессии MSDOS. Хотелось найти что-нибудь 32-разрядное.</div>
<div id="sol_body">
<h3>Архивирование данных в приложениях на MS Visual FoxPro 8 v2</h3>
<p> Автор: Илья Тепликов<br /> E-mail: itp@karelia.ru</p>
<p> Я только перелопатил немного код, т.к. класс, тот что выложен в решениях либо битый либо не<br /> предназначен для VFP8. Также убрал замену в файлах "." на "_" и добавил MS ActiveX<br /> ProgressBar (Mscomctl.ocx). В остальном же:</p>
<p> http://www.foxclub.ru/sol/index.php?act=view&id=10</p>
<p> Перелопаченный код: bullbone ie Bykov V. Konstantin    </p></div>
<div id="sol_avtor">Автор: bullbone ie Bykov V. Konstantin</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4664">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4664">bullbonebro</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="bullbonebro" href="https://foxclub.ru/account/?user=4664">
				<img alt='' src='https://secure.gravatar.com/avatar/4975126ec94cac6821d154620ef7c6da?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4975126ec94cac6821d154620ef7c6da?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 09-10-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/arhivirovanie-dannyh-v-prilozheniyah-na-ms-visual-foxpro-8-v2/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/visualer/</link>
					<title><![CDATA[VisualER]]></title>
                    					    <author><![CDATA[sss1024]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:24 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>VisualER</h1>
													</header>
													<div id="sol_opis">Framework для быстрой разработки. Поддерживает несколько серверов.</div>
<div id="sol_body">
<h3>VisualER</h3>
<p> Поддерживает VFP,MS SQL, Interbase, PostgreSQL, Sybase ASA. </p>
<p> Скачать можно на <a href='http://sss1024.narod.ru'>http://sss1024.narod.ru</a>, там же есть презенташка во Flash.   </div>
<div id="sol_avtor">Автор: sss1024</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4440">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4440">sss1024</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="sss1024" href="https://foxclub.ru/account/?user=4440">
				<img alt='' src='https://secure.gravatar.com/avatar/b6b862d2ff13380cfc47c442c469fb2e?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/b6b862d2ff13380cfc47c442c469fb2e?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 09-11-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/visualer/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/primer-demonstriruyushhij-otpravku-pochty-iz-outlookexpress/</link>
					<title><![CDATA[Пример, демонстрирующий отправку почты из OutlookExpress.]]></title>
                    					    <author><![CDATA[Steelrock]]></author>
                    										    <pubDate>Fri, 04 Nov 2022 14:31:07 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Пример, демонстрирующий отправку почты из OutlookExpress.</h1>
													</header>
													<div id="sol_opis">Предельно упрощенный пример отправки почты из приложения Visual FoxPro через OutlookExpress. В отличие от примеров (Samples) FoxPro рассмотрена отправка файлов в письме.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: steelrock</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3276">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3276">Steelrock</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Steelrock" href="https://foxclub.ru/account/?user=3276">
				<img alt='' src='https://secure.gravatar.com/avatar/deadf2a0b04fbe0dce671acfa7198027?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/deadf2a0b04fbe0dce671acfa7198027?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-01-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/primer-demonstriruyushhij-otpravku-pochty-iz-outlookexpress/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/visual-foxpro-multi-project-manager-ver-1-04-freeware/</link>
					<title><![CDATA[Visual FoxPro-Multi-Project Manager ver 1.04 (Freeware)]]></title>
                    					    <author><![CDATA[RusMikle]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:24 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Visual FoxPro-Multi-Project Manager ver 1.04 (Freeware)</h1>
													</header>
													<div id="sol_opis">Менеджер проектов (продолжение альтернативного менеджера проектов).</div>
<div id="sol_body">
<h3>Visual FoxPro-Multi-Project Manager ver 1.04 (Freeware)</h3>
<p>  Менеджер проектов (продолжение альтернативного менеджера проектов).<br /> Если у Вас более одного проекта то без него Вы более жить не сможете 🙂 На данный момент более 2000 закачек, ни одного отрицательного отклика, только положительные. Скриншоты и новые версии искать тут http://www.superbasis.de/ProjectManager/</div>
<div id="sol_avtor">Автор: Михаил Червоненко</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4718">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4718">RusMikle</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="RusMikle" href="https://foxclub.ru/account/?user=4718">
				<img alt='' src='https://secure.gravatar.com/avatar/62ad38624e87679ba913e97c235c46f4?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/62ad38624e87679ba913e97c235c46f4?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-04-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/visual-foxpro-multi-project-manager-ver-1-04-freeware/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/remoute-automation-als-windows-service-installation/</link>
					<title><![CDATA[Remoute Automation als Windows Service. (Installation)]]></title>
                    					    <author><![CDATA[RusMikle]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:21 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Remoute Automation als Windows Service. (Installation)</h1>
													</header>
													<div id="sol_opis">Запуск AUTMGR32.EXE как сервис windows server.</div>
<div id="sol_body">
<h3>Remoute Automation als Windows Service. (Installation)</h3>
<p> Т.к. в стандартном варианте AUTMGR32.EXE (Automation Server VFP) запускается как приложение, что неудобно на сервере (необходимо чтоб всегда открывался сеанс пользователя для запуска приложения) сделали инсталляцию которая ставит его как сервис винды (понятно только для NT,2000,.NET....) годится только для серверных платформ (на клиентах используйте конструкцию вида :AUTMGR32.EXE /hidden в автостарте). Свежие версии искать тут www.superbasis.de   </p></div>
<div id="sol_avtor">Автор: correct-software</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4718">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4718">RusMikle</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="RusMikle" href="https://foxclub.ru/account/?user=4718">
				<img alt='' src='https://secure.gravatar.com/avatar/62ad38624e87679ba913e97c235c46f4?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/62ad38624e87679ba913e97c235c46f4?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-04-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/remoute-automation-als-windows-service-installation/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/listbox-libo-combobox-dlya-vybora-iz-tabliczy-vozmozhnost-hraneniya-klyucha-dlya-lyuboj-stroki-ne-otobrazhaya-ego-v-odnoj-iz-kolonok-sheklistbox-na-osnove-listboxid/</link>
					<title><![CDATA[ListBox ,либо ComboBox для выбора из таблицы.Возможность хранения ключа для любой строки, не отображая его в одной из колонок. + СhekListBox на основе ListBoxID]]></title>
                    					    <author><![CDATA[Nikolai Kremko]]></author>
                    										    <pubDate>Fri, 04 Nov 2022 14:32:43 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>ListBox ,либо ComboBox для выбора из таблицы.Возможность хранения ключа для любой строки, не отображая его в одной из колонок. + СhekListBox на основе ListBoxID</h1>
													</header>
													<div id="sol_opis">Многие хотят выбор из таблицы осуществлять c через ListBox ,либо ComboBox.И чтоб иметь возможность получить значение ключа для любой строки, не отображая его в одной из колонок. И, конечно, желательно, чтоб тип ключевого поля мог быть ЛЮБЫМ. А чтоб отмечать (выбирать) сразу много записей (каждую как в CheckBox’е выделять) выкладываю CheckListBox</div>
<div id="sol_body">
<h3>ListBox ,либо ComboBox для выбора из таблицы.Возможность хранения ключа для любой строки, не отображая его в одной из колонок. + СhekListBox на основе ListBoxID</h3>
<p>Многие хотят выбор выбор из таблицы осуществлять c через ListBox ,либо ComboBox <br />
И чтоб иметь возможность получить значение ключа для любой строки, не отображая его в одной из колонок. И, конечно, желательно, чтоб тип ключевого поля мог быть ЛЮБЫМ.<br />
Но тогда встает вопрос, а где хранить ключевое поле? Для него заводится специальное свойство mv_ID[],где и храним ключ для каждой строки.</p>
<p>+++ А чтоб отмечать (выбирать) сразу много записей (каждую как в CheckBox’е выделять) выкладываю еще один CheckListBox 🙂</p>
<p>Итак, в прилагаемой библиотеке есть три класса: “ ListBoxID” и “CmbID” и добавил я еще класс CheckListBox<br />
-- тоже штука иногда нужная</p>
<p>Как с ними работать? – написал пример. Когда появятся вопросы --пишите.<br />
Буду рад помочь. А чтобы я не чувствовал себя "Неуловимым Джо" из известного аннекдота -- пишите отзывы. Любые. Хоть одно слово...<br />
Nikolai Kremko.</p>
</div>
<div id="sol_avtor">Автор: Nikolai Kremko</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4704">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4704">Nikolai Kremko</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Nikolai Kremko" href="https://foxclub.ru/account/?user=4704">
				<img alt='' src='https://secure.gravatar.com/avatar/feccfbadff7edf982a892026fe4dd003?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/feccfbadff7edf982a892026fe4dd003?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 30-08-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/listbox-libo-combobox-dlya-vybora-iz-tabliczy-vozmozhnost-hraneniya-klyucha-dlya-lyuboj-stroki-ne-otobrazhaya-ego-v-odnoj-iz-kolonok-sheklistbox-na-osnove-listboxid/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/redaktor-3d-sczen-na-vfp/</link>
					<title><![CDATA[Редактор 3D сцен на VFP.]]></title>
                    					    <author><![CDATA[Sergey Filimonoff]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:24 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Редактор 3D сцен на VFP.</h1>
													</header>
													<div id="sol_opis">Не 3D MAX конечно, но все же. Надеюсь будет полезен всем, кто использует VFoxPro.</div>
<div id="sol_body">
<h3>Редактор 3D сцен на VFP.</h3>
<p> Класс пока не совершенен, но применять можно.<br /> Использовано несколько полезных решений на WinAPI.<br /> По возможности будет добавлено остальное из OpenGL:<br /> модели, освешение, туман и т.д.<br /> Сценой можно управлять клавишами и d,c, когда фокус на форме.<br /> Библиотеку Glut32.dll из архива нужно добавить в System.</p>
</div>
<div id="sol_avtor">Автор: Sergey Filimonoff</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4566">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4566">Sergey Filimonoff</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Sergey Filimonoff" href="https://foxclub.ru/account/?user=4566">
				<img alt='' src='https://secure.gravatar.com/avatar/674ca040589c674ff037d847bf52bdf4?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/674ca040589c674ff037d847bf52bdf4?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 15-01-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/redaktor-3d-sczen-na-vfp/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/preobrazovanie-rekordseta-v-kursor/</link>
					<title><![CDATA[Преобразование Рекордсета в Курсор]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:24 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Преобразование Рекордсета в Курсор</h1>
													</header>
													<div id="sol_opis">Попытка "универсального" преобразователя рекордсета в курсор (без использования VFPCOM)</div>
<div id="sol_body">Попытка "универсального" преобразователя рекордсета в курсор (без использования VFPCOM) Для VFP8 вещь видимо непотребная, в свете CursorAdapter`a, но для версий ниже можно использовать. Писалась в марте для своих целей. Наши задачи решать помогает. </div>
<div id="sol_avtor">Автор: Gliph</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/preobrazovanie-rekordseta-v-kursor/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/tools32-dll/</link>
					<title><![CDATA[Tools32.dll]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:24 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Tools32.dll</h1>
													</header>
													<div id="sol_opis">Обновленная и дополненная библиотека разных функций (инструкция по пользованию внутри)</div>
<div id="sol_body">
<h3>Tools32.dll</h3>
<p> */* Запуск приложения с ожиданием завершения<br /> */* Удаление файла в корзину<br /> */* Преобразование OEM в Ansi <br /> */* Преобразование Ansi в OEM<br /> */* Шароварная программа - индикатор запуска первого раза<br /> */* Серийный номер диска С: - десятичный<br /> */* Серийный номер диска С: - шестнадцатеричный<br /> */* Размер оперативной памяти<br /> */* Определить - стоит ли Win NT на машине<br /> */* Копирование файла или произвольной его части<br /> */* Сохранения изображения экрана в файл<br /> */* Определение текущего разрешения экрана<br /> */* Вывод MessageBox() в заданых координатах</p>
<p>    </div>
<div id="sol_avtor">Автор: -</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/tools32-dll/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/tbl2doc-ole-ms-word/</link>
					<title><![CDATA[Экспорт данных из таблиц foxpro в таблицы MS Word (OLE: MS WORD)]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Tue, 13 Dec 2022 04:36:31 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Экспорт данных из таблиц foxpro в таблицы MS Word (OLE: MS WORD)</h1>
													</header>
													<div id="sol_opis"><em>Экспорт данных из таблиц foxpro в таблицы MS Word. Два способа(Создание документа MS Word, форматирование, добавление таблиц и тд)</em></div>
<div id="sol_body">
<p>Еще один пример по работе с MS Word.<br />
Позволяет экспортировать данные из открытых в данный момент таблиц и курсоров в таблицы Word Предварительно задается шаблон для оформления внешнего вида. Можно создавать разные документы или поместить все данные в один.<br />
Может использоваться как пример работы с OLE в Word'е<br />
Проверялось с Word.Application.8.</p>
</div>
<div id="sol_avtor">Автор: Yuri Abramenkov</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/tbl2doc-ole-ms-word/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category><category><![CDATA[Импорт-экспорт]]></category><category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/plagin-k-far-starshe-1-7-dlya-raboty-s-prg-spr-mpr-fajlami/</link>
					<title><![CDATA[Плагин к Far старше 1.7 для работы с PRG, SPR, MPR файлами]]></title>
                    					    <author><![CDATA[Varjag]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:24 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Плагин к Far старше 1.7 для работы с PRG, SPR, MPR файлами</h1>
													</header>
													<div id="sol_opis">Плагин к Far старше 1.7 для работы с PRG, SPR, MPR файлами Позволяет Выправлять программные отступы в текстах, анализировать структуру программы,расставлять/убирать комментарии и многое другое, мною еще неизведанное )))</div>
<div id="sol_body">
<h3>Плагин к Far старше 1.7 для работы с PRG, SPR, MPR файлами</h3>
<p>  Плагин к Far старше 1.7 для работы с PRG, SPR, MPR файлами<br /> Позволяет Выправлять программные отступы в текстах, анализировать структуру программы,расставлять/убирать комментарии и многое другое, мною еще неизведанное )))<br /> Подключается как обычный фаровский плагин.<br /> Вызывается по F11 в режиме редактирования текста. Особенно удобно использовать совместно с буфером обмена.<br /> Я не автор, но сайт с четырьмя сотнями плагинов к Фару почледнее время что-то молчит<br /> Взято на  http://www.uic.nnov.ru/~ruiv/plugring/cgi-bin/downld.cgi?Draw=List&Select=All&Sort=Date&SelectCateg=Addons&SelectPlugIn=366&SelectAuthor=0&SelectOther=1&SearchText=  </div>
<div id="sol_avtor">Автор: varjag</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4706">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4706">Varjag</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Varjag" href="https://foxclub.ru/account/?user=4706">
				<img alt='' src='https://secure.gravatar.com/avatar/ed4145110f4445a83ac6422e49920b5c?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ed4145110f4445a83ac6422e49920b5c?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 08-08-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/plagin-k-far-starshe-1-7-dlya-raboty-s-prg-spr-mpr-fajlami/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ntpopup-programma-dlya-arhiva-poluchennyh-i-otpravki-otvetov-i-soobshhenij-dlya-nt-42000-podobnaya-winpopup-v-win95-98/</link>
					<title><![CDATA[NTPopup &#8211; программа для архива полученных и отправки ответов и сообщений для NT (4,2000) подобная WinPopup в Win95-98]]></title>
                    					    <author><![CDATA[Mitchman]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:24 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>NTPopup &#8211; программа для архива полученных и отправки ответов и сообщений для NT (4,2000) подобная WinPopup в Win95-98</h1>
													</header>
													<div id="sol_opis">NTPopup - программа для архива полученных и отправки ответов и сообщений для NT (4,2000) подобная WinPopup в Win95-98 для очистки базы отдельный exe - init.exe исходники и  EXE, скомпилированный под VFP6.0 для Работы без установленного Фокса потребуется MSCOMCT2.OCX,VFP6R.DLL,VFP6RENU.DLL</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Mitchman</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4812">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4812">Mitchman</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Mitchman" href="https://foxclub.ru/account/?user=4812">
				<img alt='' src='https://secure.gravatar.com/avatar/61992ef8bdf73dc639637e0eb2595739?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/61992ef8bdf73dc639637e0eb2595739?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-05-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ntpopup-programma-dlya-arhiva-poluchennyh-i-otpravki-otvetov-i-soobshhenij-dlya-nt-42000-podobnaya-winpopup-v-win95-98/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/nabor-klassov-dlya-sozdaniya-spravochnikov-vfp8/</link>
					<title><![CDATA[Набор классов для создания справочников VFP]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Mon, 21 Nov 2022 07:44:54 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Набор классов для создания справочников VFP</h1>
													</header>
													<blockquote>
<div id="sol_opis">Любому из нас, разрабатывая какую-нибудь программу, приходилось возиться со справочниками. И дело это не так чтобы уж слишком радостное и захватывающее. Наверное, многие, запрограммировав справочник типа Sales пару десятков раз начинали задумываться, как это дело унифицировать :). Меня, как человека от рождения не лешенного любых человеческих пороков эта проблема настигла c поразительной скоростью. В результате сделал что сделал, вот</div>
</blockquote>
<div></div>
<div id="sol_body">
<p>Теперь кратко как это все работает.<br />
Для демонстрации работы я выдернул кусок из вполне рабочей программы, что конечно не означает 100% работоспособность куска, ну рассмотреть по нему основной принцип возможно. <br />
В демо проект входят несколько библиотек классов:<br />
inctext.vcx<br />
midatepic.vcx<br />
project.vcx<br />
splitter.vcx<br />
<strong>spravoch.vcx</strong> – основная библиотека<br />
xpbutton.vcx</p>
<p>несколько демонстрационных форм:<br />
<strong>sprotdel.scx</strong> – основная форма с которой логически связаны все остальные<br />
sprprof.scx<br />
sprrazr.scx<br />
sprsotrudn.scx</p>
<p>ну и прочий мусор, который даже описывать не стану 😉</p>
<p><strong>Процесс создания нового справочника.</strong><br />
1. Идете в Tools&gt;Options...&gt; Forms<br />
1.1. В группе Template classes ставите галгу радом с Form set:<br />
1.2. Выбераете spravoch.vcx &gt; frmsetsprav<br />
1.3. Давите OK.<br />
2. Затем в меню File&gt;New... выбераете Form и жмете здоровенну кнопку New file.<br />
3. На этом шаге нужно определить Data Еnvironment. Сдесь такой ньюанс, основная таблица должна быть добавлена первой или должна быть прописана в InitialSelectedAlias.<br />
4. Если вым нужны для отображения не все поля, накидайте их в грид сами. Не удаляйте первую колонку. Оформление заголовков колонок устанавливается по образцу первой колонки. Возможно, задание вычисляемых полей. Как это сделать посмотрите в демо форме sprOtdel. Также на форме sprMain есть пара полезных своиств – sqlFields и sqlOrders. Почитайте к ним описание внизу Properties Window.<br />
5. Дальше нужно накидать элементов редактирования на окна «Редактирование группы» и «Редактирование записи». У кнопок Ок этих форм есть оброботчики призванные облегчить процесс записи. Для их использования нужно прописать в Click контрола cntOk DoDefault(список параметров). Далее приведу шапку одного обработчика с описанием передаваемых параметров.</p>
<pre><pre class='bbcode'> *===========================================================================  
 * tcName - имя поля которое нужно проверять на уникальность  
 * если не указано проверяется поле NAME  
 * если пустая строка, проверки на уникальность не производится.  
 * tlSposob - способ проверки  
 * .F. или опущено - проверка на уникальность осуществляется по всему справочнику  
 * .T. - только в текущей группе  
 * tcErrorMessage - сообщение об ошибке, если поле не уникельно  
  LPARAMETERS tcFldName, tlSposob, tcErrorMessage  
 *===========================================================================  
</pre></pre>
<p>
В принципе все, можно запускать и опробовать.</p>
<p><strong>Создание таблиц для справочника.</strong><br />
Справочник работает только с таблицами содержащимися в базе данных, причем таблицы должны удовлетворять нескольким обязательным условиям. <br />
Обязательная структура таблиц.<br />
Id Numeric x<br />
Pid Numeric x<br />
Isfolder Numeric 1<br />
Name Character x<br />
Остальные поля по необходимости.</p>
<p>Индексы:<br />
Id Primary Id<br />
Pid Regular Pid<br />
Isfolder Regular Isfolder<br />
Name Regular UPPER(name)<br />
DEL Regular DELETED()</p>
<p>Желательно заполнение у полей свойства Caption, т.к. оно используется для заполнения хадеров колонок, если они небыли добавлены вручную.</p>
<p>Для поля Id необходимо создать Default value - присвоение уникального значение.</p>
<p>Необходимо заполнить поле Table Comment: на закладке Table прописав в нем русское название справочника. Это название в дальнейшем будет использоваться для формирование капшинов для окон.</p>
<p>На этом все.</p>
</div>
<div id="sol_avtor">Автор: Жихарев Дмитрий</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/nabor-klassov-dlya-sozdaniya-spravochnikov-vfp8/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/mnogostrochnyj-dinamicheskij-tultip-s-vozmozhnostyu-formatirovaniya-vyvodimogo-teksta-html-i-grid-s-vozmozhnostyu-vyvoda-tultipov-dlya-proizvolnoj-yachejki/</link>
					<title><![CDATA[Многострочный, динамический тултип с возможностью форматирования выводимого текста (HTML). И грид с возможностью вывода тултипов для произвольной ячейки.]]></title>
                    					    <author><![CDATA[Igor Korolyov]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:23 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Многострочный, динамический тултип с возможностью форматирования выводимого текста (HTML). И грид с возможностью вывода тултипов для произвольной ячейки.</h1>
													</header>
													<div id="sol_opis">Данные классы появились в результате длительных размышлений о  проблеме вывода некоторой информации в наиболее свободном виде во всплывающие подсказки. Все другие известные мне решения имеют существенные, или не очень недостатки, и потому я решил объединить всё самое лучшее и создал это решение. Подробная инструкция прилагается.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Igor Korolyov</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4825">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4825">Igor Korolyov</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Igor Korolyov" href="https://foxclub.ru/account/?user=4825">
				<img alt='' src='https://secure.gravatar.com/avatar/669f5f66224f3ae8257ff4493933f2e4?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/669f5f66224f3ae8257ff4493933f2e4?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-05-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/mnogostrochnyj-dinamicheskij-tultip-s-vozmozhnostyu-formatirovaniya-vyvodimogo-teksta-html-i-grid-s-vozmozhnostyu-vyvoda-tultipov-dlya-proizvolnoj-yachejki/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klassicheskaya-logicheskaya-igra-byki-i-korovy/</link>
					<title><![CDATA[Классическая логическая игра &#8220;Быки и Коровы&#8221;.]]></title>
                    					    <author><![CDATA[Igor Korolyov]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:24 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Классическая логическая игра &#8220;Быки и Коровы&#8221;.</h1>
													</header>
													<div id="sol_opis">В отличие от множества известных компьютерных вариантов этой игры, данная программа предназначена не для того чтобы играть с вами, а для того, чтобы ВЫ играли с ней. Т.е. это ОНА будет пытаться угадать вашу комбинацию 🙂 Интересна естественно лигикой поиска решения.</div>
<div id="sol_body">
<h3>Классическая логическая игра "Быки и Коровы".</h3>
<p> Запускайте prg файл и всё 🙂<br /> Кратко по правилам:<br /> комбинация состоит из 4-х цифр от 0 до 9. Одна цифра допускается только 1 раз, порядок имеет значение - т.е. поле вариантов - это упорядоченная выборка без повторений 4-х значений из 10-ти (если мне не изменяет склероз, давно уже Математику учил :)).<br /> Число "быков" - это число точно угаданных цифр из вашей комбинации (т.е. и то что число есть, и место его расположения). Число "коров" - число угаданных цифр но не угаданной позиции. Пример: Комбинация 1234<br /> Программа спрашивает ответ на комбинацию 0184 - ответ: 1 Бык (4-ка) и 1 Корова (1-ца).     </div>
<div id="sol_avtor">Автор: Igor Korolyov</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4825">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4825">Igor Korolyov</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Igor Korolyov" href="https://foxclub.ru/account/?user=4825">
				<img alt='' src='https://secure.gravatar.com/avatar/669f5f66224f3ae8257ff4493933f2e4?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/669f5f66224f3ae8257ff4493933f2e4?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-05-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klassicheskaya-logicheskaya-igra-byki-i-korovy/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/primenenie-opengl-v-vfoxpro/</link>
					<title><![CDATA[Применение OpenGL в VFoxPro.]]></title>
                    					    <author><![CDATA[Sergey Filimonoff]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:23 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Применение OpenGL в VFoxPro.</h1>
													</header>
													<div id="sol_opis">Демонстрация возможностей OpenGL в VFoxPro. Обновление, исправлены ошибки с проекцией.</div>
<div id="sol_body">
<h3>Применение OpenGL в VFoxPro.</h3>
<p>  Тут как-то заходила речь о графике 3D.<br /> Тоже давно собирался, и вот написал маленький пример на OpenGL,<br /> DirectX я еще плохо знаю 🙂<br /> Пока сделал по быстрому на форме, но со временем конечно будет в классе.<br /> Дальше каждый сам может развить, как кому нужно.<br /> Для реал-тайм игр думаю это не пойдет, но красивые графики можно строить легко.<br /> Основные проблемы вроде решены, кроме корректного получения DC окна.<br /> Еще не пробовал установить св-ва окна:<br /> WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS<br /> Для запуска OpenGL нужны библиотеки в System: <br /> OpenGL32.dll,Glu32.dll,Glut32.dll,Gdi32.dll    </div>
<div id="sol_avtor">Автор: Sergey Filimonoff</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4566">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4566">Sergey Filimonoff</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Sergey Filimonoff" href="https://foxclub.ru/account/?user=4566">
				<img alt='' src='https://secure.gravatar.com/avatar/674ca040589c674ff037d847bf52bdf4?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/674ca040589c674ff037d847bf52bdf4?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 15-01-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/primenenie-opengl-v-vfoxpro/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/pole-vvoda-slov-iz-spravochnikov/</link>
					<title><![CDATA[Поле ввода слов из справочников]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Поле ввода слов из справочников</h1>
													</header>
													<div id="sol_opis">Класс - поле ввода для удобного и быстрого выбора слов из списка. Инкрементальный поиск с автоподстановкой при наборе (как в MS Office), выбор из списка. ПОЯВИЛАСЬ НОВАЯ ВЕРСИЯ (+).</div>
<div id="sol_body">
<h3>Поле ввода слов из справочников</h3>
<p> Предлагаемый класс похож на стандартный текстбокс и комбобокс с некоторыми дополнительными возможностями - автоподстановка слова по мере набора, выбор из выпадающего списка, дополнение словаря. Для использования необходимо поместить экземпляр класса на форму, задать RowSource, ControlSource, имена ключевого поля и поля с значением слова и установить флаги разрешения добавления новых слов, вкл/выкл выпадающего списка и др. <br /> Опыт показывает, что пользователи, хорошо владеющие клавиатурой, предпочитают набирать  слова по символам. Этот класс позволяет заметно увеличить скорость ввода, сократить число ошибок и излишнего засорения словарей-справочников. <br /> В архиве - две версии. Первая (старая) - содержится в папке OLD архива: сам класс в библиотеке SRCHTEXT.VCX, .VCT, краткая документация  README.TXT, пример БД и формы с использованием класса. Свежая версия существенно изменена и дополнена - есть возможность в качестве источника данных указывать имя представления, которое будет автоматически открываться, задавать фильтр на отображаемые записи, выполнять поиск по подстроке, введены несколько видов реакции на новое слово, исправлены некоторые ошибки (и конечно добавлены новые, о которых я буду рад услышать :0) ). Класс DCT_ находится в библиотеке DICT с двумя своими наследниками DCT2_ и DCT2s_ которые позволяют показывать доп. поле из словаря и выбирать слово либо по названию с автоподстановкой, либо по коду. В библиотеке BASE содержаться базовые классы для построения словаря. Если у вас есть своя библиотека базовых классов, вы можете попробовать не копировать BASE.VCX и подменить своими классами. UTIL.PRG  - набор нужных функций, которые можно подключить по SET PROCEDURE в вашем приложении. DCT.DOC содержит мало-мальское описание объектов, остальное придется смотреть по коду и комментариям или спрашивать у меня. Пишите, буду признателен за любые замечания и предложения.</div>
<div id="sol_avtor">Автор: matod</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/pole-vvoda-slov-iz-spravochnikov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/bystryj-prosmotr-tablicz/</link>
					<title><![CDATA[Быстрый просмотр таблиц]]></title>
                    					    <author><![CDATA[Aries]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Быстрый просмотр таблиц</h1>
													</header>
													<div id="sol_opis">Програмка BROWSES.exe для быстрого просмотра таблиц</div>
<div id="sol_body">
<h3>Быстрый просмотр таблиц</h3>
<p> Быстрый просмотр таблиц<br /> Эта прожка была написана от скуки а также для того, что бы не ставить Фокс у клиентов. В ней можно<br /> просматривать таблицу, добавлять строки, помечать на удаление, паковать. Также есть окно Run для<br /> ввода команд, типа фильтр и т.д.<br /> Работают горячие клавиши. К сожалению программа работает только с одной таблицей 🙁 <br /> *************************************<br /> Добавлена кнопка "Подсветка строки". Было обнаружено что в больших таблица свыше 10 полей, при перемешении курсором немного притормаживает перемещение, это, я так понял из-за прорисовки строки. Теперь подсветку можна включать и выключать 🙂</p></div>
<div id="sol_avtor">Автор: Aries</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4794">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4794">Aries</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Aries" href="https://foxclub.ru/account/?user=4794">
				<img alt='' src='https://secure.gravatar.com/avatar/41cb07f73054c6ace4bc67d9d56f5947?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/41cb07f73054c6ace4bc67d9d56f5947?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-12-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/bystryj-prosmotr-tablicz/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/pole-s-kalkulyatorom-kotoroe-mozhna-vstavit-v-grid-ili-kinut-na-formu/</link>
					<title><![CDATA[Поле с калькулятором, которое можна вставить в грид или кинуть на форму.]]></title>
                    					    <author><![CDATA[Aries]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Поле с калькулятором, которое можна вставить в грид или кинуть на форму.</h1>
													</header>
													<div id="sol_opis">Поле с калькулятором, которое можна вставить в грид или кинуть на форму.</div>
<div id="sol_body">
<h3>Поле с калькулятором, которое можна вставить в грид или кинуть на форму.</h3>
<p> Вообщем увидел в 1С-ке поле в гриде где по клику вызывался калькулятор, такое же поле видел и в<br /> Делфях, вот и решил наваять похожее на фоксе. распакуйте архив и перед использованием прочтите<br /> файл Readmy.txt и запустите пример - form1.scx там самое наглядное представление объекта.<br /> ******************************************************<br /> Итак благодаря моему учителю и лучшему другу был отредактирован калькулятор, были убраны глюки (как же теперь без них 🙂 ) Так же отдельное спасибо Ившеву Дмитрию за подсказку, как правильно позиционировать поле, теперь его можна кидать в любое место (PageFrame, Container, From, любая вложенность). Было добавлено новое свойство nLenDecimals это длина вводимой строки.<br /> Любые пожелания и критику жде на маил vulcan@ukr.net </div>
<div id="sol_avtor">Автор: Aries</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4794">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4794">Aries</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Aries" href="https://foxclub.ru/account/?user=4794">
				<img alt='' src='https://secure.gravatar.com/avatar/41cb07f73054c6ace4bc67d9d56f5947?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/41cb07f73054c6ace4bc67d9d56f5947?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-12-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/pole-s-kalkulyatorom-kotoroe-mozhna-vstavit-v-grid-ili-kinut-na-formu/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/upravlenie-printerom/</link>
					<title><![CDATA[Управление принтером]]></title>
                    					    <author><![CDATA[po2]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Управление принтером</h1>
													</header>
													<div id="sol_opis">В предлагаемой библиотеке собраны вызовы API функций, позволяющие считывать и устанавливать некоторые параметры выбранного принтера.</div>
<div id="sol_body">
<h3>Управление принтером </h3>
<p> Настоящий вариант библиотеки теперь корректно работает со всеми версиями Windows, исправления внесены при участии мастера Delphi - Владимира Тарасова(wtar@yandex.ru). Прилагаемый пример кроме управления принтером, демонстрирует способ установки параметров отчета. Используется известный способ корректировки служебных полей Tag, Tag2 и Expr. Так же показано, как можно устанавливать верхнее и левое поле отчета.  </p></div>
<div id="sol_avtor">Автор: Ившев Дмитрий</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4770">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 8 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4770">po2</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="po2" href="https://foxclub.ru/account/?user=4770">
				<img alt='' src='https://secure.gravatar.com/avatar/c214a28bf1871abdce1868aac0111f84?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c214a28bf1871abdce1868aac0111f84?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 22-12-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/upravlenie-printerom/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/vzaimodejstvie-vfp-i-word/</link>
					<title><![CDATA[Взаимодействие VFP и Word]]></title>
                    					    <author><![CDATA[Каратаев]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:15 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Взаимодействие VFP и Word</h1>
													</header>
													<div id="sol_opis">Как вставить данные из БД в Word с форматированием текста.</div>
<div id="sol_body">
<h3>Взаимодействие VFP и Word</h3>
<p> Вставлять текст в Word удобнее сразу с форматированием. </p>
<p> Я делаю это так: </p>
<p> *Это готовый prg-файл. </p>
<p> #define cr chr(13) </p>
<p> oword=create('word.application') && Создаем объект Word </p>
<p> oword.documents.add() && Добавляем чистый лист </p>
<p> oword.caption='Мой Word' && При желании - заголовок окна Word </p>
<p> oWordRef = GetObject('','word.basic') && Инструментарий доступа к объектам Word </p>
<p> *********** </p>
<p> owordRef.insert(cr) && Вставляем строку </p>
<p> oWordRef.Font("Times New Roman",18) && Определяем параметры шрифта ... </p>
<p> oWordRef.Bold </p>
<p> oWordRef.Italic </p>
<p> oWordRef.CharColor(2) </p>
<p> owordRef.insert('Дата: '+dtoc(date())+cr) && Вставляем текст и т.д. </p>
<p> owordRef.insert(cr) </p>
<p> ************ </p>
<p> owordRef.insert(cr) </p>
<p> oWordRef.Font("Times New Roman",12) </p>
<p> oWordRef.Bold(0) </p>
<p> oWordRef.Italic(0) </p>
<p> oWordRef.SelectCurWord </p>
<p> oWordRef.CharColor(0) </p>
<p> owordRef.insert(repl('_',25)) </p>
<p> owordRef.insert(cr) </p>
<p> *********** </p>
<p> for i=1 to 10 </p>
<p> owordRef.insert(cr) </p>
<p> oWordRef.Font("Times New Roman",14) </p>
<p> oWordRef.Bold </p>
<p> oWordRef.Italic(0) </p>
<p> oWordRef.CenterPara </p>
<p> oWordRef.Underline </p>
<p> oWordRef.CharColor(0) </p>
<p> owordRef.insert('Заголовок'+str(i)) </p>
<p> owordRef.insert(cr) </p>
<p> oWordRef.Font("Times New Roman",14) </p>
<p> oWordRef.Bold(0) </p>
<p> oWordRef.Italic </p>
<p> oWordRef.JustifyPara </p>
<p> oWordRef.CharColor(0) </p>
<p> owordRef.insert('Текст'+str(i)) </p>
<p> owordRef.insert(cr) </p>
<p> ENDFOR </p>
<p> owordRef.insert(cr) </p>
<p> oWordRef.Font("Times New Roman",12) </p>
<p> oWordRef.Bold(0) </p>
<p> oWordRef.Italic(0) </p>
<p> oWordRef.SelectCurWord </p>
<p> oWordRef.CharColor(6) </p>
<p> owordRef.insert('Конец файла '+repl('_',25)) </p>
<p> owordRef.insert(cr) </p>
<p> END=oword.activedocument.Bookmarks("EndofDoc").select </p>
<p> oword.visible= .t. </p></div>
<div id="sol_avtor">Автор: Каратаев</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4982">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 1 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4982">Каратаев</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Каратаев" href="https://foxclub.ru/account/?user=4982">
				<img alt='' src='https://secure.gravatar.com/avatar/d6cebdac5e53dee88cab93bb5d71d48a?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/d6cebdac5e53dee88cab93bb5d71d48a?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 04-12-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/vzaimodejstvie-vfp-i-word/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/setallx2-by-ik-rasshirennaya-gruppovaya-rabota-so-svojstvami-metodami-obektov/</link>
					<title><![CDATA[SetAllX2 by IK &#8211; расширенная групповая работа со свойствами/методами объектов]]></title>
                    					    <author><![CDATA[Igor Korolyov]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:23 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>SetAllX2 by IK &#8211; расширенная групповая работа со свойствами/методами объектов</h1>
													</header>
													<div id="sol_opis">Стандартному методу фоксовых контейнеров SetAll не всегда хватает гибкости, что и подвигло разработчиков из MS написать FFC класс SetAllX (имеется начиная с VFP7), но и там не были реализованы некоторые возможности, и имелось несколько ошибок/странностей, что и подвигло меня к усовершенствованию этого класса.</div>
<div id="sol_body">
<h3>SetAllX2 by IK - расширенная групповая работа со свойствами/методами объектов</h3>
<p> Инструкция по использованию:</p>
<p> 1) Создайте экземпляр класса SetAllX2 - например так:</p>
<p> _SCREEN.NewObject ("SetAllX2", "SetAllX2", "SetAllX.vcx")</p>
<p> 2) Теперь можно пользоваться методом SetAllX созданного объекта из любого метода вашей программы, например так:</p>
<p> _SCREEN.SetAllX2.SetAllX (параметры...)</p>
<p> Синтаксис метода SetAllX:</p>
<p> SetAllX (toParent, tcProperty, [tcExpr], [tcBaseClassList], [tlNoContainerMode], [tlErrorWait])</p>
<p> Параметры:</p>
<p> toParent - объектная ссылка на обрабатываемый контейнер, например ThisForm или This.cntSomeContainer из метода некоторого объекта, или m.goFormRef из процедуры.</p>
<p> tcProperty - Название устанавливаемого свойства, например "BackColor" или "ReadOnly". Или имя исполняемого метода, например "MyHookMethod ()" или скажем "Refresh ()" признаком различения свойства/метода является закрывающая круглая скобка в самой правой позиции.</p>
<p> tcExpr - Выражение или значение, присваиваемое указанному свойству. Например: число - 0 или скажем 2^8+2^4, строка - "Caption" или "Сегодня " + TRANSFORM (DATE()), тип даты - {^2003.12.06} или вычисляемое выражение - "(m.goApp.Caption + ' и ' + This.Caption)"<br /> Если всё выражение заключено в круглые скобки (естественно для этого оно должно быть строковым), то производится его вычисление при присвоении, помимо этого производится корректное преобразование ссылок This и This.Parent (а значит и производных от них). Т.е. можно присвоить свойству значение, полученное путём вычисления выражения содержащего это же и/или другие свойства целевого объекта, подробнее см. в Примерах.<br /> Может быть пропущен, если второй параметр указывает на исполнение метода.<br /> tcBaseClassList Список имён базовых классов VFP (через запятую, регист и пробелы не учитывается), с объектами которых идёт работа. Напимер "CommandButton, Header, Label" По умолчанию - пустая строка, что означает обработку объектов всех классов.</p>
<p> tlNoContainerMode - Флажок, отключающий разбор иерархии вложенности объектов. Т.е. если передано .T. то будут обработаны только объекты непосредственно расположенные в указанном контейнере, иначе - и во всех вложенных контейнерах. По умолчанию установлено .F. - т.е. разбор иерархии включен.</p>
<p> tlErrorWait - Флажок, отключающий поглощение ошибок данным классом. Суть работы данного класса предполагает отсуствие каких-бы то ни было проверок (на наличие того или иного свойства/метода, корректнось типов данных и т.п.), а просто поглощение всех возникающих ошибок. Установка этого параметра в .T. отменяет это поведение и чаще всего вызывает возникновение массы сообщений об ошибках 🙂 По умолчанию установлено .F. - т.е. ошибки поглощаются.</p>
<p> Всё вышеуказанное есть и в стандартном классе SetAllX из библиотеки FFC (естественно не учитывая несколько мелких ошибок реализации :)) А теперь нечто новое:</p>
<p> Свойство cClassNames - при его задействовании (помещении туда непустой строки - списка имён классов) включается разбор иерархии наследования - т.е. будут обработаны только объекты указанных классов ИЛИ КЛАССОВ ПРОИЗВОДНЫХ ОТ УКАЗАННЫХ. Т.е. если имеется иерархия вида</p>
<p> TextBox - txt - txtSuper - txtSuperPuper<br />               - txtAnother - txtCool</p>
<p> То указав в списке имя класса txt мы будем работать с объектами всех этих классов, кроме базового (TextBox), а указав txtSuper, мы будем работать только с классами txtSuper и txtSuperPuper. Список имеет такой же формат как и параметр tcBaseClassList - имена перечислены через запятую, регист и пробелы не учитываются.<br /> ВНИМАНИЕ - это свойство не отменяет параметров метода SetAllX, а дополняет их - т.е. если при вызове метода указан параметр tcBaseClassList - то будет осуществляться фильтрация как по именам базовых классов, так и по этому свойству. Свойство само по себе не сбрасывается, т.е. при необходимости это должен сделать программист - присвоив свойству пустую строку.</p>
<p> Примеры:<br /> 1) _SCREEN.SetAllX2.SetAllX (m.oFormRef, "BackColor", 255) - установит для всех объектов расположенных на форме oFormRef цвет фона в красный.</p>
<p> 2) _SCREEN.SetAllX2.SetAllX (m.oFormRef, "ForeColor", RGB (0, 255, 0), "Label,CommandButton") - установит для всех надписей и кнопок расположенных на форме oFormRef цвет шрифта в зелёный.</p>
<p> 3) _SCREEN.SetAllX2.SetAllX (m.oFormRef.Cnt1, "FontSize", 20, "", .T.) - установит для всех объектов расположенных _именно_ в контейнере Cnt1 (т.е. не учитывая иные вложенные контенйнеры, например PageFrame или Grid) размер шрифта в 20 пунктов.</p>
<p> 4) _SCREEN.SetAllX2.SetAllX (m.oFormRef, "SomeMethod ()", "", "", .T.)<br /> Выполнит метод SomeMethod для _всех_ объектов расположенных _именно_ на форме oFormRef, не учитывая объекты на вложенных контейнерах.</p>
<p> 5) ASELOBJ (m.laTemp, 1)<br /> * Получим ссылка на форму, открытую в Форм дизайнере...<br /> _SCREEN.SetAllX2.cClassNames = "txtSuper,lblSuper"<br /> _SCREEN.SetAllX2.SetAllX (m.laTemp, "FontName", "Arial")<br /> Установит для всех объектов производных от классов txtSuper, lblSuper и их наследников, расположенных на форме открытой в дизайнере, шрифт Arial.</p>
<p> 6) _SCREEN.SetAllX2.SetAllX (m.oFormRef, "FontSize", "(This.FontSize + 1)")<br /> Увеличит для всех объектов расположенных на форме oFormRef размер шрифта на единицу.</p>
<p> 7) _SCREEN.SetAllX2.SetAllX (m.oFormRef, "Top", "(This.Top + 10), "", .T.)<br /> Сдвинет объекты расположенные непосредственно на форме oFormRef вниз на 10 пикселей.  </div>
<div id="sol_avtor">Автор: Igor Korolyov</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4825">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4825">Igor Korolyov</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Igor Korolyov" href="https://foxclub.ru/account/?user=4825">
				<img alt='' src='https://secure.gravatar.com/avatar/669f5f66224f3ae8257ff4493933f2e4?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/669f5f66224f3ae8257ff4493933f2e4?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-05-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/setallx2-by-ik-rasshirennaya-gruppovaya-rabota-so-svojstvami-metodami-obektov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/spr2scx-programma-vosstanavlivayushhaya-ekrany/</link>
					<title><![CDATA[SPR2SCX &#8211; программа, восстанавливающая экраны.]]></title>
                    					    <author><![CDATA[Eli]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:23 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>SPR2SCX &#8211; программа, восстанавливающая экраны.</h1>
													</header>
													<div id="sol_opis">Отличное дополнение к ReFox, восстанавливает файлы экранов из файлов *.spr. Выдрана из демки UnFoxAll Pro 3.0</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Неизвестный китаец 😉</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="21">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=21">Eli</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Eli" href="https://foxclub.ru/account/?user=21">
				<img alt='' src='https://secure.gravatar.com/avatar/a876ecf810d89307ca3c7185b1e9704c?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/a876ecf810d89307ca3c7185b1e9704c?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 11-06-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/spr2scx-programma-vosstanavlivayushhaya-ekrany/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/prostoj-cposob-sohraneniya-i-vosstanovleniya-polozheniya-i-razmerov-form/</link>
					<title><![CDATA[Простой cпособ сохранения и восстановления положения и размеров форм.]]></title>
                    					    <author><![CDATA[TVS]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:23 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Простой cпособ сохранения и восстановления положения и размеров форм.</h1>
													</header>
													<div id="sol_opis">Класс VS_FrmPos  для восстановления положения и размеров форм. Для сохранения и восстановления положения и размеров формы необходимо при инициализации формы в Init вызвать метод:       Имя обьекта класса.RestPos(THIS) при закрытии формы в Destroy формы вызвать метод:        Имя обьекта класса.SavePos(THIS) Пример использования оформлен как проект.</div>
<div id="sol_body">
<h3>Простой cпособ сохранения и восстановления положения и размеров форм.</h3>
<p> Класс VS_FrmPos  для восстановления положения и размеров форм.<br /> Определение класса находится в файле progmain.prg/</p>
<p> В главной программе вначале  создать  обьект на  _screen :<br />       _screen.AddObject(, 'VS_FrmPos' [,])<br /> cNameObject - имя создаваемого обьекта на основе класса<br /> NameIniFile - имя файла .mem в котором сохраняются параметры по умолчанию - wpos.ini. </p>
<p> Для сохранения и восстановления положения и размеров формы необходимо<br /> 1.  При инициализации формы в Init вызвать метод: <br />       _screen..RestPos(THIS)<br /> 2.  При закрытии формы в Destroy формы вызвать метод: <br />      _screen..SavePos(THIS)</p>
<p> Примечание<br /> Запоминаются в файл .mem переменные, соответствующие<br /> шаблону в .cScel, изначально im_aPos.<br /> Если файл не существует, то он создается при<br /> выходе из программы.<br /> Запоминаются(восстанавливаются) след. свойства FORM :<br />        NAME, TOP, LEFT, HEIGHT, WIDTH, TAG всего 6  </div>
<div id="sol_avtor">Автор: tvs</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3012">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3012">TVS</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="TVS" href="https://foxclub.ru/account/?user=3012">
				<img alt='' src='https://secure.gravatar.com/avatar/40707c4e3c00968719f9608279a8625f?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/40707c4e3c00968719f9608279a8625f?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 18-10-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/prostoj-cposob-sohraneniya-i-vosstanovleniya-polozheniya-i-razmerov-form/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/odnovremennaya-generacziya-pad-i-shortcut-menyu/</link>
					<title><![CDATA[Одновременная генерация PAD и SHORTCUT &#8211; меню]]></title>
                    					    <author><![CDATA[AlexK]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:23 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Одновременная генерация PAD и SHORTCUT &#8211; меню</h1>
													</header>
													<div id="sol_opis">Немного переделанный genmenu.prg от VFP 7 SP1 для одновременной генерации PAD – меню и SHORTCUT – меню. Генерация выполняется для меню с одним PAD. При вызове в режиме ShortCut необходимо указать параметр .T. Do menu1.mpr 	– вызов PAD – меню Do menu1.mpr with .t.  – вызов SHORTCUT – меню Ключевое поле для поиска вставок в тексте генератора -  MENU2SHOR</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: AlexK</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4764">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 10 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4764">AlexK</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="AlexK" href="https://foxclub.ru/account/?user=4764">
				<img alt='' src='https://secure.gravatar.com/avatar/1fb49e8f115e8786c485b8112a62a69e?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1fb49e8f115e8786c485b8112a62a69e?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 9<i class="rcli fa-calendar-check-o"></i>Регистрация: 11-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/odnovremennaya-generacziya-pad-i-shortcut-menyu/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ustanovka-parametrov-otcheta-printer-orientacziya-kopii/</link>
					<title><![CDATA[Установка параметров отчета (принтер, ориентация, копии &#8230;)]]></title>
                    					    <author><![CDATA[TVFOX]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Установка параметров отчета (принтер, ориентация, копии &#8230;)</h1>
													</header>
													<div id="sol_opis">VFP сохраняет настройки принтера в теле отчета. Этот класс позволяет находу изменить эти установки. Если каких-то параметров нехватает их можно дописать. Не судите строго.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Владимир</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3519">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3519">TVFOX</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="TVFOX" href="https://foxclub.ru/account/?user=3519">
				<img alt='' src='https://secure.gravatar.com/avatar/694169d8bd2fc7eab02d9b4ba9dea2f8?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/694169d8bd2fc7eab02d9b4ba9dea2f8?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 29-06-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ustanovka-parametrov-otcheta-printer-orientacziya-kopii/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/prodolzhenie-programmy-bv/</link>
					<title><![CDATA[Продолжение программы BV]]></title>
                    					    <author><![CDATA[alexdeer]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Продолжение программы BV</h1>
													</header>
													<div id="sol_opis">Делает все что угодно с dbf файлами, полные исходники программы, понимает bv.exe file.dbf, спокойно чувствует себя в сетях, надеюсь на Ваши улутшения 🙂</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Alex Deer</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="947">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=947">alexdeer</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="alexdeer" href="https://foxclub.ru/account/?user=947">
				<img alt='' src='https://secure.gravatar.com/avatar/13b36ce1b488c576358edc2489a54587?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/13b36ce1b488c576358edc2489a54587?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 19-12-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/prodolzhenie-programmy-bv/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/prodolzhenie-programmy-bv-2/</link>
					<title><![CDATA[Продолжение программы BV]]></title>
                    					    <author><![CDATA[alexdeer]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Продолжение программы BV</h1>
													</header>
													<div id="sol_opis">Делает все что угодно с dbf файлами, понимает bv.exe file.dbf, спокойно чувствует себя в сетях.Нужны библиотеки VFP8</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Alex Deer</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="947">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=947">alexdeer</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="alexdeer" href="https://foxclub.ru/account/?user=947">
				<img alt='' src='https://secure.gravatar.com/avatar/13b36ce1b488c576358edc2489a54587?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/13b36ce1b488c576358edc2489a54587?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 19-12-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/prodolzhenie-programmy-bv-2/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/generator-otchetov-rtf-i-html/</link>
					<title><![CDATA[Генератор отчетов RTF и HTML]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Генератор отчетов RTF и HTML</h1>
													</header>
													<div id="sol_opis">Генератор формирует отчет (или таблицу Excel) в виде файла RTF, HTML и Delimited с наследованием всех свойств исходного документа-макета WinWord.exe или таблицы Excel. Формирование файлов производится напрямую без применения текстового процессора WinWord и практически мгновенно (как правило, из расчета до 0.2-0.5 сек на 1 Mb, а таблиц Excel в два раза быстрее).</div>
<div id="sol_body">
<h3>Генератор отчетов RTF и HTML</h3>
<p> Поскольку документы, как правило, значительно меньше 1 Mb, то указанные затраты можно не принимать во внимание. Время формирования отчета в формате Rtf определяется исключительно затратами на вычисление “вставляемых” в документ значений и считывание записей из БД. Редактор WinWord.exe (или Excel) используется только на этапе вывода готового отчета на экран, а также при разработке исходных макетов-документов. Программа автоматически настраивается на специфику файлов Rtf любых редакторов, а не только  WinWord. Встроенный язык Rtf и XML позволяет определять такие свойства документа, которые не могут быть достигнуты визуальными средствами ни в одном известном редакторе, включая WinWord. Исходные обрабатываемые данные могут быть представлены в файлах любых типов, включая текстовые файлы. Исполнение отчета или таблицы Excel в формате HTML  не имеет принципиальных отличий от RTF. Формирование файлов  ведется не последовательной цепочкой инструкций и без использования WinWord и Excel, а по специальной технологии напрямую (ноу-хау), что позволяет генерировать даже огромные файлы с уникальной скоростью (см. ниже). Смею утверждать, что в традиционном программировании при самых благоприятных раскладах показатели производительности будут на порядок скромнее, а многое из того, что автоматически обеспечивается Ekonom, просто не возможно добиться в популярных средах программирования. Основная часть отчетов, независимо от количества объектных и прочих вложений, выводится мгновенно. При этом соблюдается основной принцип компонентного программирования, а именно: никаких ограничений и никаких новых правил, кроме тех,  которые установлены используемыми компонентами (Word, Excel, Explorer и т.д.). Пользователь должен иметь дело исключительно с однотипным ему известным интерфейсом популярных компонентов. Вычислительные операции, связанные с формированием  вставок в документ, также исполняются по специальной “скоростной” технологии. Подробное описание и программу можно получить на www.korshak.boom.ru</p></div>
<div id="sol_avtor">Автор: Коршак Валерий</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/generator-otchetov-rtf-i-html/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-struct-dlya-raboty-s-winapi-funkcziyami-christof-lange-i-mark-wilden/</link>
					<title><![CDATA[Класс STRUCT для работы с WinAPI функциями (Christof Lange и Mark Wilden)]]></title>
                    					    <author><![CDATA[JS]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс STRUCT для работы с WinAPI функциями (Christof Lange и Mark Wilden)</h1>
													</header>
													<div id="sol_opis">Класс STRUCT, разработанный Christof Lange и Mark Wilden, для работы с WinAPI функциями, требующими в качестве параметров структуры, указатели, массивы структур и тому подобное.</div>
<div id="sol_body">
<h3>Класс STRUCT для работы с WinAPI функциями (Christof Lange и Mark Wilden)</h3>
<p> Класс STRUCT, разработанный Christof Lange и Mark Wilden, для работы с WinAPI функциями, требующими в качестве параметров структуры, указатели, массивы структур и тому подобное. Детальный перевод на русский язык найдете по адресу: http://kodu.neti.ee/~juri4/vfpplus/api_struct_01_ru.htm</p></div>
<div id="sol_avtor">Автор: JS</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4816">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4816">JS</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="JS" href="https://foxclub.ru/account/?user=4816">
				<img alt='' src='https://secure.gravatar.com/avatar/c14f791251381015573ba12653f4718a?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c14f791251381015573ba12653f4718a?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 04-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-struct-dlya-raboty-s-winapi-funkcziyami-christof-lange-i-mark-wilden/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/menedzher-proektov/</link>
					<title><![CDATA[Менеджер проектов]]></title>
                    					    <author><![CDATA[-=TsA=-]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:21 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Менеджер проектов</h1>
													</header>
													<div id="sol_opis">Менеджер проектов предназначен для простого управления Вашими проектами. Он позволяет быcтро переключатся между ними с автоматической настройкой каталогов. В нем также есть кое какие полезные утилиты а также возможность расширить функциональные возможности.</div>
<div id="sol_body">
<h3>Менеджер проектов</h3>
<p> Менеджер проектов работает в среде Visual FoxPro 5 и 6 версии, (люди добрые проверте кто нибудь работает ли он в 7). Утилита реализована ввиде .apр приложения.<br /> Установка: Создайте каталог, разархивируйте туда все файлы, в Visual FoxPro дайте команду DO Manager.app. Так же прилагается файл справки.  Описание исправлений 20/12/2002 Исправлена ошибка работы клавиши 'Esc', из-за чего вместо закрытия окна менеджера происходило удаление проекта.            Исправлена ошибка 'Каталог по умолчанию', из-за которого невозможно было определить каталог отличный от каталога расположения проекта.  02/11/2002 Исправлена ошибка работы кнопки компиляция, из-за которой компияция происходила толко в латинском регистре.  29/10/2002 Исправлена ошибка работы кнопки 'Новый' в менеджере проектов.  25/10/2002 Исправленна ошибка 'Close All', из-за которой при открытом окне Менеджера или Библиотеки падал Fox, теперь эти окна просто закрываются.            Исправлена ошибка запуска внутренних процедур при совпадении имен файлов  24/10/2002 Исправленна ошибка определения HomeDir() программы в модуле запуска пользовательской программы в результате чего пользовательский модуль не запускался.            Исправленно неверное отображение русских символов на формах и кнопках.            Возращен на место потеряный второй значек в 'Библиотеке модулей' на кнопке 'приколоть'.  23/10/2002 Релиз 'Менеджер проектов'     </div>
<div id="sol_avtor">Автор: -=TsA=-</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4523">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4523">-=TsA=-</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="-=TsA=-" href="https://foxclub.ru/account/?user=4523">
				<img alt='' src='https://secure.gravatar.com/avatar/760326611213712f6944ec6e0661e00e?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/760326611213712f6944ec6e0661e00e?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 26-08-2020        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/menedzher-proektov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/zapominaem-razmer-i-polozhenie-formy-_grid-s-pamyatyu-polozheniya-stolbczev-i-ih-razmerov/</link>
					<title><![CDATA[Запоминаем размер и положение формы, _grid  с памятью положения столбцев и их размеров.]]></title>
                    					    <author><![CDATA[olegov]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Запоминаем размер и положение формы, _grid  с памятью положения столбцев и их размеров.</h1>
													</header>
													<div id="sol_opis">_forminit - позволяет запомнить расположения и размер форм в dbf  _dbgrid - обычный грид способный запоминать расположения и размер столбцев  За качество исполнения шибко не ругайте, замечаниям буду только рад.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Олег</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4655">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4655">olegov</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="olegov" href="https://foxclub.ru/account/?user=4655">
				<img alt='' src='https://secure.gravatar.com/avatar/2d4863dd26401526cf0f16a51f5c3060?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/2d4863dd26401526cf0f16a51f5c3060?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-12-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/zapominaem-razmer-i-polozhenie-formy-_grid-s-pamyatyu-polozheniya-stolbczev-i-ih-razmerov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/generator-otchetov-gf-dlya-vyvoda-v_x000d_ie-msword-excel-frontpage-i-t-d/</link>
					<title><![CDATA[Генератор отчетов GF для вывода в_x000D_IE, MSWord, Excel, FrontPage и т.д]]></title>
                    					    <author><![CDATA[szv]]></author>
                    										    <pubDate>Fri, 04 Nov 2022 14:31:40 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Генератор отчетов GF для вывода в_x000D_IE, MSWord, Excel, FrontPage и т.д</h1>
													</header>
													<div id="sol_opis">Формы получаются в формате HTML и направляются в Internet Explorer, MSWord, Excel, FrontPage и так далее. Генератор выполнен как объект. Основное назначение генератора - построение табличных форм (шахматок, сводных таблиц). Табличные же формы функционально генерируется не хуже, чем MS Office PivotTable 10.0, а в некоторых моментах и лучше, но естественно в статике (нельзя вращать).</div>
<div id="sol_body">
<h3>Генератор отчетов GF для вывода в IE, MSWord, Excel, FrontPage и т.д.</h3>
<h3>Генератор отчетов GF для вывода в<br />
IE, MSWord, Excel, FronPage и т.д.</h3>
<p>GF.fxp работает только под VFP7.0 (CreateObject)</p>
<p>Форма может получена одновременно из нескольких СУБД (Fox, Access, MSSQL-server и так далее)</p>
<p>Есть подробная документация с примерами. Есть обучающий курс - 14 уроков.</p>
<p>Достаточно функционален для табличных форм (страницы, разрывы по уровням, отдельные строки, методы<br />
пользователя и другое). <br />
Разработки продолжаются по просьбе заинтересованных лиц.</p>
<p>Для некоторых может сразу не все будет понятно. Ждем вопросы.</p>
<p>Много внимания уделялось быстродействию. Для "двойной" рекурсии (итоги по строкам и колонкам -<br />
шахматка) это было сделать не столько сложно сколько трудоемко.</p>
<p>Для эффективного использования GF кроме VFP7.0 желательно знать HTML и XML, но в самом<br />
поверхностном варианте.</p>
<p>Для вертикального вывода текста используется класс: ссылки<br />
http://www.u.arizona.edu/ic/ccm/java/demo/vtext.html<br />
Класс предлагается для свободного использования.</p>
</div>
<div id="sol_avtor">Автор: szv</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1882">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1882">szv</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="szv" href="https://foxclub.ru/account/?user=1882">
				<img alt='' src='https://secure.gravatar.com/avatar/994d262376446fd4a7cde02635f6fc20?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/994d262376446fd4a7cde02635f6fc20?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 16-04-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/generator-otchetov-gf-dlya-vyvoda-v_x000d_ie-msword-excel-frontpage-i-t-d/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/orientirovanie-v-gride/</link>
					<title><![CDATA[Ориентирование в Grid&#8217;е]]></title>
                    					    <author><![CDATA[po2]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Ориентирование в Grid&#8217;е</h1>
													</header>
													<div id="sol_opis">Предложен способ определения параметров первой строки Grid'а вне зависимости от значения свойств RelativeRow и ActiveRow.</div>
<div id="sol_body">
<h3>Ориентирование в Grid'е</h3>
<p> 	В различных конференциях посвященных программированию на Visual FoxPro, не часто, но все же появляются вопросы об определении параметров первой отображаемой строки Grid’а в случае, когда указатель находиться за пределами сетки. Чаще всего вопрос является следствием затруднений при создании всплывающих подсказок связанных с содержимым отображаемых полей. Существующие решения, например:http://vfpdev.narod.ru/download/ttingrd.zip, обычно связаны с принудительным переносом указателя в видимую область.<br /> 	Предлагаемый метод основан на использовании особенностей группы свойств [Dynamic…], которые автоматически обновляются при любых перерисовках Grid’а. Это с одной стороны позволяет обойтись минимумом кода, но с другой налагает некоторые ограничения. Наиболее явное таково. Для гарантированного срабатывания, в видимой области Grid’а должны присутствовать как минимум две колонки, одна из которых должна содержать параметр группы [Dynamic…].<br /> 	В качестве иллюстрации использования метода представлена форма, в которой для колонок Grid’а организован вывод всплывающих подсказок, в зависимости от того умещается ли содержимое поля в границах колонки.  </div>
<div id="sol_avtor">Автор: Ившев Дмитрий</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4770">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 8 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4770">po2</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="po2" href="https://foxclub.ru/account/?user=4770">
				<img alt='' src='https://secure.gravatar.com/avatar/c214a28bf1871abdce1868aac0111f84?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c214a28bf1871abdce1868aac0111f84?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 22-12-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/orientirovanie-v-gride/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/alternativnyj-proekt-menedzher-dlya-vfp7-ver-1-03-03/</link>
					<title><![CDATA[Альтернативный проект менеджер для VFP7 ver. 1.03.03]]></title>
                    					    <author><![CDATA[RusMikle]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Альтернативный проект менеджер для VFP7 ver. 1.03.03</h1>
													</header>
													<div id="sol_opis">Это то без чего вы впоследствии жить не сможете 🙂 если у Вас более одного проекта в фоксе 🙂</div>
<div id="sol_body">
<h3>Альтернативный проект менеджер для VFP7 ver. 1.03.03</h3>
<p> на сегодня<br /> 1500 пользователей  </div>
<div id="sol_avtor">Автор: RusMikle</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4718">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4718">RusMikle</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="RusMikle" href="https://foxclub.ru/account/?user=4718">
				<img alt='' src='https://secure.gravatar.com/avatar/62ad38624e87679ba913e97c235c46f4?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/62ad38624e87679ba913e97c235c46f4?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-04-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/alternativnyj-proekt-menedzher-dlya-vfp7-ver-1-03-03/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-dlya-peremeshheniya-obektov-pri-izmenenii-razmerov-formy/</link>
					<title><![CDATA[Класс для перемещения объектов при изменении размеров формы]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс для перемещения объектов при изменении размеров формы</h1>
													</header>
													<div id="sol_opis">Очень часто возникает необходимость изменения размеров и перемещения объектов при изменении размеров формы. В Delphi, например, все визуальные компоненты имеют свойство Anchor(якорь) для привязки их к размерам формы...</div>
<div id="sol_body">
<h3>Класс для перемещения объектов при изменении размеров формы</h3>
<p>   Очень часто возникает необходимость изменения размеров и перемещения визуальных объектов при изменении размеров формы. В Delphi, например, все визуальные компоненты имеют свойство Anchor(якорь) для привязки их к размерам формы. Данный класс - это попытка придать компонентам Visual FoxPro похожие свойства.<br />   Для этого Вам необходимо поместить класс Anchor из прилагаемой библиотеки (см. ссылку ниже) на форму. И объектам, которые должны изменять свое положение или размер при изменении размеров формы, в свойство Tag добавить через пробел привязываемые углы:<br />   RT - правый верхний (RightTop)<br />   RB - правый нижний (RightBottom)<br />   LT - левый верхний (LeftTop)<br />   LB - левый нижний (LeftBottom).</p>
<p>   В событие Resize() формы необходимо добавить код: This.Anchor1.Anchor(), где Anchor1 - имя объекта.</p>
<p>   Пример использования данного класса вы найдете в прилагаемом архиве. </p></div>
<div id="sol_avtor">Автор: Юрий Кузьменко</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-dlya-peremeshheniya-obektov-pri-izmenenii-razmerov-formy/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-dlya-predstavleniya-chisla-propisyu/</link>
					<title><![CDATA[Класс для представления числа прописью]]></title>
                    					    <author><![CDATA[Daniel]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс для представления числа прописью</h1>
													</header>
													<div id="sol_opis">Иногда сталкиваешься с ситуацией, когда числовое результат в разлиных документах, например, платежном порученим, счет-фактуре,  накладной или в обучающей программе, необходимо  представить прописью.  Предлагаемый класс решает эту задачу для  целочисленных значений от 0 до 999'999'999. Может кому понадобится :)))</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Daniel</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="2606">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=2606">Daniel</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Daniel" href="https://foxclub.ru/account/?user=2606">
				<img alt='' src='https://secure.gravatar.com/avatar/70be4a2a37f4f0ed38b33500934eab72?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/70be4a2a37f4f0ed38b33500934eab72?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 20-11-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-dlya-predstavleniya-chisla-propisyu/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/pechat-grid-v-excel/</link>
					<title><![CDATA[Печать Grid в Excel]]></title>
                    					    <author><![CDATA[Евгений Банщиков]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Печать Grid в Excel</h1>
													</header>
													<div id="sol_opis">Вывод содержимого Grid в лист Excel. </div>
<div id="sol_body">
<h3>Печать Grid в Excel</h3>
<p> Решение предназначено для вывода содержимого Grid в лист Excel, на основе класса e_report (генератор отчетов в Excel).     </div>
<div id="sol_avtor">Автор: Бан щиков Евгений</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4947">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4947">Евгений Банщиков</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Евгений Банщиков" href="https://foxclub.ru/account/?user=4947">
				<img alt='' src='https://secure.gravatar.com/avatar/d4e4a6c8d5c8843e1223d300618e50ee?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/d4e4a6c8d5c8843e1223d300618e50ee?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 09-04-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/pechat-grid-v-excel/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/grid-s-podsvetkoj-stroki-i-eshhe-koe-chem/</link>
					<title><![CDATA[Grid с подсветкой строки и еще кое-чем&#8230;]]></title>
                    					    <author><![CDATA[savage]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Grid с подсветкой строки и еще кое-чем&#8230;</h1>
													</header>
													<div id="sol_opis">Уже много раз обсуждалась возможность подсветки строки в Grid. И, как правило, это делается с помощью свойства, добавляемого в форму. Так вот у этого класса это свойство заделано прямо в grid, что очень удобно, когда у вас в форме больше одного grid. Да еще у этого класса автоматом расширяется колонка column1, в зависимости от толщины вертикальной полосы прокрутки. Это сделано, чтобы все колонки влезали (и как следствие, грид не прыгал, когда встаешь на последнюю его колонку). Код, конечно не очень сложный, но довольно удобный.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Шулындин Кирилл</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="15">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=15">savage</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="savage" href="https://foxclub.ru/account/?user=15">
				<img alt='' src='https://secure.gravatar.com/avatar/eca6060bfb82c3136632a78ca01ace63?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/eca6060bfb82c3136632a78ca01ace63?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-11-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/grid-s-podsvetkoj-stroki-i-eshhe-koe-chem/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/otobrazhenie-grafika-na-forme-posredstvom-elementa-upravleniya-ms-chart-2-0/</link>
					<title><![CDATA[Отображение графика на форме посредством элемента управления MS Chart 2.0]]></title>
                    					    <author><![CDATA[savage]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Отображение графика на форме посредством элемента управления MS Chart 2.0</h1>
													</header>
													<div id="sol_opis">Всегда хотелось иметь в приложениях возможность отображения графиков. На данном сайте есть решение, которое позволяет делать это на базе Excel. Но ведь Excel использует тот же самый Ms Chart 2.0!!! Так зачем же это промежуточное звено Excel, которое постоянно виснет, глючит и не хочет работать? Вот эту идею я и реализовал в этом классе. Графики строятся непосредственно в элементе Ms Chart 2.0. Безусловно, реализованы не все возможности Ms Chart, но концепцию советую посмотреть.</div>
<div id="sol_body">
<h3>Отображение графика на форме посредством элемента управления MS Chart 2.0</h3>
<p> Есть класс, базирующийся на ActiveX элементе управления. Элемент управления называется MS Chart 2.0 и обычно три файла, которые необходимы для работы этого элемента, находятся в каталоге WindowsSystem: mschrt20.dep, mschrt20.ocx, mschrt20.srg.<br /> Для того, чтобы начать работу на конкретной станции с классом mschart, надо этот элемент управления зарегистрировать с помощью утилиты regsvr32, которая находится в том же каталоге.</p>
<p> Потом ставите на форму элемент класса MSChart и работаете с ним следующими методами:<br /> 1. InitChart (cAlias, cFieldsList, cHeadersList, cColorField) – инициализация графика<br /> Calias – алиас таблицы или курсора с данными<br /> CFieldsList – список полей (через ‘’) для вывода в графике - чтобы можно было передавать не просто поля, но и выражения типа IIF<br /> CHeadersList – список заголовков (подписей) на графике, тоже через ‘’<br /> CColorField – имя поля в таблице или курсоре alias, куда класс будет писать цвет конкретной линии. Это для того, чтобы отражая данные таблицы в гриде, вы могли подсветить каждую строку своим цветом, соответствующим цвету линии на графике.</p>
<p> Например:</p>
<p> THISFORM.Grd1.SETALL("dynamicForeColor", "color", "COLUMN")  - в форме есть грид grd1, в котором отображаются названия позиций товаров цветом, который задан полем color </p>
<p> thisform.oleAmountChart.InitChart ('vCharts','m1m2m3m4’,’month1month2month3month4’,'color') – вызываем метод initChart, в который передаем названия таблицы, числовых полей m1..m4, названия заголовков month1..month4 и название поля цвета color</p>
<p> 2. Requery() – перезапрос графика, после того, как данные в курсоре или таблице alias обновились.</p>
<p> Например:</p>
<p> thisform.oleAmountChart.Requery() – перезапрашиваем график</p>
<p> И еще у класса есть три логических свойства (точнее, свойств больше, но вам нужны только эти три):<br /> 1. lAverage – строить средний график;<br /> 2. lSummary – строить суммовой график;<br /> 3. lShowLabels – строить на графике цифры – значения в каждой точке графика.</p>
<p> После изменения этих флагов надо вызвать метод Requery.</p>
<p> Если есть какие-либо дополнения или вопросы - пишите!    </div>
<div id="sol_avtor">Автор: Шулындин Кирилл</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="15">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=15">savage</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="savage" href="https://foxclub.ru/account/?user=15">
				<img alt='' src='https://secure.gravatar.com/avatar/eca6060bfb82c3136632a78ca01ace63?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/eca6060bfb82c3136632a78ca01ace63?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-11-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/otobrazhenie-grafika-na-forme-posredstvom-elementa-upravleniya-ms-chart-2-0/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kalendar-analog-activx-calendar-na-grid/</link>
					<title><![CDATA[Календарь: аналог ActivX Calendar на Grid!!!]]></title>
                    					    <author><![CDATA[TVS]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Календарь: аналог ActivX Calendar на Grid!!!</h1>
													</header>
													<div id="sol_opis">Интерфейс календаря как у ActivX Calendar, но имеет много дополнений. Впервые ! календарь сделан на основе Grid!! Управляется клавишами и мышью. Показывает разницу м/у указанной датой и текущей. Может принимать параметры -первоначальную дату, нижнюю и верхнюю границу года.</div>
<div id="sol_body">
<h3>Календарь: аналог ActivX Calendar на Grid!!!</h3>
<p> Интерфейс календаря как у ActivX Calendar, но имеет много дополнений. <br /> Впервые ! календарь сделан на основе Grid!! Управляется клавишами и мышью. Показывает разницу м/у указанной датой и текущей. Может принимать параметры -первоначальную дату,<br /> нижнюю и верхнюю границу года, координаты верхн.левого угла.<br /> Параметры<br /> 1. Дата (D) - установить  указатель в календаре на дату<br />           (по умолчанию текущая)<br /> 2. Год (N)  - нижняя граница Года для календаря<br /> 	      (по умолчанию 1900)<br /> 3. Год (N) - верхняя граница Года для календаря<br /> 	      (по умолчанию 2090)<br /> 4. nTop (N) -  координаты верхн.левого угла<br /> 5. nLeft (N)<br /> Нижняя и верхняя граница года могут совпадать. Необходимо только<br /> чтобы первоначальная дата (если она не указана то текущая дата<br />) попадали в интервал.</p>
<p> Если дата была выбрана возвращается значение(Дата) иначе .T.<br /> Доступны клавиши Enter,Esc,PgUp,PgDn,Upper,Down,Left,Right</p>
<p> Пример оформлен в качестве проекта(можно сделать и exe) для VFP7<br /> Можно запускать и из командной строки(укажите свой Path к форме):<br /> STORE "" TO dd<br /> DO FORM d:vfp7workcalendarfrmclndr.scx TO dd<br /> ? dd<br /> Архив calendtvs.zip<br /> ver.1.1 tvs (c)КНУ 2002 tvsrb@mail.ru</p></div>
<div id="sol_avtor">Автор: tvs</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3012">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3012">TVS</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="TVS" href="https://foxclub.ru/account/?user=3012">
				<img alt='' src='https://secure.gravatar.com/avatar/40707c4e3c00968719f9608279a8625f?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/40707c4e3c00968719f9608279a8625f?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 18-10-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kalendar-analog-activx-calendar-na-grid/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/poisk-v-combobox/</link>
					<title><![CDATA[Поиск в ComboBox]]></title>
                    					    <author><![CDATA[Vanka]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Поиск в ComboBox</h1>
													</header>
													<div id="sol_opis">Очень часто ипользуется выбор значения из справочника с помощью ComboBox, но инкрементный поиск позволяет перейти к нужному значению по первой букве или буквам. Я хочу предложить другое решение поиск по любому сочетанию букв по первым, по вхождению с выводом списка удовлетворяющих значений в выпадающем списке.</div>
<div id="sol_body">
<h3>Поиск в ComboBox</h3>
<p> Идею по созданию данного класса подсказал Internet Explorer.При наборе адреса<br /> сайта Explorer выдает список совпадающий по первым с вводимым адресом. Идея<br /> была хорошая и решил я ее применить в своих проектах для выбора значений из<br /> справочников.<br /> И вот просмотрев всю документацию по Combobox я создал данный класс.</p>
<p> Для его использования необходимо определить следующие свойства:</p>
<p> IncrementalSearch - определяет возможность поиска (.T. - поиск разрешен, .F. -<br />                   поиск запрещен)<br /> RowSource - определяет источник данных. Источником данных всегда является SQl<br />             команда которая выбирает значения для выбора их из Combo.<br /> cNmTexAlias - определяет наименование курсора в которое выбираются данные с<br />             помощью SQL-Select'а, чтобы при закрытии Destroy объекта закрыть<br />             открытый в данный момент курсор (т.е. убираем мусор за собой)<br /> сSrchRowSource - данное свойство управляет поиском, здесь и можно определить<br />                как искать введенное выражение по первым буквам или любое<br />                совпадение символов. Поиск построен с использованием LIKE<br />                SELECT-SQL поэтому действуют все правила для LIKE.</p>
<p> Примеры значений свойств:<br /> 1. Поиск по первым символам</p>
<p> RowSource="SELECT name, id, UPPER(name) FROM S_pred ORDER BY 3 INTO CURSOR<br />                   TexSrch"<br /> сSrchRowSource="THIS.cOldRowSource+' WHERE UPPER(name) LIKE ['+;<br />              UPPER(THIS.cLocateExpression)+'%] UNION SELECT ['+;<br />              THIS.DisplayValue+'], ['+THIS.Value+'], CHR(0) FROM TexCboSearch '"<br /> cNmTexAlias="TexSrch"</p>
<p> 2. Любое совпадение символов</p>
<p> RowSource="SELECT name, id, UPPER(name) FROM S_pred ORDER BY 3 INTO CURSOR<br />                   TexSrch"<br /> сSrchRowSource="THIS.cOldRowSource+' WHERE UPPER(name) LIKE [%'+;<br />              UPPER(THIS.cLocateExpression)+'%] UNION SELECT ['+;<br />              THIS.DisplayValue+'], ['+THIS.Value+'], CHR(0) FROM TexCboSearch '"<br /> cNmTexAlias="TexSrch"</p>
<p> 3. Выбор значений из основной таблицы по определенным условиям.</p>
<p> RowSource="SELECT name, id, UPPER(name) FROM S_pred ORDER BY 3 INTO CURSOR<br />                   TexSrch WHERE Group="1""<br /> сSrchRowSource="THIS.cOldRowSource+' AND UPPER(name) LIKE [%'+;<br />              UPPER(THIS.cLocateExpression)+'%] UNION SELECT ['+;<br />              THIS.DisplayValue+'], ['+THIS.Value+'], CHR(0) FROM TexCboSearch '"<br /> cNmTexAlias="TexSrch"<br /> ** Следует обратить внимание что WHERE располагается в конце SELECT-SQL, а<br /> всвойстве WHERE заменяется на AND. Будьте внимательны, т.к. используется в<br /> коде макроподстановка.</p>
<p> P.S. И еще одно замечание, если необходимо из основной таблицы выбирать больше<br /> полей то в свойство cSrchRowSource необходимо указать CHR(0) или другое<br /> выражение чтобы правильно работал UNION.<br /> Ну и последнее обязательно определяйте ORDER BY по отдельной строке иначе<br /> введенное поисковое выражение не будет располагаться в верхней строке.</p>
<p> Все замечания, пожелания и вопросы присылайте на E-mail.</p>
<p> С наилучшими пожеланиями.</p>
<p> Иван Олейник.<br /> E-mail: oleynik99@mail.ru  </div>
<div id="sol_avtor">Автор: Vanka</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3009">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3009">Vanka</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Vanka" href="https://foxclub.ru/account/?user=3009">
				<img alt='' src='https://secure.gravatar.com/avatar/5c85f5c3546d62e97fdb187e8c2dc470?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/5c85f5c3546d62e97fdb187e8c2dc470?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-04-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/poisk-v-combobox/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/universalnye-klassy-dlya-raboty-s-tabliczami/</link>
					<title><![CDATA[Универсальные классы для работы с таблицами.]]></title>
                    					    <author><![CDATA[Jek Zevs]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Универсальные классы для работы с таблицами.</h1>
													</header>
													<div id="sol_opis">Представляю два класса работающих совместно:  DbfShell – работа с свободными таблицами ( открытие, создание, индексация, упаковка, закрытие, удаление) см «dbfshell.txt». Netobr   -  сетевые блокировки ( всех таблиц, алиаса, строчки) см «netobr.txt».  Пример инициализации: «start.prg».  Известные недостатки - индексы создаются типа «compact index». Работает только с свободными таблицами.</div>
<div id="sol_body">
<h3>Универсальные классы для работы с таблицами.</h3>
<p> jzShell.ZIP   </p></div>
<div id="sol_avtor">Автор: Jek Zevs</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4387">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4387">Jek Zevs</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Jek Zevs" href="https://foxclub.ru/account/?user=4387">
				<img alt='' src='https://secure.gravatar.com/avatar/94ab9a6e982b85ba000bc24e6bb71c34?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/94ab9a6e982b85ba000bc24e6bb71c34?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 29-11-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/universalnye-klassy-dlya-raboty-s-tabliczami/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/menedzher-proektov-ot-perminova-igorya-versiya-3-4-ot-15-01-2003-g/</link>
					<title><![CDATA[Менеджер проектов от Перминова Игоря. Версия 3.4 от 15-01-2003 г.]]></title>
                    					    <author><![CDATA[Перминов Игорь]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:21 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Менеджер проектов от Перминова Игоря. Версия 3.4 от 15-01-2003 г.</h1>
													</header>
													<div id="sol_opis">Поможет Вам быстро переключаться между проектами, одной кнопкой генерить файл или круппу файлов. Личный архив кода. Адаптированная утилита GENDBC.</div>
<div id="sol_body">Дерево задач и проектов. Build одной кнопкой. Запуск приложения из FoxPro или Windows. Справочник кода. GENDBC утилита.</div>
<div id="sol_avtor">Автор: Перминов Игорь</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5060">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5060">Перминов Игорь</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Перминов Игорь" href="https://foxclub.ru/account/?user=5060">
				<img alt='' src='https://secure.gravatar.com/avatar/c037d0f24a4cd0738110665cf089b985?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c037d0f24a4cd0738110665cf089b985?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 16-09-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/menedzher-proektov-ot-perminova-igorya-versiya-3-4-ot-15-01-2003-g/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/konstruktor-prilozhenij-dbrad32/</link>
					<title><![CDATA[Конструктор приложений DBRAD32]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:22 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Конструктор приложений DBRAD32</h1>
													</header>
													<div id="sol_opis">·	Открытая архитектура системы  ·	Простое и быстрое создание сразу работающих задач  ·	Тиражирование решений  ·	Единая оболочка и интерфейс данных для всех задач  ·	Разработка проектов в группе  ·	Поддержка и сопровождение обновления версий приложений  ·	Режимы "файл-сервер" и "оторванные представления"  ·	Настоящие первичные ключи записей  ·	Межзадачные разделяемые таблицы  ·	Встроенный генератор отчетов с созданием шаблонов в MS Word  ·	Встроенные в систему функции пользователя  ·	Возможность неограниченного развития решений  ·	Авторизация пользователей</div>
<div id="sol_body">
<h3>Конструктор приложений DBRAD32</h3>
<p> ·	ХРАНИЛИЩЕ ДАННЫХ (Построитель структур);<br /> ·	УНИКАЛЬНЫЕ ПЕРВИЧНЫЕ КЛЮЧИ (независимые от приложения);<br /> ·	ВВОД И ОБРАБОТКА ДАННЫХ (Универсальный GRID);<br /> ·	АНАЛИТИЧЕСКИЕ ОТЧЕТЫ (Генератор Отчетов в MS Word). </p>
<p> Исходные тексты. Бесплатное использование.<br /> www.dbrad32.narod.ru </div>
<div id="sol_avtor">Автор: ---</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/konstruktor-prilozhenij-dbrad32/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/spravochnik-v-menyu-shortcut/</link>
					<title><![CDATA[Справочник в меню Shortcut]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:21 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Справочник в меню Shortcut</h1>
													</header>
													<div id="sol_opis">Когда нужно занести значение в поле основной таблицы из справочника (небольшого) вызов этой (простой) процедуры поможет Вам.</div>
<div id="sol_body">
<h3>Справочник в меню Shortcut</h3>
<p> * Создает меню из поля базы данных и возвращает текст выбранной опции меню<br /> * Вызов функции:<br /> * MYMENU(cFieldName [,cAliasName] [,lMous])<br /> * Параметры:<br /> * cFieldName - наименование поля базыданных<br /> * cAliasName - псевдоним базы данных<br /> * lMouse - Использовать координаты мыши<br /> * База данных должна быть открыта<br /> PARAMETERS _mFieldName, _mAliasName, _mMouse<br /> _mVib=""<br /> IF _mMouse<br /> 	DEFINE POPUP _mMenu SHORTCUT RELATIVE FROM ROW(),COL()<br /> ELSE<br /> 	DEFINE POPUP _mMenu SHORTCUT RELATIVE FROM MROW(),MCOL()<br /> ENDIF<br /> DO CASE<br /> 	CASE PARAMETERS()=3<br /> 		SELECT (_mAliasName)<br /> 		COPY TO ARRAY _aArray FIELD (_mFieldName)<br /> 		FOR _i=1 TO ALEN(_aArray,1)<br /> 			DEFINE BAR _i OF _mMenu PROMPT ALLTRIM(_aArray(_i,1))<br /> 			ON SELECTION BAR _i OF _mMenu _mVib=PRMBAR("_mMenu",BAR())<br /> 		ENDFOR<br /> 	CASE PARAMETERS()																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/alternativnyj-menezhder-proektov/</link>
					<title><![CDATA[Альтернативный менеждер проектов]]></title>
                    					    <author><![CDATA[RusMikle]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:21 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Альтернативный менеждер проектов</h1>
													</header>
													<div id="sol_opis">Добавлена компиляция и очистка проектов.</div>
<div id="sol_body">
<h3>Измененения в альтернативный менеждер проектов</h3>
<p> Измененения в альтернативный менеждер проектов<br /> Добавлена компиляция и очистка проектов. </div>
<div id="sol_avtor">Автор: RusMikle</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4718">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4718">RusMikle</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="RusMikle" href="https://foxclub.ru/account/?user=4718">
				<img alt='' src='https://secure.gravatar.com/avatar/62ad38624e87679ba913e97c235c46f4?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/62ad38624e87679ba913e97c235c46f4?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-04-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/alternativnyj-menezhder-proektov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/arhivirovanie-dannyh/</link>
					<title><![CDATA[Архивирование данных]]></title>
                    					    <author><![CDATA[dvp]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:21 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Архивирование данных</h1>
													</header>
													<div id="sol_opis">Использование библиотеки zlib</div>
<div id="sol_body">
<h3>Архивирование данных</h3>
<p> Использование библиотеки zlib для создания zip архивов с вложением нескольких файлов </p></div>
<div id="sol_avtor">Автор: Петров Дмитрий</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1888">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1888">dvp</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="dvp" href="https://foxclub.ru/account/?user=1888">
				<img alt='' src='https://secure.gravatar.com/avatar/2b80585062171452f39df1a339781899?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/2b80585062171452f39df1a339781899?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 19-11-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/arhivirovanie-dannyh/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/soedinenie-udalennogo-dostupa-i-otravka-pochty/</link>
					<title><![CDATA[Соединение удаленного доступа и отравка почты.]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:15 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Соединение удаленного доступа и отравка почты.</h1>
													</header>
													<div id="sol_opis">Использование бесплатных ActiveX для управления соединением удаленного доступа (передача пароля, логина, установка соединения, разрыв и т.д.) и отправки почты (также с разнообразными настройками).</div>
<div id="sol_body">      Visual FoxPro CLUB-Соединение удаленного доступа и отравка почты.      </p>
<h3>Соединение удаленного доступа и отравка почты.  Отправка почты с установкой dial-up соединения. </h3>
<p> ------------------------------- </p>
<p> Внимание! В связи с тем, что многие ссылки, указанные ниже, стали недоступны, все компоненты выложены в архиве ras.zip: <br /> onlinecontrol.ocx - ULSETCH Online Control; <br /> rascontrol.ocx - ULSETCH RasDial Control; <br /> sasmtp.dll и sasmtp.chm - SoftArtisans mailer и документация к нему; <br /> rasdial.ocx - Coll Stf RasDial Control. <br /> Компоненты надо устанавливать вручную (если выкладывать с инсталяторами, то архив на порядок больше получается). </p>
<p> -------------------------------- <br /> Возникла задача: отправить клиенту еженедельный отчет почтой с вложением.  </p>
<p> Решил разбить на 2 этапа:  <br /> 1) Сделать отправку письма с вложением.  <br /> 2) Добавить к первому пункту автоматическое соединение (dial-up) и разрыв его.  </p>
<p> 1) Посмотрев статью Журавлева, попробовал сделать через MAPI - получилось, но не совсем: на одной машине почта оказалась в Outlook-e, на другой - запросила настроить Exchange. Стал искать ActiveX. На www.activeserverpages.ru неплохая коллекция (хотя на www.vbip.com может и лучше, но я на него выбрался позже), в том числе несколько для отправки почты (что приятно - бесплатные). Скачав и установив их, я остановился на ActiveX SA-SMTPMail фирмы SoftArtisans (www.softartisans.com). Его можно скачать по адресу http://support.softartisans.com/eval/ (надо заполнить регистационную форму). Имеет свой инсталятор, так что руками ничего регистрировать не пришлось. Свойства и методы подробно описаны в help-е. Если коротко, то создаем объект: loMailer = createobject("SoftArtisans.SMTPMail"), устанавливаем свойства, вызываем метод SendMail(), который возвращает .T., если письмо отправлено и .F. - в противном случае.  </p>
<p> 2) В разделе решения лежит пример кода из книги А.Горева. Его основной недостаток - отсутствие возможности из программы разорвать связь. В конференции говорится про функцию HangUp, но подробных объяснений я не нашел (м.б. плохо искал). Найти подробное описание RAS (Remote Access Service) и, конкретно, функции HangUp() можно в msdn (http://msdn.microsoft.com), но я снова решил поискать ActiveX. И снова нашел бесплатный! На сайте www.vbip.com (Visual Basic) раздел Take&Use, подраздел Components, установить поиск по категории RAS/Connect (http://www.vbip.com/components/). Я установил компонент RasDial от COOLSTF (видимо www.coolstf.com) и RasControl и Online Control от ULSETCH Software (www.ulsetch.cjb.net). Компоненты от ULSETCH имеют инсталятор и, опять же, руками ничего регистрировать не пришлось. Online Control имеет только одно свойство и позвляет определить, находится ли пользователь в сети или нет. RasControl позволяет устанавливать соединение, НО только из уже имеющихся на машине. Если Вы не боитесь, что украдут пароли, то просто создаете соединение, устанавливаете все атрибуты (Имя пользователя, пароль, флажок "запомнить пароль"), затем в программе указываете в свойстве EntryName имя вашего соединения, вызываете метод Connect(), а потом, когда надо Disconnect(). Мне хотелось поэкспериментировать дальше, поэтому я поставил еще и RASDial от CoolStf. Этот коспонент требует ручной установки, но все довольно просто: копируем .ocx в каталог WINDOWSSYSTEM (для Windows 9x) и запускаем REGSVR32 WindowsSystemRASDIAL.OCX (Windows 9x), для NT - WinNTSYSTEM32. Всё. Компонент позволяет установить из программы пароль, имя пользователя, телефон дозвона и т.д. (в файле rasdial.txt полное описание) При указании телефона дозвона, набор номера велся в тональном режиме, победить это я не смог. Еще один важный параметр AsyncMode - определяет поведение компонента ( возвращает управление программе сразу или после результата дозвона). Надо ставить .F. (по крайней мере, у меня иначе не работало). Интересно, что в описании компонента есть замечание для VFP программистов: Установить _vfp.AutoYield = .F. в процессе работы компонента. Набор параметров, который позволил мне дозвониться и установить связь приведен в программе.  </p>
<p> Важное отличие между пунктами: все компоненты из второго пункта нужно положить на форму (Cоздать новую немодальную форму, щелкнуть на OLE Control Container, выбрать на форме место, установить в появившемся окне Insert Control и выбрать из списка нужный ActivX, сохранить форму) У меня на форме лежат Online Control (oleOnlineTest) и RASDial Control (oleRasDialer)  </p>
<p> Собственно текст программы :  </p>
<p> ************************************************************************************ <br /> * Программа автоматической отправки почты                                          * <br /> ************************************************************************************ </p>
<p> set console off <br /> set talk off <br /> set escape off <br /> set date german <br /> set century on <br /> set hours to 24 </p>
<p> _vfp.AutoYield = .F. && это советуют сделать разработчики RasDial Control </p>
<p> local lcFormFolder <br /> lcFormFolder = "" && путь к каталогу, где лежит форма с ActiveX компонентами <br /> set path to &lcFormFolder </p>
<p> * <br /> * Производим необходимые действия, например, готовим отчет в файл c:demo.txt  <br /> * </p>
<p> 	local loMailer </p>
<p>      loMailer = createobject("SoftArtisans.SMTPMail") </p>
<p>      loMailer.FromName    = "Ivan Ivanov" <br />      loMailer.FromAddress = "vanya@ivanov.ru" <br />      loMailer.bodytext    = "First E-mail"  <br />      loMailer.replyto     = "vanya@ivanov.ru"  <br />      loMailer.subject     = "Test" <br />      loMailer.smtplog     = "c:mysmtplog.txt" && файл, в который сбрасывается информация о процессе отправки <br />      loMailer.RemoteHost  = " " && надо указать адрес сервера, через который будет отправляться почта <br />      loMailer.addrecipient("First Recipientr", "semen@semenov.ru") <br />      loMailer.addattachment("c:demo.txt")   <br />      wait window 'Данные подготовлены. Сейчас попытаемся отправить!'  nowait </p>
<p>      public goRasForm <br />      do form  name goRasForm  </p>
<p>      local loRasDial, lnStatus, llMailSent, loOnlineTest </p>
<p>      loOnlineTest = goRasForm.oleOnlineTest <br />      wait window 'Проверяем в сети или нет...'  nowait </p>
<p>      if loOnlineTest.Connected  <br />      	    wait window 'Уже в сети ...'  nowait <br />          llMailSent = loMailer.SendMail() <br />      else  </p>
<p>     	      wait window 'Дозваниваемся ...'  nowait </p>
<p> 	 	 loRasDial = goRasForm.oleRasDialer <br /> 		 loRasDial.AsyncMode = .F. <br /> 		 loRasDial.EntryName = "AUTOSEND" && Необходимо завести соединение с таким именем (или с другим, но тогда изменить здесь) <br /> 		 loRasDial.UserName = "" && Заменить на реальное имя пользователя <br /> 		 loRasDial.Password = "" && и пароль <br /> 		 lnStatus = loRasDial.Dial() </p>
<p>        	 if  lnStatus < 600 <br />               llIsOnline = .T. <br />               wait window 'Соединились, пытаемся отправить...'  nowait <br />           	   llMailSent = loMailer.SendMail() <br />             endif <br />             loRasDial.HangUp() <br />             wait window 'Разорвали соединение...'  nowait </p>
<p>      endif </p>
<p>      goRasForm.Release() </p>
<p>      if llMailSent <br />        	wait window 'Письмо отправлено...'  nowait <br />      else <br />       	wait window "Ошибки при отправке письма:"+loMailer.Response nowait <br /> 	endif </p>
<p>     wait clear </p>
<p>     release all </p>
<p>    _vfp.AutoYield = .T. </p>
<p> return </p>
<p> * В config.fpw пишем screen = off, создаем .exe,  <br /> * устанавливаем в каком-нибудь планировщике его еженедельный запуск, <br /> * и отчет автоматически отправляется клиенту. Задача решена. </p>
<p> Если есть вопросы или замечания пишите lf@newmail.ru  <br /> Леонид Фишкис  </p>
<p> P.S. Если будете искать информацию по соединению удаленного доступа, то ключевые слова на "Remote Access" на английском и "Удаленное соединение" на русском. Я долго искал по "Connect" и "Удаленный доступ"!  <br />         </div>
<div id="sol_avtor">Автор: Леонид Фишкис</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/soedinenie-udalennogo-dostupa-i-otravka-pochty/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/nebolshoj-spravochnik-po-funkcziyam-i-komandam-vfp-7/</link>
					<title><![CDATA[Небольшой справочник по функциям и командам VFP 7.]]></title>
                    					    <author><![CDATA[WiRuc]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:21 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Небольшой справочник по функциям и командам VFP 7.</h1>
													</header>
													<div id="sol_opis">Краткий справочник по языку VFP 7. Убраны устаревшие на мой взгляд функции. Может быть полезен для начинающих изучать ФоксПро.</div>
<div id="sol_body">
<h3>Небольшой справочник по функциям и командам VFP 7.</h3>
<p> Буду рад любой помощи для дальнейшего развития справочника, а также любым замечаниям и дополнениям. Пишите на мой e-mail: wiruc@mail.ru<br /> Удачи!!!   </div>
<div id="sol_avtor">Автор: WiRuc</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4736">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4736">WiRuc</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="WiRuc" href="https://foxclub.ru/account/?user=4736">
				<img alt='' src='https://secure.gravatar.com/avatar/d45ea3249433ada7da4913d1c8ae5a33?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/d45ea3249433ada7da4913d1c8ae5a33?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 09-04-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/nebolshoj-spravochnik-po-funkcziyam-i-komandam-vfp-7/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/com-obekt-dlya-perehvata-soobshhenij-poluchaemyh-oknamiformami/</link>
					<title><![CDATA[COM-объект для перехвата сообщений, получаемых окнами(формами)]]></title>
                    					    <author><![CDATA[WiRuc]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:21 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>COM-объект для перехвата сообщений, получаемых окнами(формами)</h1>
													</header>
													<div id="sol_opis">COM-объект предназначен для перехвата и обработки сообщений, посылаемых Windows к формам приложения. Возможно как слежение, так и собственная обработка сообщений.</div>
<div id="sol_body">
<h3>COM-объект для перехвата сообщений, получаемых окнами(формами)</h3>
<p> Как известно, Фокс не позволяет получить доступ к своему циклу сообщений. Поэтому, для перехвата сообщений необходимо организовывать subclassing окон(форм). Данный объект предназначен именно для этого.<br /> В архиве FoxSubclass.zip расположена FoxSubclass.Dll и исходники. Объект необходимо зарегистрировать в системе с помощью вызова regsvr32 c:pathFoxSubclass.dll.<br /> ProgID объекта: FoxSubclass.WndSubclass</p>
<p> Реализованы следующие методы:<br /> 1. SubclassWindow(hWnd, szHandler, bReceiveAll) - "главный" метод, собственно осуществляющий subclassing.<br /> hWnd - окно, сообщения которого надо перехватывать<br /> szHandler - ф-ция в Фоксе, которая будет вызываться для обработки сообщений (только имя)<br /> bReceiveAll - если TRUE, то получать все сообщения, иначе, только те сообщения, которые добавлены с помощью метода AddMessage()<br /> 2. AddMessage(hWnd, uMsg, uPlace) - добавляет сообщение к карте сообщений и позволяет получать указанное сообщение в обработчике (szHandler).<br /> hWnd - окно, которое указывалось при вызове метода SubclassWindow<br /> uMsg - номер сообщения<br /> uPlace - положение вашего обработчика в цепочке вызовов (0 - ваш обработчик вызывается до стандартного обработчика, 1- после стандартного, 2 - до и после стандартного).<br /> 3. ChangeMessageParam - данный метод изменяет параметры обрабатываемого сообщения WPARAM и LPARAM (иногда необходимо, если вы сами обрабатываете сообщение). Данный метод действителен только в момент обработки сообщения.<br /> 4. UnSubclassWindow, RemoveMessage, RemoveMessageAll - я думаю понятно, для чего эти методы.</p>
<p> Свойства объекта:<br /> 1. pFoxDispatch - указатель на интерфейс Dispatch Фокса. Необходимо для всязи объекта с Фоксом, устанавливайте это свойство ДО вызова любого другого методаю. Обычно pFoxDispatch = _vfp.<br /> 2. IsHandled - позволяет указать, что сообщение обработано и дальнейшая обработка не требуется. Установка данного свойства в TRUE в вашем обработчике позволяет пропустить обработку сообщения стандартным обработчиком. В этом случае вся необходимая работа по обработке сообщения должна выполняться вашим обработчиком. Также значение этого свойства позволяет узнать, в каком месте цепочки вызовов стоит ваш обработчик. Если при вызове вашего обработчика это свойство установлено в .F., то стандартная обработка еще не была выполнена и ваш обработчик вызывается до стандартного. Если .Т. - то обработка уже была выполнена и ваш обработчик вызывается ПОСЛЕ стандартного (либо и ДО и ПОСЛЕ).</p>
<p> Обработчик на Фоксе должен быть доступен глобально и иметь следующий формат: Имя_обработчика(hWnd, uMsg, wParam, lParam), где hWnd - хендл окна, получившего сообщение; uMsg - номер сообщения; wParam - параметр WPARAM сообщения; lParam - параметр LPARAM сообщения. Если вы сами обрабатывается сообщение, то возвращаемое значение должно быть численным и зависит от сообщения (см. MSDN).</p>
<p> Пример использования класса:</p>
<p> SET procedure to wndproc.prg  && здесь находится наш обработчик WndProc(hWnd, uMsg, wParam, lParam)<br /> o = CreateObject("FoxSubclass.WndSubclass")<br /> if vartype(o)"O"<br />   return<br /> endif</p>
<p> o.pFoxDispatch = _vfp  && устанавливаем связь объекта с Фоксом<br /> o.SubclassWindow(_vfp.hWnd, "WndProc", .F.)  && subclassing главного окна Фокса<br /> o.AddMessage(_vfp.hWnd, 6, 0)  && перехватываем сообщение WM_ACTIVATE до вызова стандартного обработчика<br /> o.UnSubclassWindow(_vfp.hWnd)</p>
<p> Если сообщение WM_ACTIVATE обработано вашим обработчиком и стандартная обработка не требуется, то необходимо в теле обработчика установить свойство IsHandled в TRUE (o.IsHandled = .T.).</p>
<p> Настоятельно рекомендую не использовать перехват всех сообщений (указание последнего параметра SubclassWindow в .T.), т.к. это может вызвать падение производительности на медленных машинах. Перехватывайте только те сообщения, которые вам необходимы.<br /> В случае каких-либо замечаний или пожеланий обращайтесь по адресу: wiruc@mail.ru</p>
<p> Проект разработан с использованием Visual Studio.NET и ATL.<br /> Разработчик: Колпачев Сергей aKa WiRuc   </div>
<div id="sol_avtor">Автор: WiRuc</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4736">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4736">WiRuc</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="WiRuc" href="https://foxclub.ru/account/?user=4736">
				<img alt='' src='https://secure.gravatar.com/avatar/d45ea3249433ada7da4913d1c8ae5a33?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/d45ea3249433ada7da4913d1c8ae5a33?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 09-04-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/com-obekt-dlya-perehvata-soobshhenij-poluchaemyh-oknamiformami/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/primer-klient-servernogo-prilozheniya-programma-ucheta-orgtehniki-visual-foxpro-klient-ms-sql-server-7/</link>
					<title><![CDATA[Пример клиент-серверного приложения &#8211; программа учета оргтехники. Visual FoxPro клиент + MS SQL Server 7.]]></title>
                    					    <author><![CDATA[Jimmy]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:21 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Пример клиент-серверного приложения &#8211; программа учета оргтехники. Visual FoxPro клиент + MS SQL Server 7.</h1>
													</header>
													<div id="sol_opis">Пример клиент-серверного приложения - программа учета оргтехники. Visual FoxPro клиент + MS SQL Server 7. Справочный файл, в связи с его размером (630Кб), доступен для опциональной загрузки отсюда: http://foxserver.nsvisual.com/download/other/computers_hlp.zip</div>
<div id="sol_body">  <H2>Пример клиент-серверного приложения</H3> <H3>От автора.</H3> <P>Уважаемые коллеги! <P>В последнее время на форуме прослеживается живой интерес к клиент-серверным приложениям, в частности к связке VFP-MSSQL, что подвигло меня данную публикацию. <P>Так же, моя профессиональная деятельность за последнее время несколько изменилась и я уже не являюсь VFP программером в полном смысле этого слова, так что эта публикация является отчасти и прощальным приветом всем вам, в особенности тем людям, с которыми я долгое время общался и которые несмотря ни на что любят и знают столь незаслуженно забытый нынче Visual Foxpro: Владимир Журавлев, Степанов Денис (HellRiser), Гринчишин Влад, Сергей Титов, Владимир Максимов, Кочкомбаев Тарас, Людмила, Жирнов Сергей, Насоновская Надя и многие другие. <P>Эти люди меня многому научили, за что им огромное спасибо.  <H3>Предупреждение.</H3> <P>Данный пример ни в коей мере не может служить эталоном по созданию CS приложений на VFP! Эту программу я написал, когда знакомился с MS SQL Server 7 (около 2х лет назад). Более того - это моя первая программа, использующая клиент-серверную технологию.  <P>Ну и,самое главное, здесь используются только SPT функции, т.к. только они позволяют держать под абсолютным контролем удаленную БД, и нет ни слова о Remote View (я считаю, что не надо скрещивать два разных подхода к CS приложениям на VFP). <P>Тем не менее, приемы работы с данными, использованные здесь, достаточно показательны, и могут ответить на вопросы большинства интересующихся. <P>Программа не является учетной в понятии бухгалтерии, скорее, это обычная картотека для IT службы крупного предприятия. <H3>Платформа.</H3> <P>Клиентская часть разрабатывалась и компилировалась под VFP6+SP5. Успешно работает под Win9xWin2000Pro(Eng & Rus)NT4 WS. Серверная часть - MS SQL Server 7+SP3 (так же испытывалась на MSDE1MSDE2000). <H3>Недостатки и грабли.</H3> <P><I>Некоторые из перечисленных недостатков могли бы быть устранены перед публикацией, но я сознательно не стал этого делать, чтобы сохранить Ваше настороженное отношение к коду, а проще говоря - уберечь от бездумного копирования.</I> <P>Именно после этого проекта я написал пакет классов для работы с удаленными данными (которые опубликованы здесь в "Решениях"), т.к. здесь в полной мере проявился недостаток процедурного программирования в отношении работы с функциями SQL pass trought (SPT), а именно: <UL> <LI>Код обработки SPT функций "размыт" по тексту программы (в основном - сосредоточен в процедурах обмена данными) <LI>Вследствие этого децентрализована обработка ошибок SPT функций, что так же не является хорошим тоном в программировании <LI>Несколько некорректно обрабатываются транзакции. В принципе, это лечится установкой соответсвующего свойства соединения (SQLSETPROP(0, "Transaction", 2) && Режим ручной обработки транзакций), но здесь просто нет этой нужной строчки кода <LI>Для возврата значений из хранимых процедур используется курсор, а не выходные (OUTPUT) параметры </UL>  <P>Казалось бы - напиши универсальные процедуры и не "парься", однако, универсальность привела бы к неоправданной громоздкости этих самых процедур. Оптимальное решение - классы работы с SPT. К сожалению, к этому очевидному решению я пришел, когда уже была написана львиная доля кода и переписывать его уже не имело особого смысла - код работал. Так что учтите эти замечания, когда будете смотреть код. <P>Не смотря на это программа успешно эксплуатируется у нас в конторе и поныне. Говорят, что удобно. <H3>Достоинства.</H3> Кроме недостатков, программа обладает и достоинствами, причем немаловажными. Вот они: <UL> <LI>Минимальный траффик, т.к. вся "грязная" работа выполняется сервером с помощью хранимых процедур (ХП), а клиенту перегоняется минимум необходимых данных <LI>Использование ХП позволяет повысить степень защищенности данных на сервере, т.к. можно запретить непосредственный доступ пользователей к таблицам <LI>Изменение структуры данных не приведет к изменению кода клиентской части, в случае, если не изменится интерфейс ХП <LI>Подробная документация и интерактивная справка  </UL> <P>Можно, конечно, напрячься и вычислить еще пару достоинств, но эти - основополагающие. <H3>Сопроводительная документация.</H3> <P>К программе прилагается: <UL> <LI><B>Createdb.sql</B> - Скрипт генерации БД - после его выполнения Вы получите 100% работающую БД <LI><B>Хранимые процедуры БД Computers .xls</B> - Excel таблица с описанием ХП сервера <LI><B>Computers_4.ER1</B> - ER модель базы данных (ErWin 4) <LI><B>Readme.txt</B> - описание программы, процедуры ее установки и настройки DSN (в файле справки это тоже есть, да еще с иллюстрациями) <LI><B>Computers.hlp</B> - файл справки   </UL>  Справочный файл, в связи с его размером (630Кб), доступен для опциональной загрузки отсюда: http://foxserver.nsvisual.com/download/other/computers_hlp.zip <H3>Как сгенерить БД.</H3> <P>Краткая инструкция по генерации БД (для успешной работы необходимо обладать правами DBcreator на MSSQL): <OL> <LI>Запустить Query Analyser <LI>В окне команд написать: CREATE DATABASE Computers <LI>Нажать F5 <LI>Будет создана БД Computers <LI>Открыть скрипт генерации БД (Меню Open...) <LI>Сделать активной новую БД (выпадающий список БД) <LI>Нажать F5 <LI>В результате должны быть созданы все объекты БД, и таблицы проинициализированы системными записями </OL> Если будут проблемы - сообщите. Попробуем решить.  <P>Если же все в порядке - создайте DSN и можно запускать программу. <U>Обязательно прочтите Readme.txt !!!</U> <H3>Опять от автора.</H3> <P>Прошу не судить строго. Буду рад конструктивной критике, желательно прямо здесь, в разделе -  чтобы другие посетители были в курсе. <P>Буду очень рад, если это все кому-нибудь поможет. С уважением, Орлов Дмитрий aka Jimmy.       </div>
<div id="sol_avtor">Автор: Дмитрий Орлов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4748">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4748">Jimmy</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Jimmy" href="https://foxclub.ru/account/?user=4748">
				<img alt='' src='https://secure.gravatar.com/avatar/4438780968f2f420d33c7c7ad27e120f?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4438780968f2f420d33c7c7ad27e120f?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 30-07-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/primer-klient-servernogo-prilozheniya-programma-ucheta-orgtehniki-visual-foxpro-klient-ms-sql-server-7/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-dlya-raboty-s-ini-fajlami/</link>
					<title><![CDATA[Класс для работы с INI-файлами.]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:21 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс для работы с INI-файлами.</h1>
													</header>
													<div id="sol_opis">Довольно часто на форуме встречаются вопросы, связанные с работой с INI-файлами. Предлагаю вашему вниманию класс, который, как я надеюсь, облегчит жизнь новичкам и, возможно, будет интересен профессионалам. Данный класс реализует удобный и кажется полный интерфейс для работы с INI-файлами. Реализован для VFP7.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Сандалов Андрей</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-dlya-raboty-s-ini-fajlami/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/peremeshhenie-uzla-v-treeview/</link>
					<title><![CDATA[Перемещение узла в TreeView]]></title>
                    					    <author><![CDATA[Владимир Максимов]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:17 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Перемещение узла в TreeView</h1>
													</header>
													<div id="sol_opis">Пример написан на VFP6SP5. В нем рассматривается вопрос организации перемещения узла дерева (элемента ActiveX TreeView). В примерах рассмотрена только визуальная часть решения. Вопрос о хранении древовидной структуры в базе данных намеренно игнорируется.</div>
<div id="sol_body">
<h3>Перемещение узла в TreeView</h3>
<p> Пример написан на VFP6SP5</p>
<p> В нем рассматривается вопрос организации перемещения узла дерева (элемента ActiveX TreeView)</p>
<p> Предложены 4 варианта решения:</p>
<p> 1. Использование методов OLEDragDrop<br /> 2. Использование обычных методов DragDrop<br /> 3. Использование ShortCut меню вообще без использования механизма Drag-Drop<br /> 4. Объединение методов OLEDragDrop и ShortCut меню </p>
<p> В примерах рассмотрена только визуальная часть решения. Вопрос о хранении древовидной структуры в базе данных намеренно игнорируется.</p>
<p> Исправлено и дополнено 18.11.2002    </div>
<div id="sol_avtor">Автор: Владимир Максимов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4899">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4899">Владимир Максимов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Владимир Максимов" href="https://foxclub.ru/account/?user=4899">
				<img alt='' src='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 65<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/peremeshhenie-uzla-v-treeview/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/faq-for-reports/</link>
					<title><![CDATA[FAQ for Reports]]></title>
                    					    <author><![CDATA[Владимир Максимов]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:16 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>FAQ for Reports</h1>
													</header>
													<div id="sol_opis">В данном проекте собраны ответы на наиболее часто встречающиеся вопросы относительно генератора отчетов (Report Designer). Проект написан на VFP6SP5. В главной форме можно заодно посмотреть простейший пример работы с TreeView</div>
<div id="sol_body">
<h3>FAQ for Reports</h3>
<p> В данном проекте собраны ответы на наиболее часто встречающиеся вопросы относительно генератора отчетов (Report Designer). Проект написан на VFP6SP5 </p>
<p> В главной форме можно заодно посмотреть простейший пример работы с TreeView </p>
<p> Проект написан на VFP6SP5 </p>
<p> Если у Вас более младшая версия VFP, то Вы не сможете запустить главную форму. Однако, можно просмотреть примеры и без нее, считывая суть вопроса из таблицы Contents и запуская на выполнение соответсвующие файлы PRG. </p>
<p> В примерах НЕ используется DataEnvironment отчетов. В качестве источника данных выступает КУРСОР. </p>
<p> Некоторые примеры взяты из журнала FoxTalk за Сентябрь 2001 (№9(51) русскоязыное издание) </p>
<p> Исправлено и дополнено 12.11.2002</p></div>
<div id="sol_avtor">Автор: Владимир Максимов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4899">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4899">Владимир Максимов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Владимир Максимов" href="https://foxclub.ru/account/?user=4899">
				<img alt='' src='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 65<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/faq-for-reports/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/windowsbar/</link>
					<title><![CDATA[WindowsBar]]></title>
                    					    <author><![CDATA[ChAO]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:21 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>WindowsBar</h1>
													</header>
													<div id="sol_opis">ToolBar, для быстрого доступа к открытым окнам VFP (аналог Windows'овского TaskBar).</div>
<div id="sol_body">
<h3>WindowsBar </h3>
<p> Создает кнопки с заголовками всех открытых окон.</p>
<p> Функции:<br /> Click on Button - Активизация окна;<br /> RightClick on Button - Закрытие окна;<br /> RightClick on ToolBar - Скрытие всех окон (эмуляция нажатия "Ctrl+Alt+Shift") для выхода из режима - нажатие любой клавиши на клавиатуре или мыши.</p>
<p> Для использования:<br />     Меню Tools / Options...<br />     Закладка File Locations<br />     Выбираем Startup Program<br />     Пишем "путьWindowsBar.prg"<br />     Нажимаем Set As Default<br />     Перезапускаем FoxPro</p>
<p> Буду рад замечаниям.     </p></div>
<div id="sol_avtor">Автор: ChAO</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4181">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4181">ChAO</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="ChAO" href="https://foxclub.ru/account/?user=4181">
				<img alt='' src='https://secure.gravatar.com/avatar/9cfdc7313559f3befcbe4e625fb4ed4d?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/9cfdc7313559f3befcbe4e625fb4ed4d?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-10-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/windowsbar/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ochistka-koda-v-formah-i-klassah-pri-sozdanii-prilozheniya/</link>
					<title><![CDATA[Очистка кода в формах и классах при создании приложения.]]></title>
                    					    <author><![CDATA[DimOK_L]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:21 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Очистка кода в формах и классах при создании приложения.</h1>
													</header>
													<div id="sol_opis">Перед тем как отдать приложение пользователю необходимо очистить код из форм и классов. Вот этим и занимается этот класс.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: DimOK</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="2760">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=2760">DimOK_L</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="DimOK_L" href="https://foxclub.ru/account/?user=2760">
				<img alt='' src='https://secure.gravatar.com/avatar/e306633a2eb74b5172af0a01169922b0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e306633a2eb74b5172af0a01169922b0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 05-03-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ochistka-koda-v-formah-i-klassah-pri-sozdanii-prilozheniya/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/splitbar/</link>
					<title><![CDATA[Splitbar]]></title>
                    					    <author><![CDATA[AlexM2002]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:21 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Splitbar</h1>
													</header>
													<div id="sol_opis">Разделитель, реализованный на базе класса Line.Предназначен для пропорционального изменения размеров двух обьектов при перетаскивании разделителя.</div>
<div id="sol_body">*При небольшой доработке можно преобразовать в вуртикальный splitbar *THISform.grid1,THISform.grid2 обьекты формы, размеры которых надо менять   thisform.addobject([LINE],[DELIMITER]) &&Добавили разделитель THISform.LINE.LEFT=THISform.grid1.width+1 THISform.LINE.TOP=THISform.grid1.TOP THISform.LINE.WIDTH=0 THISform.LINE.HEIGHT=THISform.grid1.HEIGHT THISform.LINE.VISIBLE=.T. THISform.LINE.lefttopmin=30&&Минимальный размер левого обьекта THISform.LINE.rightdownmin=30&&Минимальный размер правого обьекта THISform.LINE.LEFTOBJECT=[GRID1]&&Левый обьект THISform.LINE.RIGHTOBJECT=[GRID2]&&Правый обьект </div>
<div id="sol_avtor">Автор: Алексей</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4209">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4209">AlexM2002</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="AlexM2002" href="https://foxclub.ru/account/?user=4209">
				<img alt='' src='https://secure.gravatar.com/avatar/aa4ddaf1987c03a2a8d931a8b2eb7473?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/aa4ddaf1987c03a2a8d931a8b2eb7473?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 15-08-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/splitbar/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/eksport-dbf-v-excel/</link>
					<title><![CDATA[Экспорт DBF в Excel]]></title>
                    					    <author><![CDATA[savage]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:21 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Экспорт DBF в Excel</h1>
													</header>
													<div id="sol_opis">Всячески пытался решить проблему качественного экспорта в Excel. Стандартная команда работает неудовлетворительно (в плане оформления), метод через OLE – ну очень долгий! Поэтому решил скомбинировать – основную выгрузку сделал через стандартную команду, а потом украсил через OLE. Писалось под себя, поэтому чего-то может не быть. Тем не менее – опробуйте концепцию. </div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Шулындин Кирилл</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="15">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=15">savage</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="savage" href="https://foxclub.ru/account/?user=15">
				<img alt='' src='https://secure.gravatar.com/avatar/eca6060bfb82c3136632a78ca01ace63?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/eca6060bfb82c3136632a78ca01ace63?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-11-2003        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/eksport-dbf-v-excel/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/perevod-formy-iz-scx-v-prg_x000d_versiya-2-ispravlennaya-i-uluchshennaya/</link>
					<title><![CDATA[Перевод формы из scx в prg Версия 2. Исправленная и улучшенная.]]></title>
                    					    <author><![CDATA[Каратаев]]></author>
                    										    <pubDate>Sat, 05 Sep 2020 17:19:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Перевод формы из scx в prg Версия 2. Исправленная и улучшенная.</h1>
													</header>
													<div id="sol_opis">Данная программа предназначена для преобразования визуальной формы в PRG-файл, который объявляет ее через DEFINE CLASS.</div>
<div id="sol_body">
<p>Автор: Каратаев</p>
</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4982">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 1 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4982">Каратаев</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Каратаев" href="https://foxclub.ru/account/?user=4982">
				<img alt='' src='https://secure.gravatar.com/avatar/d6cebdac5e53dee88cab93bb5d71d48a?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/d6cebdac5e53dee88cab93bb5d71d48a?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 04-12-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/perevod-formy-iz-scx-v-prg_x000d_versiya-2-ispravlennaya-i-uluchshennaya/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/funkczionalnye-klavishi-kak-v-dose-neskolko-koryavo-vnutri-no-eto-dlya-prostoty/</link>
					<title><![CDATA[Функциональные клавиши &#8211; как в досе. Несколько коряво внутри, но это для простоты.]]></title>
                    					    <author><![CDATA[Maestro]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:21 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Функциональные клавиши &#8211; как в досе. Несколько коряво внутри, но это для простоты.</h1>
													</header>
													<div id="sol_opis">Все как в старом нортоне. Причем запоминаем предыдущую установку и всегда к ней возвращаемся. Пример я сгородил. Будут вопросы - пишите.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Евгений Гамза</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4692">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4692">Maestro</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Maestro" href="https://foxclub.ru/account/?user=4692">
				<img alt='' src='https://secure.gravatar.com/avatar/ca696dd907a4e5d8d991c959b921a2eb?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ca696dd907a4e5d8d991c959b921a2eb?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 14-08-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/funkczionalnye-klavishi-kak-v-dose-neskolko-koryavo-vnutri-no-eto-dlya-prostoty/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/class-progress-bar/</link>
					<title><![CDATA[Class Progress Bar]]></title>
                    					    <author><![CDATA[-=TsA=-]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Class Progress Bar</h1>
													</header>
													<div id="sol_opis">Класс Progress Bar. Cамое разнообразное оформление объемный, плоский, вертикальный, горизонтальный, с ракрывающимся рисунком</div>
<div id="sol_body">
<h3>Class Progress Bar</h3>
<p> Cамое разнообразное оформление объемный, плоский, вертикальный, горизонтальный, с ракрывающимся рисунком (Свойствa Style, Picture).<br /> Для использования сначало занесите максимальное значение в MaxValue, а затем в CurrentValue заносите текущее значение. Из свойства Value (только чтение) можно считывать процент выполнения. Автовыбор вертикальное или горизонтальное исполнение (зависит от отношения Height & Width.) 26.09.2002 - Добавлен пример. 28.09.2002 - Исправлен баг 'пропадание картинки при программном изменении размеров прогрессбара'    </div>
<div id="sol_avtor">Автор: -=TsA=-</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4523">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4523">-=TsA=-</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="-=TsA=-" href="https://foxclub.ru/account/?user=4523">
				<img alt='' src='https://secure.gravatar.com/avatar/760326611213712f6944ec6e0661e00e?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/760326611213712f6944ec6e0661e00e?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 26-08-2020        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/class-progress-bar/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/popytka-reshit-problemmu-activex-toolbar-svyazannuyu-s-modalnoj-formoj/</link>
					<title><![CDATA[Попытка решить проблемму ActiveX ToolBar связанную с модальной формой]]></title>
                    					    <author><![CDATA[AlexK]]></author>
                    										    <pubDate>Fri, 04 Nov 2022 14:33:14 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Попытка решить проблемму ActiveX ToolBar связанную с модальной формой</h1>
													</header>
													<div id="sol_opis">Попытка решить проблемму ActiveX ToolBar связанную с модальной формой с помощью таймера. Сначала Visible ТoolBar-a =.F. После запуска формы таймер переключает Visible в .Т. и форма остается модальной. В реальной программе не пробовал</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: AlexK</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4764">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 10 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4764">AlexK</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="AlexK" href="https://foxclub.ru/account/?user=4764">
				<img alt='' src='https://secure.gravatar.com/avatar/1fb49e8f115e8786c485b8112a62a69e?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1fb49e8f115e8786c485b8112a62a69e?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 9<i class="rcli fa-calendar-check-o"></i>Регистрация: 11-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/popytka-reshit-problemmu-activex-toolbar-svyazannuyu-s-modalnoj-formoj/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/alternativa-steku-dlya-peredachi-peremennyh-mezhdu-modulyami-tipa-takoj-reestor/</link>
					<title><![CDATA[Альтернатива Стеку. Для передачи переменных между модулями. Типа такой реестор&#8230;]]></title>
                    					    <author><![CDATA[Maestro]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:21 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Альтернатива Стеку. Для передачи переменных между модулями. Типа такой реестор&#8230;</h1>
													</header>
													<div id="sol_opis">Часто бывает необходимо во время работы модуля сохранить что-либо для дальнейшего использования или из формы передать некоторое число переменных. Это один из вариантов...</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Евгений Гамза</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4692">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4692">Maestro</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Maestro" href="https://foxclub.ru/account/?user=4692">
				<img alt='' src='https://secure.gravatar.com/avatar/ca696dd907a4e5d8d991c959b921a2eb?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ca696dd907a4e5d8d991c959b921a2eb?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 14-08-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/alternativa-steku-dlya-peredachi-peremennyh-mezhdu-modulyami-tipa-takoj-reestor/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/easytoolbar-toolbar-bez-problem/</link>
					<title><![CDATA[EasyToolBar &#8211; Toolbar без проблем]]></title>
                    					    <author><![CDATA[SANSoft]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>EasyToolBar &#8211; Toolbar без проблем</h1>
													</header>
													<div id="sol_opis">Попробуйте разработныый мною класс для ToolBar'a и определение кнопок тулбара перестанет быть скучным занятием 🙂</div>
<div id="sol_body">
<h3>EasyToolBar - Toolbar без проблем</h3>
<p> Попробуйте разработныый мною класс для ToolBar'a и определение кнопок тулбара перестанет быть<br /> скучным занятием 🙂</p>
<p> Иструкции в ReadMe.txt внутри архива,<br /> разрабатывался в VFP 7.0 SP1 (на предмет совместимости с предыдущими версиями не проверялся)</p>
<p> ** Примечание. Для тулбара, состояние которого не зависит от форм на экране, и реакция на кнопки<br /> которого, обрабатывется глобально, используйте традиционный подход.</p>
<p> Будут глюки - пишите   </p></div>
<div id="sol_avtor">Автор: SANSoft</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4347">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4347">SANSoft</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="SANSoft" href="https://foxclub.ru/account/?user=4347">
				<img alt='' src='https://secure.gravatar.com/avatar/a1bfcdf8367176ffbcbff3a56c55d3d2?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/a1bfcdf8367176ffbcbff3a56c55d3d2?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-09-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/easytoolbar-toolbar-bez-problem/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/vybor-papki-s-pomoshhyu-windows-api/</link>
					<title><![CDATA[Выбор папки с помощью Windows API]]></title>
                    					    <author><![CDATA[SANSoft]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Выбор папки с помощью Windows API</h1>
													</header>
													<div id="sol_opis">Попробуйте заменить встроенную функцию GetDir() на вызов системной функции SHBrowseForFolders</div>
<div id="sol_body">
<h3>Выбор папки с помощью Windows API</h3>
<p>  Попробуйте заменить встроенную функцию GetDir() на вызов системной функции SHBrowseForFolders.</p>
<p>  Выглядит куда приятнее, да и возможностей побольше.</p>
<p>  Будут глюки - пишите!</p>
<p>  ----------------------------------------------<br />  17.09.2002  Исправил глюк с отображением sMessage, переписал BrForFolder.h </div>
<div id="sol_avtor">Автор: SANSoft</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4347">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4347">SANSoft</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="SANSoft" href="https://foxclub.ru/account/?user=4347">
				<img alt='' src='https://secure.gravatar.com/avatar/a1bfcdf8367176ffbcbff3a56c55d3d2?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/a1bfcdf8367176ffbcbff3a56c55d3d2?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-09-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/vybor-papki-s-pomoshhyu-windows-api/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/nevernoe-otobrazhenie-otdelnyh-simvolov-ili-nesovpadenie-kodovyh-stranicz/</link>
					<title><![CDATA[Неверное отображение отдельных символов или несовпадение кодовых страниц]]></title>
                    					    <author><![CDATA[Владимир Максимов]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Неверное отображение отдельных символов или несовпадение кодовых страниц</h1>
													</header>
													<div id="sol_opis">Довольно часто в конференции возникает вопрос о том, что отдельные буквы русского языка отображаются неверно или вообще вместо русских букв отображается непонятно что. Здесь приведены возможные причины этой ошибки и пути ее решения.</div>
<div id="sol_body">
<h3>Неверное отображение отдельных символов или несовпадение кодовых страниц</h3>
<p> Довольно часто в конференции возникает вопрос о том, что отдельные буквы русского языка отображаются неверно. Ниже приведены 2 строки символов. Первая - это русские буквы, а вторая - это то как они отображаются в программе.</p>
<p> абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ<br /> абвaде,жзийклмнопdстуфoцчoщъыьy_яAAAAДЕ"ЖЗEЙEEIIIIDСOOOOЦxOUUUЬY_Я</p>
<p> Если Вы нашли совпадение с Вашей проблемой, то эта статья для Вас.</p>
<p> Проблема эта носит название "несовпадение кодовых страниц". Первая строка в приведенном примере написана в кодовой странице 1251(Win Rus), а вторая получена конвертацией ее в кодовую страницу 1252(Win USA). Практически каждый программист на FoxPro пишущий не для англоязычных пользователей рано или поздно, но обязательно с ней сталкивается.</p>
<p> Причины возникновения этой ошибки можно разделить на несколько групп:</p>
<p> I - Нет каких-либо служебных файлов или библиотек<br /> II - Не сделана нужная настройка среды FoxPro<br /> III - У использованных файлов указана не та или вообще не указана кодовая страница<br /> IV - Ошибки настройки операционной системы</p>
<p> Попробую разобрать причины возникновения этой ошибки по порядку.</p>
<p> I - Нет каких-либо служебных файлов или библиотек</p>
<p> До версии VFP5 включительно вместе с готовым EXE-файлом клентам необходимо было еще поставлять специальный служебный файл FOXPRO.INT </p>
<p> Этот файл указывал FoxPro как именно следует читать разные кодовые страницы. При его отсутствии FoxPro приходил в большое недоумение. Этот файл требуется класть рядом с готовым EXE. Причем именно "рядом". Включать его внутрь готового EXE - нельзя. Файл поставлялся вместе с FoxPro и лежал в его корневой директории.</p>
<p> Начиная с версии VFP6 надобность в этом файле отпала. </p>
<p> Можно вздохнуть с облегчением и выразить отдельную благодарность MicroSoft вообще и разработчикам VFP в частности.  Останавливает меня только то, что была выпущена 7 версия FoxPro и по слухам аналогичные проблемы появились при создании дистрибутивов. Поскольку у меня нет 7 версии, то и не буду распространять слухи, подождем сервис паки и коментарии тех у кого он есть.</p>
<p> II - Не сделана нужная настройка среды FoxPro</p>
<p> Данная проблема связана с логикой работы FoxPro в отношении кодовых страниц. Дело в том, что по умолчанию, FoxPro не поддерживает автоматическую трансляцию символьных и мемо-полей. Более того, не поддерживается трансляция и откомпилированных текстовых файлов (FXP, TXT).</p>
<p> Если ваш проект был создан в системе с той же кодовой страницей, что и у клиента, то вы и не заметите разницы. Поскольку если автоматическая трансляция в FoxPro не была включена, то FoxPro будет предполагать, что все данные следует отображать в текущей кодовой странице системы. Исключением в этом смысле является VFP7 - тут разница будет заметной (с MicroSoft - не соскучишся).</p>
<p> Включить автоматическую трансляцию символьных данных можно одним единственным способом. Для этого требуется создать обычный текстовый файл с именем CONFIG.FPW и вписать в него следующую строчку </p>
<p> CODEPAGE=1251</p>
<p> Эта строка имеет 2 смысла:<br /> -) Сам факт наличия ключевого слова "CODEPAGE" для FoxPro является признаком того, что следует включить автоматическую трансляцию кодовых страниц.<br /> -) Значение правой части указывает в какой кодовой странице следует читать текстовые данные, если признак кодовой страницы явно не указан. А также, в какой кодовой странице следует создавать новые файлы, если кодовая страница не указана явно.</p>
<p> В руководстве по FoxPro рекомендуют писать строку</p>
<p> CODEPAGE=AUTO</p>
<p> Однако, проблема заключается в том, что если ваш проект предполагает создание новых файлов, то при указании ключевого слова AUTO, вместо номера кодовой страницы все эти новые файлы будут создаваться в текущей кодовой странице системы. А она может быть отлична от 1251.</p>
<p> Строго говоря, как уже было сказано, наличие этой настройки в большинстве случаев не обязательно. Однако, ее отсутсвие будет заметно если:</p>
<p> -) Вы работаете со старыми DOS таблицами в 866 кодовой странице<br /> -) У клиентов в системе текущей кодовой страницей не является 1251<br /> -) Вы работаете в VFP7</p>
<p> Остановлюсь немного на последнем пункте. Если до выхода 7 версии предполагалось, что при отсутствии явного указания на автоматическую трансляцию кодовых страниц следует брать кодовую страницу системы, то в откомпилированном EXE файле версии VFP7 по видимому предполагается, что надо брать кодовую страницу 1252 вне зависимости от кодовой страницы системы.</p>
<p> В отличии от файла FOXPRO.INT, файл CONFIG.FPW можно включать в проект и не поставлять отдельно от готового EXE. Следует только помнить, что настройки файла конфигурации устанавливаются один раз при запуске среды FoxPro. Это значит, что после запуска среды FoxPro никакие изменения в файле конфигурации не приведут к изменению настроек среды FoxPro. Необходимо будет перезагрузить FoxPro.</p>
<p> Подключить файл конфигурации на этапе разработки можно таким образом:</p>
<p> "C:Program FilesMicrosoft Visual StudioVfp98VFP6.EXE" -C"C:MyProjectsProject1config.fpw"</p>
<p> Ключ "-C" указывает, что следом за ним стоит имя файла конфигурации, который следует использовать при запуске FoxPro. Строго говоря, в данном случае имя файла конфигурации может быть абсолютно любым, но лучше придерживаться принятых наименований. Идеальным вариантом является создание ярлыка на рабочем столе, для запуска своего проекта.</p>
<p> Для готового EXE-файла достаточно просто положить файл CONFIG.FPW в ту же директорию, где находится и сам EXE-файл.</p>
<p> Подробнее о других способах использования файла конфигурации и различных настройках, которые можно сделать через него, читайте в руководстве к FoxPro.</p>
<p> Для наиболее любознательных:</p>
<p> -)Можно сделать настройку кодовой страницы и в системном реестре Windows. Для этого следует в</p>
<p> HKEY_CURRENT_USERSoftwareMicrosoftVisualFoxPro6.0Options </p>
<p> Создать дополнительный строковый параметр CodePage и присвоить ему значение 1251.</p>
<p> -)Отменить автоконвертацию некоторых полей таблицы можно используя настройку SET NOCPTRANS. Это имеет смысл для полей типа Binary, где конвертация все-равно ничего не даст.</p>
<p> III - У использованных файлов указана не та или вообще не указана кодовая страница</p>
<p> Причины установки неверной кодовой страницы может быть 2:</p>
<p> -) При создании файла не было файла конфигурации CONFIG.FPW со строкой CODEPAGE=1251. В этом случае все новые файлы будут созданы в кодовой странице операционной системы.<br /> -) Файлы, использованные в проекте были скопированы из других источников. Например, все файлы стандартных примеров Solution.pjx и TasTrade.pjx созданы в кодовой странице 1252.</p>
<p> Посмотреть кодовые страницы всех файлов включенных в проект можно через пункт главного меню Project->Project Info->закладка Files</p>
<p> Изменить кодовую страницу текстовых файлов (TXT,PRG,QPR) можно там же, щелкнув правой клавишей мыши на нужном файле и выбрав в появившемся меню пункт CodePage.</p>
<p> Прочие файлы, входящие в проект (формы, классы, отчеты) по своей сути являются обычными DBF-таблицами. Для изменения их кодовых страниц вместе с FoxPro поставляется специальная программа CPZERO.PRG. Эта программа расположена в (корневая директория FoxPro)TOOLSCPZERO</p>
<p> Для изменения кодовых страниц следует дать команду<br /> DO CPZERO.PRG WITH "MyForm.SCX",1251<br /> DO CPZERO.PRG WITH "MyClass.VCX",1251<br /> DO CPZERO.PRG WITH "MyMenu.MNX",1251<br /> DO CPZERO.PRG WITH "MyProject.PJX",1251<br /> DO CPZERO.PRG WITH "MyBase.DBC",1251</p>
<p> В данном случае, указывать расширение файлов необходимо.</p>
<p> Отдельно, следует сказать о поддержке таблиц, созданных в FoxPro for DOS. В те далекие времена (уж лет 5 тому) кодовая страница или вообще не использовалась или использовалась 866 кодовая страница.</p>
<p> В файлах созданных в FPD2.0 по умолчанию кодовая страница вообще не указывалась. Для таких файлов следует устанавливать кодовую страницу 866. На работу старых DOS-приложений это никак не повлияет, но в VFP информация будет отображаться как надо.</p>
<p> Если в вашем проекте используются таблицы в 866 кодовой странице, то наличие файла конфигурации CONFIG.FPW со строкой CODEPAGE=1251 становится просто необходимым.</p>
<p> Для проверки текущей кодовой страницы DBF-таблиц можно воспользоваться функцией CPDBF()</p>
<p> IV - Ошибки настройки операционной системы</p>
<p> Ну вот, дошли до любимых всеми программистами ошибок настроек операционной системы. Как правило, о них вспоминают или в первую или в последнюю очередь. Это ошибки связаны с тем, что по умолчанию операционная система в некоторых случаях считает, что отдельные объекты проекта или весь проект написан в кодовой странице 1252.</p>
<p> Для исправления этого недоразумения проще всего велеть системе несмотря на то, что она считает что что-то имеет кодовую страницу 1252 обрабатывать это что-то как имеющую кодовую страницу 1251. Т.е. надо влезть в системный реестр и поменять все ссылки с 1252 на 1251. К сожалению, я не могу указать полный перечень адресов, где такая замена необходима. Единственный обязательный адрес это:</p>
<p> [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlNlsCodePage]<br /> "1252"="c_1251.nls"</p>
<p> Эта ошибка характерна для отображения данных в ActiveX компонентах, если проект был создан в Win9x, а готовый EXE запускается в среде WinNT, WinXP или Win2000</p>
<p> Вот, кажется, и все. Буду рад любым замечаниям и дополнениям.   </p></div>
<div id="sol_avtor">Автор: Владимир Максимов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4899">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4899">Владимир Максимов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Владимир Максимов" href="https://foxclub.ru/account/?user=4899">
				<img alt='' src='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 65<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/nevernoe-otobrazhenie-otdelnyh-simvolov-ili-nesovpadenie-kodovyh-stranicz/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/otpravka-sms-soobshhenij-iz-foxa-cherez-sotovyj-telefon-podklyuchennyj-k-com-portu/</link>
					<title><![CDATA[Отправка SMS сообщений из FOXа через сотовый телефон, подключенный к COM порту.]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Отправка SMS сообщений из FOXа через сотовый телефон, подключенный к COM порту.</h1>
													</header>
													<div id="sol_opis">Функция отправки СМС сообщений из приложений через подключенный к COM порту сотовый телефон. СМС шлюзы интернета не используются, речь идет именно об отправке через телефон.  Функция получает два параметра: нромер телефона  и строку собственно сообщения, которую необходимо передать. Требует ActiveX компонент MicrosoftCommunication Control на форме, из которой вызывается. Сообщения передаются только латиницей.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: geo</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/otpravka-sms-soobshhenij-iz-foxa-cherez-sotovyj-telefon-podklyuchennyj-k-com-portu/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/vvod-teksta-s-podskazkoj/</link>
					<title><![CDATA[Ввод текста с подсказкой]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Ввод текста с подсказкой</h1>
													</header>
													<div id="sol_opis">Данный класс был попыткой облегчения ввода информации из справочников. Для примера сделана обработка только полей типа CHAR</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Морозов В.А.</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/vvod-teksta-s-podskazkoj/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/prozrachnaya-forma-klass-glassform/</link>
					<title><![CDATA[Прозрачная форма (Класс GlassForm)]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Прозрачная форма (Класс GlassForm)</h1>
													</header>
													<div id="sol_opis">Класс, позволяющий делать форму прозрачной (для Win9... и далее). Кладете класс на форму - он отражается в виде кнопки. В процессе работы жмете на неё - форма становиться прозрачной,можете передвигать форму по экрану - она остаётся прозрачной, еще раз жмете - и форма принимает прежний (непрозрачный) вид. Удачи!</div>
<div id="sol_body">
<h3>Прозрачная форма (Класс GlassForm) </h3>
<p> Когда-то, неизвестно откуда скачал пример - "Полупрозрачная форма", в которой описывалось как сделать форму прозрачной. А затем недели 2 назад на UNIVERSAL Thread FoxPRO нашел класс GlassForm от Roi Ledford (roi@futureblur.com). Всё бы хорошо, но этот класс работал только под WIN2000 и выше. Всё что я сделал - это доработал этот класс, чтобы он работал под любым Виндовозом. Пример использования прилагается. Жмёте кнопку на форме - форма становится прозрачной, можете передвигать форму по экрану - она остаётся прозрачной, еще раз жмете - и форма принимает прежний (непрозрачный) вид. Для работы запустите проект PROBA или GLASSFORM. Под WIN2000 и выше больше возможностей показывает GLASSFORM - здесь ещё можно задать через параметры скорость с какой форма будет становиться прозрачной - плавно или мгновенно. Под Win98 и ниже это увы не работает. <br /> Здесь хочу высказать большое спасибо и выразить свою огромную признательность всем коллегам, принимающим активное участие в работе этого форума, за их решения, помощь и советы в таком трудном деле как освоение VisualFox! Без вашей неоценимой помощи я бы долго с ним кувыркался.   </div>
<div id="sol_avtor">Автор: vau, Roi Ledford.</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/prozrachnaya-forma-klass-glassform/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/programma-prosmotr-i-obrabotka-vhodyashhih-faksovformat-pcx/</link>
					<title><![CDATA[Программа &#8211; просмотр и обработка входящих факсов(формат PCX).]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Программа &#8211; просмотр и обработка входящих факсов(формат PCX).</h1>
													</header>
													<div id="sol_opis">Программа - пример работы с приложением ImageKodak из стандартного пакета Windows98</div>
<div id="sol_body">Архив разделен на 3 части по ~ 500Kb:<br />  <a href=261ImageKodak.part1.zip>261ImageKodak.part1.zip</a><br /> <a href=262ImageKodak.part2.zip>262ImageKodak.part2.zip</a><br /> <a href=263ImageKodak.part3.zip>263ImageKodak.part3.zip</a></div>
<div id="sol_avtor">Автор: Морозов В.А.</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/programma-prosmotr-i-obrabotka-vhodyashhih-faksovformat-pcx/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/shifrovanie-dannyh-s-ispolzovaniem-sredstv-kriptografii-windows/</link>
					<title><![CDATA[Шифрование данных с использованием средств криптографии WINDOWS.]]></title>
                    					    <author><![CDATA[_vit]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Шифрование данных с использованием средств криптографии WINDOWS.</h1>
													</header>
													<div id="sol_opis">Использование объектов CAPICOM позволяет в 3-4 строки шифровать/дешифровать данные с использованием сложных средств криптографии WINDOWS.</div>
<div id="sol_body">
<h3>Шифрование данных с использованием средств криптографии WINDOWS.  </h3>
<h2>Использование объектов криптографии CAPICOM в VisualFoxPro</h2>
<p>  </p>
<p>Как известно, средства криптографии включены в состав Windows (по крайней мере, насколько мне известно, начиная с Win95). Для использования этих средств в приложениях, Microsoft любезно предоставила <b>CryptoAPI. </b>Но его использование может показаться сложным для разработчиков на Фоксе не знакомых с языком программирования Си.</p>
<p>Однако есть еще одно решение с помощью которого применение средств криптографии Windows становиться предельно просто, это CAPICOM. Весь код шифрования/дешифрования занимает несколько строк, надо лишь иметь зарегистрированную в системе библиотеку CAPICOM.dll.</p>
<p>  </p>
<h4>Шифрование строки символов</h4>
<dl>   </p>
<dd>oCAPI = CREATEOBJECT('CAPICOM.EncryptedData')    && создаем объект</dd>
<dd>oCAPI.Content = "Test Data for encryption"       && шифруемая строка</dd>
<dd>oCAPI.setsecret("MyPassword")                    && генерируем из пароля ключ шифрования</dd>
<dd>cEncData = oCAPI.encrypt()                       && Шифруем</dd>
<dd>release oCAPI                                    && освобождаем объект</dd>
<dd>? cEncData</dd>
<p> </dl>
<p>Переменная cEncData содержит теперь контент с зашифрованной строкой</p>
<h4>Дешифрование</h4>
<dl>   </p>
<dd>oCAPI = CREATEOBJECT('CAPICOM.EncryptedData') </dd>
<dd>oCAPI.setsecret("MyPassword") </dd>
<dd>oCAPI.decrypt(cEncData) </dd>
<dd>? oCAPI.Content</dd>
<p> </dl>
<p>   </p>
<p>Свойство Content теперь содержит расшифрованную строку.</p>
<p>Настолько просто, что теперь данные не шифрует только ленивый :0)</p>
<p>При необходимости использования алгоритма шифрования и длины ключа, отличных от используемых по умолчанию необходимо перед вызовом метода <b>setsecret()</b> установить свойства объекта <b>Algorithm</b> - <b>Name</b> и <b>KeyLength</b>.</p>
<p>Например:   </p>
<dl>   </p>
<dd>oCAPI.Algorithm.Name = CAPICOM_ENCRYPTION_ALGORITHM_RC4 </dd>
<dd>oCAPI.Algorithm.KeyLength = CAPICOM_ENCRYPTION_KEY_LENGTH_MAXIMUM</dd>
<p> </dl>
<p>   </p>
<p>Список констант возможных алгоритмов см CAPICOM.h</p>
<p>При дешифровке нет необходимости указывать алгоритм и длину ключа, поскольку при шифровании, CAPICOM “укладывает” эти данные в контент.</p>
<p>Кроме шифрования CAPICOM может быть использовано для формирования цифровой подписи, проверки сигнатур, хеширования данных, работы с хранилищами сертификатов.</p>
<p>Скачать CAPICOM 2.0 можно здесь:</br> <a href="http://download.microsoft.com/download/whistler/Install/2.0/W982KMeXP/EN-US/CC2RINST.EXE">http://download.microsoft.com/download/whistler/Install/2.0/W982KMeXP/EN-US/CC2RINST.EXE</a> </p>
<h4>Установка</h4>
<p>   </p>
<p>• Скопируйте CAPICOM.dll в системную папку Windows</p>
<p>• Зарегистрируйте, для этого в папке с установленным CAPICOM.dll в командной строке введите команду:    </p>
<dl>
<dd><small>regsvr32 CAPICOM.dll</small></dd>
</dl>
<p>    </p>
<p>CAPICOM 1.0 - может быть использовано в среде Microsoft Windows 95, Microsoft Windows 98, Microsoft Windows ME, Microsoft Windows NT 4.0, Microsoft Windows 2000, Windows XP и Windows .NET Server.</br> CAPICOM 2.0 - Windows 98, Windows Me, Windows NT 4.0, Windows 2000, Windows XP и Windows .NET Server.</br> Для обоих CAPICOM 1.0 и CAPICOM 2.0, требуется наличие Microsoft Internet Explorer не младше версии 5.0.</p>
<p>  </div>
<div id="sol_avtor">Автор: Vit</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4793">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4793">_vit</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="_vit" href="https://foxclub.ru/account/?user=4793">
				<img alt='' src='https://secure.gravatar.com/avatar/ddbbb3fd798e21172fd1bb27b6bbbc13?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ddbbb3fd798e21172fd1bb27b6bbbc13?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 29-07-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/shifrovanie-dannyh-s-ispolzovaniem-sredstv-kriptografii-windows/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/opisanie-struktur-tablicz/</link>
					<title><![CDATA[Описание структур таблиц]]></title>
                    					    <author><![CDATA[dvp]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Описание структур таблиц</h1>
													</header>
													<div id="sol_opis">Создание текстового файла с описанием структуры таблиц из указанного каталога</div>
<div id="sol_body">
<h3>Описание структур таблиц</h3>
<p> Небольшая програмка для формирования текстового файла с описанием структуры таблиц из указанного каталога. Была необходима для распечатки на матричном принтере. При работе создает таблицу, в которой можно указать назначение обрабатываемых таблиц и полей. Возможно есть что-то подобное и получше. Буду рад если кому-то эта штука пригодится.  </p></div>
<div id="sol_avtor">Автор: Дмитрий Петров</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1888">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 23 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1888">dvp</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="dvp" href="https://foxclub.ru/account/?user=1888">
				<img alt='' src='https://secure.gravatar.com/avatar/2b80585062171452f39df1a339781899?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/2b80585062171452f39df1a339781899?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 19-11-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/opisanie-struktur-tablicz/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/zapushhen-li-ekzemplyar-prilozheniya/</link>
					<title><![CDATA[Запущен ли экземпляр приложения]]></title>
                    					    <author><![CDATA[_vit]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Запущен ли экземпляр приложения</h1>
													</header>
													<div id="sol_opis">Определение запущеного экземпляра приложения с использованием именованного объекта ядра. (WINDOWS NT/200/XP)</div>
<div id="sol_body">
<h3>Запущен ли экземпляр приложения</h3>
<p> Здесь в решениях, уже описывались разные способы определения - запущен ли экземпляр приложения. <br /> Каждый из них имеет свои достоинства и недостатки. <br /> Способ, основанный на поиске окна, не годиться для приложений, где название окна меняется динамически. <br /> Способ, основанный на блокировке таблицы, может требовать наличие дополнительной таблицы. <br /> Предлагаю Вашему вниманию еще один способ, основанный на именованных объектах ядра WINDOWS. </p>
<p> Приведенный ниже фрагмент кода необходимо вносить в начало главной программы проекта. </p>
<p>     #Define ERROR_ALREDY_EXIST 183<br />     #Define MUTEX_NAME "{F93A88FF-2FEC-4f8f-8347-5B53D3E143F5}"</p>
<p>     Declare integer CreateMutex in kernel32 integer lpMutexAttributes, ;<br />         integer bInitialOwner, string lpName<br />     Declare integer CloseHandle in kernel32 integer hObject<br />     Declare integer GetLastError in kernel32 </p>
<p>     * Открываем объект ядра (в данном случае мьютекс)<br />     hMutex = CreateMutex(0, 0, MUTEX_NAME)</p>
<p>     * Проверяем существует ли объект с этим именем<br />     if GetLastError() = ERROR_ALREDY_EXIST<br />         * если существует закрываем экземпляр приложения<br />         = messagebox("Application already run", 16)<br />         = CloseHandle(hMutex)<br />         Quit<br />     endif</p>
<p>     * Если не существует <br />     * Далее продолжение программы<br />     *...</p>
<p> Перед окончанием программы необходимо закрыть объект ядра </p>
<p>     = CloseHandle(hMutex)</p>
<p> Поскольку именованные объекты ядра независимо от типа, имеют общее пространство имен, во избежании неприятностей при совпадении имени вашего объекта с уже существующими в системе или создаваемыми другими приложениями в будущем, необходимо тщательно подходить к выбору имени объекта. <br /> В данном примере в качестве имени используется сгенерированный GUID (глобально уникальный идентификатор). <br /> Использование GUID не обязательно, но важно обеспечить уникальность имени. </p>
<p> Недостаток этого способа заключается в том, что в WINDOWS 95/98/ME именованные объекты ядра не реализованы, его использование возможно только в NT/2000/XP. </p></div>
<div id="sol_avtor">Автор: Vit</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4793">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4793">_vit</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="_vit" href="https://foxclub.ru/account/?user=4793">
				<img alt='' src='https://secure.gravatar.com/avatar/ddbbb3fd798e21172fd1bb27b6bbbc13?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ddbbb3fd798e21172fd1bb27b6bbbc13?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 29-07-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/zapushhen-li-ekzemplyar-prilozheniya/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/indikator-yazyka-klaviatury/</link>
					<title><![CDATA[Индикатор языка клавиатуры]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Индикатор языка клавиатуры</h1>
													</header>
													<div id="sol_opis">Индикатор клавиатуры показывает текущий язык, а также позволяет сменить язык клавиатуры. Достаточно щелкнуть индикатор, а затем выбрать нужный язык из списка. Может быть полезен для диалога ввода пароля и т.п. Тестировался для VFP5, VFP7 (VFP6 - не пробовал).  OS Win98, WinNT, Win2000, WinXP (Win95 - не продовал).  ВНИМАНИЕ! Отслеживание изменения языка клавиатуры реализовано через таймер с небольшим интервалом срабатывания.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Сандалов Андрей</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/indikator-yazyka-klaviatury/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/statusbar-v-prilozhenii-na-osnove-top-level-form/</link>
					<title><![CDATA[StatusBar в приложении на основе Top Level Form.]]></title>
                    					    <author><![CDATA[po2]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>StatusBar в приложении на основе Top Level Form.</h1>
													</header>
													<div id="sol_opis">Пример переноса стандартного StatusBar'а в приложение выполненное на основе Top Level Form.</div>
<div id="sol_body">
<h3>StatusBar в приложении на основе Top Level Form.</h3>
<p> Просматривая после отпуска материалы конференции, наткнулся на обсуждение возможности отобразить стандартный StatusBar в приложении на основе Top Level Form. На тот момент я был полностью уверен в невозможности такого переноса, тем более, что в свое время вынужден был использовать соответствующий ActiveX. Однако один из участников обсуждения упомянул программы автора Владимира Яйленко (http://yvs.makeevka.com:8101/index.htm), в которых вроде бы стандартный StatusBar мирно уживается с Top Level Form. Хотя при ближайшем рассмотрении все весьма достойные приложения Владимира Яйленко оказались выполненными с использованием Screen’а, решил вернуться к прошлым опытам. Тем более, что само по себе, переназначение родителя для некоторого дочернего  окна - операция тривиальная. Сложнее было догадаться, как обойти нежелание Fox’а обновлять состояние StatusBar’а при значении _Screen.Visible=.f. К счастью оказалось, что Fox как обычно больше верит себе, чем операционной системе. Поэтому оказалось достаточным после манипуляций по переносу окна StatusBar’а в заранее созданную панель инструментов встроенную в Top Level Form, установить флажок _Screen.Visible=.t. и скрыть основное окно Fox’а с помощью API-функции ShowWindow().<br /> Пример представлен в виде законченного проекта. Необходимо собрать исполняемый EXE-модуль, который запустить с помощью команды Выполнить... из меню на кнопке Пуск. <br /> Модуль тестировался под управлением Windows 98SE(VFP6SP5,VFP7)   </div>
<div id="sol_avtor">Автор: Ившев Дмитрий</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4770">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 8 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4770">po2</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="po2" href="https://foxclub.ru/account/?user=4770">
				<img alt='' src='https://secure.gravatar.com/avatar/c214a28bf1871abdce1868aac0111f84?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c214a28bf1871abdce1868aac0111f84?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 22-12-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/statusbar-v-prilozhenii-na-osnove-top-level-form/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/pereklyuchenie-raskladki-klaviatury-v-grid_x000d_/</link>
					<title><![CDATA[Переключение раскладки клавиатуры в Grid_x000D_]]></title>
                    					    <author><![CDATA[Каратаев]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Переключение раскладки клавиатуры в Grid_x000D_</h1>
													</header>
													<div id="sol_opis">Проблема: при вводе данных оператором в числовом поле точка (разделитель разрядов) на правой цифровой клавиатуре (ПЦК), при ее русской раскладке, не ставиться. Приходится переключаться, а это их (операторов) нервирует и тормозит работу.</div>
<div id="sol_body">
<h3>Переключение раскладки клавиатуры в Grid </h3>
<p> Переключение раскладки клавиатуры в Grid<br /> Проблема: при вводе данных оператором в числовом поле точка (разделитель разрядов) <br /> на правой цифровой клавиатуре (ПЦК), при ее русской раскладке, не ставиться.<br /> Приходится переключаться, а это их (операторов) нервирует и тормозит работу.<br /> Причем столкнулся с тем, что на некоторых машинах наоборот - точка на ПЦК <br /> не ставиться именно при английской раскладке... не стал вникать почему (ну <br /> не ставиться да и бог с ней)<br /> На конференции часто встречаются вопросы по этому поводу, <br /> а тут и мне заказчики задали задачу: "А нельзя ли...?"<br /> Ну, естественно можно. И сделал так:<br /> (Сразу оговорюсь, что сам ничего не придумал, все взято из материалов конференции)<br /> *=======================================================<br /> * В программе перед открытием формы<br /> PRIVATE cRasklad, cRaskladDef<br /> store '00000409' TO cRasklad     && раскладка клавиатуры в числовом поле = En <br /> store '00000419' TO cRaskladDef  && раскладка клавиатуры по умолчанию = Ru<br /> * на самом же деле эти значения я храню в ini-файле и юзер может их настроить<br /> * под свою машину<br /> *<br /> * Дальше открываем форму<br /> DO Form Форма_с_Гридом<br /> *=======================================================<br /> * В событии AfterRowColChange для Grid пишу:<br /> LPARAMETERS nColIndex<br /> DO CASE <br />    CASE TYPE(SYS(18)) = "N"<br />      DO a_keyb WITH 0<br />    OTHERWISE<br />      DO a_keyb WITH 1<br /> ENDCASE        <br /> *=======================================================<br /> * Вот и все.<br /> * Пардон, забыл про a_keyb.prg, вот он:<br /> * (Это как раз то, что я и взял из материалов конференции)<br /> ********************************<br /> * Файл a_keyb.prg <br /> ********************************<br /> PARAMETERS tVid<br /> DECLARE INTEGER GetKeyboardLayoutName IN win32api STRING cKeyboard<br /> DECLARE INTEGER LoadKeyboardLayout IN win32api STRING cp1, INTEGER np2<br /> cKeyboard = space(100)<br /> GetKeyboardLayoutName(@cKeyboard) </p>
<p> DO CASE <br /> 	CASE tVid = 0   && переключить для числ. поля<br />  		if m.cKeyboard # cRasklad<br />     			LoadKeyboardLayout( cRasklad, 1)  <br />  	    	ENDIF   	<br /> 	CASE tVid = 1    && вернуть по умолчанию<br /> 	   	LoadKeyboardLayout( cRaskladDef, 1)  <br /> 	ENDCASE <br /> Clear DLLs GetKeyboardLayoutName,LoadKeyboardLayout<br /> return<br /> *******************************************<br /> И все. Никакого торможения работы в форме я не заметил.<br /> К сожалению не нашел метод в Форме, который бы вроде<br /> AfterRowColChange для Grid отслеживал изменения фокусировки<br /> объектов Формы. А в каждом объекте писать проверку что то не<br /> хочется.<br /> Буду рад всем замечаниям и подсказкам. Раз проблема есть,<br /> то совместными усилиями можем получить ее нормальное разрешение.<br /> А все, что выше, - это лишь одна из попыток.</p>
<p> С уважением Каратаев       ddw2@yandex.ru    </div>
<div id="sol_avtor">Автор: Каратаев</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4982">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 1 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4982">Каратаев</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Каратаев" href="https://foxclub.ru/account/?user=4982">
				<img alt='' src='https://secure.gravatar.com/avatar/d6cebdac5e53dee88cab93bb5d71d48a?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/d6cebdac5e53dee88cab93bb5d71d48a?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 04-12-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/pereklyuchenie-raskladki-klaviatury-v-grid_x000d_/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/perevod-denezhnoj-summy-iz-chisla-v-slova/</link>
					<title><![CDATA[Перевод денежной суммы из числа в слова]]></title>
                    					    <author><![CDATA[Владимир Максимов]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Перевод денежной суммы из числа в слова</h1>
													</header>
													<div id="sol_opis">Перевод денежной суммы из числового представления в слова. Сумма может содержать до 15 разрядов в целой части и до 18 разрядов в дробной. Возможно округление результата.</div>
<div id="sol_body">
<h3>Перевод денежной суммы из числа в слова</h3>
<p> Несколько слов о том, почему я вообще решил выложить это решение. Вроде бы большое количество примеров на эту тему есть в разделе "Нетривиальные задачи", да и здесь есть решение Михаила Дунькина - "propis". </p>
<p> Вот поначалу и я так подумал. Но оказалось, что в разделе "Нетривиальные задача" к этому решению предъявлялось ряд специфических требований выполнение которых делало код практически нечитаемым. Мне потребовалось почти полдня чтобы разобраться в логике всех представленных там решений. А если добавить к этому, что в представленных решения слова "рубли" и "копейки" вообще не фигурируют, то использование их "в чистом виде" становится крайне затруднительным. </p>
<p> Вот поэтому, я и решил взяв кое-какие полезные идеи из предоставленных решений довести их до стадии "рублей" и "копеек".  </p>
<p> Получившийся код не есть идеал с точки зрения эффективности или производительности. Моя задача была сделать его достаточно простым и максимально понятным с тем, чтобы любой пользователь мог с легкостью адаптировать предлагаемый код под свою задачу затратив минимальные усилия. Надеюсь, это мне удалось. </p></div>
<div id="sol_avtor">Автор: Владимир Максимов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4899">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4899">Владимир Максимов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Владимир Максимов" href="https://foxclub.ru/account/?user=4899">
				<img alt='' src='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 65<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/perevod-denezhnoj-summy-iz-chisla-v-slova/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/rabota-so-spravochnikami/</link>
					<title><![CDATA[Работа со справочниками]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Работа со справочниками</h1>
													</header>
													<div id="sol_opis">Один из вариантов работы со справочниками</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Морозов В.А.</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/rabota-so-spravochnikami/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/igra-ping-pong/</link>
					<title><![CDATA[Игра &#8220;Ping-Pong&#8221;]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Игра &#8220;Ping-Pong&#8221;</h1>
													</header>
													<div id="sol_opis">Игра Ping-Pong</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Морозов В.А.</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/igra-ping-pong/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Игры]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/termometr-s-knopkoj-otmena/</link>
					<title><![CDATA[Термометр с кнопкой &#8220;Отмена&#8221;]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Термометр с кнопкой &#8220;Отмена&#8221;</h1>
													</header>
													<div id="sol_opis">Термометр с кнопкой "Отмена" Выполнен в виде COM объекта(EXE-файл) в архиве есть более полное описание</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: AID</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/termometr-s-knopkoj-otmena/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/upakovka-direktorii/</link>
					<title><![CDATA[Упаковка директории]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Упаковка директории</h1>
													</header>
													<div id="sol_opis">Сканирует текущую директорию, и если найдена пустая поддиректория, то она будет удалена.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Морозов В.А.</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/upakovka-direktorii/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/odin-iz-variantov-sortirovki/</link>
					<title><![CDATA[Один из вариантов сортировки.]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Один из вариантов сортировки.</h1>
													</header>
													<div id="sol_opis">1. Пример использования сортировки по нескольким полям в произвольном порядке 2. Пример использования OLEBOUNDCONTROL</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Морозов В.А.</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/odin-iz-variantov-sortirovki/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/skanirovanie-direktorii-i-poisk-fajlov-po-klyuchu/</link>
					<title><![CDATA[Сканирование директории и поиск файлов по ключу]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Сканирование директории и поиск файлов по ключу</h1>
													</header>
													<div id="sol_opis">Многие, наверное, пользовались или просто знают приложение FILES из стандартного пакета MS VisualFP (files.dll). Данная программа - попытка написать что-то свое. На выходе имеем курсор FILELIST.</div>
<div id="sol_body">
<h3>Сканирование директории и поиск файлов по ключу</h3>
<p> В Windows 2000 - была обнаружена проблема открытия OLE-приложения WORD. Основная проблема - оптимизация поиска файлов по ключевому слову. Кто работал над данной проблематикой просьба поделиться информацией.  </p></div>
<div id="sol_avtor">Автор: Морозов В.А.</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/skanirovanie-direktorii-i-poisk-fajlov-po-klyuchu/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/igra-tetris/</link>
					<title><![CDATA[Игра ТЕТРИС]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Игра ТЕТРИС</h1>
													</header>
													<div id="sol_opis">Игра ТЕТРИС, интересна логикой.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Морозов В.А.</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/igra-tetris/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/form-release-i-form-refresh-dlya-aktivnoj-formy/</link>
					<title><![CDATA[Form.Release и Form.Refresh для активной формы]]></title>
                    					    <author><![CDATA[Каратаев]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Form.Release и Form.Refresh для активной формы</h1>
													</header>
													<div id="sol_opis">Бывают случаи, когда несколько форм обращаются к одним и те же процедурам, по окончании работы которых, форма должна или обновиться или закрыться.</div>
<div id="sol_body">
<h3>Form.Release и Form.Refresh для активной формы</h3>
<p> Бывают случаи, когда несколько форм обращаются к одним и те же процедурам, по окончании работы которых, форма должна или обновиться или закрыться. <br /> Я долго мучался, пытаясь прописать в этих процедурах какая же форма в данный момент у меня открыта (активна) и что именно ее надо закрыть (обновить). Потом нашел выход, который и предлагаю тем, кто подобно мне еще на стадии "мучений". <br /> Две маленькие програмки: <br /> win_rele для закрытия формы <br /> win_ref для обновления <br /> Вызываются из процедуры, формы, откуда угодно. <br /> Do win_rele <br /> Do win_ref <br /> Ниже сами prg-шники (они в принципе одинаковы) </p>
<p> *** win_rele.prg <br /> PRIVATE cWin <br /> cWin = alltrim(WOUTPUT()) <br /> if not empty(cWin) <br />    oper = cWin+'.Release' <br />    &oper <br /> endif <br /> RETURN </p>
<p> *** win_ref.prg <br /> PRIVATE cWin <br /> cWin = alltrim(WOUTPUT()) <br /> if not empty(cWin) <br />    oper = cWin+'.Refresh' <br />    &oper <br /> endif <br /> RETURN </p>
<p> Конечно это не верх творчества, за что и приношу извинения опытным FoxPro-шникам, но кому то это может и пригодиться.  </p></div>
<div id="sol_avtor">Автор: Каратаев</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4982">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 1 год</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4982">Каратаев</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Каратаев" href="https://foxclub.ru/account/?user=4982">
				<img alt='' src='https://secure.gravatar.com/avatar/d6cebdac5e53dee88cab93bb5d71d48a?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/d6cebdac5e53dee88cab93bb5d71d48a?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 04-12-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/form-release-i-form-refresh-dlya-aktivnoj-formy/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/igra-morskoj-boj/</link>
					<title><![CDATA[Игра &#8220;Морской бой&#8221;]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Игра &#8220;Морской бой&#8221;</h1>
													</header>
													<div id="sol_opis">Игра Морской бой, интересна логикой</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Морозов В.А.</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/igra-morskoj-boj/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/raschet-trudoemkosti/</link>
					<title><![CDATA[Расчет трудоемкости]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Расчет трудоемкости</h1>
													</header>
													<div id="sol_opis">Расчет трудоемкости произведен по "Укрупненным нормам времени на разработку ПС СВТ", утвержденных Госкомитетом СССР по труду и социальным вопросам и ВЦПС (постановление № 358/22-20 от 24.09.1986 г.), уточненных 538 ПЗ в 1998, 1999 гг. с коэффициентом 0.85. Реализация алгоритмов на языке Ассемблер и С</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Морозов В.А.</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/raschet-trudoemkosti/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/rabota-s-reestrom-windows/</link>
					<title><![CDATA[Работа с реестром Windows]]></title>
                    					    <author><![CDATA[Олег Бляхеров]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Работа с реестром Windows</h1>
													</header>
													<div id="sol_opis">Класс RegistrMan обеспечивает создание, удаление ключей и их параметров, считывание и установку значений, регистрацию DLL, установку лицензий</div>
<div id="sol_body">
<h3>Работа с реестром Windows</h3>
<p> Представляю вниманию посетителей клуба средства для работы с реестром Windows. <br /> Недавно мне пришлось поучаствовать в одном проекте, в котором нужно было хранить большое количество разнообразных настроек. Большинство участников проекта решило, что их нужно хранить в реестре. Дескать, не каждый юзер влезет и вообще круто. И, хотя я был против (предпочитаю простые текстовые ini-файлы), мне же, как инструментальщику-любителю, и поручили изготовить соответствующий инструмент. <br /> Материалы для него частично подсмотрены в решениях, лежащих в клубе, частично выбраны прямо из MSDN. <br /> Средства оформлены в виде класса RegistrMan, методы которого позволяют создавать и удалять ключи реестра и их параметры, считывать и устанавливать значения параметров и т.п. На первом этапе в класс включены не все возможности, предоставляемые функциями API, работающими с реестром. В частности, за бортом остался экспорт/импорт ключей реестра. Возможно, в дальнейшем я и это добавлю, если будет потребность. <br /> Кроме того, в класс добавлены методы, обеспечивающие регистрацию DLL и OCX в реестре и установку лицензий для них. <br /> Помимо самой библиотеки registr.vcx в комплект входят еще четыре файла: <br /> registr.h - необходимые константы из WinReg.h, WinNT.h, WinError.h и т.п. <br /> foxpro.h - стандартный файл констант из поставки VFP6 <br /> registr.txt - описание класса <br /> regtest.prg - примерчик для проверки <br /> Класс проверялся под Win98 и WinXP. <br /> Желающие поучаствовать в развитии инструмента могут погонять его в других средах и на более крутых примерах. <br /> Обо всех замеченных ошибках и неудобствах просьба поскорее сообщить автору, дабы он (т.е. я) тоже свою пользу получил. <br /> С уважением, Олег Бляхеров <br /> olegvbru@yahoo.com     </div>
<div id="sol_avtor">Автор: Олег Бляхеров</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5049">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5049">Олег Бляхеров</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Олег Бляхеров" href="https://foxclub.ru/account/?user=5049">
				<img alt='' src='https://secure.gravatar.com/avatar/59254e455634d23d143dcfe629716d52?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/59254e455634d23d143dcfe629716d52?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 8<i class="rcli fa-calendar-check-o"></i>Регистрация: 23-04-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/rabota-s-reestrom-windows/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/igra-lines/</link>
					<title><![CDATA[Игра &#8216;Lines&#8217;]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Игра &#8216;Lines&#8217;</h1>
													</header>
													<div id="sol_opis">Игра 'Lines' (VFP 6.0 SP5) Эта игра была интересна разработкой игровой логики. Самым проблемным моментом в алгоритме было следующее: нахождение минимального из всех возможных путей от начального до конечного положения шарика. </div>
<div id="sol_body">
<h3>Игра 'Lines'</h3>
<p> В программе есть недочеты, которые лень устранять. Если кому интересно могу выслать исходники, если кто занимался этой проблемой, то просьба выслать алгоритм решения проблемы.    </p></div>
<div id="sol_avtor">Автор: Морозов В.А.</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/igra-lines/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/igra-krestiki-noliki/</link>
					<title><![CDATA[Игра &#8220;КРЕСТИКИ-НОЛИКИ&#8221;]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Игра &#8220;КРЕСТИКИ-НОЛИКИ&#8221;</h1>
													</header>
													<div id="sol_opis">Игра "КРЕСТИКИ-НОЛИКИ", был интересен разработкой логики</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Морозов В.А.</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/igra-krestiki-noliki/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kidaem-daanye-iz-msflexgridmshflexgridv-excel/</link>
					<title><![CDATA[Кидаем дааные из MSFLEXGRID(MSHFLEXGRID)в excel]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Кидаем дааные из MSFLEXGRID(MSHFLEXGRID)в excel</h1>
													</header>
													<div id="sol_opis">Позволяект пересылать данные в excel для дальнеишего использования</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: zgogilava</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kidaem-daanye-iz-msflexgridmshflexgridv-excel/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/proverka-korrektnosti-inn-i-20-ti-znachnyh-bankovskih-schetov/</link>
					<title><![CDATA[Проверка корректности ИНН и 20-ти значных банковских счетов]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Проверка корректности ИНН и 20-ти значных банковских счетов</h1>
													</header>
													<div id="sol_opis">Написаны 2 функции, оформленные как 2 отдельных PRG-файла, проверяющие корректность значений ИНН и 20-ти значных банковских счетов на основе расчета их контрольных сумм.  CheckINN.prg - корректность ИНН CheckAccount.prg - корректность 20-ти разрядного счета  Методика проверки ИНН взята со страницы: http://myriadsoftware.al.ru/rus/documents/article03.html  Методики проверки 20-ти разрядных счетов я не нашел, но код создан на основе примера который предоставил Орлов Дмитрий (Jimmy)</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: ВладимирМ</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/proverka-korrektnosti-inn-i-20-ti-znachnyh-bankovskih-schetov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/rabota-s-msflexgridmshflexgrid-om/</link>
					<title><![CDATA[работа с MSFLEXGRID(MSHFLEXGRID)-ом]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>работа с MSFLEXGRID(MSHFLEXGRID)-ом</h1>
													</header>
													<div id="sol_opis">Позволяет брать данные из excel и записивать в фаил для дальнейшего использования в MSFLEXGRID(MSHFLEXGRID). смотрите пример.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: zgogilava</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/rabota-s-msflexgridmshflexgrid-om/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/schityvaenie-informaczii-iz-nestrukturirovannyh-excel-dokumentov-legko/</link>
					<title><![CDATA[Считываение информации из неструктурированных EXCEL &#8211; документов? Легко!]]></title>
                    					    <author><![CDATA[Jimmy]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Считываение информации из неструктурированных EXCEL &#8211; документов? Легко!</h1>
													</header>
													<div id="sol_opis">Вашему вниманию предлагается техника, позволяющая достаточно просто решить проблемы импорта в БД информации из EXCEL документов произвольной структуры. Идея была когда-то воплощена в VB программу (мною-же), а теперь я сделал класс для VFP. Для демонстрации прилагается программа и тестовый XLS документ. С уважением, Jimmy</div>
<div id="sol_body">Посвящается she <H2>Считывание информации в БД из документов EXCEL произвольной формы.</H2>  <H3>Уважаемые коллеги!</H3> <P> Хочу предварить описание некоторыми пояснениями: <UL> <LI>До идеи, описанной здесь, дошел сам, но не претендую на первенство, т.к. допускаю, что могут быть люди (да наверное и есть), которые уже давно используют такую технику работы. <LI>Текст, изложенный ниже - это моя пояснительная записка для шефа, так что прошу не судить строго за стиль. <LI>Собственно реализация идеи - класс <B>cstXLSscaner</B> в демопрограмме. Описывать его интерфейс не стал - там все предельно просто. <LI>Перед запуском программы посмотрите пояснения в Test.xls (кстати, он содержит пару макросов - не бойтесь). <LI>Буду благодарен за комментарии и поправки (только вежливо, пожалуйста).  </UL> <H3>Формирование БД на основе документов EXCEL.</H3> <P> Если основой информационного наполнения БД являются некие документы в формате EXCEL ,  то неизбежно встает вопрос о переносе данных в БД, где информация хранится в собственном  формате и структуре. Посему, информацию нужно либо вводить вручную, либо автоматизировать  процесс преобразования. Естественно, что далее будет рассматриваться именно вопрос  автоматизации данного процесса. <H3>Представление информации в документе EXCEL.</H3> <P> Документ EXCEL – двумерная таблица (на самом деле – n-мерная, но традиционно воспринимаемая,  как двумерная), содержащая информацию в своих ячейках. Каждая ячейка имеет свои координаты -  адрес. <P>  По степени однородности информации и ее структурированности можно выделить два типа документов: <OL> <LI>Информация представлена в виде таблицы, содержащей жестко структурированную однородную  информацию. Каждая запись таблицы (независимо от ее расположения в таблице) содержит одинаковый  набор реквизитов, расположенных в одинаковой последовательности. Формализовать алгоритм  считывания данных в этом случае достаточно просто – достаточно знать состав реквизитов и  количество записей (строк) таблицы. <LI>Документ содержит разнородную информацию переменной структуры ( набор реквизитов зависит  от расположения записи в таблице), а часто и вовсе не табличного вида.  Формализовать алгоритм  считывания для таких документов, как правило, достаточно трудно или даже невозможно. Это  объясняется тем, что при необходимости представления дополнительной информации документ  может подвергнуться серьезным изменениям. Для считывания данных часто пользуются картой адресов  ячеек, согласно которой программа и считывает информацию. Однако, при любом изменении документа  необходимо корректировать и карту адресов. </OL> <P> Наиболее распространен именно второй тип документов, так что имеет смысл ориентироваться именно на них. <H3>Идентификация данных в документе.</H3> <P> Как видно из вышесказанного, главная задача при считывании данных из документов в БД – идентификация считанных значений. Чаще всего это карта адресов или  диапазон адресов, согласно которым  программа и идентифицирует данные. Т.е. попросту координатная идентификация. Такой подход  вызывает определенные сложности при изменении документов (ведь придется менять и код программы!),  и, что более важно, для каждого документа необходимо иметь свою карту адресов.  <P> Однако, есть более простой, на мой взгляд, способ идентификации – создание скрытых  идентификаторов в документе. <H3>Создание скрытых идентификаторов в документе EXCEL.</H3> <P> Ячейка в EXCEL – своего рода слоеный пирог. Первый слой – данные пользователя; второй – данные о  формате ячейки; третий – комментарий.  <P><BIG><I>Комментарии!!!</I></BIG>  <P> Комментарии не видны (при определенных настройках EXCEL), их нельзя случайно удалить,  они сохраняются при удалении информации из ячейки, копируются вместе с ячейкой, не влияют на  работу EXCEL, и, наконец, доступны для программы, поддерживающей механизм OLE.  <P> Таким образом, появляется возможность хранить в комментарии ячейки ее идентификатор, не заботясь  об ее физическом адресе в документе. Единственное (и самое важное) , что для этого нужно – это  создание единого кодификатора  реквизитов. При наличии такого кодификатора, нетрудно создать  шаблоны основных документов, уже содержащие эти идентификаторы, или изменить  соответствующим образом алгоритм формирования этих документов, если они формируются автоматически. <H3>Алгоритм считывания.</H3> <P> Применив трюк с созданием идентификаторов ячеек, можно использовать простейший (по своей реализации) алгоритм считывания, который, в тоже время является исключительно надежным и устойчивым, так как  не зависит от вида документа и адресов ячеек с данными. Это – обычное сканирование двумерного  массива. <P> Для работы алгоритма необходимо задать только размерность массива (таблицы).  Далее происходит простой перебор элементов массива (ячеек таблицы). Данные, содержащиеся в ячейке,  идентифицируются с помощью кода, помещенного в комментарий, и заносятся в БД.     </div>
<div id="sol_avtor">Автор: Дмитрий Орлов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4748">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4748">Jimmy</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Jimmy" href="https://foxclub.ru/account/?user=4748">
				<img alt='' src='https://secure.gravatar.com/avatar/4438780968f2f420d33c7c7ad27e120f?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4438780968f2f420d33c7c7ad27e120f?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 30-07-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/schityvaenie-informaczii-iz-nestrukturirovannyh-excel-dokumentov-legko/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/generator-programmy-reindeksaczii-tablicz-bd/</link>
					<title><![CDATA[Генератор программы реиндексации таблиц БД]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Генератор программы реиндексации таблиц БД</h1>
													</header>
													<div id="sol_opis">Программа генерирует .prg файл по созданной в дизайнере БД, после чего его можно включить в ваше приложение для выполнения реиндексации таблиц. Помогает восстановить индексы после их физического удаления, а также ссылочную целостность.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Жихарев Дмитрий</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/generator-programmy-reindeksaczii-tablicz-bd/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/novaya-versiya-klassa-upakovki-raspakovki-foxzif-podhodit-i-dlya-vfp5/</link>
					<title><![CDATA[Новая версия класса упаковки/распаковки FoxZif. Подходит и для VFP5.]]></title>
                    					    <author><![CDATA[SergEESTI]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Новая версия класса упаковки/распаковки FoxZif. Подходит и для VFP5.</h1>
													</header>
													<div id="sol_opis">Формат ZIF остался прежним. Изменен несколько алгоритм упаковки/распаковки. Приложен небольшой тестовый пример.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Sergei Dzjuba</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="2763">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=2763">SergEESTI</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="SergEESTI" href="https://foxclub.ru/account/?user=2763">
				<img alt='' src='https://secure.gravatar.com/avatar/b7a8146a232a1c4ed2a2fe23eec364bf?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/b7a8146a232a1c4ed2a2fe23eec364bf?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 21-12-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/novaya-versiya-klassa-upakovki-raspakovki-foxzif-podhodit-i-dlya-vfp5/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kalendar-krasivyj-malenkij-navigacziya-s-klaviatury-vfp7/</link>
					<title><![CDATA[Календарь (красивый+маленький+навигация с клавиатуры) (VFP7)]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Календарь (красивый+маленький+навигация с клавиатуры) (VFP7)</h1>
													</header>
													<div id="sol_opis">Контрол "всплывающего" календаря (красивый+маленький+навигация с клавиатуры) (VFP7)</div>
<div id="sol_body">
<h3>Календарь (красивый+маленький+навигация с клавиатуры) (VFP7)</h3>
<p> Все как обычно: искал -не нашел, ActiveX - не хочу => пришлось писать <br /> История такова: <br />  Пользователь (хороший знакомый) попросил (за бутылку пива 🙂 изменить предыдущий календарь на <br /> 	1) красивый (что б не стыдно было показать) <br /> 	2) маленький (дабы не закрывал пол формы) <br /> 	3) управлялся с клавы (мышью лень тыкать) <br /> я пообещал. Много где искал (может не там) - не нашел. </p>
<p> Быстрые клавиши <br /> В контроле <br /> 	Shift+Enter - вызвать календарь <br /> В форме <br /> 	Вправо/влево - День (-/+) <br /> 	Вверх/вниз - Неделя (-/+) <br /> 	PageUp/PageDn(Скрол мыши) - Месяц (-/+) <br /> 	Ctrl+PageUp/PageDw - Год (-/+) <br /> 	HOME - Сегодняшнее число <br /> 	END - Число по умолчанию <br /> 	Enter(Двойной щелчек) - Выбрать '+CHR(13)+; <br /> 	Esc - Отмена </p>
<p> К сожалению работает только под VFP7 (если кто переделат под 6/5 - намыльте мне) </p>
<p> Если у кого появятся пожелания/советы/..., пишите мне.      </div>
<div id="sol_avtor">Автор: P.Ol.</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kalendar-krasivyj-malenkij-navigacziya-s-klaviatury-vfp7/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/eksport-frx-otchetov-v-html-fajl/</link>
					<title><![CDATA[Экспорт FRX отчетов в HTML файл]]></title>
                    					    <author><![CDATA[fox_head]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Экспорт FRX отчетов в HTML файл</h1>
													</header>
													<div id="sol_opis">Экспорт FRX отчетов в HTML файл теперь доступен для использования в ваших приложениях посредством создания объекта 'HTMLFile' из библиотеки классов Frx2Any.app. Пример использования библиотеки классов Frx2Any.app приведен в проекте, который вы найдете в ZIP файле  Программа позволяет конвертировать практически все FRX отчеты (один к одному) в HTML файл       Демо лимит - 39 записей     Скачать свежую демо версию  http://www.neova.ca</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Марат Чарыев</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4697">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4697">fox_head</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="fox_head" href="https://foxclub.ru/account/?user=4697">
				<img alt='' src='https://secure.gravatar.com/avatar/a31bcb6deba87450e0ba799493fe00a9?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/a31bcb6deba87450e0ba799493fe00a9?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 23-12-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/eksport-frx-otchetov-v-html-fajl/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/tabliczy-i-nabory-tablicz/</link>
					<title><![CDATA[Таблицы и наборы таблиц]]></title>
                    					    <author><![CDATA[Олег Бляхеров]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Таблицы и наборы таблиц</h1>
													</header>
													<div id="sol_opis">Средства для работы с таблицами (курсорами)    Представляю вниманию посетителей клуба обновленный вариант библиотеки классов для работы с постоянными и времеными таблицами (курсорами) и наборами таблиц.</div>
<div id="sol_body">
<h3>Таблицы и наборы таблиц</h3>
<p>  По сравнению с первым вариантом здесь добавлен доступ к свойствам и значения полей курсора (Класс Field). Для класса DataCursor добавлены свойства Fields, nFieldsCount, cFieldClass и метод MakeFields, метод Go переименован в Navigate, добавлены методы Go, GoTop, GoBottom, Skip, Seek, Locate, Continue.    Изменения сделаны по результатам обсуждения с Дмитрием Орловым (Jimmy)     Теперь библиотека содержит три класса: DataCursor, Field и DataSet.    Класс DataCursor обеспечивает открытие и закрытие таблиц (курсоров), управление индексами, фильтрами, буферизацией, связями с другими таблицами, а также перемещение по таблице.    Класс Field обеспечивает доступ к свойствам и значениям полей курсора. Объекты класса Field создаются как объекты-члены в объекте DataCursor и заносятся в массив Fields, являющийся свойством объекта DataCursor.    Класс DataSet обеспечивает совместную работу с несколькими связанными по смыслу курсорами. Предполагается, что набор данных включает в себя несколько курсоров (класс DataCursor и его производные) и наборов данных (класс DataSet и его производные), работа с которыми должна выполняться согласовано.  </p>
<p>    Предлагаемая библиотека не является в полном смысле "Решением", так как ни в одной реальной задаче не обкатывалась. Это скорее эскиз решения, идея, которую я хотел бы обсудить на профессиональном уровне прежде, чем окончательно вставлять эти средства в свои проекты. Кроме того, не обладая опытом работы с SQL-серверами и представлениями, я не включил в эти классы возможности работы с ними, а хотелось бы. <br />    Суть предложения заключается в том, чтобы организовать в клубе или по e-mail обсуждение и, возможно, совместное доведение библиотеки до кондиции с тем, чтобы в последствии выложить получившийся продукт в клубе для всеобщего использования. <br />    Со своей стороны, я готов взять на себя всю организационную сторону дела - учет предложений, адаптацию их в исходный текст и обновление выложенной в клубе библиотеки. <br />    Более подробная информация о мотивах, классах и содержании пакета - в файле readme.txt Заинтересовавшиеся моим предложением посетители клуба могут высказать свое мнение здесь или по e-mail olegvbru@yahoo.com <br /> С уважением, Олег Бляхеров.      </div>
<div id="sol_avtor">Автор: Олег Бляхеров</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5049">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5049">Олег Бляхеров</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Олег Бляхеров" href="https://foxclub.ru/account/?user=5049">
				<img alt='' src='https://secure.gravatar.com/avatar/59254e455634d23d143dcfe629716d52?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/59254e455634d23d143dcfe629716d52?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 8<i class="rcli fa-calendar-check-o"></i>Регистрация: 23-04-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/tabliczy-i-nabory-tablicz/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/zamena-funkczii-messagebox/</link>
					<title><![CDATA[Замена функции =messagebox()]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Замена функции =messagebox()</h1>
													</header>
													<div id="sol_opis">Захотелось сделать замену стандартной функции =messagebox(),  чтобы можно было менять текст на кнопках и еще кое-какие мелочи и при этом сохранить простоту вызова и возможность вывода текста в несколько строк.</div>
<div id="sol_body">
<h3>Замена функции =messagebox()</h3>
<p> Замена функции =messagebox() <br /> Функция написана при активном участии Jek Zevs  jek_zevs@aport2000.ru </p>
<p> Обновления: </p>
<p> 01.03.2002 Сделано приведение кнопок к одному (максимальному) размеру <br /> 27.01.2002  Исправлена ошибка, связанная с установкой фокуса. (При вызове функции из методов  типа Valid() другой формы, неправильно интерпретируется ThisForm) <br /> Изменен алгоритм для рассчета длины кнопок и расположения картинки. </p>
<p> 23.01.2002  Добавлены следующие возможности: <br />             автоформатирование текста (если строка в сообщении превышает половину экрана, <br />             то она автоматически разбивается на подстроки), <br />             автозакрытие формы через указанное число секунд, <br />             Возможность задания второго параметра, как у messagebox() и <br />             еще разные мелочи.  </p>
<p> 12.01.2002  Добавлена возможность задавать стандартную картинку не текстом, а по коду.  </p>
<p> 23.12.2001  Исправлено вырвнивание текста (в некоторых случаях текст заезжал на картинку). <br />             Добавлена возможность выделить любую их кнопок (поставив символ "																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/komponent-kalendar/</link>
					<title><![CDATA[Компонент Календарь]]></title>
                    					    <author><![CDATA[Pinguin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Компонент Календарь</h1>
													</header>
													<div id="sol_opis">Как ни банально, но еще один календарь. Всегда его использую в своих проектах. Вообще это выборка из лучших(на мой взгляд) календарей в "одном флаконе" Пробуйте, тестируйте и т.д. Только одно ограничение - работает на VFP 7.0</div>
<div id="sol_body">
<h3>Компонент Календарь</h3>
<p> Использование: <br /> 1. В Методе Init формы или в любом другом месте до вызова формы прописываем: Set Procedure to Utils <br /> 2. В панели инструментов Form Control Нажимаем кнопку Add Class и в выпавшем меню выбираем Add... . Указываем библиотеку Tools.vcx, после чего в панели Form Control появится кнопка контейнера Calendar <br /> 3. Вставляем класс в форму. <br /> Инициализация: <br /> thisform.Calendar1.Value=date() <br /> Чтение значения: <br /> myVar = thisform.Calendar1.Value    </div>
<div id="sol_avtor">Автор: (сборка): Дворядкин Дмитрий</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4286">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4286">Pinguin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Pinguin" href="https://foxclub.ru/account/?user=4286">
				<img alt='' src='https://secure.gravatar.com/avatar/5d8562ccfbee6bdf526eb977b4bc07ff?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/5d8562ccfbee6bdf526eb977b4bc07ff?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 14-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/komponent-kalendar/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/i-opyat-kalendar/</link>
					<title><![CDATA[И опять календарь]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>И опять календарь</h1>
													</header>
													<div id="sol_opis">Похоже, что у каждого свой календарь. Может и мой кому-нибудь сгодится.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Василий Поторочин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/i-opyat-kalendar/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/preview-dlya-tekstovyh-fajlov-pod-upravleniem-subd-foxpro-2-6-for-dos/</link>
					<title><![CDATA[PreView для текстовых файлов под управлением СУБД FoxPro 2.6 for DOS]]></title>
                    					    <author><![CDATA[Professor]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>PreView для текстовых файлов под управлением СУБД FoxPro 2.6 for DOS</h1>
													</header>
													<div id="sol_opis">Предпросмотр текстовых файлов : удобные настройки для скроллинга, закрепление областей, выборочная печать</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Leonov Yuri</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3181">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3181">Professor</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Professor" href="https://foxclub.ru/account/?user=3181">
				<img alt='' src='https://secure.gravatar.com/avatar/23826b0a00872bf08ae5047c7c398ba4?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/23826b0a00872bf08ae5047c7c398ba4?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-01-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/preview-dlya-tekstovyh-fajlov-pod-upravleniem-subd-foxpro-2-6-for-dos/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/risajzing-formy/</link>
					<title><![CDATA[Рисайзинг формы.]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Рисайзинг формы.</h1>
													</header>
													<div id="sol_opis">Теперь добиться изменения размеров всех элементов формы пропорционально её изменяющимся размерам не просто просто, а очень просто.</div>
<div id="sol_body">
<h3>Рисайзинг формы.</h3>
<p> * Рекурсивный метод изменения размеров <br /> * элементов формы. Количество элементов <br /> * на форме и уровень вложенности объектов - <br /> * неограничено. <br /> * Кроме этого метода на форму необходимо <br /> * поместить:  <br /> *   Свойства:   amas[1,1] - массив, для первонач.размеров <br /> *                                            всех элементов формы <br /> *                         nkolm - фактическая его размерность <br /> *                         FIRSTHEIGHT - первоначальные <br /> *                         FIRSTWIDTH      размеры формы    <br /> *                         nkofh  - коэффициенты высоты <br /> *                         nkofw    и длины изменения <br /> *  <br /> *                         nb1  - переменные для <br /> *                         nb2     панимуляции с Fontsize <br /> *                                            <br /> *                         ndelta     -   текущее смещение значения Fontsize </p>
<p> * <br /> * В метод Init поместить: <br /> 	THISFORM.firstheight=THISFORM.height <br /> 	THISFORM.firstwidth=THISFORM.width <br /> 	THISFORM.nkolm = 0 <br /> 	THISFORM.ndelta = 0 <br /> 	THISFORM.recurs (THISFORM,.F.) <br /> * И в Resize : <br /> 	THISFORM.nkofh = THISFORM.HEIGHT/THISFORM.FIRSTHEIGHT <br /> 	THISFORM.nkofw = THISFORM.WIDTH/THISFORM.FIRSTWIDTH <br /> 	thisform.nkolm = 0 <br /> 	THISFORM.nb1 = 0 <br /> 	THISFORM.nb2 = 1 <br /> 	THISFORM.recurs(THISFORM,.t.) <br /> 	if (THISFORM.nb2 > 0 and THISFORM.ndelta > 0); <br /> 		 or (THISFORM.nb1 > 0) <br />       THISFORM.ndelta = THISFORM.ndelta + THISFORM.nb1  <br />       THISFORM.ndelta = THISFORM.ndelta - THISFORM.nb2 <br /> 	endif <br /> * <br /> * и все... <br /> * </p>
<p> Метод : Recurs </p>
<p> lparameters oObj, lP <br /> LOCAL nTotMem,i,aMems[1],m1 <br /> m1 = 7 <br />   WITH oObj <br /> 	if thisform.name # .name or thisform.baseclass # .baseclass <br />   	if type("oObj.top") = "N" or type("oObj.height") = "N"; <br />   		or type("oObj.left") = "N" or type("oObj.width") = "N"; <br />   		or type("oObj.fontsize") = "N" <br />    	thisform.nkolm = thisform.nkolm + 1 <br /> 	if !lP <br /> 		dimension thisform.amas[thisform.nkolm,m1] </p>
<p>   		if type("oObj.top") = "N" <br />    			thisform.amas[thisform.nkolm,1] =oObj.top <br />   		endif <br />   		if type("oObj.height") = "N" <br />   			thisform.amas[thisform.nkolm,2] = oObj.height <br />   		endif <br />   		if type("oObj.left") = "N" <br />   			thisform.amas[thisform.nkolm,3] = oObj.left <br />  		endif <br />   		if type("oObj.width") = "N" <br /> 			thisform.amas[thisform.nkolm,4] = oObj.width <br />   		endif <br /> 		if type("oObj.headerheight") = "N" <br /> 			thisform.amas[thisform.nkolm,5] =oObj.headerheight <br /> 		endif <br /> 		if type("oObj.rowheight") = "N" <br /> 			thisform.amas[thisform.nkolm,6] = oObj.rowheight <br />  		endif <br /> 		if type("oObj.fontsize") = "N" <br /> 			thisform.amas[thisform.nkolm,7] =oObj.fontsize <br /> 		endif </p>
<p> 	else  </p>
<p> 		if type("oObj.top") = "N" <br /> 			oObj.top = thisform.amas[thisform.nkolm,1]*THISFORM.nkofh <br /> 		endif <br /> 		if type("oObj.height") = "N" <br /> 			oObj.height = thisform.amas[thisform.nkolm,2]*THISFORM.nkofh <br /> 		endif <br /> 		if type("oObj.left") = "N" <br /> 			oObj.left = thisform.amas[thisform.nkolm,3]*THISFORM.nkofw <br /> 		endif <br />   if type("oObj.fontsize") = "N" <br />    if (thisform.amas[thisform.nkolm,7]*THISFORM.nkofh)-THISFORM.ndelta > 4 <br />     oObj.fontsize = (thisform.amas[thisform.nkolm,7]*THISFORM.nkofh)-THISFORM.ndelta <br />    else <br />     oObj.fontsize = 4 <br />     THISFORM.ndelta = THISFORM.ndelta - 1 <br />    endif <br />   endif </p>
<p>   if type("oObj.width") = "N" <br />    if (oObj.baseclass ="Label" and !.wordwrap); <br /> 		or oObj.baseclass ="Checkbox" </p>
<p>     if (TXTWIDTH(oObj.caption,oObj.fontname,oObj.fontsize))*; <br />      FONTMETRIC(6,oObj.fontname,oObj.fontsize) > oObj.width </p>
<p>      THISFORM.nb1 = 1 <br />      THISFORM.nb2 = 0 <br />     endif <br />     if (TXTWIDTH(oObj.caption,oObj.fontname,oObj.fontsize+1))*; <br />         FONTMETRIC(6,oObj.fontname,oObj.fontsize+1) > oObj.width  <br />         THISFORM.nb2 = 0 <br />    	endif <br />    endif </p>
<p>    oObj.width = thisform.amas[thisform.nkolm,4]*THISFORM.nkofw <br />   endif <br /> 		if type("oObj.headerheight") = "N" <br /> 			oObj.headerheight = thisform.amas[thisform.nkolm,5]*THISFORM.nkofh <br /> 		endif <br /> 		if type("oObj.rowheight") = "N" <br /> 			oObj.rowheight = thisform.amas[thisform.nkolm,6]*THISFORM.nkofh <br /> 		endif </p>
<p> 	endif <br /> 	endif <br /> 	endif <br /> 	nTotMem = AMEMBERS(aMems,oObj,2) <br /> 		FOR i = 1 TO m.nTotMem  <br />   		oObj = EVAL("."+aMems[m.i]) <br /> 			IF TYPE("."+aMems[m.i]) = "O"  <br /> 				thisform.recurs(oObj,lP) <br /> 			ENDIF <br /> 		ENDFOR <br /> ENDWITH </p>
<p>      </div>
<div id="sol_avtor">Автор: Василий Поторочин.</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/risajzing-formy/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/rabota-s-listview/</link>
					<title><![CDATA[Работа с ListView]]></title>
                    					    <author><![CDATA[Владимир Максимов]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:19 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Работа с ListView</h1>
													</header>
													<div id="sol_opis">В данном примере приведены решения различных задач в СТАНДАРТНОМ ActiveX компоненте ListView.</div>
<div id="sol_body">
<h3>Работа с ListView</h3>
<p> Это не мой пример. Он взят с данной страницы: </p>
<p> http://www.fastwrite.com/DvlOnly/ThisDownload.cfm?RID=27 </p>
<p> Еще раз подчеркну. Это стандартный ActiveX компонент. Дело в том, что описание, данное в ComCtl2.hlp крайне запутано, неполно и местами ошибочно. В данном примере можно найти решение для очень многих проблем связанных с ListView.  </p></div>
<div id="sol_avtor">Автор: Владимир Максимов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4899">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4899">Владимир Максимов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Владимир Максимов" href="https://foxclub.ru/account/?user=4899">
				<img alt='' src='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 65<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/rabota-s-listview/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/prostye-i-effektivnye-klassy-dlya-raboty-s-remote-dannymi-lyubitelyam-klient-servernyh-reshenij/</link>
					<title><![CDATA[Простые и эффективные классы для работы с Remote данными &#8211; любителям клиент-серверных решений.]]></title>
                    					    <author><![CDATA[Jimmy]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Простые и эффективные классы для работы с Remote данными &#8211; любителям клиент-серверных решений.</h1>
													</header>
													<div id="sol_opis">Уважаемые коллеги!   На суд публики представлено два класса-оболочки. 1. cstConnections: позволяет централизованно управлять ODBC соединениями (те самые DSN, о которых постоянно спрашивают на конференции)- список, использование, настройка. В общем - полный контроль. Для его тестирования/демонстрации возможностей используйте прилагаемую форму Testconnections. 2. cstSqlPassTrought: централизованное управление функциями SQL*() плюс некоторая дополнительная функциональность (типа выполнения скриптов).   При их создании преследовались следующие цели: простота, контроль, централизованная обработка ошибок. Подробности смотрите в файле Readme.txt С уважением, Дмитрий Орлов (Jimmy)    PS Замечания, пожелания, критику или сообщения о выявленных ошибках просьба публиковать здесь же или на мыло.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Дмитрий Орлов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4748">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4748">Jimmy</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Jimmy" href="https://foxclub.ru/account/?user=4748">
				<img alt='' src='https://secure.gravatar.com/avatar/4438780968f2f420d33c7c7ad27e120f?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4438780968f2f420d33c7c7ad27e120f?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 30-07-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/prostye-i-effektivnye-klassy-dlya-raboty-s-remote-dannymi-lyubitelyam-klient-servernyh-reshenij/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/foxpro-realizacziya-podgotovki-svodnoj-tabliczy-po-strokam-i-stolbczam/</link>
					<title><![CDATA[FoxPro-реализация подготовки сводной таблицы по строкам и столбцам]]></title>
                    					    <author><![CDATA[Professor]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>FoxPro-реализация подготовки сводной таблицы по строкам и столбцам</h1>
													</header>
													<div id="sol_opis">Это классическая задача бухучета - имея набор данных в виде "змейки", представить данные в виде сводной таблицы - аналог функции "PivotTAble" Microsoft Excel.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Leonov Yuri</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3181">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3181">Professor</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Professor" href="https://foxclub.ru/account/?user=3181">
				<img alt='' src='https://secure.gravatar.com/avatar/23826b0a00872bf08ae5047c7c398ba4?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/23826b0a00872bf08ae5047c7c398ba4?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-01-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/foxpro-realizacziya-podgotovki-svodnoj-tabliczy-po-strokam-i-stolbczam/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kalendar-eshhe-odna-variacziya/</link>
					<title><![CDATA[Календарь. Еще одна вариация.]]></title>
                    					    <author><![CDATA[Владимир Бутяев]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Календарь. Еще одна вариация.</h1>
													</header>
													<div id="sol_opis">Суть понятна из названия - это Календарь.</div>
<div id="sol_body">
<h3>Календарь. Еще одна вариация.</h3>
<p> Слегка напоминает вид календаря, принятый в "Консультант Плюс". Загрузите файл и запустите calendar.prg. <br /> Пояснения: <br /> 1. Значения можете выбирать как мышкой, так и клавой. <br /> 2. При нажатии кнопки "Выбрать" (или нажать "Enter") будет выбрана дата и показана на экране. <br /> 3. Если нажать "Отмена" (или "Esc"), то покажется та дата, которую Вы указали в качестве параметра "with" в "do form ..." (т.е., как-будто она не изменилась). <br /> 4. Выбрав "Очистить дату и выйти" будет выбрана пустая ('..') дата. <br /> 5. Как следует из пункта 3, дата, переданная в качестве параметра, инициализирует календарь. Если параметра не будет или он будет не типа "Дата", то для инициализации используется (по умолчанию) текущая дата.  </div>
<div id="sol_avtor">Автор: Бутяев Владимир</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4896">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4896">Владимир Бутяев</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Владимир Бутяев" href="https://foxclub.ru/account/?user=4896">
				<img alt='' src='https://secure.gravatar.com/avatar/e04277efd2b39213d388edefdab2f7e7?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e04277efd2b39213d388edefdab2f7e7?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 20-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kalendar-eshhe-odna-variacziya/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ocherednoj-kalendar-s-kotorym-mozhno-rabotat-bez-myshi/</link>
					<title><![CDATA[Очередной календарь с которым можно работать без мыши]]></title>
                    					    <author><![CDATA[DmGr]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Очередной календарь с которым можно работать без мыши</h1>
													</header>
													<div id="sol_opis">Очередной календарь с которым можно работать без мыши</div>
<div id="sol_body">
<h3>Очередной календарь с которым можно работать без мыши </h3>
<p> Этот объект появился на свет исключительно из за того,  что мне не нравяться программы в которых какие-либо действия можно делать только с помощью мыши.<br /> Пересмотрел несколько решений, не ни одно до конца меня не удовлетворило.<br />  Вызов производится примерно так</p>
<pre> oCalendar = createobject( "Calendar", THIS.Parent.txtDate.Value )  или так, тогда объект инициализируется с текущей датой oCalendar = createobject( "Calendar" )  * Далее установка координат по ситуации oCalendar.Top = THIS.Top + THIS.Parent.Top + THISFORM.Top + sysmetric( 9 ) + sysmetric( 11 ) + 4 oCalendar.Left = THIS.Left + THIS.Parent.Left + THISFORM.Left + sysmetric( 11 ) + 4  * Собственно сам вызов oCalendar.Show( ) THIS.Parent.txtDate.Value = oCalendar.ReturnDate oCalendar.Release( ) </pre>
<p> Сочетания клавиш, задействованные в объекте, можно посмотреть вызвав его и нажав клавишу F1 или F12.<br /> Но можно все делать и мышью. <br /> Написано но VFP5, потому код не совсем оптимален.<br /> Объект еще основательно не тестировался, так что "возможно все", но я пока ничего подозрительного не заметил.<br /> За цвета прошу не пинать, я не дизайнер, красьте сами :)))</p>
<p> Собственно все... 🙂 </p>
<p> Пожелания и замечание можно (и желательно) присылать по адресу GraninDm@mail.ru</p></div>
<div id="sol_avtor">Автор: DmGr</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4731">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4731">DmGr</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="DmGr" href="https://foxclub.ru/account/?user=4731">
				<img alt='' src='https://secure.gravatar.com/avatar/333bfef466a5a9cecf9b94f79b0e468d?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/333bfef466a5a9cecf9b94f79b0e468d?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 21-01-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ocherednoj-kalendar-s-kotorym-mozhno-rabotat-bez-myshi/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/igra-speeder-man/</link>
					<title><![CDATA[Игра Speeder Man]]></title>
                    					    <author><![CDATA[Hel!Riser]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Игра Speeder Man</h1>
													</header>
													<div id="sol_opis">Кто из вас не катался на мотоцикле по лесу? В любом случае этот аркадный клон объездов препятствий предоставит вам такую возможность. Но осторожничайте! Чем дальше в лес - тем больше можно наломать дров! 🙂 В архиве имеется полный проект с исходниками. Прога скомпил:ена под VFP60</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Денис В. Степанов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4814">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4814">Hel!Riser</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Hel!Riser" href="https://foxclub.ru/account/?user=4814">
				<img alt='' src='https://secure.gravatar.com/avatar/e2a29a43d5cd1efb980fa624551c4b00?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e2a29a43d5cd1efb980fa624551c4b00?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 11-03-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/igra-speeder-man/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/splitter/</link>
					<title><![CDATA[Сплиттер]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Сплиттер</h1>
													</header>
													<div id="sol_opis">Доделан сплиттер. Теперь работает на PageFrame любой вложенности</div>
<div id="sol_body">
<h3>Сплиттер</h3>
<p> Тестируем доделанную версию сплиттера Ж:)   </p></div>
<div id="sol_avtor">Автор: Michael Postin</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/splitter/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/proverka-pravopisaniya/</link>
					<title><![CDATA[Проверка правописания]]></title>
                    					    <author><![CDATA[Hel!Riser]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Проверка правописания</h1>
													</header>
													<div id="sol_opis">Проверка правописания для русского языка. До выполняемых действий можно достучаться через клик правой кнопки мыши в зоне ввода. ВАЖНО! Должны быть предустановлены MS Word с проверкой правописания и зарегестр:ен RichTx32.OCX  ЗЫ Есть известная фича - процесс не бь:ется. Но как побороть не знай 🙂 ЗЫЫ В архиве полный проект с исходниками и прогой скомпил:енной под VFP60</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Денис В. Степанов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4814">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4814">Hel!Riser</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Hel!Riser" href="https://foxclub.ru/account/?user=4814">
				<img alt='' src='https://secure.gravatar.com/avatar/e2a29a43d5cd1efb980fa624551c4b00?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e2a29a43d5cd1efb980fa624551c4b00?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 11-03-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/proverka-pravopisaniya/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kolichestvo-czifr-posle-zapyatoj-u-peremennoj-pamyati/</link>
					<title><![CDATA[Количество цифр после запятой у переменной памяти]]></title>
                    					    <author><![CDATA[Владимир Максимов]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Количество цифр после запятой у переменной памяти</h1>
													</header>
													<div id="sol_opis">Способ определения количества цифр (включая завершающие нули) после запятой у переменной памяти</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: ВладимирМ</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4899">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4899">Владимир Максимов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Владимир Максимов" href="https://foxclub.ru/account/?user=4899">
				<img alt='' src='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 65<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kolichestvo-czifr-posle-zapyatoj-u-peremennoj-pamyati/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/biblioteka-dlya-kopirovaniya-fajlov/</link>
					<title><![CDATA[Библиотека для копирования файлов.]]></title>
                    					    <author><![CDATA[1Kolka]]></author>
                    										    <pubDate>Fri, 04 Nov 2022 14:36:34 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Библиотека для копирования файлов.</h1>
													</header>
													<div id="sol_opis">Предназначена для копировния файлов с отображением процесса копирования. Иметет на выбор 2 прогресс бара (градусника). При копировании выводится так же текст заголовка окна и текст над градусником (примерно как в Windows Commander). Тестировалась на VFP, есть подозрение что будет работать и на других языках.</div>
<div id="sol_body">
<h3>Библиотека для копирования файлов.</h3>
<p>Продолжаем цикл "Подружим Фокс и Дельфи".</p>
<p>Данная DLL предназначена для копирования файлов. Ничем не отличается от <br />
COPY FILE, кроме наличия прогресс баров и комментариев.</p>
<p>Первый прогресс бар без текста внутри. Похож на тот, который возникает при поиске <br />
нового оборудования в Windows. <br />
Второй с процентами и плавной бегущей полосой.</p>
<p>ГЛЮКИ: <br />
При больших размерах файла при повторном копировании бывает так, что <br />
функция отработала, а файл на свое место еще не лег. Это связано с файловым <br />
кэшем самой WINDOWS и как победить это я не нашел.</p>
<p>При копировании на дискету тоже самое. Причина та же.</p>
<pre><pre class='bbcode'> ********************************************************************************   
 * Параметры : *   
 * 1. Строка с указанием полного имени исходного файла *   
 * 2. Строка с указанием полного имени файла назначения *   
 * 3. Заголовок окна *   
 * 4. Строка над прогресс баром. *   
 * 5. Тип прогресс бара *   
 * (их всего 2 если указано число не 1 и не 2 то будет использован 1) *   
 * *   
 * Возврат: *   
 * 1 - если ошибка *   
 * 0 - если ошибок нет *   
 * *   
 ********************************************************************************  
    
 ********************************************************************************   
 * Собственно вызов. *   
 ********************************************************************************   
  FileNameWhence = "c:MyFileWhence.xxx"   
  FileNameWhere = "a:MyFileWhere.xxx"   
  cCaption = 'Копируется файл 1 из 1'   
  cText = FileNameWhence + ' -&gt; ' + FileNameWhere  
    
  DECLARE INTEGER CopyFileProgress IN CopyFile.DLL STRING, STRING, STRING, STRING, INTEGER  
    
  IF CopyFileProgress(FileNameWhence,FileNameWhere,cCaption,cText,2) = 1   
  MESSAGEBOX ('Файл не скопирован',0+16,'Ошибка')   
  ENDIF  
    
  CLEAR DLLS   
 ********************************************************************************  
</pre></pre>
<p>Эта DLL написана на DELPHI 6.0 с использованием стандартных средств и <br />
библиотек RX.</p>
<p>Это мое 3-е решение. Так получилось, что предыдущие 2 оказались <br />
изобретением велосипеда. Если и это окажется тем же, прошу не критиковать. <br />
Согласен, что если как следует поискать, то всегда можно найти что то лучшее. <br />
Кто хочет ищите, кому нравится - пользуйтесь.</p>
<p>С уважением ко всем лисятникам Гончаров Н.А. <br />
mailto:1Kolka@rambler.ru</p>
</div>
<div id="sol_avtor">Автор: Гончаров Н.А.</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="7">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=7">1Kolka</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="1Kolka" href="https://foxclub.ru/account/?user=7">
				<img alt='' src='https://secure.gravatar.com/avatar/f23040502e4a0ebee45eb00c4e06a266?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/f23040502e4a0ebee45eb00c4e06a266?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-01-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/biblioteka-dlya-kopirovaniya-fajlov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/sohranenie-i-vosstanovlenie-rabochih-oblastej/</link>
					<title><![CDATA[Сохранение и восстановление рабочих областей.]]></title>
                    					    <author><![CDATA[1Kolka]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:15 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Сохранение и восстановление рабочих областей.</h1>
													</header>
													<div id="sol_opis">Пара процедур для сохранения и восстановления рабочих областей. К примеру полезно, когда нужно вызвать модальную форму, а потом восстановить все как было. Восстанавливается все, Индексы, Связи, Отношения, Указатели.  Может быть полезна при отладке, когда в какой то момент необходимо запомнить состояние рабочих областей, а за тем проанализировать его. </div>
<div id="sol_body">
<h3>Сохранение и восстановление рабочих областей.</h3>
<p> Работает примерно так: <br /> AliasSave('MainArrayPublic') <br /> ** <br /> * Здесь делаем все что хотим <br /> ** <br /> AliasRead('MainArrayPublic') </p>
<p> MainArrayPublic - Это Ваш массив, который объявится глобальным. Таких массивов может быть множество, соответственно и восстанавливать рабочие области можно из любого. <br /> Ограничения: <br /> 1. Число сохраняемых областей не более 100 <br /> 2. Число связей у родительской таблицы не более 20 </p>
<p> И вот еще что. В массиве хранится полный путь к таблице, и если Вы захотите после AliasSave изменить set path (defa), то AliasRead все равно найдет эту таблицу, даже если в окружении путей её не видно и она закрыта. <br /> Ну удачи. Если Глюки какие, пишите.<br /><a href='alias.zip'>Скачать alias.zip</a>         </div>
<div id="sol_avtor">Автор: Kolka</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="7">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=7">1Kolka</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="1Kolka" href="https://foxclub.ru/account/?user=7">
				<img alt='' src='https://secure.gravatar.com/avatar/f23040502e4a0ebee45eb00c4e06a266?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/f23040502e4a0ebee45eb00c4e06a266?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-01-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/sohranenie-i-vosstanovlenie-rabochih-oblastej/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/upakovka-raspakovka-fajlov/</link>
					<title><![CDATA[Упаковка / Распаковка файлов]]></title>
                    					    <author><![CDATA[SergEESTI]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Упаковка / Распаковка файлов</h1>
													</header>
													<div id="sol_opis">Класс предназначен для упаковки/распаковки файлов одного каталога с использованием OLE об'екта ZLIBTOOL. Возможно создание многотомного архива.</div>
<div id="sol_body">
<h3>Упаковка / Распаковка файлов</h3>
<p> Для работы класса надо зарегистрировать OLE об'ект ZLIBTOOL, который находится в FOXZIF.ZIP. Описание использования класса также в FOXZIF.ZIP. В архив включаются файлы одного каталога согласно указанной маски. Возможно создание многотомного архива. Длина тома произвольная. На создание класса подвигла необходимость упаковки/распаковки файлов из FOXа. При этом под Win 2000 нагло режутся длинные имена при использовании DOSовских архиваторов типа ARJ. Вторая причина - это необходимость передачи архивов через INET, а на многих серверах установлено ограничение длины пересылаемых файлов.  </p></div>
<div id="sol_avtor">Автор: SergEESTI</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="2763">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=2763">SergEESTI</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="SergEESTI" href="https://foxclub.ru/account/?user=2763">
				<img alt='' src='https://secure.gravatar.com/avatar/b7a8146a232a1c4ed2a2fe23eec364bf?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/b7a8146a232a1c4ed2a2fe23eec364bf?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 21-12-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/upakovka-raspakovka-fajlov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/lenivaya-pereindeksacziya/</link>
					<title><![CDATA[&#8220;ленивая&#8221; переиндексация]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>&#8220;ленивая&#8221; переиндексация</h1>
													</header>
													<div id="sol_opis">упрощает написание процедуры переиндексации</div>
<div id="sol_body">
<h3>"ленивая" переиндексация</h3>
<p> допустим вы дописываете программу и в конце как всегда - сервисные функции - переиндексация. <br /> у вас уже есть куча баз в которых куча cdx tag-ов <br /> не удобно лазить каждый раз в свойства базы и смотерть инексное выражение , чтобы потом его вставлять в процедуру. </p>
<p> чтобы немного упростить это дело (не заменить!!!) написал небольшую прогу. выберите нужную таблицу и запустите программку, потом полученные строки вставляете в свою процедуру </p>
<p> НО ограничения если у вас не совсем стандартный индекс: есть фильтры  <br /> или DESCENDING и т.п. то все таки надо будет ручками эти вещи дописать в процедуру переиндексации. </p>
<p> ********************************* begin ***************** <br /> SET text on TO 'c:_list.txt' <br /> set cons off </p>
<p> text <br />    <br /> endtext </p>
<p> FOR nCount = 1 TO 254 <br /> 	IF !EMPTY(TAG(nCount)) <br />      text <br />        <br />       endtext <br /> 	ELSE <br /> 		EXIT   <br /> 	ENDIF <br /> ENDFOR <br /> set text to <br /> set cons on </p>
<p> *** открываем файл компируем оттуда текст в процедуру переиндексации <br /> ********************************* end ***************** </p>
<p> а вот содержимое того файла  </p>
<p>  *** индексный файл  C:PSBNEWCREDIT.CDX <br />       index on KODTT  tag TT additiv <br />       index on STR(KODTT,3)+ALLTRIM(NOMER)  tag TNOMER additiv <br />       index on STR(KODTT,3)+ALLTRIM(NAME_F)  tag TFNAME additiv <br />       index on STATUS  tag STATUSD additiv <br />       index on DATE1  tag DOPEN additiv <br />       index on STR(KODTT,3)+STR(KODDOG,6)  tag TTDOG additiv <br />       index on STR(KODTT,3)+STR(STATUS,1)  tag TTSTATUS additiv     </div>
<div id="sol_avtor">Автор: Sergii---1</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/lenivaya-pereindeksacziya/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/biblioteka-dlya-raboty-s-ini-fajlami/</link>
					<title><![CDATA[Библиотека для работы с INI файлами.]]></title>
                    					    <author><![CDATA[1Kolka]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Библиотека для работы с INI файлами.</h1>
													</header>
													<div id="sol_opis">Библиотека (DLL) для работы с INI файлами. Работает пока только со строковыми типами данных. Пример прилагается.</div>
<div id="sol_body">
<p style="text-indent: 0; word-spacing: 0; line-height: 100%; margin: 0" align="center"><b><a href="205rwini.zip">RWINI.DLL</a></b></p>
<p style="text-indent: 0; word-spacing: 0; line-height: 100%; margin: 0" align="center">
<p style="text-indent: 0; word-spacing: 0; line-height: 100%; margin: 0" align="center">Работая в Visual Fox Pro часто сталкиваешься с </p>
<p style="text-indent: 0; word-spacing: 0; line-height: 100%; margin: 0" align="center"> проблемой хранения настроек, и каждый раз приходится решать </p>
<p style="text-indent: 0; word-spacing: 0; line-height: 100%; margin: 0" align="center"> её довольно сложными методами.</p>
<p style="text-indent: 0; word-spacing: 0; line-height: 100%; margin: 0" align="center">
<p style="text-indent: 0; word-spacing: 0; line-height: 100%; margin: 0" align="center">Эта DLL предназначена для работы с INI-файлами. </p>
<p style="text-indent: 0; word-spacing: 0; line-height: 100%; margin: 0" align="center">Она имеет пока 2 функции: mReadString и mWriteString.</p>
<p align="center" style="word-spacing: 0; line-height: 100%; margin: 0">
<p align="center" style="word-spacing: 0; line-height: 100%; margin: 0">
<p align="center" style="word-spacing: 0; line-height: 100%; margin: 0"><b>Пример на VFP:</b></p>
<p align="center" style="word-spacing: 0; line-height: 100%; margin: 0">
<p style="word-spacing: 0; line-height: 100%; margin: 0">DECLARE STRING mReadString  IN "RWIni.dll" STRING, STRING, STRING <br /> DECLARE STRING mWriteString IN "RWIni.dll" STRING, STRING, STRING, STRING<br /> NameFile    = 'MyFile.ini'<br /> NameSection = 'MySectionInIniFile'<br /> NameParam   = 'MyParameterInSection'<br /> ValueParam  = 'MyString'<br /> WAIT WIND  mReadString  (NameFile, NameSection, NameParam)<br /> WAIT WIND  mWriteString (NameFile, NameSection, NameParam, ValueParam)<br /> CLEAR DLLS<br />  </p>
<p style="word-spacing: 0; line-height: 100%; margin: 0">mReadString  вернет значение параметра NameParam секции NameSection. </p>
<p style="word-spacing: 0; line-height: 100%; margin: 0">
<p style="word-spacing: 0; line-height: 100%; margin: 0">mWriteString пропишет строку ValueParam параметру NameParam секции NameSection и вернет "OK". Если файл не существует, создаст его.</p>
<p align="center" style="word-spacing: 0; line-height: 100%; margin: 0">
<p align="center" style="word-spacing: 0; line-height: 100%; margin: 0">ВНИМАНИЕ: Если не указать путь к INI-файлу и его не будет видно в окружении, то он создастся в каталоге WINDOWS.</p>
<p align="center" style="word-spacing: 0; line-height: 100%; margin: 0">
<p align="center" style="word-spacing: 0; line-height: 100%; margin: 0">Если интересно, заходите за обновлениями. Планируется добавление функций</p>
<p align="center" style="word-spacing: 0; line-height: 100%; margin: 0">чтения и записи других типов и работа с реестром.</p>
<p align="center" style="word-spacing: 0; line-height: 100%; margin: 0">
<p align="center" style="word-spacing: 0; line-height: 100%; margin: 0">Кто хочет поругать, указать на недостатки или похвалить <a href="mailto:1kolka@rambler.ru">пишите</a>.</p>
<p align="center" style="word-spacing: 0; line-height: 100%; margin: 0">
<p align="center" style="word-spacing: 0; line-height: 100%; margin: 0">
<p style="word-spacing: 0; line-height: 100%; margin: 0">
</p></div>
<div id="sol_avtor">Автор: Гончаров Н.А.</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="7">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=7">1Kolka</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="1Kolka" href="https://foxclub.ru/account/?user=7">
				<img alt='' src='https://secure.gravatar.com/avatar/f23040502e4a0ebee45eb00c4e06a266?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/f23040502e4a0ebee45eb00c4e06a266?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-01-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/biblioteka-dlya-raboty-s-ini-fajlami/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/otmetka-proizvolnoj-gruppy-zapisej-v-gride/</link>
					<title><![CDATA[Отметка произвольной группы записей в Grid&#8217;е]]></title>
                    					    <author><![CDATA[po2]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Отметка произвольной группы записей в Grid&#8217;е</h1>
													</header>
													<div id="sol_opis">Приведенный код демонстрирует один из возможных способов организации отметки произвольной группы записей в Grid’е, по правилам близким к стандартным для списков в Windows-приложениях.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Ившев Дмитрий</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4770">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 8 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4770">po2</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="po2" href="https://foxclub.ru/account/?user=4770">
				<img alt='' src='https://secure.gravatar.com/avatar/c214a28bf1871abdce1868aac0111f84?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c214a28bf1871abdce1868aac0111f84?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 22-12-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/otmetka-proizvolnoj-gruppy-zapisej-v-gride/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/sposob-opredelit-obshhee-kolichestvo-stranicz-v-reporte/</link>
					<title><![CDATA[Способ определить общее количество страниц в Reportе]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Способ определить общее количество страниц в Reportе</h1>
													</header>
													<div id="sol_opis">Способ определить общее количество страниц в Reportе</div>
<div id="sol_body">
<h3>Способ определить общее количество страниц в Reportе</h3>
<p> Предлагаю способ определить общее количество страниц в Reportе, чтобы юзер смог увидеть вожделенное «Страница X из Y». К сожалению, работает только с режимом предварительного просмотра. </p>
<p> 1. В стартовой процедуре определить public переменную max_page_of_report. <br /> 2. В требуемом отчёте создать в PageHeader или PageFooter поле 'Стр. '+alltrim(str(_pageno))+' из '+alltrim(str(max_page_of_report)). <br /> 3. Создать в отчёте переменную (Report/Variables) с именем current_report_last_page. <br /> 4. Поставить этой переменной галочку Release after report, и прописать Value to store: get_last_page_of_report(). Остальное оставить как есть: Initial value – 0, Calculate – nothing, Reset at: End of report. <br /> 5. Прописать в какой-нибудь общий путь функцию: <br /> function get_last_page_of_report <br /> 	if max_page_of_report																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/postroenie-perekrestnoj-tabliczy-shahmatki-universalnaya-funkcziya/</link>
					<title><![CDATA[Построение перекрестной таблицы-шахматки (универсальная функция)]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:17 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Построение перекрестной таблицы-шахматки (универсальная функция)</h1>
													</header>
													<div id="sol_opis">Функция создания перекрестной таблицы (развертки - шахматки) в виде:  первые колонки - информационные поля, затем числовые поля с именами N_... (число этих полей каждый раз будет разное), последнее поле - Итого по горизонтали (опционально). </div>
<div id="sol_body">
<h3>Построение перекрестной таблицы-шахматки (универсальная функция) </h3>
<p> Алгоритм: из источника создается промежуточная выборка по заданному условию, в которой методом разворачивания по Информационным полям и полю Группировки производится слияние (группировка) записей с числовой обработкой группы "слитых" строк по Информационному полю на основе выражения (по умолчанию - это SUM). На основе промежуточной отсортированной выборки строится Кросс-таблица путем добавления и заполнения в ней сводных числовых колонок (разворачиванием) по значению Группирующего поля и добавления строк по значению составного ключа нформационных полей. </p>
<p> Функцию можно использовать автономно или в составе Генератора Отчетов DBRAD32 - в качестве предварительно создаваемой таблицы для Кросс-отчета, который "умеет" выводить в Word и форматировать переменное число колонок (т.н. блок числовых колонок), перенося по полосам колонки, не помещающиеся на страницу. Из FLD-файла генератор автоматически загружает заголовки блока числовых колонок, вычисленные в функции. В результате клиент получает законченный отчет для любой выборки из источника данных. Пример такого Кросс-отчета см. на www.dbrad32.narod.ru ("Автономный генератор отчетов"). Функцию построения кросс-таблицы можно вызывать в методе Load Кросс-шаблона или в тексте Макро-шаблона (входящего в составной отчет Макро+Кросс ). </p>
<p> Для демонстрации работы функции распакуйте архив и запустите файл cross.prg. </p>
<p> Выражаю благодарность Юрию Ч. за окончательное тестирование функции.     </p></div>
<div id="sol_avtor">Автор: Дм.Баянов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/postroenie-perekrestnoj-tabliczy-shahmatki-universalnaya-funkcziya/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/cohranit-v-bmp-proizvolnuyu-oblast-formy/</link>
					<title><![CDATA[Cохранить в bmp произвольную область формы]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Cохранить в bmp произвольную область формы</h1>
													</header>
													<div id="sol_opis">В BMP-файл можно сохранить и форму, не помещающуюся в окне формы (со скроллингом), и произвольную область формы (удобно сохранять графики и диаграммы).  Решил эту задачу некий Рома (_vrs_@rambler.ru), прислав доработанный им класс. Разрешение на публикацию от него получено.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Натали</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/cohranit-v-bmp-proizvolnuyu-oblast-formy/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/formatmessage/</link>
					<title><![CDATA[FormatMessage()]]></title>
                    					    <author><![CDATA[Владимир Новиков]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>FormatMessage()</h1>
													</header>
													<div id="sol_opis">Функция показывает текст ошибки произошедшей при вызове функций WIN32API</div>
<div id="sol_body">
<h3>FormatMessage()</h3>
<p> На этом сайте много полезных классов, в некоторых обработка ошибок организована , в некоторых нет. Всем известна ф. GetLastError() , которая выводит номер произошедшей ошибки в вызове ф. WIN32API. Вот этот номер и надо дать в качестве параметра моей функции, и она покажет текстовое описание (НА РУССКОМ ЯЗЫКЕ!!!) ошибки. <br /> Если Вы применяете функцию продекларированную в нестандартной библиотеке виндоса, то вам придется мою ф. немного видоизменить, дать в параметрах ссылку на файл с ресурсами ошибок. Ну и если у Вас английская версия виндоса , то и ошибки будут на инглише.  <br /> Пример вызова №:  =Text_error(GetLastError()) или например Text_error(87).   </div>
<div id="sol_avtor">Автор: Владимир Новиков</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4900">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4900">Владимир Новиков</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Владимир Новиков" href="https://foxclub.ru/account/?user=4900">
				<img alt='' src='https://secure.gravatar.com/avatar/293ba84e913d04c5da2e8a7edd828e30?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/293ba84e913d04c5da2e8a7edd828e30?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-10-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/formatmessage/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/rabota-s-yarlykami/</link>
					<title><![CDATA[Работа с ярлыками]]></title>
                    					    <author><![CDATA[Олег Бляхеров]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Работа с ярлыками</h1>
													</header>
													<div id="sol_opis">FLL-библиотека для создания ярлыков и чтения их реквизитов</div>
<div id="sol_body">
<h3>Работа с ярлыками</h3>
<p> Файл содержит FLL-библиотеку ShellLink.fll с двумя функциями: создать ярлык CreateLink и прочитать реквизиты ярлыка GetLink, а также исходник ShellLink.cpp и тестовый пример test.prg. Имена файлов в тестовом примере нужно заменить на что-нибудь свое.  </p></div>
<div id="sol_avtor">Автор: Олег Бляхеров</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5049">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5049">Олег Бляхеров</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Олег Бляхеров" href="https://foxclub.ru/account/?user=5049">
				<img alt='' src='https://secure.gravatar.com/avatar/59254e455634d23d143dcfe629716d52?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/59254e455634d23d143dcfe629716d52?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 8<i class="rcli fa-calendar-check-o"></i>Регистрация: 23-04-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/rabota-s-yarlykami/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/makrointerpretator-proczedur-i-makrointerpretator-tekstov/</link>
					<title><![CDATA[Макроинтерпретатор процедур и Макроинтерпретатор текстов]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:17 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Макроинтерпретатор процедур и Макроинтерпретатор текстов</h1>
													</header>
													<div id="sol_opis">Предназначены для исполнения создаваемых 'на лету' пользовательских текстовых процедур (Интерпретатор процедур) и шаблонов текстов с макросами (Интерпретатор текстов). RunMacTxt() просто исполняет процедуру, GetMacTxt() возвращает текст с подставленными выражениями вместо вычисленных в фигурных скобках макросов.</div>
<div id="sol_body">
<h3>Макроинтерпретатор текстовых процедур</h3>
<p> Строки процедуры могут содержать функции и команды VFP, операции с глобальными переменными. Поддерживаются вложенные конструкции IF_ELSEIF_ELSE_ENDIF и DO WHILE, команды LOOP, BREAK, EXIT, комментарии (// или *, &&) и переносы строк (;), мониторинг  ошибок. В функцию RunMacTxt передается переменная , содержащая текст процедуры из строк, разделенных символами перевода каретки. В функцию GetMacTxt передается переменная, содержащая текст со вставками в фигурных скобках любых выражений VFP или управляющих конструкций IF_ENDIF или DO WHILE с префиксом в виде знака амперсанда. Существует вариант GetMacTxt для текста RTF.  Для проверки запустите файл MACRO.PRG. </p></div>
<div id="sol_avtor">Автор: Дм.Баянов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/makrointerpretator-proczedur-i-makrointerpretator-tekstov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/netlib/</link>
					<title><![CDATA[NETLIB]]></title>
                    					    <author><![CDATA[Владимир Журавлев]]></author>
                    										    <pubDate>Fri, 04 Sep 2020 07:56:02 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>NETLIB</h1>
													</header>
													<div id="sol_body">Перевод и адаптация класса Эда Рауха ( Ed Rauh www.universalthread.com , files archives, win32api) В любом языке есть свои ограничения. Фокс от них тоже не свободен. Но как известно, нет задачи, которую бы нельзя было бы решить, если это действительно нужно. <br />
Как известно, вызов многих win32 функций требует использования косвенной адресации. Но это в Фоксе не проблема, используем @ . Вызов других функций требует передачи структур. Тоже ничего страшного-подсовываем массивы, имитирующие эти структуры. Но вот часть функций имеет самоссылочные структуры или ссылки на ссылки ( косвенно-косвенную динамическую адресацию) . <br />
Другими словами в функцию должна передаваться структура, а в структуре косвенные ссылки на другие структуры. Вот тут лобовой способ решения на Фоксе не срабатывает. Подсовывание @ дважды в вызове функции и в ее теле при вызове из нее такой же структуры приводит к неправильной работе. Нужна более тяжелая артилерия. <br />
То есть нужна подготовительная работа по возможности работы с памятью нужным образом. Само собой все это можно сделать на Фоксе. Только нужно знать -что и как. Ну а для чего. А вот ,например , как увидеть сетевое окружение. Ясно , что функция aprinters дает принтеры. Список драйвой тоже можно получить за дешево. <br />
Я рассказывал об этом в своей предыдущей статье про использование winipi функций. Но вот получить все в дном пакете со свойствами, что на каком компьютере расположено, вообще получить сетевое окружение-это уже требует других функций. Или, например , присоединить или отсоединить программно сетевой диск, дать ему имя, сделать диск доступным другим пользователям или закрыть от постороннего доступа и все такое прочее. Можно даже сделать такую штучку. <br />
У Вас есть Дельфийский конкурент, который вас достал своим амморальным поведением, но сидит на другом компьютере. Можно вырубить там дистанционно в реестре ссылки на нужные ему библиотеки, и несколько приятных часов ему обеспечено. Вот тут то и приходится вызывать функции , которые из Фокса не так просто и вызвать. <br />
Эд Раух решил эту задачу и представил на использование публике.Как и мы все с вами тоже часто делаем. Сделал он это как полуфабрикат. Часть кода в классах, часть в текстах функций, часть в примерах. Вобщем ничего готового. Я посидел пару дней и доделал из этой каши более менее нормальную библиотеку классов. Правда комментариев новых как не было, так и нет. Но пользоваться можно. Названия методов интуитивны. Скажем -как посмотреть сетевое окружение в курсоре Фокса. <br />
Нет ничего проще - Set classlib to netlib thisform.share1.getshare Результат будет в курсоре Библиотека-целое раздолье для программистов, обожающих сложности и C++. Ну у всех свои слабости</div>
<div id="sol_avtor"></div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4803">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4803">Владимир Журавлев</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Владимир Журавлев" href="https://foxclub.ru/account/?user=4803">
				<img alt='' src='https://secure.gravatar.com/avatar/fade0b88081aac265adcec71eabb56f4?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/fade0b88081aac265adcec71eabb56f4?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 26-03-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/netlib/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/inkrementnyj-poisk-v-tablicze-locate/</link>
					<title><![CDATA[Инкрементный поиск в таблице (locate)]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Mon, 21 Nov 2022 09:06:51 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Инкрементный поиск в таблице (locate)</h1>
													</header>
													<div id="sol_opis">Вот решил пополнить ряды классов для инкрементного поиска. Что можно сказать, смотрите, понравится, пользуйтес нет, тем более 😉 Для использования в колонке подменить Text1 на IncText. BackSpace - затереть 1 символ Ctrl+Enter - искать тоже-самое ниже.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Жихарев Дмитрий</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/inkrementnyj-poisk-v-tablicze-locate/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/pechat-dos-otchetov-na-windows-printery/</link>
					<title><![CDATA[Печать Дос отчетов на Windows  принтеры.]]></title>
                    					    <author><![CDATA[Abrosimov]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:17 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Печать Дос отчетов на Windows  принтеры.</h1>
													</header>
													<div id="sol_opis">Печать Дос отчетов на Windows  принтеры. Печатает файлы в  дос кодировке на лазерные и струйные принтеры. Определяет длину строки и позволяет резать отчет на листы, указав количество символов на листе.</div>
<div id="sol_body">Очень часто встречается проблема распечатки файлов в Дос кодировки на струйные и лазерные принтеры, которые аппаратно неруссифицированы. Windows система уже стала де факто. Программа позволяет масштабировать выходную информацию (задается размер шрифта), однако визуально это не отображается.  Очень полезна для печати дос-отчетов в бухгалтерии. Позволяет разрезать отчет на любой формат. Вы  просто указываете количество символов в строке.  Реализована на VFp 6.0 и требует соответсвующих dll.    </div>
<div id="sol_avtor">Автор: Абросимов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="2603">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=2603">Abrosimov</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Abrosimov" href="https://foxclub.ru/account/?user=2603">
				<img alt='' src='https://secure.gravatar.com/avatar/4ce951928c142dbae56135812f95b472?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4ce951928c142dbae56135812f95b472?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 08-10-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/pechat-dos-otchetov-na-windows-printery/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/generacziya-menyu/</link>
					<title><![CDATA[Генерация меню]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:17 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Генерация меню</h1>
													</header>
													<div id="sol_opis">Одна из самых нудных, но необходимых, задач - это разграничение прав доступа к системе. Для каждого типа рабочего места (то, что когда-то называлось АРМ'ом) нужно описать и сгенерировать свое меню. Предлагается следующий подход. Создается базовое меню, которое содержит все опции и на его основе с помощью прилагаемой программы генерируются меню для соответствующих АРМ'ов. Так как меню в FoxPro - это DBF-таблица, то права доступа записываются прямо в нее, в поле Comment. Необходимое условие - в рабочей системе должен быть классификатор рабочих мест, который содержит как минимум ID (Char или Integer),  наименование рабочего места и имя соответствующего меню. В каталоге HOME() должен быть файл Genmenu.fxp. Этот классификатор используется как при генерации меню, так и при запуске системы для вызова нужного меню. На VFP7 не проверял - попробуйте. Все исходники прилагаются.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: shn</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/generacziya-menyu/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/generator-unikalnyh-znachenij-guid/</link>
					<title><![CDATA[Генератор Уникальных значений GUID]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:17 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Генератор Уникальных значений GUID</h1>
													</header>
													<div id="sol_opis">Генератор GUID позволяет АВТОНОМНО создавать УНИКАЛЬНЫЕ значения на ИЗОЛИРОВАННЫХ информационных уровнях с быстродействием до 10000 значений в секунду.  Полученные значения упакованы в 8 (или 10) байт, упорядочиваются по возрастанию в хронологическом порядке создания и имеют возможность восстановления даты создания. Удобный способ создания ПЕРВИЧНЫХ КЛЮЧЕЙ. 19.11.2001 добавлены функции TimFromGuid() и SecFromGuid().</div>
<div id="sol_body">
<h3>Генератор Уникальных значений GUID</h3>
<p> Известен метод получения GUID, <a href='http://support.microsoft.com/support/kb/articles/Q269/3/87.asp'> разработанный фирмой Microsoft </a>, <i>Contributions by John Desch</i>. Этот метод создает неупакованное значение GUID длиной в 38 байт, и декларирует наличие защиты от дублирования значений на изолированных системах при автономном вызове функции '... returns a unique value: that is, no other invocation, on the same or any other system (networked or not), should return the same value...'. </p>
<p> Предлагаемый здесь улучшенный метод получения компактного надежного GUID для изолированных систем строит упакованное значение длиной в 8 или 10 байт, имеет открытую описанную физическую модель построения. Значение создается на основе следующих компонент: </p>
<ul>
<li>Временных отметок (вместимость до 20 лет),
<li>Идентификтатора программной Сессии и Аппаратного идентификатора (HDD),
<li>(Опционально) дополнительного кода от генератора случайных чисел (10-байтовый GUID).  </ul>
<p> Для реального использования достаточен вариант 8-байтового GUID, т.к. вероятность дублирования значения на той же микросекунде после сдвига часов хотя и ненулевая, но мизерно мала. Улучшенный 10-байтовый метод (с доп. случайным кодом) сводит такую вероятность фактически к нулю, хотя требует дополнительно два байта в значении. </p>
<p> В значении GUID используются только неконфликтующие символы ASCII, доступные для ввода с клавиатуры. Метод генерации является базовым в <a href='http://www.dbrad32.narod.ru'> проекте DBRAD32 (www.dbrad32.narod.ru)</a> при создании первичных ключей, классов справочников, отношений, подсвеченных строк в локальных сессиях, идентификаторов объектов и т.п. Надежность метода проверена на протяжении 5-ти лет. </p>
<p> Приложенный файл архива guid.zip содержит два файла - guid.doc (комментарий)и guid.prg   (исходный код функций). Для проверки достаточно просто запустить guid.prg. Для использования генератора GUID в своем приложении необходимо скопировать в него текст функций, в начале приложения инициализировать генератор однократным вызовом функции IniGenGuid() и затем получать значение GUID вызовом функции Guid(). Функции DatFromGuid() и TimFromGuid() позволят получить дату и время создания значения.   </div>
<div id="sol_avtor">Автор: Дм.Баянов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/generator-unikalnyh-znachenij-guid/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/virtualnye-mnogopolzovatelskie-blokirovki-semafory/</link>
					<title><![CDATA[&#8220;Виртуальные&#8221; многопользовательские блокировки (семафоры)]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:17 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>&#8220;Виртуальные&#8221; многопользовательские блокировки (семафоры)</h1>
													</header>
													<div id="sol_opis">Семафорные логические блокировки позволяют разделять доступ группам пользователей к любым объектам, которым можно присвоить идентификатор внутри группы. Объектами могут выступать таблицы, записи, директории, группы файлов и любые абстрактные объекты. На один объект может быть наложено НЕСКОЛЬКО Shared-блокировок или одна Exlusive, при этом блокировки "знают" имя своего хозяина и момент блокирования. Такие нефизические блокировки организуются в виде независимого механизма во внешнем семафорном списке.</div>
<div id="sol_body">
<h3>&quot;Виртуальные&quot;многопользовательские блокировки (семафоры)</h3>
<p>   Примерами типовых задач для таких блокировок являются: <br /> 1) Разделение доступа к группе файлов в директории - захват и манипуляция с группой любых файлов разного типа, при этом остальные пользователи не должны иметь доступ к этой группе файлов на время сеанса. <br /> 2) Групповая блокировка для записи - группа пользователей редактирует одну запись, блокируя ее в режиме Shared, при этом для удаления эта запись недоступна.  </p>
<p>   Блокировки организуются в виде внешней таблицы семафорных блокировок, в которую заносится запись о блокировке с информацией об : <br /> 1) идентификаторе объекта <br /> 2) имени пользователя <br /> 3) режиме блокировки (монопольная или разделяемая) <br /> 4) времени и дате установки блокировки </p>
<p> При аварийном завершеннии приложения, выставившего блокировку, она автоматически дезактивируется в семафоре. Освободившиеся записи используются для других блокировок, оптимизируя механизм от разбухания таблицы и необходимости ее упаковки. <br /> Логические блокировки позволяют гибко отрегулировать множественный доступ к нестандартным объектам, не производя ФИЗИЧЕСКУЮ блокировку стандартных объектов БД (таблиц и записей). Для полной и правильной работы с записями требуется использование в них уникальных первичных ключей. <br /> В приложенном файле slock.prg находятся набор автономных функций (SemLock, SemUnlock и SemLocked) с тестовым примером, иллюстрирующие многопользовательские блокировки для абстрактных объектов. Для проверки необходимо откомпилировать файл и запустить его несколько раз (каждая сессия будет имитировать пользователя).     </div>
<div id="sol_avtor">Автор: Дм.Баянов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/virtualnye-mnogopolzovatelskie-blokirovki-semafory/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/vfpcgi-dll-pishem-cgi-na-visualfoxpro/</link>
					<title><![CDATA[VFPCGI.DLL &#8211; Пишем CGI на VisualFoxPro]]></title>
                    					    <author><![CDATA[vat]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:17 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>VFPCGI.DLL &#8211; Пишем CGI на VisualFoxPro</h1>
													</header>
													<div id="sol_opis">VFPCGI - динамическая библиотека для Windows 9x/2000, с помощью которой можно легко и быстро сделать CGI скрипт на Visual FoxPro.</div>
<div id="sol_body">
<h3>VFPCGI.DLL - Пишем CGI на VisualFoxPro</h3>
<p> VFPCGI - динамическая библиотека для Windows 9x/2000, с помощью которой можно легко и быстро сделать CGI скрипт на Visual FoxPro. Подробности на <a href=http://vfpcgi.narod.ru >http://vfpcgi.narod.ru</a> <br />																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/prostoj-kalendar/</link>
					<title><![CDATA[Простой календарь]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:17 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Простой календарь</h1>
													</header>
													<div id="sol_opis">Служит для заполнения поля ДАТЫ. Весь календарь исполнен в prg модуле. Подключается элементарно. В архиве есть пример.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Alexsum</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/prostoj-kalendar/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/prosmotr-otcheta-s-iznanki/</link>
					<title><![CDATA[Просмотр отчета с изнанки]]></title>
                    					    <author><![CDATA[Lara]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:17 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Просмотр отчета с изнанки</h1>
													</header>
													<div id="sol_opis">Удобный просмотр файлов отчетов (.frx)</div>
<div id="sol_body">
<h3>Просмотр отчета с изнанки</h3>
<p>  Если Вы используете стандатрный генератор отчетов Visual FoxPro и сталкивались с проблемой поиска переменной в многочисленных полях, то эта программа вам подойдет. <br />  В zip'e exe-шка и вспомогательная таблица. В отдельной директории не нуждаются. </p></div>
<div id="sol_avtor">Автор: Лариса Ляхт</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="2419">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=2419">Lara</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Lara" href="https://foxclub.ru/account/?user=2419">
				<img alt='' src='https://secure.gravatar.com/avatar/71ce3b5d85deea1868c0e051f981e98b?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/71ce3b5d85deea1868c0e051f981e98b?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 18-04-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/prosmotr-otcheta-s-iznanki/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-spravochnikov/</link>
					<title><![CDATA[Класс справочников]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:17 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс справочников</h1>
													</header>
													<div id="sol_opis">Для одной из задач понадобилось возможность добавлениия справочников в  процессе работы. В итоге возник этот класс.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Fly_Tiger</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-spravochnikov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/eshhe-raz-zapushheno-li-prilozhenie/</link>
					<title><![CDATA[Еще раз запущено ли приложение]]></title>
                    					    <author><![CDATA[Будрин]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:17 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Еще раз запущено ли приложение</h1>
													</header>
													<div id="sol_opis">Многие пользователи не задумываясь запускают по несколько копий программ. Что бывает нежелательно. В связи с этим мною была написана библиотечка (FLL),а другой пользователь Fox по имени Андрей (фамилию жалко не знаю) сделал DLL. Смысл данных изысканий состоит в том что функции возвращают список имен процессов и имена окон.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Александр и Андрей</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4875">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4875">Будрин</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Будрин" href="https://foxclub.ru/account/?user=4875">
				<img alt='' src='https://secure.gravatar.com/avatar/b72e8152e7e819bc1221a4a1739826e1?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/b72e8152e7e819bc1221a4a1739826e1?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 21-09-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/eshhe-raz-zapushheno-li-prilozhenie/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/organizacziya-steka-v-prilozhenii/</link>
					<title><![CDATA[Организация стека в приложении.]]></title>
                    					    <author><![CDATA[Jimmy]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:17 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Организация стека в приложении.</h1>
													</header>
													<div id="sol_opis">Для чего? - спросите Вы. Отвечу: Очень просто обмениваться данными между отдельными блоками приложения (допустим - формами). И всего-то 20-25 строк!  Каждый разработчик когда-то сталкивается с проблемой: нужно возвратить из формы несколько параметров в вызвающую программу. Я - столкнулся! И вот решение - организация стека LIFO, причем, сфера его применения оказалась гораздо шире, чем просто возврат параметров из формы 🙂  Стек - это объект, созданный на основе класса cstStack , обладающий тремя методами: Push(), Pop(), Clear(). Работает так: величина, помещенная в стек последней - выйдет первой (LIFO). Величины, помещаемые в стек, могут быть любого допустимого типа, т.е. не надо делать дополнительных преобразований, размер же стека = ограничению Фокса на размер массивов. Решение предоставлено в виде тестовой программы. Запустите - увидите. Понравится - пользуйтесь. Jimmy</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Дмитрий Орлов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4748">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4748">Jimmy</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Jimmy" href="https://foxclub.ru/account/?user=4748">
				<img alt='' src='https://secure.gravatar.com/avatar/4438780968f2f420d33c7c7ad27e120f?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4438780968f2f420d33c7c7ad27e120f?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 30-07-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/organizacziya-steka-v-prilozhenii/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/vychislenie-md5-signatur-fajlov/</link>
					<title><![CDATA[Вычисление MD5 сигнатур файлов]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Wed, 23 Nov 2022 09:05:48 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Вычисление MD5 сигнатур файлов</h1>
													</header>
													<div id="sol_opis">Возникла задача определить "качество" хранения и копирования неких больших файлов. Создавались они само собой на жестком диске , потом могли быть скопированы по локальной сети, закачивались на FTP сервер, записывались на CDR(W). Тут и встала проблема обнаружения "битых" копий. Общий метод борьбы известен: считай контрольную сумму. Какой из алгоритмов выбрать?</div>
<div id="sol_body">
<h2>Вычисление MD5 сигнатур файлов</h2>
<h3>Зачем это понадобилось</h3>
<p>Возникла задача определить "качество" хранения и копирования неких больших файлов. Создавались они само собой на жестком диске , потом могли быть скопированы по локальной сети, закачивались на FTP сервер, записывались на CDR(W). Тут и встала проблема обнаружения "битых" копий. Общий метод борьбы известен: считай контрольную сумму. Какой из алгоритмов выбрать? Остановились на MD5 по следующим причинам:</p>
<ul>
<li>это современный, стойкий, быстрый алгоритм</li>
<li>существуют консольные утилиты для вычисления</li>
<li>бесплатная реализация в виде динамической библиотеки</li>
<li>нафига еще искать, если это прекрасно работает 😉</li>
</ul>
<h3>The MD5 Message-Digest Algorithm</h3>
<p>Сначала заставим Google поискать "md5". В первых строках получаем ссылку на <a href="http://userpages.umbc.edu/~mabzug1/cs/md5/md5.html">MD5 Homepage (unofficial)</a> откуда узнаем, что</p>
<p>MD5 был разработан в 1992 году <a href="http://theory.lcs.mit.edu/~rivest/homepage.html"> Профессором Ronald L. Rivest </a> из Массачусетского технологического института (<a href="http://web.mit.edu">MIT</a>), одним из основателей <a href="http://www.rsasecurity.com">RSA Security</a>. Подробное описание можно найти в RFC 1321, а если коротко, то</p>
<blockquote><p><i> [MD5 алгоритм] получает на вход сообщение произвольной длины и на выходе выдает "подпись"(сигнатуру) длиной 128 битов. Предполагается, что не существует двух сообщений имеющих одинаковые сигнатуры, или, что невозможно создать сообщение с заранее заданной сигнатурой. MD5 алгоритм в основном используется в крипрографических приложениях типа RSA. По существу, MD5 - это способ проверки целостности данных, гораздо более надежный, чем контрольная сумма или другие методы. </i></p></blockquote>
<p>Другой умный мужик Francisco Carlos Piragibe de Almeida написал нам на счастье <a href="http://www.esquadro.com.br/md5bas.zip"> a DLL with a BAS wrapper module</a></p>
<p>Кроме того находим парочку консольных утилит</p>
<ul>
<li><a href="http://www.fourmilab.ch/md5/">Command Line Message Digest Utility</a></li>
<li><a href="http://www.iay.pwp.blueyonder.co.uk/threel/tech/tools/md5.htm"> MD5 Checksum Utility</a></li>
</ul>
<p>Условия использования простые - не забывайте указать "RSA Data Security, Inc. MD5 Message-Digest Algorithm" в своих программах и других материалах. Что собственно и делем 😉</p>
<h3>Начинаем реализовавать новые знания</h3>
<p>Для начала бэйсиковскую программку переводим на лисиный язык, попутно исправляя ошибки (кому интересно может тоже поразвлекаться с <b>Fault Error</b>) и оформляя все в виде класса.</p>
<pre><pre class='bbcode'>     
 *-------------------------------------------------- * Это будет метод Init *--------------------------------------------------   
  DECLARE INTEGER MDStringFix IN aamd532.dll STRING s, LONG l, STRING r   
  DECLARE INTEGER MDFile IN aamd532.dll STRING f, STRING r   
 *-------------------------------------------------- * Function MD5String -- оформим одноименным методом *--------------------------------------------------   
  PARAM s   
  r = SPACE(32)   
  l = LEN(s) = MDStringFix( s, l, @r)   
  RETURN r   
 *-------------------------------------------------- * Function MD5File -- оформим одноименным методом *--------------------------------------------------   
  PARAM fname   
  r = SPACE(32) = MDFile( fname, @r)   
  RETURN r   
    
</pre></pre>
<p>В Command окне протестируем оба метода. Для проверки первого в конце RFC 1321 приведены тестовые образцы. Для проверки сигнатуры файла возьмем образец из дистрибутива <b>FreeBSD 4.1-RELEASE</b> В каждой папке с файлами там имеется файл <b>checksum.md5</b>, который представляет собой список сигнатур файлов.</p>
<pre><pre class='bbcode'>     
  set classlib to md5   
  o=createobject("md5") &amp;&amp; ------ Правильные ответы -------   
  ? o.md5string("") &amp;&amp; d41d8cd98f00b204e9800998ecf8427e   
  ? o.md5string("a") &amp;&amp; 0cc175b9c0f1b6a831c399e269772661   
  ? o.md5string("abc") &amp;&amp; 900150983cd24fb0d6963f7d28e17f72   
  ? o.md5string("message digest") &amp;&amp; f96b697d7cb7938d525a2f31aaf161d0   
  ? o.md5string(space(15000000)) &amp;&amp; Сигнатура 15 миллионов пробелов ;)   
  ? o.md5file("bin.aa") &amp;&amp; e16d5641bd71c1308b9a85d47b3e6309   
  ? o.md5file("blabla.bla") &amp;&amp; FILE NOT FOUND   
</pre></pre>
<p>Собственно метод, используемый во <b>FreeBSD</b>, нас вполне устраивает. Перед тем как переместить данные будем создавать файл <b>checksum.md5</b> Для этого служит метод нашего класса <b>MD5MakeList</b>, которому будем передавать путь к папке с данными, а он породит нам список и вернет число обработанных файлов или -1 при ошибке. Позднее в класс были добавлены простенький "прогрессбар" (чтобы пользователь не скучал ;), а также свойства:</p>
<p><b>StopAtError</b> -- если .F., то процесс обсчета не прерывается при ошибках.<br />
<b>BadFileCount</b> -- после <b>MD5MakeList</b> содержит число необсчитанных файлов.</p>
<h3>Download</h3>
<p><a href="md5vfp.zip">Это архив с классом md5.vc*, библиотекой aamd532.dll и утилиткой md5.exe</a></p>
<p><b>aamd532.dll</b> скопируйте в <b>WindowsSystem</b> или <b>WINNTSystem32</b></p>
<p>PS. MD5 (md5vfp.zip) = dc8e6ec6d0e84fff9fb4c73289c09210 🙂</p>
<hr />
<p>2001, Тепликов Илья, <a href="mailto:itp@karelia.ru">itp@karelia.ru</a></p>
</div>
<div id="sol_avtor">Автор: Илья Тепликов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/vychislenie-md5-signatur-fajlov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/vfp-grid-chast-i/</link>
					<title><![CDATA[VFP грид, часть I]]></title>
                    					    <author><![CDATA[TomDill]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:17 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>VFP грид, часть I</h1>
													</header>
													<div><em>(Авторский перевод статьи "VFP Grids, Part I" в Universal Thread Magazine за Август 2001. См. <a href="http://www.universalthread.com/Magazine/August2001/">http://www.universalthread.com/Magazine/August2001/</a>, спасибо также Наде Носоновской за помощь в переводе и корректировке текста и за дополнительные примеры.)</em></div>
<div id="sol_body">
<p><b>Что такое грид и когда его использовать?</b></p>
<blockquote><p><em><strong>Грид</strong></em> - это набор объектов ФоксПро, позволяющий представлять данные в виде таблицы-списка, который можно просматривать в двух направлениях при помощи полос прокрутки. Грид состоит из главного объекта грида и набора колонок. Каждая колонка, в свою очередь, должна иметь объект заголовка и контрол, который позволяет редактировать и отображать данные в колонке грида (по умолчанию это TextBox). Грид выглядит как прямоугольная область с линейной решеткой, заголовками вверху каждой колонки, полосами прокрутки и некоторыми другими полезными вещами, такими как метки записей, метки удаления записи, полоска для разделения грида на две части.</p></blockquote>
<p>Но на самом деле, отображение данных не настолько свободно, как, например, в таблице Excel. Грид требует набор данных (псевдоним), чтобы отобразить что-то. В пределах одной колонки сложно организовать отображение различных типов данных для различных строк. Грид имеет одинаковый размер всех строк, и колонка имеет одинаковую ширину для всех строк. Существуют также некоторые ограничения, которые могут выглядеть странно, пока не вспомнить о том, что грид на самом деле является контролом, построенным на коде комманды BROWSE, поддерживаемой из более ранних версий ФоксПро. Это может ответить на много вопросов по поводу странного поведения грида и его свойств. Несмотря на все хлопоты с ним связанные, грид - весьма полезный контрол и очень популярен среди программистов ФоксПро, потому существует также много обходных путей и решений для гридов, которые позволяют пробиться сквозь ограничения и создавать действительно замечательные вещи. Ограничения, связанные со странностями грида, не должны быть ключевым аспектом в принятии решения об использовании грида в приложении.</p>
<p>Грид полезен для отображения (просмотра) данных в компактной форме (большое количество данных на одну страницу). Грид хорош для выпадающего списка или для отдельной страницы формы - списка для поиска и навигации по данным. Не очень хорошо использовать грид как основное средство навигации по данным, т.к. грид занимает большое место на форме. Но часто грид является основным средством навигации и управления по данным на самой основной (начальной) форме - на грид налагается большое количество функциональности для вызова других форм для редактирования данных.</p>
<p>Грид полезен для любых регулярных данных только для чтения. Плохая идея использовать грид для редактирования данных. Редактирование данных гридом хорошо использовать и легко организовать только в приложениях административного типа. Редактирование данных при помощи грида имеет много проблем, если пытаться пробиться сквозь ограничения и странности грида в ФоксПро. Но, несмотря на это, такие формы данных, как редактирование списка элементов накладной или ордера, все-таки более естественны для пользователя, если они представлены в виде списка-таблицы (грида) для редактирования. Такие случаи - исключение, но не правило, не ставьте гриды на каждой форме только потому что очень просто редактировать данные в них. Если использовать гриды повсюду, то бысто обнаружите себя в проблемах, т.к. грид - довольно сложное средство, которое может быстро выйти из-под контроля. Надо будет после этого потратить много усилий, чтобы решить проблему, найти решение и потом далее исравлять проблемы, следующие за ними. Обычно данные редактируются при помощи формы с набором контролов для каждого поля данных и набора средств для навигации по данным, записи/отмены изменения и некоторых других средств специфических для конкретной формы. Организация такой формы при помощи грида - это прямой путь потратить дополнительное время. Конечно, если у вас есть время и вам нравится поиграть со странностями грида (кто кого?), грид - прекрасный контрол для проведения времени на поиск и изобретение решений и обходных путей.</p>
<p><b>Автоматическая перепривязака колонок грида</b></p>
<p>Одна из странностей грида, которая проявляется довольно часто, это автоматическая перепривязка колонок грида к полям набора данных. Можно обнаружить, что грид отображает не те данные, которые вы ему указали через свойство ControlSource в колонках. В дополнение, данные в колонках отображены в порядке физического размещения полей в наборе данных, несмотря на то, что начальный порядок следования колонок был задан иным. Почему так?</p>
<ul>
<li>Потому что свойство RecordSource грида изменилось во время дизайна. После этого свойство ControlSource всех колонок очищается, что часто упускается программистом. После запуска формы такой грид сам назначит поля колонкам. Для такого случая делайте резервную копию всех значений этого свойства, в основном используют свойство Comment колонки.</li>
<li>Потому что свойство RecordSource грида изменилось во время выполнения. Если это не порсто ошибочное повторное изменение, то надо сохранять значения ControlSource для всех колонок, а после присвоения набора данных - восстанавливать.</li>
<li>Возможно что грид был перестроен, об этом - в следующей части этой статьи.</li>
</ul>
<p>Это все не так досадно, как побочные эффекты после такого поведения грида. В основном, нет никакой разницы, пока грид не имеет сложной функциональности и построения. Например, если значения колонки отображались при помощи выражения - выражение будет утрачено, и только поле будет отображаться Например, вместо значения PADR(mMyMemoField,200) поле покажет "Memo" в колонке грида). В гриде появляются нежелательные поля, такие как поле главного ключа таблицы, про которое пользователь не имеет никакого представления. Но самый опасный случай, когда в гриде есть некоторые необычные контролы. Простой пример - в гриде есть CheckBox, и грид решил привязать колонку с ним с полю символьного типа, ФоксПро выдает ошибку несовпадения типов при первом же обновлении изображения грида:<u><i> 'Type is not supported by this control'</i></u>.</p>
<p>Несмотря на все это, все-таки бывают ситуации, когда набор данных грида надо изменять в любом случае, например, чтобы избежать перестройки грида. Ниже приведены примеры кода, как сохранить значения ControlSource всех колонок грида при помощи свойства Comment колонки, и как восстановить их.</p>
<pre>&amp;&amp; сохранить ControlSource каждой колонки
with {grid}
   local nColumnIndex
   for m.nColumnIndex = 1 to .ColumnCount
      .Columns(m.nColumnIndex).Comment = .Columns(m.nColumnIndex).ControlSource
   endfor
endwith
 
&amp;&amp; восстановить ControlSource каждой колонки
with {grid}
   local nColumnIndex
   for m.nColumnIndex = 1 to .ColumnCount
      if !empty(.Columns(m.nColumnIndex).Comment)
         .Columns(m.nColumnIndex).ControlSource = .Columns(m.nColumnIndex).Comment
      endif
   endfor
endwith</pre>
<p>Здесь {grid} это ссылка на объект грида.<br />
Хорошая идея сделать эти куски кода методами класса грида в Вашем приложении. Так же, хорошо вызывать восстановление значений ControlSource в событии Init грида на случай, если программист случайно изменил или спровоцировал изменение (просто нажал Enter на свойстве RecordSource в редакторе свойств) во время дизайна (для этого надо в дизайне делать копию значений).</p>
<p>Для этого можно выполнить следующий код (идея принадлежит Cetin Basoz из UniversalThread):</p>
<pre>********************************************************************
* Description.......: GridBuilder - allows to build a grid in design-time
*  Calling Samples...:
*  Parameter List....:
*  Created by........: Cetin Basoz
*  Modified by.......:
********************************************************************
*custom builder not registered
aselobj(arrObj)
for each oObj in arrObj
         if upper(oObj.baseclass)='GRID'
                 for each oColumn in oObj.columns
                     oColumn.Comment = oColumn.ControlSource
                 next
         endif
next</pre>
<p>Важное примечание: не делайте никакого обновления любого видимого объекта грида до того, как все значения ControlSource будут восстановленны. Иначе может выдаваться сообщение типа 'Type is not supported by control', как описано выше.</p>
<p><b>Автоматическая перестройка грида</b></p>
<p style="text-align: justify;">Когда-нибудь случалось, что ваш грид не хочет вести себя так, как вы ему указали во время дизайна? Контролы утрачены в колонках после запуска? Код событий в колонках, заголовках или контролах не запускается? Перестройка грида - это полное уничтожение всех колонок и контролов в гриде и создание их заново, используя стандартные контролы ФоксПро со всеми значениями свойств по умолчанию. Это утрата всех значений, свойств, кода методов и событий контролов в колонках. Свойство CurrentControl принимает значение "Text1" - контрол TextBox в колонке по умолчанию. Заголовки утрачены и приняли значения названий полей набора данных. Как правило, это катастрофа, когда не понимаешь, что случилось с гридом.</p>
<p>Перестройка случается в нескольких случаях, которые описанны ниже с соответствующими решениями для них.</p>
<p>1. Грид перестраивает себя всегда, если набор данных для этого грида, указанный в RecordSource, закрывается. Если это -представление (View), то обычно перестройка не возникает по команде Requery(). Если это запрос, то переприсвоение другого запроса или закрытие набора данных -результата предыдущего запроса, тоже запускает перестройку. Также перестройка возникает, если было использовано SQL Pass-Through (SPT) функции для выборки в набор данных для грида, и этот запрос запущен заново для выборки в тот же набор данных (т.е. перечитывание данных через SPT запускает реконструкцию, тогда как для представления requery() не запускает ее).</p>
<p>Чтоб избежать реконструкции, когда обновляется набор данных грида, до того, как делать любые действия, описанные выше, надо присвоить пустую строку свойству RecordSource грида (но только не строку с одним пропуском - " ", а именно пустую - ""). Проверяйте Ваш код аккуратно, чтоб запрограммировать это в правильном порядке действий с гридом, и ничто другое не испортит его. (Строку кода, запускающую перестройку грида, можно поймать, поставив SET STEP ON в событии BeforeRowColChange грида.) После того, как набор данных для грида подготовлен заново, надо присвоить название (Alias) набора данных или запрос гриду заново. Перестройка при таком способе не возникает, но происходит автоматическая перепривязка колонок грида после присвоения набора данных.<br />
Пример кода:</p>
<pre>* сохранить ControlSource каждой колонки
...........
{grid}.RecordSource = ""
* изменения в наборах данных для грида, закрывание/открывание заново или SPT запрос
...........
* Восстановить набор данных для грида
{grid}.RecordSource = "{НазваниеНабораДанных}"
* restore the control sources of columns here
...........</pre>
<p>Здесь {grid} - это ссылка на объект грида,<br />
{НазваниеНабораДанных} - это псевдоним (Alias) набора данных или текст запроса. В наиболее общем случае, как набор данных для грида псевдоним можно выбрать из значений свойства ControlSource колонок, т.к. ФоксПро всегда подставляет автоматически псевдоним к названию поля в колонке, приводя значение к формату "псевдоним.поле" несмотря на то, что во время дизайна программист указал только поле.</p>
<p>Все замечания относительно автоматической перепривязки колонок к полям относятся и к этому случаю.</p>
<p>Существует и другой способ отменить перестройку грида - при помощи события BeforeRowColChange в гриде. Это событие запускается всегда перед тем, как грид перестроится. Оно запускается в любом случае: когда набор данных грида закрывается, SPT-запрос заново выбирает данные в набор данных грида; несмотря на то, что грид невидим, неактивен и независимо от настроек грида. Самое чудесное то, что комманда NODEFAULT, используемая в этом событии на протяжении всего времени обновления набора данных, отменяет перестройку грида вообще, но следует пользоваться этим очень аккуратно, т.к. могут возникать нежелательные побочные эффекты.</p>
<p>Вот пример кода для обновления набора данных грида таким способом:</p>
<pre>thisform.GridRefreshing = .T. &amp;&amp; сообщить, что данные будут обновляться
... выполнить обновление данных
thisform.Grid.RecordSource = thisform.Grid.RecordSource
thisform.Refresh &amp;&amp; или grid.refresh
DOEVENTS &amp;&amp; если нужно - просто протестируйте без этого
&amp;&amp; после этого момента грид перестает запускать перестройку
thisform.GridRefreshing = .F.</pre>
<p>В событии BeforeRowColChange грида такой код:</p>
<pre>if PEMStatus(thisform,"GridRefreshing",5) AND thisform.GridRefreshing
   nodefault &amp;&amp; отменить перестройку на протяжении обновления данных
   return
endif</pre>
<p>Можно поставить этот код в класс грида для организации этой функциональности, тогда свойство GridRefreshing можно перенести в грид.<br />
Иногда после такого способа нужно поставить фокус за пределы грида и обратно, так как текущая клетка грида может показывать звездочки ('*******').</p>
<p>К сожалению, невозможно определить причину запуска события <em>BeforeRowColChang</em>e, чтоб различить, когда запускается перестройка грида, и когда это событие запускается перед сменой текущей клетки в гриде или получения фокуса гридом. Просто используйте свойство-флажок для этого, как в примере. Конечно, если у вас есть время, можно организовать класс грида с покрывающей его прозрачной прямоугольной областью, чтоб выловить все события мышки до того, как событие грида BeforeRowColChange запустится. Это также требует ловить события клавиатуры в событии KeyPress формы при активном гриде (свойство <em>KeyPreview</em> формы должно быть .T. для этого), и надо заключить грид в объект контэйнера, чтоб поймать момент получения фокуса гридом.</p>
<p>Оба подхода имеют существенный недостаток: необходимы дополнительные строки кода для грида во всех местах в коде, которые могут вызвать перестройку. Если эти места находятся во многих формах и классах, то весьма трудно их все обнаружить; и в дополнение необходимо во всех этих местах кода иметь ссылку на грид. Также, при динамическом обновлении данных грида при помощи представления, при переходе на использование удаленного доступа к БД проблемы будут при использовании функций SQL Pass-Through, поскольку обновление данных ими запускает перестройку (тогда как представления - нет, но представления для удаленного доступа (Remote View) не всегда подходят). Проблемы возникают в основном из-за того, что программист, не зная об перестройке грида или не предусматривая ее, использует для представления комманду requery() в разных местах кода и оставляет их так разбросанными не думая, что это плохо. Когда осуществляется перевод кода на работу через SQL Pass-Through, надо искать все эти места, и, в дополнение, добавлять код для отмены перестройки грида при необходимости. Если это в других классах или формах, то это может стать большой затратой времени. Совет: разместите обновление данных, открывание и закрывание наборов данных и код всех других действий с данными в одном месте - методах формы или объекта доступного нескольким формам. Всегда предполагайте, что некоторый код работы с данными может в будущем требовать дополнительные строки кода, даже если это просто вызов комманды requery(). В будущем это окупится - надо будет вносить изменения только в одном месте вместо поиска всюду, где только можно, в случае таких изменений. Перестройка грида - один из таких случаев. Например, создайте класс грида, который также будет содержать методы для работы с данными, отображаемыми гридом. При помощи ссылки на объект такого грида обновление данных будет вызываться одним вызовом метода объекта во всех формах, где нужно обновление этих данных. В случае изменений в коде надо будет вносить изменения только в одном месте - этом методе грида. Ну ладно, скорее всего, вы не будете строить приложений, которые потребуют таких сложностей...</p>
<p>Будучи разочарованы поведением грида, программисты также часто создают временный набор данных (курсор) и используют его как набор данных для грида, потом обновляют данные в нем путем удаления старых записей и копирования новых. Если такой курсор уже есть в программе, то обновлять его содержимое таким способом несложно. Но есть небольшая проблема - вертикальная полоса прокрутки показывает общее количество записей, которое намного больше, чем реально отображаемое (из-за множества записей помеченных на удаление).</p>
<p>2. Перестройка грида запускается также когда грид инициализируется, но свойство RecordSource пустое или набор данных для грида не существует (еще не открыт или запрос не запускался). В таком случае грид перестраивает себя, используя текущий псевдоним как набор данных, если таковой открыт в текущей рабочей области (или остается пустым, если не открыт, но все колонки уничтожаются все равно). Это случается часто: если надо открыть набор данных в зависимости от параметров позже чем в событии Load формы, то используйте следующую технику.</p>
<p>В событии Load создайте пустой курсор при помощи комманды CREATE CURSOR, используя ту же структуру, что и для набора данных грида под тем же именем, набор данных грида должен быть указан на этот курсор (на это имя). Во время открывания реальных данных грид уже может быть инициализирован, потому используйте решения из п.1. для того, чтоб закрыть временный курсор и открыть реальные данные. Другое решение - поставить объект на форму, событие Init которого запускается до того как событие Init грида.</p>
<p>Второй подход - добавлять грид к форме на лету. Создайте класс грида со всеми необходимыми настройками и колонками и не кладите его на форму во время дизайна. В коде Init формы используйте AddObject() или NewObject(), чтоб добавить его к форме или контэйнеру на форме после того, как набор данных для грида приготовлен.</p>
<p>3. Грид перестраивается, если установить количество колонок в 0 или -1. Я надеюсь, Вы никогда этого не делаете, не правда ли? 😉 Все-таки иногда это может быть использовано в простых административных формах, которые позволяют открыть любую таблицу для ее просмотра в гриде. Но из-за перестройки такой грид может иметь ограниченную функциональность, или вся функциональность в таком случае должна быть размещена в классах, которые используются после перестройки способом добавления их к гриду и замещения объектов по умолчанию. К сожалению, не существует другого способа задать свои классы и настройки для колонок, которые создаются ФоксПро автоматичски.</p>
<p>4. Грид перестраивается, когда набор данных выходит за пределы видимости грида. Это часто случается, когда набор данных открыт в одной сессии данных, а грид реально инициализирован в другой сессии данных, потому когда грид пробует обновить свое изображение, другая сессия данных является текущей, в которой этот набор данных не существует. Это может также возникнуть и в других ситуациях при активном переключении программистом сессий данных.</p>
<p>Перестройка грида не может быть отменена путем создания и хранения ссылок на каждую колонку грида (объект не уничтожается, если на него существует ссылка где-то в переменной) - грид просто отторгает объекты колонок от себя и очищает много свойств. Создание класса грида уже с колонками и его использование также не предотвращает перестройку (класс с объектами не позволяет удалять объекты в нем там, где этот класс используется как объект, и грид не исключение, но перестройка грида - исключение).</p>
<p>Также существует популярный обход перестройки грида вообще - создание грида программным образом динамически и пересоздание его после обновления данных. Создайте класс грида со всеми настройками. Программным образом удаляйте его с формы перед обновлением данных и добавляйте заново после обновления. Это требует некоторых проверок в таком коде, программного присвоения значений некоторым свойствам грида и т.п. Этот способ плох тем, что он требует создания своего класса грида для каждого частного случая, знать название этого класса, создавать программу для добавления каждого грида - много кода и объектов программирования, которых можно избежать.</p>
<p>Можно также создавать полностью грид и все его колонки, объекты и настройки при помощи одного только кода. После перестройки нужно запускать этот код каждый раз заново. Этот подход хорош только в случае, если перестройка нужна, например, если колонки грида динамично добавляются/убираются (нельзя создать класс грида) или для административных целей - для просмотра любой таблицы в гриде и в то же время иметь некоторую функциональность, такую как редактирование memo-полей в контроле EditBox, сортировка по нажатию на заголовок и т.п.</p>
<p>&nbsp;</p>
<p><b>Блокировка (замораживание) колонки, чтоб она была всегда видима, несмотря на прокрутку </b></p>
<p>Если надо заблокировать (заморозить) некоторую колонку или колонки грида, чтоб они были всегда видны слева даже после горизонтальной прокрутки, первая мысль приходит - это разделить грид на две части: левая показывает первые колонки, которые нам нужно, а правая используется для прокрутки. Но для пользователя это выглядит странно и требует объяснений: эти все лишние полосы прокрутки, слева часто больше, чем одна колонка и т.п. ...</p>
<p>Грид имеет хорошое свойство "LeftColumn", содержащее порядковый номер колонки, которая сейчас отображена как самая левая колонка среди отображаемых колонок грида при текущей горизонтальной прокрутке. Это значение изменяется при прокрутке. Можно его использовать, чтобы переместить нужную нам колонку на место левой отображаемой позиции, в событии Scrolled грида, заблокировав эту колонку таким образом:</p>
<p>if nDirection&gt;3 this.Columns(1).ColumnOrder = this.LeftColumn endif И, для автоматической прокрутки по перемещению текущей клетки грида, в событии AfterRowColChange добавьте строку: this.Columns(1).ColumnOrder = this.LeftColumn</p>
<p>Теперь первая колонка грида всегда отображается первой!</p>
<p><b>Советы для грида</b></p>
<ul>
<li>-При использовании запроса как набора данных для грида, всегда добавляйте "INTO CURSOR :" в конце строки запроса, иначе будет появляться окно Browse для отображения результата запроса при инициализации формы или в момент когда этот запрос выполнится.</li>
<li>- Колонка грида позволяет использовать выражение в качестве ControlSource! Колонка должна быть только для чтения (ReadOnly = .T.), результат выражения должен быть одного типа и постоянной длины для всех колонок, иначе могут возникнуть всяческие странности, звездочки и другие эффекты вплоть до фатальных ошибок в самом ФоксПро. Если все же надо отображать данные разных типов в одной колонке, используйте контэйнер или несколько контролов в одной колонке.</li>
<li>- Чтоб добавить во время дизайна новый контрол в колонку грида, выберите колонку в редакторе свойств, выберите окно редактирования класса или формы путем нажатия мышкой на заголовке окна, выберите нужный класс в панели классов и нажмите мышкой на гриде.</li>
<li>- Чтоб удалить контрол из колонки грида, выберите этот контрол в редакторе свойств, выберите окно редактирования класса или формы путем нажатия мышкой на заголовке окна, затем нажмите клавишу "Del".</li>
<li>- Если настроить грид не показывать горизонтальные линии решетки грида, серые или другие линии на их месте при HighlightRow=.F. это то, что находится прямо под гридом (в основном это поверхность формы, потому линии в основном серые). Чтоб избавиться от такого "мусора", положите под грид прямоугольную область, закрашенную в цвет колонок грида.</li>
<li>- Можно изменить изображение курсора мышки для колонки грида путем установки нужных свойств в событии MouseMove колонки.</li>
</ul>
<p><b>Предупреждения для грида </b></p>
<p>Эти строки дают некоторые предостережения для программистов, которые используют гриды...</p>
<ul>
<li>- Помните, что изменение набора данных для грида в режиме дизайна требует также запоминание значений ControlSource для всех колонок. После изменения свойства RecordSource они все очищаются! Обычно копия делается в свойство Comment колонки.</li>
<li>- Не оставляйте свойство RecordSource грида пустым до инициализации грида.</li>
<li>- События и свойства объекта внутри колонки грида используются только для текущей клетки грида, если свойство Sparse колонки равно .T. Если это свойство равно .F., только свойства используются для отображения строк в колонке, тогда как события по-прежнему работают только для текущей клетки.</li>
<li>- Событие Scrolled запускается только при прокрутке с помощью полос прокрутки. Если грид прокручивается при помощи клавиатуры, программным образом или в других случаях, то это событие не запускается. Прокрутку таким образом надо ловить в событии AfterRowColChange, DoScroll и тестировать много (есть случаи, когда грид прокручивается и при других действиях без изменения текущей клетки, например, в некоторых случаях при работе с заголовком колонки).</li>
<li>- Свойства RelativeRow и ActiveRow принимают корректные значения только, если грид активен. ActiveRow равен нулю, если текущая запись выходит за пределы области отображения грида.</li>
</ul>
<p>&nbsp;</p>
<p><b>VFP гриды, следующие части </b></p>
<p>Следующие статьи будут обсуждать модель событий грида, что такое покрывающая прозрачная область для грида и как ее использовать, сила свойств Dynamic* колонки, точное позиционирование объекта над клеткой грида, советы для колонок и заголовков грида, сортировка грида, индикатор сортировки и многое другое.</p>
<p>перевод <a href="mailto:vgryn@softservecom.com">Влад Гринчишин</a></p>
</div>
<div id="sol_avtor">Автор: UT (перевод Влад Гринчишин)</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4721">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4721">TomDill</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="TomDill" href="https://foxclub.ru/account/?user=4721">
				<img alt='' src='https://secure.gravatar.com/avatar/160fc8699e725800faef89e83c10ce5b?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/160fc8699e725800faef89e83c10ce5b?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 27-07-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/vfp-grid-chast-i/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Статьи]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/generacziya-prg-fajlov-dlya-vozvrata-ustanovok/</link>
					<title><![CDATA[Генерация PRG &#8211; файлов для возврата установок]]></title>
                    					    <author><![CDATA[Maestro]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:17 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Генерация PRG &#8211; файлов для возврата установок</h1>
													</header>
													<div id="sol_opis">Используем для сохранения состояний системы генерацию PRG - файла с программой возврата системы в прежнее состояние...</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Evgeny</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4692">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4692">Maestro</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Maestro" href="https://foxclub.ru/account/?user=4692">
				<img alt='' src='https://secure.gravatar.com/avatar/ca696dd907a4e5d8d991c959b921a2eb?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ca696dd907a4e5d8d991c959b921a2eb?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 14-08-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/generacziya-prg-fajlov-dlya-vozvrata-ustanovok/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/inkrementnyj-poisk-v-tablicze/</link>
					<title><![CDATA[Инкрементный поиск в таблице.]]></title>
                    					    <author><![CDATA[Maestro]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:17 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Инкрементный поиск в таблице.</h1>
													</header>
													<div id="sol_opis">Ничего визуального. Просто открываете таблицу и запускаете функцию с параметрами. Удобна для работы со справочниками. Максимум 5 полей. Ищет по любому, предварительно проиндексированному, полю. Основа взята из журнала Леса Пинтера еще для Дос.  Для VFP перевел недавно, вроде глюков нет, хотя так трудно отделить программу от своих библиотечных модулей. Пишите если что...</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Evgeny</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4692">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4692">Maestro</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Maestro" href="https://foxclub.ru/account/?user=4692">
				<img alt='' src='https://secure.gravatar.com/avatar/ca696dd907a4e5d8d991c959b921a2eb?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ca696dd907a4e5d8d991c959b921a2eb?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 14-08-2002        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/inkrementnyj-poisk-v-tablicze/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klassy-ot-tas/</link>
					<title><![CDATA[Классы от TAS.]]></title>
                    					    <author><![CDATA[TAS]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:17 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Классы от TAS.</h1>
													</header>
													<div id="sol_opis">Классы:  Древовидного списка Календаря Меню Прогресс бара</div>
<div id="sol_body">
<h3>Классы от TAS.</h3>
<p> Подробности читайте в доке. <br /><a href='classtas.zip'>Скачать classtas.zip</a> [142 Кб]   </div>
<div id="sol_avtor">Автор: TAS</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4728">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 3 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4728">TAS</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="TAS" href="https://foxclub.ru/account/?user=4728">
				<img alt='' src='https://secure.gravatar.com/avatar/7004b77ba9803498111fe71a830bd53f?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7004b77ba9803498111fe71a830bd53f?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 7<i class="rcli fa-calendar-check-o"></i>Регистрация: 28-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klassy-ot-tas/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/progress-bar-2/</link>
					<title><![CDATA[Progress Bar]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:16 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Progress Bar</h1>
													</header>
													<div id="sol_opis">Еще один вариант "Термометра". Можно просто запустить программу и посмотреть результат.</div>
<div id="sol_body">
<h3>Progress Bar </h3>
<pre> *=========================================================== *                   Пpимеp "теpмометpа" *===========================================================  * создание фоpмы ----------------------- public Frm_demo Frm_demo = createobject("DemoForm", "Frm_demo", 'Пpимеp "теpмометpа"', 10, 10, 170, 300) with Frm_demo   .AddObject("L_01", "DemoLabel", "", 20, 10)   .AddObject("Prb1", "ProgrBar", 50, 10, 30, 0)   .AddObject("L_02", "DemoLabel", "", 100, 10)   .AddObject("Prb2", "ProgrBar", 130, 10, 20, 0)   .Setall("Visible", .T.)   .Show(2) endwith  * обpаботка ---------------------------- maxval = 50 for tekval=1 to maxval   * отобpажение --------------   with Frm_demo     .L_01.Caption = "Обpабатывается документ: " + str(tekval, 2)     .Prb1.Say(tekval, maxval)     .L_02.Caption = "Осталось обpаботать: " + str(maxval-tekval, 2)     .Prb2.Say(maxval-tekval, maxval)   endwith    * обpаботка ----------------   wait window "Обpабатывается документ: " + str(tekval, 2) timeout 0.1 endfor  wait window "Обработка завершена. Нажмите " release Frm_demo  return  *=========================================================== *                           Form *=========================================================== define class DemoForm as Form   procedure Init (par_n, par_c, par_t, par_l, par_h, par_w)   with This     .Name    = par_n     .Caption = par_c     .Top     = par_t     .Left    = par_l     .Height  = par_h     .Width   = par_w     .FontName = "Arial"     .FontSize = 10   endwith   endproc enddefine  *=========================================================== *                          Label *=========================================================== define class DemoLabel as Label   AutoSize = .T.   procedure Init (par_c, par_t, par_l)   with This     .Caption = par_c     .Top     = par_t     .Left    = par_l     .Height  = 20     .FontName = Thisform.FontName     .FontSize = Thisform.FontSize     .FontBold = Thisform.FontBold   endwith   endproc enddefine  *=========================================================== *                       Progress Bar *=========================================================== define class ProgrBar as Container    BackStyle   = 0   BorderWidth = 1   SpecialEffect = 1    add object Term as Container with ;     BackStyle = 1, BorderWidth = 2, SpecialEffect = 0, ;     BackColor = RGB(0,255,255)    procedure Init (par_t, par_l, par_h, par_w)   * если par_w=0, то делается симметpичным в _фоpме_   with This     .Top     = par_t     .Left    = par_l     .Height  = par_h     .Width   = iif(par_w=0, Thisform.Width-.Left*2, par_w)      .Term.Top    = 3     .Term.Left   = 3     .Term.Height = .Height-6     .Term.Width  = 5   endwith   endproc    procedure Say (par_1, par_2)   with This     local i     if par_1																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/graficheskoe-predstavlenie-dannyh-vfp-v-vide-diagramm-excel-universalnaya-forma/</link>
					<title><![CDATA[Графическое представление данных VFP в виде диаграмм Excel. Универсальная форма.]]></title>
                    					    <author><![CDATA[Jimmy]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:16 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Графическое представление данных VFP в виде диаграмм Excel. Универсальная форма.</h1>
													</header>
													<div id="sol_opis">Многим разработчиком хотелось бы блеснуть перед пользователями своим искусством обращения с данными. И я не исключение. Поэтому и появилась эта форма, которая позволяет "легким движением руки" превратить столбики непонятных чисел в красивую и УПРАВЛЯЕМУЮ диаграмму. Для этого нужно написать десяток строк примитивного кода (см. Readme.txt)</div>
<div id="sol_body">
<h3>Графическое представление данных VFP в виде диаграмм Excel. Универсальная форма.</h3>
<p> Уважаемые коллеги! <br /> Данное решение не претендует на ранг гениальных или основополагающих. Это просто вариант решения наболевшей проблемы. В общем - смотрите сами. Я же буду благодарен за любые конструктивные предложения и замечания. <br /> Jimmy.    </div>
<div id="sol_avtor">Автор: Дмитрий Орлов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4748">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4748">Jimmy</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Jimmy" href="https://foxclub.ru/account/?user=4748">
				<img alt='' src='https://secure.gravatar.com/avatar/4438780968f2f420d33c7c7ad27e120f?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4438780968f2f420d33c7c7ad27e120f?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 30-07-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/graficheskoe-predstavlenie-dannyh-vfp-v-vide-diagramm-excel-universalnaya-forma/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/menedzher-zadach-versiya-3-1/</link>
					<title><![CDATA[Менеджер задач. Версия 3.1]]></title>
                    					    <author><![CDATA[Перминов Игорь]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:16 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Менеджер задач. Версия 3.1</h1>
													</header>
													<div id="sol_opis">Менеджер задач версия 3.1. Позволит Вам разобраться с Вашими проектами. Проекты одной задачи объеденит и ускорит доступ к ним, перекомпиляция всех проектов входящих в задачу нажатием одной кнопки. *Новое - ведение библиотеки кода. Можно вырезать код и запомнить его в библиотеке, затем использовать в другом месте. *Примечание - работает только под VFP v 7.0.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Перминов И.Э.</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5060">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5060">Перминов Игорь</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Перминов Игорь" href="https://foxclub.ru/account/?user=5060">
				<img alt='' src='https://secure.gravatar.com/avatar/c037d0f24a4cd0738110665cf089b985?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c037d0f24a4cd0738110665cf089b985?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 16-09-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/menedzher-zadach-versiya-3-1/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/o-sistemnom-stile-programmirovaniya-ili-pochemu-nashi-pishut-ne-tak-kak-za-bugrom/</link>
					<title><![CDATA[О &#8220;системном&#8221; стиле программирования, или почему &#8220;наши&#8221; пишут не так, как &#8220;за бугром&#8221;]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:16 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>О &#8220;системном&#8221; стиле программирования, или почему &#8220;наши&#8221; пишут не так, как &#8220;за бугром&#8221;</h1>
													</header>
													<div id="sol_opis">Спорные рассуждения "старого" разработчика после многих лет борьбы со средствами разработки и программирования (начиная с момента сжигания СМ-4 (разъемы 220в и сигналов ACLO и DCLO оказались одинаковыми!)и последущего ее восстановления своими силами). Для начинающих, которым интересен опыт пострадавших в неравной борьбе за надежный результат.</div>
<div id="sol_body">
<h3>О "системном" стиле программирования, или почему "наши" пишут не так, как "за бугром" </h3>
<p> Прошу не судить строго и придирчиво за наукообразный стиль изложения. Это лишь сформировавшаяся личная точка зрения автора, написанная в момент приступа пафоса после очередного акта борьбы с расползающимся хаосом. Как известно, каждый разработчик пытается нащупать свой "философский камень" в виде каких-то универсальных формул и правил, рожденных в длительном процессе наработки опыта. <br /><a href='Part1.zip'>Скачать Part1.zip</a> [51 Кб]   </div>
<div id="sol_avtor">Автор: Дм.Баянов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/o-sistemnom-stile-programmirovaniya-ili-pochemu-nashi-pishut-ne-tak-kak-za-bugrom/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/mysql-browser/</link>
					<title><![CDATA[MySQL Browser]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:16 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>MySQL Browser</h1>
													</header>
													<div id="sol_opis">Сервисная программа для работы с MySQL сервером через ODBC драйвера, с исходным кодом и кучей возможностей.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Alex Deer</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/mysql-browser/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/igra-ej-poberegis/</link>
					<title><![CDATA[Игра Эй, поберегись!]]></title>
                    					    <author><![CDATA[Hel!Riser]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:16 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Игра Эй, поберегись!</h1>
													</header>
													<div id="sol_opis">Примерный аналог электронной игрушки Ну, погоди! Нужно помочь утенку в битве за урожай. А яичный синдром куриц-несушек постепенно нарастает...</div>
<div id="sol_body">
<h3>Игра Эй, поберегись!</h3>
<p> В архиве лежит проект, вместе с ЕХЕ-файлом.   </div>
<div id="sol_avtor">Автор: HellRiser</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4814">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4814">Hel!Riser</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Hel!Riser" href="https://foxclub.ru/account/?user=4814">
				<img alt='' src='https://secure.gravatar.com/avatar/e2a29a43d5cd1efb980fa624551c4b00?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e2a29a43d5cd1efb980fa624551c4b00?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 11-03-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/igra-ej-poberegis/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Игры]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/menedzhr-zadach/</link>
					<title><![CDATA[Менеджр задач]]></title>
                    					    <author><![CDATA[Перминов Игорь]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:16 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Менеджр задач</h1>
													</header>
													<div id="sol_opis">Менеджер задач поможет Вам разобраться с Вашими проектами, а так же объеденить различные проекты в одну задачу.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Перминов И.Э.</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5060">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5060">Перминов Игорь</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Перминов Игорь" href="https://foxclub.ru/account/?user=5060">
				<img alt='' src='https://secure.gravatar.com/avatar/c037d0f24a4cd0738110665cf089b985?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c037d0f24a4cd0738110665cf089b985?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 5<i class="rcli fa-calendar-check-o"></i>Регистрация: 16-09-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/menedzhr-zadach/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/30-primerov-reshenij-dmitriya-bayanova/</link>
					<title><![CDATA[30 примеров решений Дмитрия Баянова]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:16 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>30 примеров решений Дмитрия Баянова</h1>
													</header>
													<div id="sol_opis">На 57 страницах описаны решения с комментариями и объяснениями. Исходный файл находится на www.dbrad32.narod.ru/dbsys/book1.zip</div>
<div id="sol_body">
<h3>30 примеров решений Дмитрия Баянова </h3>
<p> 1. Создание класса Trigger button - Триггерная кнопка  <br /> 2. Создание класса Ticker - Управляющий ползунок ScrollBar  <br /> 3. Функции работы с массивами  <br /> 4. Классы универсального поиска  <br /> 5. Позиционирование на запись таблицы  <br /> 6. Получение значения уникального идентификатора GUID (первичного ключа записи)  <br /> 7. Организация выделенных (подсвеченных) записей в таблице  <br /> 8. Быстрое выделение (поиск) записей в таблице  <br /> 9. Вычисление логического номера записи  <br /> 10. Нормализация индекса  <br /> 11. Функция упорядочивания по убыванию  <br /> 12. Масштабируемое изменение размеров окна с его объектами  <br /> 13. Проблема унификации сетевого пути  <br /> 14. Блокированные файлы и терминирование программы  <br /> 15. Нелимитированная по длине макроподстановка  <br /> 16. Вычисляемый макрос в тексте  <br /> 17. Работа с текстами через массив  <br /> 18. Рекурсивный интерпретатор конструкции If_ElseIf_Else_Endif  <br /> 19. Рекурсивный интерпретатор макропроцедур с поддержкой DoWhile_EndDo и If_ElseIf_Else_Endif <br /> 20. Организация стека истории ключей и его хранение  <br /> 21. Имитация технологии электронной таблицы  <br /> 22. Редактирование буферной SQL выборки из большой таблицы  <br /> 23. Многопользовательские семафорные блокировки  <br /> 24. Задержка достоверности разделяемых данных  <br /> 25. Построение трехмерной перекрестной таблицы  <br /> 26. Построение расширенного словаря базы данных  <br /> 27. Оптимальный состав компонент базового исполняющего ядра  <br /> 28. Создание оптимального набора визуальных компонент редактирования данных БД  <br /> 29. Определение многофункционального табличного интерфейса для    типовой работы с данными БД  <br /> 30. Модель защиты от несанкционированного использования и распространения элементов ИС      </div>
<div id="sol_avtor">Автор: Дмитрий Баянов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/30-primerov-reshenij-dmitriya-bayanova/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/generator-obektnogo-menyu-dlya-menu-designer/</link>
					<title><![CDATA[Генератор объектного меню для Menu Designer]]></title>
                    					    <author><![CDATA[Jimmy]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:16 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Генератор объектного меню для Menu Designer</h1>
													</header>
													<div id="sol_opis">Альтернативный генератор меню для VFP. Преобразует меню, созданное в Menu Designer к объектному виду. Теперь можно управлять видимостью пунктов меню, доступностью, устанвливать/ снимать пометки и т.д. Прилагается форма для тестирования. Подробное описание - в заголовке PRG файла.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Дмитрий Орлов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4748">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4748">Jimmy</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Jimmy" href="https://foxclub.ru/account/?user=4748">
				<img alt='' src='https://secure.gravatar.com/avatar/4438780968f2f420d33c7c7ad27e120f?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/4438780968f2f420d33c7c7ad27e120f?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 6<i class="rcli fa-calendar-check-o"></i>Регистрация: 30-07-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/generator-obektnogo-menyu-dlya-menu-designer/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/registracziya-programmy-s-zapisyu-dannyh-v-sistemnyj-reestr/</link>
					<title><![CDATA[Регистрация программы с записью данных в системный реестр]]></title>
                    					    <author><![CDATA[Владимир Максимов]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:16 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Регистрация программы с записью данных в системный реестр</h1>
													</header>
													<div id="sol_opis">Предлагаемый мною класс реализует самый элементарный (можно сказать, примитивный) механизм регистрации программы с чтением и записью необходимой информации в системный реестр. <br /> Конечно, данный класс можно использовать и в "чистом" виде, но скорее его следует рассматривать как учебное пособие по работе с реестром на начальном этапе.</div>
<div id="sol_body">Не так давно, у меня возникла необходимость предусмотреть возможность регистрации моей собственной программы в системном реестре. <br /> Фактически, вопрос стоял так: Как организовать запись и чтение собственной информации в системном реестре? <br /> Естесственно, что первым делом я посмотрел примеры в Solution и нашел класс <br /> "c:program filesmicrosoft visual studiomsdn9898vsa1033samplesvfp98classesregistry.prg" <br /> Однако, "с налета" и без описания в нем оказалось крайне трудно разобраться. <br /> Предлагаемый мною класс реализует самый элементарный (можно сказать, примитивный) механизм регистрации программы с чтением и записью необходимой информации в системный реестр. <br /> Конечно, данный класс можно использовать и в "чистом" виде, но скорее его следует рассматривать как учебное пособие по работе с реестром на начальном этапе. </p>
<p> <b>Механизм регистрации</b></p>
<p>  1. Считывается серийный номер диска<br /> 2. Этот номер посылается разработчику программы<br /> 3. На основании полученного номера, разработчик формирует регистрационный номер (в данном примере - это просто десятичный логарифм от серийного номера)<br /> 4. Пользователь вводит полученный от разработчика регистрационный номер и может работать с программой.<br /> 5. Серийный номер диска и полученный регистрационный номер записываются в системном реестре и проверяются при каждом запуске программы<br /> 6. При повторных запусках окно ввода регистрационного номера не активизируется.</p>
<p> По умолчанию, в разделе "HKEY_LOCAL_MACHINESOFTWARE" системного реестра будет сосздан подраздел "MyCompanyMyProgramm" и записаны данные в параметр "login" <br /> Пример использования класса приведен в файле Main.prg   </p>
</div>
<div id="sol_avtor">Автор: Владимир Максимов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4899">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4899">Владимир Максимов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Владимир Максимов" href="https://foxclub.ru/account/?user=4899">
				<img alt='' src='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 65<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/registracziya-programmy-s-zapisyu-dannyh-v-sistemnyj-reestr/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Распространение программ]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/instrumenty-razrabotchika-dlya-visual-foxpro-6-0/</link>
					<title><![CDATA[Инструменты разработчика для Visual FoxPro 6.0]]></title>
                    					    <author><![CDATA[Олег Бляхеров]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:16 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Инструменты разработчика для Visual FoxPro 6.0</h1>
													</header>
													<div id="sol_opis">Набор утилит, для облегчения труда разработчика приложений на Visual FoxPro:  </p>
<li>Все мои проекты… вер.1.3
<li>Поиск в проекте вер.3.1.
<li>Сравнение файлов вер.3.7
<li>Сравнение библиотек вер.2.5<br /> Статус: FreeWare</div>
<div id="sol_body">
<h3>Инструменты разработчика для Visual FoxPro 6.0 </h3>
<p> Настоящий профессионал начинается с инструмента (ИМХО!). Это касается всех видов деятельности - от столяра до зубного врача, и программисты здесь не исключение. Именно эта нехитрая мысль, а также долгие поиски нужного проекта в проводнике или всех мест, где я имел неосторожность использовать “эту дурацкую функцию, которая почему-то глючит в очередном сервис-паке”, подвигли меня на изготовление (сначала для себя) нескольких простеньких инструментов, в той или иной степени решающих все эти проблемы. За несколько лет они обросли мяском, приобрели более-менее приличный вид и, что самое главное, сэкономили мне массу времени и сил. Теперь я готов предложить некоторые из них на суд широкой фокс-общественности и пусть народ скажет свое слово. </p>
<p> В пакет, представляемый здесь, входит четыре фокс-приложения: “Все мои проекты…”, “Поиск в проекте”, “Сравнение файлов” и “Сравнение библиотек и форм”. Смысл и назначение этих приложений понятны (я надеюсь) из названий, так что сильно распростра-няться на эту тему не буду. А если, что и останется непонятым, так на это есть e-mail. </p>
<p> Приложения представляют собой app-модули и вызваются прямо из командного окна. Обращение к инструментам описано в соотвествующих разделах. Для большего удобства вызов приложений можно вставить в главное меню Foxpro с помощью простенькой процедуры, запускаемой из config.fpw </p>
<p>   </div>
<div id="sol_avtor">Автор: Олег Бляхеров</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="5049">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=5049">Олег Бляхеров</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Олег Бляхеров" href="https://foxclub.ru/account/?user=5049">
				<img alt='' src='https://secure.gravatar.com/avatar/59254e455634d23d143dcfe629716d52?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/59254e455634d23d143dcfe629716d52?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 8<i class="rcli fa-calendar-check-o"></i>Регистрация: 23-04-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/instrumenty-razrabotchika-dlya-visual-foxpro-6-0/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ishodnye-teksty-proekta-generator-otchetov-dbrad32/</link>
					<title><![CDATA[Исходные тексты проекта &#8220;Генератор Отчетов DBRAD32&#8243;&#8221;&#8221;]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:16 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Исходные тексты проекта &#8220;Генератор Отчетов DBRAD32&#8243;&#8221;&#8221;</h1>
													</header>
													<div id="sol_opis">Выставлены полные исходные авторские тексты решений и проекта на www.dbrad32.narod.ru</div>
<div id="sol_body">
<h3>Исходные тексты проекта "Генератор Отчетов DBRAD32"</h3>
<p> Выставлены полные исходные авторские тексты решений и проекта на www.dbrad32.narod.ru</p></div>
<div id="sol_avtor">Автор: Дмитрий Баянов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ishodnye-teksty-proekta-generator-otchetov-dbrad32/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ishodnye-teksty-universalnogo-yadra-dbrad32/</link>
					<title><![CDATA[Исходные тексты Универсального Ядра DBRAD32]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:16 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Исходные тексты Универсального Ядра DBRAD32</h1>
													</header>
													<div id="sol_opis">Выставлены полные исходные авторские тексты решений и проекта "DBRAD32 - Универсальное Ядро для приложений VFP"" на странице www.dbrad32.narod.ru.  "</div>
<div id="sol_body">
<h3>Исходные тексты Универсального Ядра DBRAD32</h3>
<p> Выставлены полные исходные авторские тексты решений и проекта "DBRAD32 - Универсальное Ядро для приложений VFP" на странице www.dbrad32.narod.ru.</p></div>
<div id="sol_avtor">Автор: Дмитрий Баянов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ishodnye-teksty-universalnogo-yadra-dbrad32/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ustranenie-soobshheniya-o-sintaksicheskoj-oshibke-pri-zapuske-menyu/</link>
					<title><![CDATA[Устранение сообщения о синтаксической ошибке при запуске меню]]></title>
                    					    <author><![CDATA[Владимир Максимов]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:16 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Устранение сообщения о синтаксической ошибке при запуске меню</h1>
													</header>
													<div id="sol_opis">Если Вы создаете собственное меню, то в момент его запуска, как правило, выскакивает сообщение о синтаксической ошибке. Если его игнорировать, то дальнейшая работа программы идет без проблем. Я предлагаю несколько вариантов устранения данной ошибки.</div>
<div id="sol_body">
<h3>Устранение сообщения о синтаксической ошибке при запуске меню</h3>
<p> Предлагаю несколько вариантов решения. </p>
<p> I) Глобальный </p>
<p> За генерацию меню (т.е. создание файла MPR на базе вашего файла MPX) отвечает программа GenMenu.prg. </p>
<p> Эта программа расположена в корневом каталоге VFP. Если Вы делали установку в директорию по умолчанию, то это директория "C:Program FilesMicrosoft Visual StudioVfp98" </p>
<p> Откройте файл GenMenu.prg на редактирование командой: </p>
<p> MODIFY COMMAND "c:program filesmicrosoft visual studiovfp98genmenu.prg" </p>
<p> Найдите в нем функцию  <br /> FUNCTION addkey </p>
<p> и закоментируйте в этой функции весь условный оператор, начинающийся с фразы: </p>
<p> IF !IsLeadByte(prompt) </p>
<p> Однако, оставьте незакоментированной в нем единственную строчку </p>
<p> STORE "" to m.cKeyname </p>
<p> Т.е. соответсвующий кусок программы должен выглядеть так: </p>
<p> *!* IF !IsLeadByte(prompt) <br /> *!* STORE c_key_padhotkey_LOC + UPPER(LEFT(prompt,1)) TO m.cKeyname <br /> *!* ELSE <br /> STORE "" to m.cKeyname <br /> *!* ENDIF </p>
<p> Сохраните и откомпилируйте измененный файл GenMenu.prg. </p>
<p> Все. Теперь Вам остается только перегенерить все Ваши меню. Сообщение о синтаксической ошибке больше возникать не будут. </p>
<p> II) Ловкость рук </p>
<p> Если Вы считаете, что MicroSoft не ошибается или не чуствуете в себе достаточной уверенности, чтобы исправлять не свои файлы, то Вам остается только каким-либо способом обмануть генератор меню: </p>
<p> а) Каждый пункт главной линейки меню начинать с цифры <br /> б) Первым символом каждого пункта использовать латинскую букву похожую на русскую ("C","M","P" и т.п.) <br /> в) Обязательно вручную назначать комбинацию горячих клавишь для каждого пунтка меню </p>
<p> III) Игнорирование сообщения об ошибке </p>
<p> Это совсем грубый способ. Перед каждым вызовом меню, следует включать собственный обработчик ошибок. Примерно так: </p>
<p> LOCAL lcOldError, lnErrorNumber <br /> lcOldError = ON("Error") <br /> ON ERROR lnErrorNumber = Error() </p>
<p> DO MyMenu.mpr </p>
<p> ON ERROR &lcOldError</p></div>
<div id="sol_avtor">Автор: Владимир Максимов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4899">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4899">Владимир Максимов</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Владимир Максимов" href="https://foxclub.ru/account/?user=4899">
				<img alt='' src='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/1c0f189997f17b35ef1beca43d0e27d0?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 65<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ustranenie-soobshheniya-o-sintaksicheskoj-oshibke-pri-zapuske-menyu/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/vosstanovlenie-bazy-dannyh-s-ispolzovaniem-arhivatora-winrar/</link>
					<title><![CDATA[Восстановление базы данных с использованием архиватора WinRAR.]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:16 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Восстановление базы данных с использованием архиватора WinRAR.</h1>
													</header>
													<div id="sol_opis">Это решение является продолжением (или 2-й частью) решения по дублированию базы данных с использованием архиватора WinRAR.</div>
<div id="sol_body">
<h3>Восстановление базы данных с использованием архиватора WinRAR.</h3>
<p> PROCEDURE RecoveBD <br /> * ПРОЦЕДУРА ВОССТАНОВЛЕНИЯ БД </p>
<p>    * делаем подготовку (определяем пути, собираем файлы и пр.) <br />    LOCAL lcPathTarget && путь назначения <br />    lcPathTarget = "" <br />    * проверим на предмет задания файла-дубля БД <br />    DO WHILE EMPTY(ALLTRIM(lcPathTarget)) <br />     lcPathTarget = GETFILE("rar","","",0,"Найдите и задайте файл-дубль базы"+; <br />                               " данных") && определяем путь  и имя файла для чтения <br />     IF EMPTY(ALLTRIM(lcPathTarget )) THEN <br />      IF MESSAGEBOX ("Не указан файл - дубль базы данных."+CHR(10)+; <br />          "Повторить поиск файла?",4+32+0,"ВОПРОС") # 6; <br />        THEN <br />       DO MyExit && уходим <br />      ENDIF <br />     ENDIF <br />    ENDDO </p>
<p>    LOCAL lcArgument <br />    lcArgument = " e " + lcPathTarget + " " + DataPath  && DataPath  - путь к <br />                                                      * папке, куда все восстанавливается </p>
<p>    * АРХИВИРУЕМ <br />    *объявляем функцию api для отлавливания начала и завершения дублирования <br />    DECLARE integer FindWindow IN Win32API string, string </p>
<p>    LOCAL StartDateTime && время начала старта <br />    LOCAL lcMessError && сообщение об ошибке </p>
<p>    * Проверяем на предмет незанятости базы данных <br />    LOCAL lcOldError <br />    lcOldError = ON('Error') && запоминаем путь к старому обработчику ошибок <br />    ON ERROR DO Zaglushka <br />    LOCAL llZanjato <br />    llZanjato = .T. <br />    DO WHILE llZanjato && крутимся в цикле, пока не освободится БД <br />     OPEN DATABASE KlassNar EXCLUSIVE <br />     IF DBUSED('KlassNar') THEN && если база открылась, то работаем <br />      llZanjato = .F. <br />     ELSE <br />      IF MESSAGEBOX("Кто-то работает с базой данных."+CHR(10)+; <br />           "Восстановить базу данных невозможно."+CHR(10)+; <br />           "Выгоните их всех!"+CHR(10)+CHR(10)+; <br />           "Повторить попытку восстановления?",5+16+0,"ВОПРОС") = 4 THEN <br />       llZanjato = .T. <br />      ELSE <br />       DO MyExit && уходим <br />      ENDIF <br />     ENDIF <br />    ENDDO </p>
<p>    * Резко закрываем активные базы и таблицы <br />    CLOSE DATABASE ALL </p>
<p>    lcMessError = myRun("WinRAR.exe",lcArgument) && архивация (или дублирование) </p>
<p>    LOCAL ltDeltaTime && время ожидания, сек <br />    ltDeltaTime = 60 <br />    StartDateTime = DATETIME() <br />    *Ждем появления окна WinRAR или пока не истекло время ожидания <br />    DO WHILE FindWindow(NULL,'WinRAR')=0 <br />     IF DATETIME() > StartDateTime + ltDeltaTime THEN && время ожидания появления окна <br />                                                       * 60 сек <br />      MESSAGEBOX("Истекло время ожидания запуска архиватора."+CHR(10)+; <br />        "Восстановление не выполнено!"+CHR(10)+; <br />        "Возможно не установлен архиватор WinRar.",0+16+0,"ОШИБКА") <br />      DO MyExit && уходим <br />     ENDIF <br />    ENDDO </p>
<p>    *Ждем завершения работы WinRAR или пока не истекло время ожидания <br />    ltDeltaTime = 300 && 5 минут <br />    StartDateTime = DATETIME() <br />    LOCAL ltDeltaTime && время ожидания, сек <br />    DO WHILE FindWindow(NULL,'WinRAR')#0 <br />     IF DATETIME() > StartDateTime + ltDeltaTime THEN <br />      * запросим выход или еще подождем 2 минуты <br />      IF MESSAGEBOX('Истекло время ожидания завершения восстановления.'+CHR(10)+; <br />         'Подождать еще 2 минуты?'+CHR(10)+CHR(10)+; <br />         'ПОЯСНЕНИЕ: Если восстановление завершилось пока Вы думали, все '+; <br />         'равно нажмите "Да". '+; <br />         'Нажатие "Нет" приводит к прекращению дальнейшей работы.'; <br />         ,4+32+0,"ВОПРОС") = 6 THEN <br />       StartDateTime = DATETIME() <br />       ltDeltaTime = 120 && 2 минуты <br />      ELSE <br />       DO MyExit && уходим <br />      ENDIF <br />     ENDIF <br />    ENDDO </p>
<p>    ON ERROR &lcOldError && восстановить обработчик ошибок </p>
<p>    * проверяем результат восстановления на ошибки <br />    IF NOT EMPTY(ALLTRIM(lcMessError)) THEN <br />     MESSAGEBOX ("Ошибка при восстановлении базы данных."+CHR(10)+; <br />        "Восстановление не выполнено!"+CHR(10)+; <br />        "Возможно не установлен архиватор WinRar.",0+16+0,"ОШИБКА") <br />    ELSE <br />     MESSAGEBOX("Восстановление базы данных завершено",0+64+0,"ИНФОРМАЦИЯ") <br />    ENDIF <br />   DO MyExit && уходим </p>
<p> ENDPROC <br /> ************************************************************* </p>
<p> FUNCTION myRun <br /> * Функция, которая ищет файл и запускает соответствующее приложение для этого файла <br /> * С помощью данной функции можно запускать программы (например, WinRar) </p>
<p> LPARAMETERS cFile, cAtribut <br /> LOCAL lcAtribut <br /> * а передается ли атрибут для вызываемого файла? <br /> IF PARAMETERS()																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/odin-iz-variantov-reglamentnogo-dublirovaniya-bazy-dannyh-s-ispolzovaniem-arhivatora-winrar/</link>
					<title><![CDATA[Один из вариантов регламентного дублирования базы данных (с использованием архиватора WinRAR)]]></title>
                    					    <author><![CDATA[ГВК]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:15 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Один из вариантов регламентного дублирования базы данных (с использованием архиватора WinRAR)</h1>
													</header>
													<div id="sol_opis">Представляю на Ваш суд один из способов защитного дублирования базы данных на случай потерь, для возможности последующего восстановления.     В моем варианте используется архиватор WinRAR. Аналогично могут быть использованы архиваторы pkzip или arj (может кто-то докопается и до WinZip).     Принята аксиома, что дублирование является обязательной процедурой, и нельзя позволить пользователю дальнейшую работу, пока не продублирована база данных.      Текст процедуры MyExit не приводится. Он такой, который используется Вами в головной процедуре при назначении On Shutdown.       В моем варианте не решен вопрос вылавливания ошибок при архивировании.      Приношу огромную благодарность коллегам, которые помогали мне своими консультациями в конференции клуба, а также в ФИДО - конференциях. Так что данное решение скорее является коллективным трудом.</div>
<div id="sol_body">
<h3>Один из вариантов регламентного дублирования базы данных (с использованием архиватора WinRAR)</h3>
<p> PROCEDURE DublBD <br /> * ПРОЦЕДУРА ДУБЛИРОВАНИЯ БД </p>
<p>  SELECT 0 <br />  USE DatesDubl.dbf &&открываем таблицу с историей дублирования <br />  GO BOTTOM </p>
<p>  IF Date() > DatesDubl.dLastDubl + 14 THEN && время дублирования наступило? <br />   IF MESSAGEBOX("Наступило время обязательного дублирования базы <br /> данных."+CHR(10)+; <br />   "Без дублирования работать дальше Вы не сможете."+CHR(10)+; <br />   "Начать дублирование сейчас?.",; <br />   4+64+0,"ИНФОРМАЦИЯ") = 6 THEN </p>
<p>    * делаем подготовку (определяем пути, собираем файлы и пр.) <br />    LOCAL lcListFilds && список дублируемых файлов <br />    lcListFilds =    DataPath + "*.d?? "; <br />          + DataPath + "*.cdx "; <br />          + DataPath + "*.f?? "; <br />          + DataPath + "*.tbk "; <br />          + DataPath + "*.old" </p>
<p>    LOCAL lcPathTarget && путь назначения <br />    LOCAL Y, M, D <br />    * генерируем имя файла <br />    Y = ALLTRIM(STR(YEAR(DATE()))) && год <br />    M = ALLTRIM(STR(MONTH(DATE())))   && месяц <br />    IF LEN(M) StartDateTime + ltDeltaTime THEN <br />      * запросим выход или еще подождем 2 минуты <br />      IF MESSAGEBOX('Истекло время ожидания завершения дублирования.'+CHR(10)+; <br />         'Подождать еще 2 минуты?'+CHR(10)+CHR(10)+; <br />         'ПОЯСНЕНИЕ: Если дублирование завершилось пока Вы думали, все равно'+; <br />         ' нажмите "Да". '+; <br />         'Нажатие "Нет" приводит к прекращению дальнейшей работы.'; <br />         ,4+32+0,"ВОПРОС") = 6 THEN <br />       StartDateTime = DATETIME() <br />       ltDeltaTime = 120 && 2 минуты <br />      ELSE <br />       DO MyExit && уходим <br />      ENDIF <br />     ENDIF <br />    ENDDO </p>
<p>    ON ERROR &lcOldError && восстановить обработчик ошибок </p>
<p>    * проверяем результат дублирования на ошибки <br />    IF NOT EMPTY(ALLTRIM(lcMessError)) THEN <br />     MESSAGEBOX ("Ошибка при дублировании."+CHR(10)+; <br />        "Дублирование не выполнено!"+CHR(10)+; <br />        "Возможно не установлен архиватор WinRar.",0+16+0,"ОШИБКА") <br />     DO MyExit && уходим <br />    ELSE <br />     * добавим дату сегодняшнего дублирования <br />     SELECT 0 <br />     USE DatesDubl <br />     APPEN BLANK <br />     REPLACE DatesDubl.dLastDubl WITH DATE() <br />     USE <br />    ENDIF <br />   ELSE <br />    DO MyExit && клиент отказался дублировать! Его дело! Уходим <br />   ENDIF <br />  ELSE <br />   SELECT DatesDubl && закрываем таблицу с историей дублирования. Она нам больше не нужна <br />   USE <br />  ENDIF </p>
<p> ENDPROC </p>
<p> ******************************************************************** <br /> FUNCTION myRun <br /> * Функция, которая ищет файл и запускает соответствующее приложение для <br /> этого файла <br /> * С помощью данной функции можно запускать программы (например, WinRar) </p>
<p> LPARAMETERS cFile, cAtribut <br /> LOCAL lcAtribut <br /> * а передается ли атрибут для вызываемого файла? <br /> IF PARAMETERS()																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/generator-otchetov-dbrad32-dlya-ms-word/</link>
					<title><![CDATA[Генератор отчетов DBRAD32 для MS Word.]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:16 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Генератор отчетов DBRAD32 для MS Word.</h1>
													</header>
													<div id="sol_opis">Альтернативный генератор отчетов MsWord для приложений Visual FoxPro. Создает файлы RTF/HTML и грузит в Word. Условие выборки, группирование, сведение, макро в тексте Word, контекст VFP, составные отчеты, разделяемая работа в сети, обширный набор вспомогательных функций (от генератора GUID до конвертора сумм прописью), открыт для пользователя, примеры. Файлы можно скачать с www.dbrad32.narod.ru. Прилинковывается к вашему приложению в виде APP-файла. Для бесплатного использования.</div>
<div id="sol_body">
<h3>Генератор отчетов DBRAD32 для MS Word.</h3>
<p> Файлы можно скачать с <a href="http://www.dbrad32.narod.ru">www.dbrad32.narod.ru.</a> Размер упакованного набора с примерами - ок. 2мб.</div>
<div id="sol_avtor">Автор: Дмитрий Баянов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/generator-otchetov-dbrad32-dlya-ms-word/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/sredstvo-bystrogo-postroeniya-prilozhenij-vfp-s-universalnym-yadrom/</link>
					<title><![CDATA[Средство быстрого построения приложений VFP с универсальным ядром]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:16 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Средство быстрого построения приложений VFP с универсальным ядром</h1>
													</header>
													<div id="sol_opis">CASE-средство, Universal Application Engine - UAE - Универсальное Ядро с системными функциями и встроенным генератором отчетов под MS Word позволяет сразу получать работающее приложение для Visual FoxPro. Статьи, описание, примеры, средства разработки и само ядро DBRAD32 для бесплатного использования размещены на www.dbrad32.narod.ru. ------------------------ ВНИМАНИЮ администратора ! Я, как автор, предоставляю Вам право на размещение на вашем сайте любых материалов, опубликованных на моей странице www.dbrad32.narod.ru.</div>
<div id="sol_body">
<h3>Средство быстрого построения приложений VFP с универсальным ядром</h3>
<p> CASE-средство, Universal Application Engine - UAE - Универсальное Ядро с системными функциями и встроенным генератором отчетов под MS Word позволяет сразу получать работающее приложение для Visual FoxPro. Статьи, описание, примеры, средства разработки и само ядро DBRAD32 для бесплатного использования размещены на www.dbrad32.narod.ru.</p></div>
<div id="sol_avtor">Автор: Дмитрий Баянов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/sredstvo-bystrogo-postroeniya-prilozhenij-vfp-s-universalnym-yadrom/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/inkrementnyj-poisk-v-grid-da-i-ne-tolko/</link>
					<title><![CDATA[Инкрементный поиск в Grid (да и не только)]]></title>
                    					    <author><![CDATA[Zheka]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:15 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Инкрементный поиск в Grid (да и не только)</h1>
													</header>
													<div id="sol_opis">Возможность быстрого поиска по базе</div>
<div id="sol_body">
<h3>Инкрементный поиск в Grid (да и не только)</h3>
<p> Посмотрев на бурные обсуждения проблемы быстрого поиска в Grid, я вспомнил, что сам когда-то делал нечто похожее в своем приложении. Это не класс, не объект (просто лень тратить время на оформление). А сама процедура проста до безобразия: </p>
<p> Метод KeyPress формы, в которой расположен Grid(List): </p>
<p> LPARAMETERS nKeyCode, nShiftAltCtrl </p>
<p> cValidString="abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя1234567890 '"+'!@#$%^&*()_+№;%:?*()/|,.[]{}-=-"' </p>
<p> if ATC(CHR(nKeyCode), cValidString)>0 <br /> 	This.SearchString=This.SearchString+CHR(nKeyCode) && Добавляем введенный символ в переменную <br /> 	This.OLEControl1.Panels(2).Text=' Быстрый поиск: "'+This.SearchString+'" ' && Обновление строки подсказки <br /> 	=Seek(This.SearchString, "Abonenty", This.ColumnsArray(This.CurrentColumn)) && Поиск по текущей колонке <br /> 	If Found() <br /> 		This.Grid1.SetFocus <br /> 	endIf <br /> 	This.TimeOutTimer.Interval=3000 && Запуск таймера на очистку строки поиска через 3 секунды <br /> 	NoDefault <br /> endIf </p>
<p> Несмотря на топорность решения это работает быстро, не требует упорядочивания набора данных по колонке поиска (хотя для удобства поиска рекомендуется его делать) и привязано не к объекту, а к таблице. Таким же образом я делал поиск и в List'е, и в TreeView.</p></div>
<div id="sol_avtor">Автор: Евгений Колмаков</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="2757">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=2757">Zheka</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Zheka" href="https://foxclub.ru/account/?user=2757">
				<img alt='' src='https://secure.gravatar.com/avatar/f1e393ff79f708b050395af36a19b265?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/f1e393ff79f708b050395af36a19b265?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 21-06-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/inkrementnyj-poisk-v-grid-da-i-ne-tolko/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/parallelnyj-vyvod-fox-otcheta-v-dokument-word/</link>
					<title><![CDATA[Параллельный вывод Fox-отчета в документ Word.]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:15 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Параллельный вывод Fox-отчета в документ Word.</h1>
													</header>
													<div id="sol_opis">Формирование Word документа параллельно работе foxpro  reporta.</div>
<div id="sol_body">
<h3>Параллельный вывод Fox-отчета в документ Word.</h3>
<p> Идею одновременного  формирования документа Word с Foxpro отчетом мне подсказал Владимир Журавлев. И лень заставляет самого  чуть подумать <br /> Не хочется заново перегребать данные чтоб приготовить Word документ. <br /> Идея довольно проста <br /> На каждое поле отчета навешиваем некий метод . <br /> Например для самого тривиального случая у нас есть таблица с одним полем <br /> Мы хотим вывести на предв. Просмотр и одновременно сформировать Ворд документ. <br /> Итак действия: в отчете в BeforeOpenTables() создаем экземпляр Worda и сразу добавляем пустой документ <br /> 	oword=create('word.application') <br /> 	oword.documents.add() <br /> затем в отчете обращаемся к методу rp(“field”) <br /> который будет делать 2 операции <br /> PROCE rp <br /> lparameter fld <br /> *вставляем значение в DOC <br /> oword.Selection.TypeText(fld) <br /> oword.Selection.insertafter(chr(13)) <br /> *если хочется посмотреть как формируется word документ <br /> 	oword.visible=.t. <br /> * иначе его можно показать в AfterCloseTables() <br />      * Вставка в отчет <br />        return  fld <br /> Вот собственно и вся идея, получаем doc + результат работы report-а. </p>
<p> Для нормальных(любой сложности отчетов с группами и пр.) немного усложним. <br /> Я сделал класс с 2-мя методами  <br /> Метод RP c 3-мя параметрами <br /> lparameter fld,mycol,cr && 1- поле, 2- колво колонок в отчете,3 -признак добавления строки таблицы </p>
<p> * вставляем поле и перемещаемся на сл. ячейку <br />     oword.Selection.TypeText(ch_fld) <br />     oword.Selection.MoveRight <br /> * Ниже добавление строчки по 3-му параметру=1 <br />     if cr=1 <br />     oword.Selection.InsertRowsBelow(1) <br />     endif </p>
<p> oword.visible=.t. </p>
<p> * Вставка в отчет <br /> return  fld </p>
<p> Метод Pg_setup для настройки параметров страницы Ворда. <br /> para orient,top_m,bott_m,left_m,right_m  <br /> * orient- ориентация (1,0) <br /> *  **_m- соотв.отступы <br /> With oword.ActiveDocument.PageSetup <br />         .LineNumbering.Active =.f. <br />         .Orientation=orient && 0- портрет <br />         .TopMargin=top_m && верхний <br />         .BottomMargin =bott_m&& нижний отступ  <br />         .LeftMargin =left_m && левый <br />         .RightMargin =right_m&& правый <br />      *   .PageWidth =1188.7 &&-а3        840.6  &&-a4        <br />      *   .PageHeight = 840.6  &&-а3      594.3  && -а4        <br /> EndWith </p>
<p> Настройку страницы делаю сразу после добавления пустого документа в BeforeOpen…() <br /> В репорте на каждое поле вешаю RP(“Поле”,”Кол.колонок”,признак 0или 1) </p>
<p> Такой подход позволяет готовить и отображатьпару Report-word.doc в самом разном сочетании <br /> Мой вариант несколько сыроват, думаю кому интересно- доведут до ума. </p>
<p> В примере есть подробные комментарии. <br /> Всем удачи, Дмитрий. </p>
<p>       </div>
<div id="sol_avtor">Автор: Дмитрий Петров</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/parallelnyj-vyvod-fox-otcheta-v-dokument-word/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/zamorozka-stolbczov-v-grid/</link>
					<title><![CDATA[Заморозка столбцов в GRID]]></title>
                    					    <author><![CDATA[Василий]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:15 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Заморозка столбцов в GRID</h1>
													</header>
													<div id="sol_opis">Замораживаем столбцы как EXCELе в приципе только общая идея, а каждый сам для себя навороты наделает</div>
<div id="sol_body">
<h3>Заморозка столбцов в GRIDE</h3>
<p> в ИНИТЕ формы все описано, особенно долго я не тестировал, так ято не обессудьте за ошибки<br />  Автор: Василий (vasia_@rambler.ru)    </div>
<div id="sol_avtor">Автор: Василий</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4886">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4886">Василий</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Василий" href="https://foxclub.ru/account/?user=4886">
				<img alt='' src='https://secure.gravatar.com/avatar/0af18387235cfbd2a79fde60fcf4193c?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/0af18387235cfbd2a79fde60fcf4193c?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 19-10-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/zamorozka-stolbczov-v-grid/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/obj2bmp-a-developers-tool/</link>
					<title><![CDATA[Obj2Bmp &#8211; A Developer&#8217;s Tool]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:15 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Obj2Bmp &#8211; A Developer&#8217;s Tool</h1>
													</header>
													<div id="sol_opis">Сохранение изображения формы или ее объектов в формате BMP 16,256 или 24 bit color. Описание внутри архива (англ.)</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: George Tasker</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/obj2bmp-a-developers-tool/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/podsvetka-stroki-grid/</link>
					<title><![CDATA[Подсветка строки GRID]]></title>
                    					    <author><![CDATA[pit]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:15 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Подсветка строки GRID</h1>
													</header>
													<div id="sol_opis">Много попадается вопросов на эту тему , особенно у новичков, хотя себя ветераном фокса тоже не считаю</div>
<div id="sol_body">
<h3>Подсветка строки GRID</h3>
<p> В Init-event объекта Grid запишите  <br /> This.tag = STR(RECNO()) <br /> THIS.setall(&quot;Dynamicbackcolor&quot;, ; <br />        &quot;IIF(str(RECNO())==This.tag,RGB(192,192,192), ; <br />                          RGB(255,255,255))&quot;,&quot;Column&quot;) </p>
<p> В AfterRowColChange-event объекта Grid запишите  <br /> LPARAMETERS nColIndex </p>
<p> This.tag = STR(RECNO()) <br /> THIS.Refresh() </p>
</div>
<div id="sol_avtor">Автор: pit</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4158">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4158">pit</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="pit" href="https://foxclub.ru/account/?user=4158">
				<img alt='' src='https://secure.gravatar.com/avatar/6dff588a3afb5230e438b259bccd1b09?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/6dff588a3afb5230e438b259bccd1b09?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 17-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/podsvetka-stroki-grid/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kak-mozhno-podruzhit-vfp5-6-s-tts-netware-ili-indeksy-bolshe-ne-padayut/</link>
					<title><![CDATA[Как можно подружить VFP5/6 с TTS NetWare.Или индексы больше не падают.]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:15 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Как можно подружить VFP5/6 с TTS NetWare.Или индексы больше не падают.</h1>
													</header>
													<div id="sol_opis">Наверняка любой программист, пишущий на Visual FoxPro,  многопользовательские приложения сталкивался с проблемами падения индексов или порчи DBF файлов на файл сервере ...</div>
<div id="sol_body">
<h3>Как можно подружить VFP5/6 с TTS NetWare.Или индексы больше не падают.</h3>
<p> Наверняка любой программист, пишущий на Visual FoxPro,  многопользовательские приложения сталкивался с проблемами падения индексов или порчи DBF файлов на файл сервере. </p>
<p> Используя библиотеку GPLIB MHSOFTWARE  <a href=http://www.mhsoftware.com/gplib.htm>http://www.mhsoftware.com/gplib.htm </a> Можно избежать этих проблем если не теоретически то практически навсегда. Для начала, правда,  необходимо установить 32 битового клиента от NOVELL. <br /> Еще необходимо получить <a href=http://www.mhsoftware.com/bin/gp30.exe>http://www.mhsoftware.com/bin/gp30.exe</a> библиотеку. <br /> Она имеет статус TRIAL. <br />  У меня установка практически прошла без проблем.   Использую я VFP6 + SP4  Window 2000 pro Русский и 32 битовый Novell Client . <br />  После установки выяснилось, в GPLIB нет места для VFP6, возможно в MHSOFTWARE не знали о выходе VFP6 и не добавили в пример обработку   Visual FoxPro 6.</p>
<p> Легким движением исправляем эту нелепость в демонстрационном коде: </p>
<p> Смотрите самое начало модуля GPSTART.PRG </p>
<p> DO case <br /> CASE version()="Visual FoxPro 03" <br /> 	nFoxVer=3 <br /> CASE version()="Visual FoxPro 05" <br /> 	nFoxVer=5 </p>
<p> **** Я добавил только эти две строчки <br /> CASE version()="Visual FoxPro 06" <br /> 	nFoxVer=5 <br /> **** Конец модификации </p>
<p> OTHERWISE <br /> 	do form ShowMsg with "FOX_VER" <br /> 	return .f. <br /> ENDCASE </p>
<p> Демонстрационный код работает что дальше. </p>
<p> Для защиты своих  данных,  я использую несколько функций GPLIB. </p>
<p> N_TTSAvail() 		- Сообщает доступна ли TTS <br /> N_TTSBegin() 		- Начало транзакции <br /> N_TTSCommt() 		- Завершение транзакции <br /> N_TTSRollB() 		- Откат транзакции <br /> N_SetAttr( mFile, ”+T” ) 	- Установить флаг TTS на файл <br /> N_SetAttr( mFile, ”-T” ) 	- Снять флаг TTS c файла <br /> N_FileInfo(mFile)		- Получить информацию о файле на файлсервере NetWare </p>
<p> Этого списка функций достаточно, что бы забыть проблемы с падением индексов или таблиц. </p>
<p> Но для грамотного применения необходимы уточнения. К сожалению транзакционный буфер не так велик, как хотелось бы, поэтому приходится делать короткие транзакции. </p>
<p> На файлы необходимо установить флаг TTS. </p>
<p> Представим себе нам необходимо вести базу операций и менять сальдо по счетам.  <br /> У нас есть база операций TEST и база остатков на счетах SALDOTST.  <br /> При каждой логической операции нам необходимо добавлять запить в TEST и менять остаток на счете в базе SALDOTST.  В реальной жизни одна транзакция может менять гораздо больше количество файлов и добавлять записи в несколько таблиц.  <br /> Нам необходима целостность данных как логическая так и физическая.  <br /> Логическая целостность подразумевает списание со счета 1  зачисление на счет 2 и добавление в таблицу TEST записи <br /> Физическая целостность, это когда таблицы или CDX не портятся при прерывании записи в них при потере питания или сетевого соединения. </p>
<p> SEEK СЧЕТ-1 <br /> Replace OSTATOK with OSTATOK - OUMMAOP  </p>
<p> SEEK СЧЕТ 2 <br /> Replace OSTATOK with OSTATOK + OUMMAOP  </p>
<p> INSERT INTO TEST from memvar </p>
<p> У нас получилось 3 шага, если представить что между шагом 1 и 2 произошел сбой, <br /> что маловероятно, но возможно. Мы получим  не корректную информацию. <br /> Со счета-1 деньги исчезли, но не появились на счете-2 и не попали в базу операций TEST. </p>
<p> 	Теперь приведем пример как это избежать, применяя GPLIB.  </p>
<p> Function trtest <br /> Parameter mTranTyp <br /> Private nTransNo,mCod </p>
<p> && 0 - одинокая проводка завершаем трнзакцию в модуле <br /> && 1 - транзакция не завершена <br /> &&     выходим <br /> &&       - без разблокировки захваченых записей <br /> &&       - без завершения транзакции <br /> &&     удобно применять при массовых транзакциях <br /> &&     следует только убедиться в достаточной длине транзакционного буфера <br /> &&     не рекомендую работать в данном режиме при большом количестве вызовов с параметром 1 <br /> && <br /> && 2 - завершаем транзакцию <br /> &&     происходит только разблокировка и завершение транзакции <br /> && </p>
<p> mCod = 0 <br /> If mTranTyp  2 <br /> 	If mTYPBL = 1 <br /> * 1-й вариант <br /> 		If mTranTyp = 0 <br /> 			mLock  = flock(mFile) && Блокируем ФАЙЛ на момент транзакции <br /> 		Endif <br /> 	Else <br /> * 2-й вариант блокируем только записи с которыми работаем на момент транзакции <br /> && В моем случае корректность при поиске гарантируется <br /> && Работает значительно быстрее чем 1-й вариант <br /> 		Seek m.LSD <br /> 		If found() <br /> 			If abs(ISS) >= m.SUMMAOP <br /> 				mRECD = alltrim(str(recno())) <br /> 			Else <br /> 				mCod = 1 && Нехватка средств <br /> 			Endif <br /> 		Else <br /> 			Wait window "Не найден "+m.LSD <br /> 		Endif <br /> 		If mCod = 0 <br /> 			Seek m.LSK <br /> 			If found() <br /> 				mRECK = alltrim(str(recno())) <br /> 			Else <br /> 				Wait window "Не найден  "+m.LSK <br /> 			Endif <br /> 			mLOCKRECDK = 	mRECD+","+mRECK <br /> 			If mTranTyp = 0 <br /> 				mLock  = rlock( mLOCKRECDK , 'SALDOTST' ) <br /> 			Endif <br /> 		Endif <br /> 	Endif </p>
<p> 	If mCod = 0 </p>
<p> 		If N_TTSAvail()  &&  </p>
<p> 			If mTranTyp = 0 <br /> 				nResult =N_TTSBegin()	&& Начало транзакции <br /> 			Endif </p>
<p> 			Select SALDOTST <br /> 			Seek m.LSD <br /> 			If found() <br /> 				Replace obd with obd + m.SUMMAOP <br /> 				If TYPLS = 1 && С активного <br /> 					Replace ISS with ISS - m.SUMMAOP <br /> 				Else && С пассивного <br /> 					Replace ISS with ISS - (m.SUMMAOP - m.SUMMAOP - m.SUMMAOP) <br /> 				Endif <br /> 				Replace userop with m.userop <br /> 			Endif </p>
<p> 			Seek m.LSK <br /> 			If found() <br /> 				Replace obk  with obk + m.SUMMAOP <br /> 				If TYPLS = 1 && На  активный <br /> 					Replace ISS with ISS + m.SUMMAOP <br /> 				Else && На пассивный <br /> 					Replace ISS with ISS + (m.SUMMAOP - m.SUMMAOP - m.SUMMAOP) <br /> 				Endif <br /> 				Replace userop with m.userop <br /> 			Endif <br /> && Операцию в базу операций <br /> 			Insert into TEST from memvar <br /> 			If mTranTyp = 0 <br /> 				nResult=N_TTSCommt()	&& Конец транзакции <br /> 			Endif <br /> 		Else <br /> 			Wait window 'TTS was not available!' <br /> 		Endif <br /> 		If mTranTyp = 0 <br /> 			Unlock all <br /> 		Endif <br /> 	Endif <br /> Else <br /> 	nResult=N_TTSCommt()	&& Get the transaction number <br /> 	Unlock all <br /> Endif </p>
<p> Return mCod </p>
<p> В примере четко видно, необходимо блокировать записи, которые мы меняем, до того как мы используем TTS. </p>
<p> Если в какой либо момент после объявления транзакции 	N_TTSBegin() <br /> Происходит сбой, зависание сервера, зависание клиента или разрыв сети потеря питания <br /> При запуске сервера, при соответствующей настройке NetWare, все незавершенные транзакции  откатятся. И таблицы с индексами примут те значения, которые были в них до начала транзакции, на которой произошел сбой.  <br /> Что собственно и требовалось.  </p>
<p> Для работы TTS  необходимо установить флаг TTS на те файлы которые вы  <br /> хотите обрабатывать под эгидой TTS. <br /> При этом это не только DBF таблицы но и CDX и FPT и вообще любые файлы, вы же можете использовать транзакционный механизм даже при операциях на низком уровне FOPEN FWRITE FCLOSE.  Все же  NetWare TTS замечательная штука! К сожалению, в любимой мной операционной системе NT и ее всех клонах  нет такой замечательной функции. </p>
<p> 	Немого хотелось сказать о командах  VFP    </p>
<p> BEGIN TRANSACTION   <br /> END TRANSACTION <br /> ROLLBACK </p>
<p> Эти команды сильно облегчают страдания с падением таблиц и индексов <br /> Но TTS NetWare надежней, чем эти встроенные команды. <br /> Разумеется, если таблицы расположены на сервере NetWare.  <br /> С локальными таблицами, проблемы решать придется с менее надежными командами управления транзакциями VISUALFOXPRO. </p>
<p> Короткая  работающая программа. GTEST в архиве <a href='gtest.zip'>GTEST.ZIP</a> <br /> К данной статье прилагается. </p>
<p> После компиляции и запуска нажмите кнопку  СОЗДАТЬ ТЕСТОВУЮ БАЗУ </p>
<p> Проверьте баланс </p>
<p> Запустите ТЕСТ,  желательно с нескольких станций. </p>
<p> Во время работы теста попробуйте  выключить питание на клиентской машине, или просто выдернуть из сетевой карты  кабель,  у меня еще была возможность выключать питание на сервере!    </p>
<p> Если TTS на NetWare  правильно настроен, то при перезагрузке сервера откат транзакций произойдет автоматически. Иначе вашему администратору придется на каждой зависшей транзакции отвечать на утомительные вопросы и что самое страшное,  при неверном ответе можно записать в данные те значения <br /> которые  они имели  бы без применения TTS. Поэтому лучше установить флаг  </p>
<p> Auto TTS Backout Flag = ON  </p>
<p> В файле STARTUP.NCF. </p>
<p> Auto TTS Backout Flag: OFF  (задается лишь в STARTUP.NCF) <br />   	Описание:     авто-отмена TTS при перезагрузке (пропуск подсказок) </p>
<p> В AUTOEXEC.NCF  на NetWare  посмотреть следующие настройки и при необходимости можно их ввести. </p>
<p> set tts abort dump flag = on </p>
<p> Maximum Transactions = 10000  </p>
<p> TTS Abort Dump Flag: ON <br />   Описание:  включает вывод данных отказанных транзакций  <br />  в файл регистрации </p>
<p> Maximum Transactions: 10000 <br />   Границы: 100 -- 10000 <br />   Описание:     максимальное число конкурентных транзакций в системе  </div>
<div id="sol_avtor">Автор: Зайцев Юрий Владимирович</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kak-mozhno-podruzhit-vfp5-6-s-tts-netware-ili-indeksy-bolshe-ne-padayut/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/imagen/</link>
					<title><![CDATA[ImageN]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:15 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>ImageN</h1>
													</header>
													<div id="sol_opis">Этот ActiveX поможет тем, кто разрабатывает приложения с использованием различных типов графических изображений. Понимает практически все существующие графические фоматы: JPG,Progressive JPEG,TIF, G3/G4, TGA, BMP, PCX, WMF, PNG , AutoCAD 14 DXF, DWG. Есть примеры для VFP6 в т.ч и пример по работе с БД.</div>
<div id="sol_body">
<h3>ImageN</h3>
<p>  Этот ActiveX поможет тем, кто разрабатывает приложения с использованием различных типов графических изображений. <br /> Понимает практически все существующие графические фоматы: <br /> JPG,Progressive JPEG,TIF, G3/G4, TGA, BMP,PCX, WMF, PNG ,AutoCAD 14 DXF, DWG. <br /> Есть примеры для VFP6 в т.ч и пример по работе с БД. </p></div>
<div id="sol_avtor">Автор: Pegassus Software</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/imagen/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/poluchenie-spicka-vseh-zapushhennyh-prilozhenij/</link>
					<title><![CDATA[Получение спиcка всех запущенных приложений]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:15 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Получение спиcка всех запущенных приложений</h1>
													</header>
													<div id="sol_opis">Функция создает список всех запущенных приложений в Windows, которое имеют открытые окна (есть окно на taskbar). Или создает список приложений в названии окон которых содержится определенный текст.</div>
<div id="sol_body">
<h3>Получение спсика всех запущенных приложений</h3>
<p> Иногда бывает нужно создать список приложений запущенных в данный момент. Средствами самого Foxpro это сделать трудно, т.к. часто у окон приложений заголовки динамические, постоянно изменяющиеся. Поэтому для создания такого списка используется API. </p>
<p> Приведенная функция работает в двух режимах: выводит все активные приложения или только те, в окнах которых содержится определенный текст. </p>
<p> ? IsWindEx('Microsoft Word') && выводит список всех запущенных Word'ов <br /> ? IsWindEx('') && выводит список всех запущенный приложений </p>
<p> FUNCTION IsWindEx<br /> PARAMETERS WindowName      <br />      IsWindEx = .F. <br />      SET LIBRARY TO foxtools.fll <br />      * Register the Windows API functions that will be called <br />      mGetWinTxt = RegFn("GetWindowText", "I@CI", "I") <br />      mGetWindow = RegFn("GetWindow", "II", "I") <br />      mIsWinVis =  RegFn("IsWindowVisible", "I", "I") <br />      * Get the HWND (handle) to the main FoxPro window <br />      foxhwnd = MAINHWND() <br />      * Produce a list of all windows <br />      hwndNext = CallFn(mGetWindow,foxhwnd,0) <br />      DO WHILE hwndNext  0 <br />           IF (hwndnext  foxhwnd) .AND. ; <br />                CallFn(mGetWindow,hwndnext,4) = 0 .AND. ; <br />                CallFn(mIsWinVis,hwndnext)  0 <br />                Stuffer = SPACE(64) <br />                x = CallFn(mGetWinTxt,hwndnext,@Stuffer,64) <br />                * If a window name was specified, check to <br />                * see if this is the specified window. If a <br />                * window name was not specified, display the <br />                * name of the window. <br />                IF LEN(TRIM(WindowName)) = 0 <br />                     ? Stuffer <br />                ELSE <br />                     IF WindowName $ Stuffer <br />                          IsWindEx = .T. <br />                          EXIT <br />                     ENDIF <br />                ENDIF <br />           ENDIF <br />          hwndNext = CallFn(mGetWindow,hwndnext,2) <br />         ENDDO <br />      SET LIBRARY TO <br />      IF LEN(TRIM(WindowName)) = 0 <br />           IsWindEx = .T. <br />      ENDIF <br /> RETURN IsWindEx</div>
<div id="sol_avtor">Автор: MS KB</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/poluchenie-spicka-vseh-zapushhennyh-prilozhenij/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/delaem-dve-stroki-v-zagolovke-grid/</link>
					<title><![CDATA[Две строки в заголовке GRID]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Mon, 21 Nov 2022 09:20:43 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Две строки в заголовке GRID</h1>
													</header>
													<p align="left">Бывает нужно сделать две строки в заголовке GRID: название колонки большое, а длина поля 3 знака. Вот тут-то и можно использовать класс NewHeader.</p>
<p align="left">Скачайте класс NewHeader и включите его в свой проект. Затем создайте форму и поместите на нее GRID. <br />
GRID нужно привязать к какой-нибудь таблице, но это как-бы само-собой разумеется.</p>
<p align="left">В событие<b> init</b> формы пишем следующий код:</p>
<pre><pre class='bbcode'>  Set classlib to NewHeader  
  This.addObject('MyHeader','MyHeader',This.Grid1,50)  
  This.MyHeader.Visible=.T.  
  This.MyHeader.ScrollHeader()  
</pre></pre>
<p align="left">Обратите внимание на строку <i>This.addObject('MyHeader','MyHeader',This.Grid1,50)</i>. В ней число 50 указывает высоту заголовка (header) в пикселях. То есть смотрите, какой у вас самый высокий заголовок в указывайте его высоту. Естественно, что высота заголовка для всех столбцов будет одинаковая. И к тому же строк можно делать и три, и четыре.</p>
<p align="left">Далее ... в события <b>AfterRowColChange</b> и <b>Scrolled</b> объекта GRID нужно вставить код: ThisForm.MyHeader.ScrollHeader() Метод ScrollHeader() следит за скроллингом и обновлением заголовка.</p>
<p align="left">Заключительный шаг - это удаление объекта MyHeader из GRIDа, иначе ваша форма не закроется. Для этого вставьте в событие <b>Destroy</b> формы код:</p>
<pre><pre class='bbcode'>  ThisForm.MyHeader.GridObject = NULL   
</pre></pre>
<p align="left">Объект удалиться и форма успешно закроется.<a href="../classes/newhead.zip"> </a></p>
<div id="sol_avtor">Автор: Неизвестно</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/delaem-dve-stroki-v-zagolovke-grid/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kak-privyazat-tajmer-k-glavnomu-oknu-vfp/</link>
					<title><![CDATA[Как привязать таймер к главному окну VFP]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:15 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Как привязать таймер к главному окну VFP</h1>
													</header>
													<div id="sol_opis">Объект таймер появился в VFP3. Он может выполнять определенный код регулярно, через определенное время. Так же это невидимый компонент. Его легко поместить на фому, но как его поместить на главное окно VFP ?</div>
<div id="sol_body">
<h3>Как привязать таймер к главному окну VFP</h3>
<p> Системная переменная _SCREEN содержит свойства управляющие главным окном VFP, которым можно управлять аналогично любой форме. </p>
<p> Следующий код ставит таймер на главное окно, аналогичный код может использовать для установки любого компонента на главное окно. </p>
<p> Нажмите F6 для удаление таймера. </p>
<p> * Для удаления объекта: <br />    ON KEY LABEL F6 _SCREEN.RemoveObject('oTime') </p>
<p>    * Активизация таймера: <br />    _SCREEN.AddObject('oTime','MyTimer') </p>
<p>    * Определение класса. Событие TIMER срабатывает каждую секунду, и отображается <br />    * WAIT WINDOW <br />    DEFINE CLASS MyTimer AS Timer <br />       Interval= 1000 <br />       PROCEDURE Timer <br />         WAIT WINDOW (TIME()) NOWAIT <br />       ENDPROC <br />    ENDDEFINE  </p>
</div>
<div id="sol_avtor">Автор: Microsoft KB</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kak-privyazat-tajmer-k-glavnomu-oknu-vfp/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/zagruzka-kursov-valyut-s-sajta-czb-rf/</link>
					<title><![CDATA[Загрузка курсов валют с сайта ЦБ РФ]]></title>
                    					    <author><![CDATA[grufos]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:14 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Загрузка курсов валют с сайта ЦБ РФ</h1>
													</header>
													<div id="sol_opis">Закачивает курсы всех доступных на сайте ЦБ РФ валют</div>
<div id="sol_body">
<h3>Загрузка курсов валют с сайта ЦБ РФ</h3>
<p> По умолчанию закачивается с сайт ЦБ РФ (cbr.ru) <br /> Более подробно о параметрах в .prg <br /> Cur1 - имя курсора, куда сохраняются данные <br /> Как работает: [code] set procedure to curs_currency data_f=ctod(&quot;09/01/2000&quot;) data_t=ctod(&quot;09/02/2000&quot;) do get_curs with data_f,data_t,&quot;cur1&quot; [/code]</div>
<div id="sol_avtor">Автор: Сергей Гринько</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3268">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 24 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3268">grufos</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="grufos" href="https://foxclub.ru/account/?user=3268">
				<img alt='' src='https://secure.gravatar.com/avatar/972dea2eaf696dadefff495c59043da1?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/972dea2eaf696dadefff495c59043da1?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 08-12-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/zagruzka-kursov-valyut-s-sajta-czb-rf/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/registracziya-i-udalenie-ocx-activex/</link>
					<title><![CDATA[Регистрация и удаление OCX/ActiveX]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:15 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Регистрация и удаление OCX/ActiveX</h1>
													</header>
													<div id="sol_opis">Регистрация и удаление компонентов Activex без regsrv32.exe</div>
<div id="sol_body">
<h3>Регистрация и удаление OCX/ActiveX</h3>
<p> Регистрация OCX/ActiveX в системе без использования внешних приложений и т.д. Все только средствами API. <br /> Как работает: <br /> =ocxreg(&quot;c:windowssystemcomctl32.ocx&quot;) <br /> =ocxunreg(&quot;c:windowssystemcomctl32.ocx&quot;)   </div>
<div id="sol_avtor">Автор: UT</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/registracziya-i-udalenie-ocx-activex/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/znachenie-po-maske/</link>
					<title><![CDATA[Значение по маске]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:15 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Значение по маске</h1>
													</header>
													<div id="sol_opis">Возращает следующее значение по маске, если маска не совпадает возвращает первый код по маске</div>
<div id="sol_body">
<h3>Значение по маске</h3>
<p> Пример: tcValue = &quot;Сч 12767/15-05-99&quot; <br /> tcMask = &quot;Сч ?????/%D-%M-%Y&quot; <br /> new_id=New_Mask_ID(tcValue,tcMask) <br /> * Возвратит: &quot;Сч 12768/15-05-99&quot; <br /><a href='mask_id.zip'>Скачать mask_id.zip</a></div>
<div id="sol_avtor">Автор: Yanckin Andrey</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/znachenie-po-maske/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/proverka-parametra-files-v-config-sys/</link>
					<title><![CDATA[Проверка параметра FILES в CONFIG.SYS]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:15 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Проверка параметра FILES в CONFIG.SYS</h1>
													</header>
													<div id="sol_opis">Используется для проверки и корректировки параметра FILES в CONFIG.SYS. </div>
<div id="sol_body">Проверяет параметр и корректирует его автоматически под ваши нужды или сообщает пользователю о том, что параметр не соответсвует нужному. </p>
<p> Использование: do ckconfig with 70 - проверка параметра FILES на соответсвие значению 70     </div>
<div id="sol_avtor">Автор: Jacqueline Elia</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/proverka-parametra-files-v-config-sys/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/shifrovanie-tablicz/</link>
					<title><![CDATA[Шифрование таблиц]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:15 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Шифрование таблиц</h1>
													</header>
													<div id="sol_opis">Шифрование/дешифрование таблицы (.dbf)</div>
<div id="sol_body">
<h3>Шифрование таблиц</h3>
<p> Как работает: <br /> Открываете таблицу или переходите в область с открытой таблицей и выполняете код: <br /> securedata(&quot;ON&quot;) - для шифровки <br /> securedata(&quot;OFF&quot;) - для дешифровки </p>
<p><a href='Secure.zip'>Скачать Secure.zip</a></div>
<div id="sol_avtor">Автор: John Harvey</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/shifrovanie-tablicz/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/perevod-polya-tipa-timestamp-ot-sql-server-v-stroku/</link>
					<title><![CDATA[Перевод поля типа timestamp (от SQL Server) в строку]]></title>
                    					    <author><![CDATA[mr_doc]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:15 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Перевод поля типа timestamp (от SQL Server) в строку</h1>
													</header>
													<div id="sol_opis">Фукнция для перевода поля типа timestamp, которое вы получили от SQL Server в строку.</div>
<div id="sol_body">
<h3>Перевод поля типа timestamp (от SQL Server) в строку</h3>
<p> Имя основной функции GetTimeStamp, а DecToHex вспомогательная, она переводит число из 10 в 16 систему счисления. <br /> Если есть вопрсы то пишите : mr_doc11@mail.ru <br /> Или icq: 79503410 </p>
<p><a href='gts.zip'>Скачать gts.zip</a></div>
<div id="sol_avtor">Автор: mr_doc</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4008">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4008">mr_doc</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="mr_doc" href="https://foxclub.ru/account/?user=4008">
				<img alt='' src='https://secure.gravatar.com/avatar/50dde7e656d2cfa989dcdcae6e1a8d47?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/50dde7e656d2cfa989dcdcae6e1a8d47?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 08-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/perevod-polya-tipa-timestamp-ot-sql-server-v-stroku/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/povtornyj-zapusk-formy/</link>
					<title><![CDATA[Повторный запуск формы]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:14 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Повторный запуск формы</h1>
													</header>
													<div id="sol_opis">Пример, показывающий как легко предотвратить запуск одной и той же формы два раза не делая форму модальной.</div>
<div id="sol_body">Вставьте приведенный код в событие Init формы: [code] LOCAL i, lcWindName, llRetVal  llRetVal = .T. i = 0 lcWindName = WCHILD("",0) && The "" must be a NULL or empty string  DO WHILE !EMPTY(lcWindName) IF lcWindName = UPPER(this.name) i = i + 1 IF i > 1 llRetVal = .F. EXIT ENDIF ENDIF lcWindName = WCHILD("",1) && The "" must be a NULL or empty string ENDDO  RETURN llRetVal  [/code]</div>
<div id="sol_avtor">Автор: KB</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/povtornyj-zapusk-formy/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/poisk-fajlov/</link>
					<title><![CDATA[Поиск файлов]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:14 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Поиск файлов</h1>
													</header>
													<div id="sol_opis">Поиск файлов средствами Foxpro. Прогресс-бар, настраиваемое окно поиска ...</div>
<div id="sol_body">
<h3>Поиск файлов</h3>
<p> Поиск по всем доступным дискам (A-Z) файла, указанного в параметрах. Возвращает строку вида [Drive]:[Path][Filename w/ extension] при поиске конкретного файла и курсор при поиске группы файлов (используя ? и *)<br />  Использование [code] set procedure to filesearch additive oFind = createobject("FileSearch") ? oFind.Search(cFileName,[cBarText],[bShowWindow],[bMoreInfo],[bCmdButtons]) [/code] [cBarText] заголовок окна поиска<br /> [bShowWindow] показывать окно поиска, по умолчанию .F.<br /> [bMoreInfo] показывать путь по которому в данный момент идет поиск, по умолчанию .F.<br /> [bCmdButtons] показывать кнопку прекращения поиска, по умолчанию .F.<br />  Пример: [code] set procedure to filesearch additive oFind = createobject("FileSearch") ? oFind.Search("win.com","win.com - ",.T.,.T.,.T.) && покажет c:windowswin.com [/code]</div>
<div id="sol_avtor">Автор: Ben Stack</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/poisk-fajlov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/migayushhij-tekst/</link>
					<title><![CDATA[Мигающий текст]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:14 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Мигающий текст</h1>
													</header>
													<div id="sol_opis">В FoxPro версий 2.х для DOS, вы могли создавать мигающий текст на экране. Однако, это не срабатывает в Visual Foxpro. Эта статья показывает как создать мигающую Label на форме.</div>
<div id="sol_body">
<h3>Мигающий текст</h3>
<p> Этот пример использует объект таймер для создания эффекта мигания объекта Label. </p>
<p> Создайте форму test.scx </p>
<p> Поместите объект Label на форму </p>
<p> Поместите таймер на форму. В событие Timer поместите следующий код: <br />    THISFORM.Label1.Visible=! THISFORM.Label1.Visible  </p>
<p> Установите свойство Interval таймера равным 1000 </p>
<p> Запустите форму ...</p></div>
<div id="sol_avtor">Автор: Microsoft KB</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/migayushhij-tekst/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/otobrazhenie-check-boxes-v-otchete/</link>
					<title><![CDATA[Отображение Check Boxes в отчете]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:14 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Отображение Check Boxes в отчете</h1>
													</header>
													<div id="sol_opis">Отчеты Visual FoxPro  могут печатать данные из полей и переменных. Но так же возможно напечатать обычные "галочки" (check boxes). Эта статья предлагает два способа. Visual Foxpro 6.</div>
<div id="sol_body">
<h3>Отображение Check Boxes в отчете</h3>
<p> Check boxes в отчетах предоставляют возможность легко показать логическую информацию, такую как ответы на вопросы типа &quot;да-нет&quot;. Но Report Designer не включает в себя объект Check box. Однако, вы можете отобразить его используя два предлагаемых метода. </p>
<p> Метод 1: Использование двух изображений (bitmaps). </p>
<p> Одно изображение содержит check box выбранным, а другое невыбранным. </p>
<p> Теперь с помощью Picture/ActiveX Bound Control из Report Controls, помещаем первое изображение на отчет (обычно в раздел Detail). </p>
<p> В окне Report Picture, нажмите Print When. Затем отметье Remove Line if Blank, и введите условие при котором показывается изображение с выбранным Check box. </p>
<p> Повторите то же самое со вторым изображением, введите условие при котором показывается изображение с невыбранным Check box.  </p>
<p> И поставьте второе изображение НА ТО ЖЕ САМОЕ место, что и первое. </p>
<p> Метод 2: Использование шрифта Wingdings <br /> Поместите на отчет обычноле поле (Field Control) </p>
<p> Напишите следующий код в Expression: <br />    IIF(&lt;logical expression&gt;,'x','o')  <br /> Нажмите OK. </p>
<p> Затем выделите это поле и измените его шрифт (меню Format-Font) на Wingdings </div>
<div id="sol_avtor">Автор: Microsoft KB</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/otobrazhenie-check-boxes-v-otchete/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/animaczionnyj-gif-gif89-dll/</link>
					<title><![CDATA[Анимационный gif (gif89.dll)]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:14 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Анимационный gif (gif89.dll)</h1>
													</header>
													<div id="sol_opis">Установка на форму анимационной картинки (gif). Используется gif89.dll</div>
<div id="sol_body">
<h3>Анимационный gif (gif89.dll)</h3>
<p> Перед использованием этой dll вы должны зарегистрировать ее в системе. Из windowssystem используется regsrv32.exe: <br /> <i>regsrv32.exe gif89.dll</i> </p>
<p> Теперь в VFP (меню Tools/Options/Controls) выделяем компонент gif89, который появится в библиотеке классов. Кидаем его на форму. </p>
<p> Свойства: <br /> autostart (.t./.f.) - анимировать gif сразу после запуска формы <br /> filename - имя gif-файла  <br /> speed - скорость анимации </p>
<p> Методы: <br /> play - стартовать анимирование <br /> stop - прекратить анимирование </p>
<p> Примечание: <br /> Иногда компонент работает некорректно, если свойство autosize=.t. ... Следовательно его желательно установить в .f. </p>
<p> Если у вас есть красивые и практичные gifки (прогрес-бары, часики и т.д.) присылайте (iron@nsvisual.com) - они будут размещены здесь. </p></div>
<div id="sol_avtor">Автор: -</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/animaczionnyj-gif-gif89-dll/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/transform-nestandartnye-vidy-form/</link>
					<title><![CDATA[TransForm &#8211; нестандартные виды форм]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:14 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>TransForm &#8211; нестандартные виды форм</h1>
													</header>
													<div id="sol_opis">Создание форм в виде кругов, эллипсов, квадратов, прямоугольников, многоугольников, прозрачных форм.</div>
<div id="sol_body">
<h3>TransForm - нестандартные виды форм</h3>
<p> Некоторое разнообразие интерфейса VFP ... позволяет изменять форму уже СУЩЕСТВУЮЩЕЙ формы на выбранную вами. Т.е. вы создаете обычную форму и в событие Init вставляете код конвертации формы. </p>
<p> Создание формы в виде эллипса </p>
<p> SetFormElliptic (toFormRef, tnx, tny) </p>
<p> Параметры: <br /> toFormRef - название формы для конвертирования <br /> tnx - нижняя правая X-координата прямоугольника в который вписан эллипс <br /> tny - нижняя правая Y-координата прямоугольника в который вписан эллипс </p>
<p> Возвращаемые значения: <br /> .T. если удачно; иначе .F. </p>
<p> Пример: <br /> oformtrans = newobject('cusformtransformer','frmtrans') <br /> oformtrans.SetFormElliptic(THIS, 100, 200) </p>
<p> Создание прозрачной формы, т.е. все объекты на форме как бы &quot;висят&quot; сами по себе. Заголовок формы остается видимым. </p>
<p> SetFormTransparent (toFormRef) </p>
<p> Параметры: <br /> toFormRef - название формы для конвертирования </p>
<p> Возвращаемые значения <br /> .T. если удачно; иначе .F. </p>
<p> Пример <br /> oformtrans = newobject('cusformtransformer','frmtrans') <br /> oformtrans.SetFormTransparent (THIS) </p>
<p> Создание многоугольной формы </p>
<p> SetFormUDF (toFormRef, tapoints) </p>
<p> Параметры: <br /> toFormRef - название формы для конвертирования <br /> tapoints - двумерный массив с координатами  </p>
<p> Возвращаемые значения <br /> .T. если удачно; иначе .F. </p>
<p> Пример <br /> oformtrans = newobject('cusformtransformer','frmtrans') <br /> local array lapoints[9,2] <br /> lapoints[1,1] = 0 <br /> lapoints[1,2] = 0 <br /> lapoints[2,1] = 10 <br /> lapoints[2,2] = 5 <br /> lapoints[3,1] = 100 <br /> lapoints[3,2] = 50 <br /> lapoints[4,1] = 200 <br /> lapoints[4,2] = 75 <br /> lapoints[5,1] = 60 <br /> lapoints[5,2] = 100 <br /> lapoints[6,1] = 300 <br /> lapoints[6,2] = 10 <br /> lapoints[7,1] = 250 <br /> lapoints[7,2] = 35 <br /> lapoints[8,1] = 10 <br /> lapoints[8,2] = 300 <br /> lapoints[9,1] = 25 <br /> lapoints[9,2] = 100 <br /> oformtrans.SetFormUDF (THIS, @lapoints) </p>
<p> В прилагаемом архиве лежит чуть более подробная документация на английском языке ... Удачи !       </div>
<div id="sol_avtor">Автор: (c) Universalthread</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/transform-nestandartnye-vidy-form/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/opredelenie-dostupnyh-v-sisteme-diskov/</link>
					<title><![CDATA[Определение доступных в системе дисков]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:14 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Определение доступных в системе дисков</h1>
													</header>
													<div id="sol_opis">Как в VFP 5-6 определить какие в настоящий момент диски доступны (A:,C:,D:,H:,L: например...) и их свойства (removable)</div>
<div id="sol_body">
<h3>Определение доступных в системе дисков</h3>
<p> FUNCTION logicdr <br />   PARAMETER m_tip </p>
<p>    * m_tip - ключ для получения ответа <br />    * 1 - только список дисков <br />    * 2 - список и тип диска <br />    DIMENSION adrivenames[32],adrivetypes[7], aspdrive[32] <br />    adrivenames[1]='A:' <br />    adrivenames[2]='B:' <br />    adrivenames[3]='C:' <br />    adrivenames[4]='D:' <br />    adrivenames[5]='E:' <br />    adrivenames[6]='F:' <br />    adrivenames[7]='G:' <br />    adrivenames[8]='H:' <br />    adrivenames[9]='I:' <br />    adrivenames[10]='J:' <br />    adrivenames[11]='K:' <br />    adrivenames[12]='L:' </p>
<p>    adrivenames[13]='M:' <br />    adrivenames[14]='N:' <br />    adrivenames[15]='O:' <br />    adrivenames[16]='P:' <br />    adrivenames[17]='Q:' <br />    adrivenames[18]='R:' <br />    adrivenames[19]='S:' <br />    adrivenames[20]='T:' <br />    adrivenames[21]='U:' <br />    adrivenames[22]='V:' <br />    adrivenames[23]='W:' <br />    adrivenames[24]='X:' <br />    adrivenames[25]='Y:' <br />    adrivenames[26]='Z:' <br />    adrivetypes[1]='Unknown type' <br />    adrivetypes[2]='Basic type' <br />    adrivetypes[3]='floppy' <br />    adrivetypes[4]='hard-DISK' <br />    adrivetypes[5]='net-DISK' </p>
<p>    adrivetypes[6]='CD-ROM' <br />    adrivetypes[7]='RAM - DISK' <br />    DECLARE INTEGER GetLogicalDrives IN Win32API <br />    DECLARE INTEGER GetDriveType IN Win32API STRING @ </p>
<p>    ibitmask=getlogicaldrives() <br />    ? 'Имеющиеся в системе дисковые устройства:' <br />    * в массиве   aspdrive[jj] получаем список доступных дисков <br />    jj=0 <br />    FOR i=0 TO 25 <br />       IF BITTEST(ibitmask,i) <br />          IF TYPE(adrivenames[I+1])#&quot;L&quot; <br />             jj=jj+1 <br />             DO CASE <br />   CASE m_tip=1 <br />      aspdrive[jj] = adrivenames[I+1] </p>
<p>   CASE m_tip=2 <br />      aspdrive[jj] = adrivenames[I+1]+' - '; <br />      + adrivetypes[GetDriveType(aDriveNames[I + 1]) + 1] <br />             ENDCASE <br />          ENDIF <br />         *  ? adrivenames[I+1]+' - '+adrivetypes[GetDriveType(aDriveNames[I+1])+1] <br />       ENDIF <br />    ENDFOR </p>
<p>    CLEAR DLLS <br />    * получаем список подключенных дисков <br />    mspisok=&quot; &quot; <br />    FOR kk=1 TO jj <br />       DO CASE <br />          CASE m_tip=1 <br />             mspisok=mspisok+aspdrive[kk]+SPACE(1) <br />          CASE m_tip=2 </p>
<p>             mspisok=mspisok+aspdrive[kk]+&quot;,&quot;+SPACE(1) <br />       ENDCASE <br />    ENDFOR </p>
<p>    RETURN mspisok </p>
<p> Ей надо передать два параметра буфер под строку и размер этого буфера А вернет она целое число (что значит - не помню) </p>
<p> DWORD GetLogicalDriveString(DWORD nBufferLetgth, LPTSTR lpBuffer) </p>
<p> т.е DECLARE INTEGER GetLogicalDriceString in win32api as DS INTEGER <br /> Size, STRING @ DriveString </p>
<p> DriveString=SPACE(200) </p>
<p> DS(200,DriveString) </p>
<p> Пролучишь в DS строку, где диски разделены нулевым символом и сама строка им заканчивается т.е что-то вроде &quot;A:&quot;+CHR(0)+&quot;C:&quot;+CHR(0)+&quot;D:&quot;+CHR(0)+CHR(0) </p>
<p> Может надо будет вызывать как DS(200,@DriveString) т.е может нужна ссылка на ссылку. </p>
<p> Подробности смотри в Win32 SDK. </p>
<p> Best regards,  Alexander <br /> mailto:avm@sci.yakutia.ru </div>
<div id="sol_avtor">Автор: Alexander</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/opredelenie-dostupnyh-v-sisteme-diskov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/proczedura-registraczii-oshibok/</link>
					<title><![CDATA[Процедура регистрации ошибок]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:14 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Процедура регистрации ошибок</h1>
													</header>
													<div id="sol_opis">Регистрация ошибок происходящих в программе и сохранение результата в текстовом файле</div>
<div id="sol_body">
<h3>Процедура регистрации ошибок</h3>
<p> Вызов процедуры <br /> ON ERROR DO errhand WITH ERROR( ), MESSAGE( ), MESSAGE(1), PROGRAM( ), LINENO( ) </p>
<p> Тело процедуры <br /> Результат выводится в текстовый файл  out_err.txt и окно ошибок, </p>
<p> PROCEDURE errhand <br />     PARAMETER merror, MESS, mess1, mprog, mlineno </p>
<p>     IF FILE(&quot;out_err.txt&quot;)  			&amp;&amp; определяем есть ли файл для записи ошибок <br />         gnerrorfile=FOPEN('out_err.txt',12) <br />     ELSE <br />         gnerrorfile = FCREATE('out_err.txt')  		&amp;&amp; If not create it <br />     ENDIF </p>
<p>        =  FSEEK(gnerrorfile, 0, 2)         		&amp;&amp; указатель записи на конец файла <br /> * пишем в конец файла данные об ошибке <br />     = FPUTS(gnerrorfile,&quot;===================================&quot;) </p>
<p>     = FPUTS(gnerrorfile, DTOC(DATE()) + &quot;  &quot;+TIME()) <br />     error1 = 'Error number: ' + ALLTRIM(STR(merror)) <br />     = FPUTS(gnerrorfile,  error1) <br />     = FPUTS(gnerrorfile,   'Error message: ' + MESS) <br />     = FPUTS(gnerrorfile,  'Line of code with error: ' + mess1) <br />     = FPUTS(gnerrorfile,  'Line number of error: ' + LTRIM(STR(mlineno))) <br />     = FPUTS(gnerrorfile, 'Program with error: ' + mprog) <br />     = FFLUSH(gnerrorfile) <br /> *!*	    Выводим сообщение на экран <br />     ? CHR(7) <br />     m_11 = error1 +chr(13)+; </p>
<p>      'Error message: ' + MESS +chr(13) + ; <br />      'Line of code with error: ' + mess1 +chr(13)+ ; <br />      'Line number of error: ' + LTRIM(STR(mlineno)) + chr(13)+ ; <br />      'Program with error: ' + mprog <br />     =FCLOSE(gnerrorfile) <br />     m_bb=MESSAGEBOX(m_11, 1, dflabel) <br />     DO CASE <br />         CASE m_bb = 1 <br />         * нет действий  <br />         CASE m_bb = 2 <br />             CANCEL <br />             clea all <br />     ENDCASE <br />     RETURN </p>
<p> A.Пинигин, СБОРНИК прибамбасов для VFP по материалам конференций, литературы и собственных разработок.  г. Рига E-mail: apinigin@olainfarm.lv</p></div>
<div id="sol_avtor">Автор: A.Пинигин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/proczedura-registraczii-oshibok/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kak-mozhno-proverit-est-li-disketa-v-floppike/</link>
					<title><![CDATA[Как можно проверить, есть ли дискета в флоппике]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:14 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Как можно проверить, есть ли дискета в флоппике</h1>
													</header>
													<div id="sol_opis">Как можно проверить, есть ли дискета в флоппике без перехвата ошибок и их вывода 😉</div>
<div id="sol_body">
<h3>Как можно проверить, есть ли дискета в флоппике</h3>
<p>  Все намного проще, чем ты думаешь.. <br /> if diskspace('a:')=-1 <br />       =messagebox('Всавьте дискету в дисковод A:') <br /> endif </p>
<p> Если сомневаешься, что флоппи навешанно именно на A: можно применить апишную GetDriveType, (GetDriveType) которая должна вернуть 2 внезависимости если ли дискета в дисководе или нет. <br /> В FPD2.6 не работает </p>
<p> A.Пинигин, СБОРНИК прибамбасов для VFP по материалам конференций, литературы и собственных разработок.  г. Рига E-mail: apinigin@olainfarm.lv</p></div>
<div id="sol_avtor">Автор: A.Пинигин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kak-mozhno-proverit-est-li-disketa-v-floppike/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kak-v-vfp-5-uznat-imya-tekushhego-po-umolchaniyu-printera/</link>
					<title><![CDATA[Как в VFP 5 узнать имя текущего (по умолчанию) принтера?]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:14 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Как в VFP 5 узнать имя текущего (по умолчанию) принтера?</h1>
													</header>
													<div id="sol_opis">Как в VFP 5 узнать имя текущего (по умолчанию) принтера?</div>
<div id="sol_body">
<h3>Как в VFP 5 узнать имя текущего (по умолчанию) принтера?</h3>
<p> Информацию о текущем принтере можно узнать с помощью функции PRINTERS(ArrayName). Установку драйвера принтера можно проверить функцией PRINTSTATUS(). Вызвать диалог установок принтера можно функцией GETPRINTER(). <br /> uprfin@adm.yar.ru </p>
<p> A.Пинигин, СБОРНИК прибамбасов для VFP по материалам конференций, литературы и собственных разработок.  г. Рига E-mail: apinigin@olainfarm.lv      </p></div>
<div id="sol_avtor">Автор: A.Пинигин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kak-v-vfp-5-uznat-imya-tekushhego-po-umolchaniyu-printera/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/peredacha-po-protokolu-ftp/</link>
					<title><![CDATA[Передача по протоколу FTP]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:14 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Передача по протоколу FTP</h1>
													</header>
													<div id="sol_opis">Передача по протоколу FTP с помощью стандартной утилиты ftp.exe</div>
<div id="sol_body">
<h3>Передача по протоколу FTP</h3>
<p> Есть вариант, надежный и простой. Использует стандартную утилиту <br /> FTP, входящую в состав Windows-9х. Работает в FPV и FPD. </p>
<p> ---------- Здесь пример программы ---------- <br /> CLOSE ALL <br /> CLEAR ALL <br /> CLEAR <br /> FileName=&quot;Test.txt&quot; <br /> SET CONSOLE OFF <br /> SET PRINTER ON <br /> SET PRINTER TO MyFile. <br /> SET TEXTMERGE ON <br /> open 12.46.62.8  &lt;-- здесь Ваш IP-адрес <br /> osipov            &lt;-- здесь Ваше имя <br /> my_passwd         &lt;-- здесь Ваш пароль <br /> cd /public/users/alexdata <br /> ascii <br /> get &lt;&lt;FileName&gt;&gt; </p>
<p> quit <br /> SET PRINTER TO <br /> SET PRINTER OFF <br /> SET TEXTMERGE OFF <br /> SET CONSOLE ON <br /> ! FTP -s:MyFile -v -d &gt;Nul <br /> DELETE FILE MyFile <br /> CLEAR <br /> ---------- Конец примера ---------- </p>
<p> См. Также работу с функциями API   </p>
<p> Думаю, особых пояснений здесь не требуется. Формируем текстовый файл, содержащий команды утилиты FTP и затем вызываем FTP с соответствующим списком параметров. <br /> Так я &quot;общаюсь&quot; с UNIX'ом. Может и туповато, но зато работает на любой машине, где есть Windows-9x без всяких дополнительных штучек. </p>
<p> A.Пинигин, СБОРНИК прибамбасов для VFP по материалам конференций, литературы и собственных разработок.  г. Рига E-mail: apinigin@olainfarm.lv</div>
<div id="sol_avtor">Автор: A.Пинигин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/peredacha-po-protokolu-ftp/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kak-poluchit-dannye-iz-reestra/</link>
					<title><![CDATA[Как получить данные из реестра]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:14 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Как получить данные из реестра</h1>
													</header>
													<div id="sol_opis">Как получить данные из реестра, пример работы с реестром</div>
<div id="sol_body">
<h3>Как получить данные из реестра</h3>
<p> Вот кусочек моей программы. Здесь я читаю из реестра параметры настройки <br /> принтера с целью определить ориентацию страницы: книжная или альбомная, и <br /> размер бумаги. </p>
<p> #define HKEY_LOCAL_MACHINE 0x80000002 <br /> #define KEY_READ 0x00020019 <br /> #define ERROR_SUCCESS 0 <br /> DECLARE INTEGER RegOpenKeyEx IN ADVAPI32; <br />   INTEGER HKLM, STRING SubKey, INTEGER Dummy, INTEGER Access,ж <br />   INTEGER @hKey <br /> DECLARE INTEGER RegCloseKey IN ADVAPI32 INTEGER <br /> DECLARE INTEGER RegQueryValueEx IN ADVAPI32; </p>
<p>   INTEGER hKey, STRING ValueName, INTEGER Dummy, INTEGER Type,; <br />   STRING Data, INTEGER @Size </p>
<p> * это ветвь реестра, в которой находится интересующий нас параметр <br /> SubKey=&quot;SystemCurrentControlSetcontrolPrintPrinters&quot;+PrinterName <br /> * Открываем эту ветвь и получаем её handle <br /> IF RegOpenKeyEx(HKEY_LOCAL_MACHINE,SubKey,0,KEY_READ,@hKey) != <br />    ERROR_SUCCESS <br />   MESSAGEBOX(&quot;Не удаётся получить параметры настройки принтера &quot;+; <br />              &quot;из системного реестра.&quot;,16,&quot;Печать&quot;) </p>
<p>   RETURN <br />   ENDIF <br /> * &quot;Default DevMode&quot; - это название параметра, значение которого я хочу <br /> * получить. Сначала определяем, сколько памяти нам нужно зарезервировать, <br /> * чтобы принять этот параметер <br /> nSize=0 <br /> RegQueryValueEx(hKey,&quot;Default DevMode&quot;,0,0,0,@nSize) <br /> * Резервируем память <br /> DevMode=SPACE(nSize) <br /> * Теперь считываем значение параметра <br /> RegQueryValueEx(hKey,&quot;Default DevMode&quot;,0,0,@DevMode,@nSize) <br /> * Заканчиваем работать с реестром <br /> RegCloseKey(hKey) </p>
<p> *  <br /> dmOrientation=ASC(SUBSTR(DevMode,45,1)) &amp;&amp; 1 - книжная; 2 - альбомная <br /> dmPaperSize=ASC(SUBSTR(DevMode,47,1))   &amp;&amp; 8 - A3; 9 - A4 </p>
<p> A.Пинигин, СБОРНИК прибамбасов для VFP по материалам конференций, литературы и собственных разработок.  г. Рига E-mail: apinigin@olainfarm.lv</p></div>
<div id="sol_avtor">Автор: A.Пинигин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kak-poluchit-dannye-iz-reestra/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/reindeksacziya-tablicz-bazy-dannyh/</link>
					<title><![CDATA[Реиндексация таблиц базы данных]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Wed, 16 Jun 2021 17:02:18 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Реиндексация таблиц базы данных</h1>
													</header>
													<div id="sol_opis">Реиндексация таблиц базы данных. Удобно тем, что не нужно реиндексировать каждую таблицу.</div>
<div id="sol_body">
<h3>Реиндексация таблиц базы данных</h3>
<p><code>CLOSE TABLES<br />
FOR i = 1 to ADBOBJECTS(laTables, "Table")<br />
IF !EMPTY(laTables[i])<br />
IF !USED(laTables[i])<br />
USE (laTables[i]) IN 0 EXCL<br />
SELECT (laTables[i])<br />
WAIT WINDOW NOWAIT REINDEXING_LOC + ;  </p>
<p>UPPER(ALLTRIM(laTables[i])) + ".DBF"  </p>
<p>REINDEX<br />
ENDIF<br />
ENDIF<br />
ENDFOR<br />
CLOSE TABLES<br />
WAIT WINDOW NOWAIT DONE_LOC<br />
#DEFINE OUTFILE "valdbc.txt"<br />
CLOSE TABLES  </p>
<p>IF FILE(OUTFILE)<br />
DELETE FILE OUTFILE<br />
ENDIF  </p>
<p>this.WaitMode(.T.)<br />
WAIT WINDOW NOWAIT VALIDATING_LOC<br />
VALIDATE DATABASE TO FILE OUTFILE NOCONSOLE<br />
WAIT CLEAR<br />
this.WaitMode(.F.)  </p>
<p>MODIFY FILE OUTFILE NOMODIFY NOMENU  </p>
<p>DELETE FILE OUTFILE</code></p>
<p>A.Пинигин, СБОРНИК прибамбасов для VFP по материалам конференций, литературы и собственных разработок. г. Рига E-mail: apinigin@olainfarm.lv</p>
</div>
<div id="sol_avtor">Автор: A.Пинигин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/reindeksacziya-tablicz-bazy-dannyh/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kak-prosmotret-spisok-obektov-soderzhashhihsya-v-dataenvironment/</link>
					<title><![CDATA[Как просмотреть список обьектов, содержащихся в DataEnvironment]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:14 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Как просмотреть список обьектов, содержащихся в DataEnvironment</h1>
													</header>
													<div id="sol_opis">Как просмотреть список обьектов, содержащихся в DataEnvironment</div>
<div id="sol_body">
<h3>Как просмотреть список обьектов, содержащихся в DataEnvironment </h3>
<p> . Hо в свойства DataEnvironment не нашел свойств вроде Objects или Cursors, Relations. </p>
<p> В Click() фоpмы помести следующий код и щёлкни по ней, дальше думаю <br /> поймёшь. </p>
<p> FOR i = AMEMBERS(anThisForm, ThisForm, 2) TO 1 STEP -1 <br /> IF UPPER( EVAL('ThisForm.' + anThisForm[i] + '.BaseClass') ) ='DATAENVIRONMENT' </p>
<p> FOR j = 1 TO AMEMBERS( anDE, EVAL('ThisForm.' + anThisForm[i] ), 2) </p>
<p> WAIT WINDOW 'ThisForm.' + anThisForm[i] + '.' + anDE[j] &amp;&amp; Лови, вот он </p>
<p> ENDFOR </p>
<p> ENDIF <br /> ENDFOR </p>
<p> A.Пинигин, СБОРНИК прибамбасов для VFP по материалам конференций, литературы и собственных разработок.  г. Рига E-mail: apinigin@olainfarm.lv</div>
<div id="sol_avtor">Автор: A.Пинигин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kak-prosmotret-spisok-obektov-soderzhashhihsya-v-dataenvironment/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/vstraivanie-v-prilozhenie-instrumetov-dlya-raboty-s-bd-ruchkami-i-dr/</link>
					<title><![CDATA[Встраивание в приложение инструметов для работы с БД ручками и др.]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:14 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Встраивание в приложение инструметов для работы с БД ручками и др.</h1>
													</header>
													<div id="sol_opis">Изpедка возникает потpебность на компьютеpе заказчика поковыpять базу данных.  Для этого нужно либо таскать с собой полную сpеду фокса, либо сделать отдельную инстpументальную пpогpамму.  Я пpедпочел включить такие дополнительные инстpументальные функции в основную пpогpамму и запускать их паpаметpами командной стpоки ...</div>
<div id="sol_body">
<h3>Встраивание в приложение инструметов для работы с БД ручками и др.</h3>
<p>    Изpедка возникает потpебность на компьютеpе заказчика поковыpять базу данных.    Для этого нужно либо таскать с собой полную сpеду фокса, либо сделать отдельную инстpументальную пpогpамму.     Я пpедпочел включить такие дополнительные инстpументальные функции в основную пpогpамму и запускать их паpаметpами командной стpоки, для чего на днях (декабpь 1998) сооpудил нижеследующее.  Если пpиведенный пpимеp вставить в начало пpогpаммы, то она тепеpь, помимо своего пpямого назначения, сможет откликаться на команды:</p>
<p>    MYPROG.EXE /GTABLE.DBF  - вызов BROWSE для TABLE.DBF<br />    MYPROG.EXE /PFILE.TXT   - выполнение (макpоподстановкой) команд из<br />                              файла FILE.TXT  </p>
<pre> ************************************************************ *              Главная (начальная) пpоцедуpа ************************************************************     lparameters par1, par2, par3, par4, par5, par6, par7  * паpаметpы ------------------------------------------------ if !empty(par1)   local par_cmd   par_cmd = upper(left(par1,2))   do case   case par_cmd=="/G"  && бpаузеp -----------------     gmp_c_brow(substr(par1,3))    case par_cmd=="/P"  && командный файл ----------     gmp_c_prog(substr(par1,3))  * case par_cmd=="/?"  && и тому подобное --------- *   ... скажем вызов modify command для указанного файла...    otherwise           && ошибка ------------------     err_quit("Hевеpные паpаметpы командной стpоки")   endcase endif  * дальше пошла ваша пpогpамма ------------------------------ * do MyMainProg wait wind "Just main program running..."         return  *=========================================================== *              Для командной стpоки - Browse *===========================================================                procedure gmp_c_brow (f_name) gmp_c_begn() if !file(f_name)   err_quit("Hет файла "+f_name) endif use (f_name) if used()   keyboard "{Ctrl-F10}"    && :-)   browse endif cancel         return  *=========================================================== *              Для командной стpоки - Program *===========================================================                procedure gmp_c_prog (f_name) local f_hnd, f_str gmp_c_begn() ?"Выполнение команд из файла  " + f_name ? if !file(f_name)   err_quit("Hет файла "+f_name) endif f_hnd = fopen(f_name) if f_hnd																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/opyt-perevoda-proekta-iz-foxpro-2-6-dos-v-vfp-6-0/</link>
					<title><![CDATA[Опыт перевода проекта из FoxPro 2.6 DOS в VFP 6.0]]></title>
                    					    <author><![CDATA[ГВК]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:14 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Опыт перевода проекта из FoxPro 2.6 DOS в VFP 6.0</h1>
													</header>
													<div id="sol_opis">Опыт перевода проекта из FoxPro 2.6 DOS в VFP 6.0</div>
<div id="sol_body">
<h3>Опыт перевода проекта из FoxPro 2.6 DOS в VFP 6.0</h3>
<p>                              ОПЫТ ПЕРЕВОДА ПРОЕКТА <br />                   из FoxPro 2.6 DOS в Visual FoxPro 6.0 </p>
<p> Для чего я это пишу? </p>
<p> Чтение эхо-конференций и конференции Visual FoxPro Club показал, что, несмотря на существование современного средства разработки программ Visual FoxPro 6, многие продолжают программировать на устаревшем (морально и физически) средстве FoxPro 2.6 DOS. Причины различные, углубляться не буду. Но одна из причин, как мне кажется, инерция человеческого мышления, и неохота связываться с трудностями перехода на новое средство. А также кажущиеся огромные трудности. <br /> Да, бесспорно, трудности есть. Особенно, когда это приходится преодолевать самостоятельно. По слухам, существует кое-какая литература, посвященная этой проблеме, но я не сталкивался. Преодолел эти трудности самостоятельно, и теперь возникло желание поделиться решениями. </p>
<p> Замечание Игоря Шанука. В MSDN есть раздел посвященный переводу проектов разработанных на более ранних версиях FoxPro: "Converting from Other Versions of FoxPro" -> "Converting from FoxPro 2.6" </p>
<p> Данные записки предназначены для тех, кто уже хочет, но еще не может, или для тех, кто ну никак не созреет к переходу на VFP 6.0. </p>
<p> Замечание! На самом деле, переход с 2.6 на VFP 6.0 не столь уж и труден. Во всяком случае, задача вполне преодолимая. VFP 6.0 декларирует поддержку всего, созданного в ранних версиях FoxPro. Хотя это и не совсем так, но это мелочи. </p>
<p> Ограничения. </p>
<p> Проект, который я переводил из 2.6 в 6.0, содержит только процедуры и свободные таблицы. То есть, отчеты, запросы, окна и т. п. запрограммированы ручками в процедурах (в файлах PRG). <br /> Предполагается, что VFP 6.0 проинсталлирован и имеются исходные тексты проекта, который переводится. Инсталляция FoxPro 2.6 необязательна. </p>
<p> Порядок перевода. </p>
<p> 1.     Создаем новую папку. <br /> 2.     Требуется устранить первую проблему отображения русских букв. Связано это с тем, что в 2.6 файлы в кодовой странице 866. </p>
<p> Решение может быть таким: создать новый проект в VFP 6.0, включить в него все PRG файлы, и в Projekt Info -> Files проставить всем файлам Code Page = 866 (Russian MS-DOS). Однако в этом случае, текст преобразованного PRG файла оставляет желать лучшего, потому что по непонятным причинам русский текст искажается (многие буквы не воспринимаются и заменяются различными никому не нужными и всем мешающими символами). </p>
<p> Я рекомендую следующее решение: </p>
<p> -     Открыть PRG файлы (можно последовательно) в WinWorde, указав кодировку &#8211; Кирилица (DOS). </p>
<p> -     Открытые файлы сохранить в новой папке как текстовые с расширением PRG, но в другом формате (Файл -> Сохранить как &#8211;> формат файла = только текст (*.txt) &#8211;> ответить ДА на запрос о преобразовании). В этом случае, PRG файлы сразу делаются в кодировке 1251 и русский текст корректен. </p>
<p> Замечание! Работа довольно кропотливая, но она стоит того. В противном случае, см. решение 1, описанное выше, Вам придется просматривать тексты PRG файлов и корректировать все надписи по-русски. Это гораздо больше работы. </p>
<p> Замечание Игоря Шанука. Тут на мой взгляд хорошо бы было уточнить этот момент.Я провел эксперимент: <br /> 1.     Создал новый файл проекта (в VFP) <br /> 2.     Добавил в него (вручную) нужные файлы <br /> 3.     Установил для файлов 866 кодовую страницу (до установки кодовой страницы файл не открывался) </p>
<p> После всех этих манипуляций русский текст в комментариях и сообщениях, которые предполагалось выдавать пользователю, нормально читался. </p>
<p> Замечание Игоря Шанука. Т.е. фактически подхода два: <br />   a) предоставить FoxPro работать с файлами в исходной кодовой странице <br /> (866), <br />     b) либо предварительно перекодировать файлы в 1251. (В этом случае <br /> можно написать несложную утилиту (на том же FoxPro) которая автоматизирует этот процесс). </p>
<p> 4.     Требуется устранить вторую проблему отображения русских букв. Связано это с тем, что в 2.6 окна отображают русские буквы шрифтом по умолчанию, и может получиться греко-арабская абракадабра при выполнении проекта. </p>
<p> Для этого необходимо добавить в описание окон наименование [и размер] шрифта, например:  </p>
<p> DEFINE WINDOW okno ; <br />           FROM INT((SROW()-19)/2),INT((SCOL()-80)/2) ; <br />           TO INT((SROW()-19)/2)+19,INT((SCOL()-80)/2)+79 ; <br />           TITLE "РЕДАКТИРУЕМЫЕ РЕГИСТРАЦИОННЫЕ ДАННЫЕ" ; <br />           NOFLOAT ; <br />           NOCLOSE ; <br />           NOMINIMIZE ; <br />           DOUBLE ; <br />           COLOR w+/bg,w+/b,gr/n,gr+/w,n+/w,w+/gr,bg+/bg,n+/n,b/bg,w/bg,+ ; </p>
<p>           FONT 'Times New Roman', 10 </p>
<p> 5.     Заменить все литеральные константы дат типа {01.01.93} на {^1993-01-01}, т. е. -   {^ГГГГ-ММ-ДД}. </p>
<p> Замечание Игоря Шанука. Этого можно не делать, если в VFP установить SET STRICTDATE TO 0. Так же думаю, что полезно привести ссылку на раздел MSDN "Year 2000 Date Support" </p>
<p> 6.     Добавить соответствующее SET CENTURE </p>
<p> 7.     Удалить из новой папки все файлы с расширением FXP. Могут случайно попасться FXP файлы для FoxPro 2.6, которые очень сильно будут мешать. </p>
<p> 8.     Создать новый файл проекта. Включить в него все необходимые PRG файлы и перекомпилировать проект (предполагается, что Вы знаете как включать файлы в проект и как перекомпилировать проект). </p>
<p> 9.     ВСЕ! Проект можно запускать на выполнение. Однако, для дальнейшей хорошей работы, проект желательно все-таки перепроектировать, а именно &#8211; добавить формы, поиграть с размерами и фонтами окон, и т.п. </p>
<p> Примечание! Автор будет благодарен, если кто-нибудь дополнит эти скромные записки материалами по переводу из 2.6 в VFP отчетов, запросов и т.п. прибамбасов. </div>
<div id="sol_avtor">Автор: ГВК</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4916">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4916">ГВК</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="ГВК" href="https://foxclub.ru/account/?user=4916">
				<img alt='' src='https://secure.gravatar.com/avatar/5a09f42e891e4cabff5297b00599e9fa?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/5a09f42e891e4cabff5297b00599e9fa?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 2<i class="rcli fa-calendar-check-o"></i>Регистрация: 03-10-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/opyt-perevoda-proekta-iz-foxpro-2-6-dos-v-vfp-6-0/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Инструменты разработчика]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/grid-ispolzovanie-goryachih-klavish-ctrl-c-ctrl-v-ctrl-x-dlya-zapisi-v-bufer-obmena/</link>
					<title><![CDATA[GRID. Использование горячих клавиш Ctrl+C, Ctrl+V, Ctrl+X для записи в буфер обмена.]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:13 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>GRID. Использование горячих клавиш Ctrl+C, Ctrl+V, Ctrl+X для записи в буфер обмена.</h1>
													</header>
													<div id="sol_opis">В скомпилированном EXE-файле стандартные сочетания клавиш для работой с буфером обмена (ctrl+c,ctrl+v,ctrl+x) не работают. Как же работать с буфером обмена.</div>
<div id="sol_body">
<h3>GRID. Использование горячих клавиш Ctrl+C, Ctrl+V, Ctrl+X для записи в буфер обмена. </h3>
<p> Для EXE шника.  В режиме RUN-TIME работает и без этого. </p>
<p> Это только для текстового поля (Учесть что в _CLIPTEXT данные хранятся в текстовом формате) </p>
<p> Обмен ведется через системную переменную _CLIPTEXT. <br />  В метод KeyPress объекта записывается: </p>
<p> DO CASE <br />   CASE nkeycode=13 <br />     THIS.DBLCLICK </p>
<p>   CASE nkeycode = 3 AND nshiftaltctrl = 2    &amp;&amp; Ctrl+C <br />     _CLIPTEXT =ALLTRIM(THIS.SELTEXT) </p>
<p>   CASE nkeycode = 22 AND nshiftaltctrl = 2   &amp;&amp; Ctrl+V </p>
<p>        THIS.SELTEXT = _CLIPTEXT <br />     THISFORM.REFRESH </p>
<p>   CASE nkeycode = 24 AND nshiftaltctrl = 2   &amp;&amp; Ctrl+X <br />     _CLIPTEXT =ALLTRIM(THIS.SELTEXT) </p>
<p>     THISFORM.REFRESH <br /> ENDCASE </p>
<p> A.Пинигин, СБОРНИК прибамбасов для VFP по материалам конференций, литературы и собственных разработок.  г. Рига E-mail: apinigin@olainfarm.lv</p></div>
<div id="sol_avtor">Автор: A.Пинигин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/grid-ispolzovanie-goryachih-klavish-ctrl-c-ctrl-v-ctrl-x-dlya-zapisi-v-bufer-obmena/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/kak-vstavit-novyj-obekt-v-grid-i-ubrat-staryj/</link>
					<title><![CDATA[Как вставить новый объект в GRID и убрать старый]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:13 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Как вставить новый объект в GRID и убрать старый</h1>
													</header>
													<div id="sol_opis">Как вставить в столбцы GRID не только стандартный textbox, но и checkbox,spinner ... и как их потом удалить ...</div>
<div id="sol_body">
<h3>Как вставить новый объект в GRID и убрать старый</h3>
<p> ·	Выбрать колонку, в которой вы хотите использовать другой элемент управления. <br /> ·	Выбрать на панели инструментов FORM CONTROLS требуемый элемент управления и щелкнуть мышкой на выбранной колонке. Пусть вас не сиущает, что элемент управления не отобразился немедленно. <br /> ·	Используя список объектов в окне PROPERTY, убедитесь, что выбранный элемент управления появился с отступом ниже выбранной колонки. Установите для элемента управления необходимые свойства. Например, еслимы будем отображать в форме данные таблицы INVOICES, то, очевидно, логическое поле paid, показывающее признгак оплаты счета, удобно отображать с помощью элемента управления CHECKBOX. Для этого объекта надо установить свойство CAPTION значение “ ” (пустая строка), а для свойства Sparce колонки значение .F.. </p>
<p> ·	Для колонки свойство CurrentControl следует установить равным наименованию используемого элемента упарвления. Вот теперь в колонке Grid вы увидите графическое отображение типа выбранного объекта </p>
<p> &gt;Вопрос как убрать этот же CheckBox? <br /> &gt;Александр </p>
<p> Делается это так.  </p>
<p> ·	По правой кнопке мыши вызываем окно Properties.  <br /> ·	Выбираем в нем объект, который нужно удалить.  <br /> ·	Не закрывая окна Properties, кликаем мышой по заголовку (!!!) окна Form Designer.  <br /> ·	Жмём клавишу Delete.  <br /> ·	Радуемся жизни и пьём пиво. </p>
<p> Прислал Кирилл. </p>
<p> &quot;Cyrill Phomin&quot; &lt;cyrill@dci.mpei.ac.ru&gt; <br /> Organization: Moscow Power Engineering Institute <br /> Date: Fri, 18 Dec 1998 21:32:19 +0300 </p>
<p> A.Пинигин, СБОРНИК прибамбасов для VFP по материалам конференций, литературы и собственных разработок.  г. Рига E-mail: apinigin@olainfarm.lv</p></div>
<div id="sol_avtor">Автор: А.Пинигин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/kak-vstavit-novyj-obekt-v-grid-i-ubrat-staryj/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/rabota-iz-vfp-s-excel-s-ispolzovaniem-ole/</link>
					<title><![CDATA[Работа из VFP с EXCEL с использованием OLE]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:14 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Работа из VFP с EXCEL с использованием OLE</h1>
													</header>
													<div id="sol_opis">Еще один пример работы с Excel из VFP</div>
<div id="sol_body">
<h3>Работа из VFP с EXCEL с использованием OLE</h3>
<p> 1 вариант </p>
<p> OLEOBJECT = CREATEOBJECT(&quot;EXCEL.Application&quot;) <br /> OLEOBJECT.APPLICATION.VISIBLE = .T. </p>
<p> SELECT diction </p>
<p> EXPORT TO INFO XL5 <br /> OLEOBJECT.workbooks.OPEN(&quot;c:aarazrabcapcodsinfo.XLs&quot;) <br /> m_Kol2=reccount()+3 <br /> m_str=alltrim(str(m_kol)) <br /> m_str2=alltrim(str(m_kol2)) <br /> c1=&quot;C&quot;+m_str <br /> d1=&quot;D&quot;+m_str <br /> e1=&quot;E&quot;+m_str <br /> f1=&quot;F&quot;+m_str <br /> g1=&quot;G&quot;+m_str <br /> h1=&quot;H&quot;+m_str <br /> i1=&quot;I&quot;+m_str <br /> c2=&quot;C&quot;+m_str2 <br /> OLEOBJECT.RANGE(C1).SELECT <br /> OLEOBJECT.RANGE(C1).VALUE = &quot;Kapkodi/Trafiks/=&quot; <br /> OLEOBJECT.RANGE(D1).SELECT </p>
<p> OLEOBJECT.RANGE(D1).VALUE = m2kol   			&amp;&amp; общее количество капкодов <br /> OLEOBJECT.RANGE(E1).SELECT <br /> OLEOBJECT.RANGE(E1).VALUE = m_traf_pagr </p>
<p> ******************************************************************************** <br /> 2 вариант </p>
<p> LOCAL m_kol,m_kols <br /> #DEFINE xlleft          1 <br /> #DEFINE xlcenter        3 <br /> #DEFINE xlright         5 <br /> #DEFINE xlcenteracrossselection 7 <br /> #DEFINE xlnone          1 <br /> #DEFINE xlthin          2 <br /> #DEFINE xlmedium        3 <br /> #DEFINE xlbottom        4 </p>
<p> *!*	Делаем выборку данных из таблицы wrzakaz <br /> DO CASE <br />   CASE REPORT.filename = &quot;zakaz_pr&quot; </p>
<p>     m_nr_zakaz =  wrzakaz0.nr_zakaz <br />     SELECT REPORT <br />     SET DELETED ON <br />     DO qr_zakaz_pr.QPR <br />     SELECT qr_zakaz_pr <br />     *!*	    ALTER TABLE qr_zakaz_pr ADD COLUMN spis N(5) </p>
<p>     SELECT qr_zakaz_pr <br />     GO TOP <br />     m_kol=0 </p>
<p>     DO WHILE !EOF() <br />       m_kol=m_kol+10 <br />       *!*	      m_kols = STR(m_kol,4,0)+&quot;0&quot; <br />       REPL spis WITH m_kol </p>
<p>       SKIP <br />     ENDDO <br />     APPEND BLANK <br />     REPL spis WITH 0 <br />     REPL tovar WITH &quot;FAX - THE COORDINATION OF THE ORDER&quot; <br />     REPL coment WITH m_nr_zakaz <br />     APPEND BLANK <br />     REPL spis WITH 1 <br />     REPL tovar WITH Thisform.m_nos+space(6)+Thisform.m_tl1  &amp;&amp; телефон 1 <br />     APPEND BLANK <br />     REPL spis WITH 2 </p>
<p>     REPL tovar WITH Thisform.m_tl2   &amp;&amp; телефон 2 <br />     APPEND BLANK <br />     REPL spis WITH 3 <br />     REPL tovar WITH Thisform.m_fax   &amp;&amp; fax </p>
<p>     APPEND BLANK <br />     REPL spis WITH 4 <br />     * количество записей в таблице до подписи <br />     m_count0 = RECCOUNT() +2 </p>
<p>     APPEND BLANK <br />     REPL spis WITH m_kol+1 <br />     APPEND BLANK <br />     REPL spis WITH m_kol+1 <br />     REPL tovar WITH &quot;Kind regards       &quot;+Thisform.m_fam &amp;&amp; подпись <br />     APPEND BLANK <br />     REPL spis WITH m_kol+1 </p>
<p>     REPL tovar WITH DTOC(DATE()) <br />     * количество записей в таблице <br />     m_count = RECCOUNT() +1 </p>
<p>     INDEX ON spis TAG spis <br />     SET ORDER TO spis <br />     EXPORT TO qr_zakaz_pr XL5 </p>
<p>     OLEOBJECT = CREATEOBJECT(&quot;EXCEL.Application&quot;) <br />     OLEOBJECT.APPLICATION.VISIBLE = .T. </p>
<p>     m_pathxls = m_curdir + 'qr_zakaz_pr.XLS' <br />     OLEOBJECT.workbooks.OPEN(m_pathxls) </p>
<p>     FOR bukva =  65 TO    70 <br />       m1 = [OLEOBJECT.RANGE(]+[&quot;]+CHR(bukva)+[6]+[&quot;]+[).SELECT] <br />       m2 = [OLEOBJECT.COLUMNS(]+[&quot;]+CHR(bukva)+[:]+CHR(bukva)+[&quot;]+[).entirecolumn.autofit] </p>
<p>       OLEOBJECT.RANGE(&quot;C6&quot;).VALUE = &quot;Pal&quot; <br />       OLEOBJECT.RANGE(&quot;B6&quot;).VALUE = &quot;The goods&quot; <br />       OLEOBJECT.RANGE(&quot;D6&quot;).VALUE = &quot;Box&quot; <br />       OLEOBJECT.RANGE(&quot;E6&quot;).VALUE = &quot;Cost of the goods for 1 box&quot; <br />       &amp;m1 <br />       *!*	 .HorizontalAlignment = xlCenter <br />       *!*	        .VerticalAlignment = xlBottom </p>
<p>       OLEOBJECT.SELECTION.FONT.bold = .T. <br />       OLEOBJECT.SELECTION.FONT.italic = .T. <br />       OLEOBJECT.SELECTION.FONT.NAME = &quot;Arial&quot; <br />       OLEOBJECT.SELECTION.FONT.SIZE  = 10 </p>
<p>       &amp;m2 </p>
<p>     ENDFOR </p>
<p>     * Выделение области и удаление значений <br />     * чистка области в районе <br />     OLEOBJECT.RANGE(&quot;C2:E5&quot;).SELECT <br />     OLEOBJECT.SELECTION.clearcontents <br />     * чистка области порядковых номеров <br />     OLEOBJECT.RANGE(&quot;A1:G1&quot;).SELECT <br />     OLEOBJECT.SELECTION.clearcontents <br />     m_oblast = &quot;G1:G&quot;+ALLTRIM(STR(m_count,3,0)) <br />     m_comand = [OLEOBJECT.RANGE(&quot;]+m_oblast+[&quot;).SELECT] <br />     &amp;m_comand <br />     OLEOBJECT.SELECTION.clearcontents <br />     * чистка области в районе подписи </p>
<p>     m_oblast0 = &quot;C&quot;+ALLTRIM(STR(m_count0,3,0))+&quot;:&quot;+[E]+ALLTRIM(STR(m_count,3,0)) <br />     m_comand0 = [OLEOBJECT.RANGE(&quot;]+m_oblast0+[&quot;).SELECT] <br />     &amp;m_comand0 <br />     OLEOBJECT.SELECTION.clearcontents <br />     * чистка области кода номенклатуры <br />     m_oblast = &quot;A1:A&quot;+ALLTRIM(STR(m_count,3,0)) <br />     m_comand = [OLEOBJECT.RANGE(&quot;]+m_oblast+[&quot;).SELECT] <br />     &amp;m_comand <br />     OLEOBJECT.SELECTION.clearcontents <br />     * Выравнивание по центру <br />     OLEOBJECT.RANGE(&quot;B2&quot;).SELECT <br />     OLEOBJECT.SELECTION.horizontalalignment =  xlcenter </p>
<p>     OLEOBJECT.SELECTION.verticalalignment = xlbottom <br />     OLEOBJECT.SELECTION.FONT.NAME = &quot;Arial&quot; <br />     OLEOBJECT.SELECTION.FONT.SIZE  = 15 <br />     xljustify = -4150 <br />     OLEOBJECT.RANGE(&quot;B3:B5&quot;).SELECT <br />     OLEOBJECT.SELECTION.horizontalalignment = xlright <br />     *!*	        OLEOBJECT.SELECTION.VerticalAlignment = xlJustify </p>
<p>     OLEOBJECT.RANGE(&quot;B2:E2&quot;).SELECT <br />     OLEOBJECT.SELECTION.horizontalalignment = xlcenter <br />     *!*	    OLEOBJECT.SELECTION.merge </p>
<p>     OLEOBJECT.RANGE(&quot;B3:E3&quot;).SELECT </p>
<p>     OLEOBJECT.SELECTION.horizontalalignment =  -4152 &amp;&amp; прижать вправо <br />     *!*	    OLEOBJECT.SELECTION.merge </p>
<p>     OLEOBJECT.RANGE(&quot;B4:E4&quot;).SELECT <br />     OLEOBJECT.SELECTION.horizontalalignment =  -4152 &amp;&amp; прижать вправо <br />     *!*	    OLEOBJECT.SELECTION.merge </p>
<p>     OLEOBJECT.RANGE(&quot;B5:E5&quot;).SELECT <br />     OLEOBJECT.SELECTION.horizontalalignment =  -4152 &amp;&amp; прижать вправо <br />     *!*	    OLEOBJECT.SELECTION.merge </p>
<p>     OLEOBJECT.RANGE(&quot;F2&quot;).SELECT <br />     OLEOBJECT.SELECTION.FONT.italic = .T. </p>
<p>     OLEOBJECT.SELECTION.FONT.NAME = &quot;Arial&quot; <br />     OLEOBJECT.SELECTION.FONT.SIZE  = 7 </p>
<p>     SELECT qr_zakaz_pr <br />     USE <br />     DELETE FILE qr_zakaz_pr.DBF <br />     DELETE FILE qr_zakaz_pr.CDX </p>
<p> A.Пинигин, СБОРНИК прибамбасов для VFP по материалам конференций, литературы и собственных разработок.  г. Рига E-mail: apinigin@olainfarm.lv</p></div>
<div id="sol_avtor">Автор: А.Пинигин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/rabota-iz-vfp-s-excel-s-ispolzovaniem-ole/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/sozdanie-otcheta-s-ispolzovaniem-excel/</link>
					<title><![CDATA[Создание отчета с использованием Excel]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:14 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Создание отчета с использованием Excel</h1>
													</header>
													<div id="sol_opis">Пример работы с Excel: создание отчета. Использует excel.h</div>
<div id="sol_body">
<h3>Создание отчета с использованием Excel</h3>
<p> Системные констаиты хранятся в файле excel.h  <br /> Делаем запись макроса макрорекордером Excel, делаем переопределение  логических констант true и false командами #DEFINE true .T.,  #DEFINE false .F. и исправляем отдельные команды </p>
<p> WITH SELECTION.BORDERS(xledgeleft) в вид  <br /> WITH .SELECTION.BORDERS(xledgeleft) </p>
<p> END WITH   в вид  ENDWITH </p>
<p> * Пример программы рисования таблицы </p>
<p> #include excel.h <br /> #DEFINE true .T. <br /> #DEFINE false .F. <br /> #DEFINE m_fontsize 18 <br /> #DEFINE m_fontname &quot;Times New Roman&quot; </p>
<p> IF !USED (&quot;rep2&quot;) <br />   SELECT 0 <br />   USE rep2 <br /> ELSE <br />   SELECT rep2 <br /> ENDIF </p>
<p> * получение последнего номера строки <br /> m_rec_kol = RECCOUNT()+1 <br /> m_adrsum = m_rec_kol+1 </p>
<p> m_d1 = ALLTRIM(STR(m_rec_kol)) <br /> m_d2 = ALLTRIM(STR(m_adrsum)) </p>
<p> lcolderror = ON(&quot;ERROR&quot;) <br /> ON ERROR o_excel = .NULL. <br /> o_excel = GETOBJECT( , &quot;Excel.application&quot;) <br /> ON ERROR &amp;lcolderror <br /> IF ISNULL(o_excel) <br />   EXPORT TO rep_trener XL5 <br />   m_file_xls = SYS(5)+CURDIR()+&quot;rep_trener.XLs&quot; <br />   o_excel = CREATEOBJECT(&quot;EXCEL.Application&quot;) <br />   o_excel.APPLICATION.VISIBLE = .T. <br />   o_excel.workbooks.OPEN(&quot;&amp;m_file_xls&quot;) <br /> ELSE <br />   m_box = MESSAGEBOX(&quot;Проверте не запущен ли файл REP_TRENER.XLS &quot;+CHR(13)+; </p>
<p>     &quot; &quot;, 0+32, &quot;Предупреждение!&quot;) <br />   RETURN <br /> ENDIF </p>
<p> WITH o_excel <br />   *************************************************** <br />   *!*	  выделение области таблицы и рисование линий <br />   *************************************************** <br />   * выделение области <br />   m_com = [.RANGE(&quot;A1:I]+m_d1+[&quot;).SELECT] <br />   &amp;m_com <br />   ********************************************* <br />   * рисование линий <br />   ********************************************* <br />   .SELECTION.BORDERS(xldiagonaldown).linestyle = xlnone </p>
<p>   .SELECTION.BORDERS(xldiagonalup).linestyle = xlnone <br />   WITH .SELECTION.BORDERS(xledgeleft) <br />     .linestyle = xlcontinuous <br />     .weight = xlthin <br />     .colorindex = xlautomatic <br />   ENDWITH <br />   WITH .SELECTION.BORDERS(xledgetop) <br />     .linestyle = xlcontinuous <br />     .weight = xlthin <br />     .colorindex = xlautomatic <br />   ENDWITH <br />   WITH .SELECTION.BORDERS(xledgebottom) <br />     .linestyle = xlcontinuous <br />     .weight = xlthin <br />     .colorindex = xlautomatic <br />   ENDWITH <br />   WITH .SELECTION.BORDERS(xledgeright) </p>
<p>     .linestyle = xlcontinuous <br />     .weight = xlthin <br />     .colorindex = xlautomatic <br />   ENDWITH <br />   WITH .SELECTION.BORDERS(xlinsidevertical) <br />     .linestyle = xlcontinuous <br />     .weight = xlthin <br />     .colorindex = xlautomatic <br />   ENDWITH <br />   WITH .SELECTION.BORDERS(xlinsidehorizontal) <br />     .linestyle = xlcontinuous <br />     .weight = xlthin <br />     .colorindex = xlautomatic <br />   ENDWITH <br />   ********************************************* <br />   * автоматическое выравнивание <br />   ********************************************* </p>
<p>   .cells.SELECT <br />   .SELECTION.COLUMNS.autofit </p>
<p>   *!*	  суммирование EXCELом <br />   m_range = [.RANGE(&quot;I]+m_d2+[&quot;).SELECT] <br />   m_summir = [.activecell.VALUE =&quot;=SUM(I2:I]+m_d1+[)&quot;] <br />   &amp;m_range <br />   &amp;m_summir <br />   ********************************************* <br />   * убрать Грид линии <br />   ********************************************* <br />   .activewindow.displaygridlines = false </p>
<p>   * смена заголоаков <br />   .RANGE(&quot;I1&quot;).SELECT <br />   .activecell.formular1c1 = &quot;Cумма&quot; <br />   .RANGE(&quot;G1&quot;).SELECT <br />   .activecell.formular1c1 = &quot;Цена продукции&quot; </p>
<p>   .RANGE(&quot;F1&quot;).SELECT <br />   .activecell.formular1c1 = &quot; Цена склада &quot; <br />   * смена формата данных <br />   .COLUMNS(&quot;I:I&quot;).SELECT <br />   .SELECTION.numberformat = &quot;0.00&quot; </p>
<p>   .RANGE(&quot;A1:I1&quot;).SELECT <br />   WITH .SELECTION <br />     .horizontalalignment = xlcenter <br />     .verticalalignment = xlcenter <br />     .wraptext = true <br />     .ORIENTATION = 0 <br />     .shrinktofit = false <br />     .mergecells = false <br />   ENDWITH <br />   ********************************************* <br />   * центровка заголовка документа <br />   ********************************************* </p>
<p>   .RANGE(&quot;A1:I1&quot;).SELECT <br />   .SELECTION.INSERT <br />   .SELECTION.merge <br />   WITH .SELECTION <br />     .horizontalalignment = xlcenter <br />     .verticalalignment = xlbottom <br />     .wraptext = false <br />     .ORIENTATION = 0 <br />     .shrinktofit = false <br />     .mergecells = true <br />   ENDWITH </p>
<p>   *********************************************8 <br />   * заголовок всего документа <br />   ********************************************* <br />   .RANGE(&quot;A1&quot;).SELECT <br />   .activecell.VALUE = &quot; Заголовок таблицы &quot; <br />   * смена типа и размера и шрифта </p>
<p>   .RANGE(&quot;A1&quot;).SELECT <br />   WITH .SELECTION <br />     .FONT.NAME = m_fontname <br />     .FONT.SIZE = m_fontsize <br />   ENDWITH </p>
<p>   * .sheets(1).SELECT <br />   .sheets.ADD </p>
<p>   .sheets(1).SELECT <br />   .sheets(1).NAME = &quot;Тренер&quot; <br />   .sheets(&quot;rep_trener&quot;).SELECT <br />   .sheets(&quot;rep_trener&quot;).NAME = &quot;Тренер_222&quot; <br />   .RANGE(&quot;I10:I20&quot;).SELECT </p>
<p> ENDWITH </p>
<p> o_excel.APPLICATION.VISIBLE = .T. <br /> oexlchart = CREATEOBJECT(&quot;EXCEL.CHART&quot;) <br /> oexlchart.chartwizard(oexlchart.PARENT.sheets(2).RANGE(&quot;I10:I20&quot;) ,,,2) </p>
<p> * oexlchart.chartwizard(oexlchart.parent.sheets(2).RANGE(&quot;I10:I13&quot;) ,,,2) <br /> oexlchart.APPLICATION.VISIBLE = .T. </p>
<p> A.Пинигин, СБОРНИК прибамбасов для VFP по материалам конференций, литературы и собственных разработок.  г. Рига E-mail: apinigin@olainfarm.lv</p></div>
<div id="sol_avtor">Автор: A.Пинигин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/sozdanie-otcheta-s-ispolzovaniem-excel/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/primer-raboty-s-word-ispolzovanie-ole/</link>
					<title><![CDATA[Пример работы с Word (использование OLE)]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:14 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Пример работы с Word (использование OLE)</h1>
													</header>
													<div id="sol_opis">Небольшой пример работы с Word</div>
<div id="sol_body">
<h3>Пример работы с Word (использование OLE)</h3>
<p> oWord = CreateObject(&quot;Word.Basic&quot;) <br /> oWord = FileOpen (&quot;C:Мои документыTest.doc&quot;)       &amp;&amp; must be exist! <br /> oWord.Insert(&quot;ля-ля&quot;) <br /> oWord.InsertPara <br /> oWord.AppShow </p>
<p> 	Виктор Рыбаков </p>
<p>         	Торговая Фирма &quot;НЕВСКИЙ&quot;, С-Петербург </p>
<p> &quot;Viktor A. Rybakov&quot; &lt;rybak@nevsky.spb.su&gt; </p>
<p> A.Пинигин, СБОРНИК прибамбасов для VFP по материалам конференций, литературы и собственных разработок.  г. Рига E-mail: apinigin@olainfarm.lv</p></div>
<div id="sol_avtor">Автор: А.Пинигин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/primer-raboty-s-word-ispolzovanie-ole/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ispolzovanie-kalendarya-dlya-vybora-daty/</link>
					<title><![CDATA[Использование календаря для выбора даты]]></title>
                    					    <author><![CDATA[YuriWhite]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:10 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Использование календаря для выбора даты</h1>
													</header>
													<div id="sol_opis">Этот календарь можно использовать для выбора и вставки даты в поля форм или просто выбора и использования где-то еще.</div>
<div id="sol_body">
<p align="center"><b>Использование календаря для выбора    даты</b></p>
<p align="left">Этот календарь можно использовать для выбора и вставки даты в    поля форм или просто выбора и использования где-то еще. </p>
<p align="left">Как пользоваться ... Сперва скачайте      класс Календаря. В этом архиве лежат четыре файла: calendar.vcx,calendar.vct,getdatecalendar.scx,getdatecalendar.sct.      Пользоваться мы будем в основном формами (getdatecalendar.scx/sct). </p>
<p align="left">Создайте форму или prg-файл. Для использование календаря нужно      обязательно поставить SET DATE GERMAN. Теперь запускаем форму: do form getdatecalendar      to sel_date. В переменную sel_date попадает выбранная дата. И теперь вы можете      ее поместить в поле (replace),форму или использовать как-либо еще.</p>
<p align="left">Пример вызова календаря:</p>
<p align="left">*** sel_date.prg<br />     set date german<br />     do form getdatecalendar to sel_date<br />     ? sel_date</p>
</p></div>
<div id="sol_avtor">Автор: YuriWhite</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4699">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4699">YuriWhite</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="YuriWhite" href="https://foxclub.ru/account/?user=4699">
				<img alt='' src='https://secure.gravatar.com/avatar/c494223377c4770632b0bdcbcb26dd5e?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c494223377c4770632b0bdcbcb26dd5e?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ispolzovanie-kalendarya-dlya-vybora-daty/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/sistemnye-utility/</link>
					<title><![CDATA[Системные утилиты]]></title>
                    					    <author><![CDATA[YuriWhite]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:13 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Системные утилиты</h1>
													</header>
													<div id="sol_opis">Библиотека функций оформленная в виде DLL, Описание в SystemUtils.H</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: YuriWhite</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4699">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4699">YuriWhite</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="YuriWhite" href="https://foxclub.ru/account/?user=4699">
				<img alt='' src='https://secure.gravatar.com/avatar/c494223377c4770632b0bdcbcb26dd5e?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/c494223377c4770632b0bdcbcb26dd5e?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 3<i class="rcli fa-calendar-check-o"></i>Регистрация: 02-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/sistemnye-utility/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ustanovka-866-kodovoj-straniczy-na-otkrytyh-tabliczah/</link>
					<title><![CDATA[Установка 866 кодовой страницы на открытых таблицах]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:13 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Установка 866 кодовой страницы на открытых таблицах</h1>
													</header>
													<div id="sol_opis">Устанавливает 866ую кодовую страницу на открытых таблицах. Очень помогает при работе VFP с данными клипперовских программ</div>
<div id="sol_body">
<h3>Установка 866 кодовой страницы на открытых таблицах</h3>
<p> * Подключаем функцию <br /> declare INTEGER SetCP866 in codecpTOOLS.DLL STRING FileName </p>
<p> * Устанавливаем 866-ую кодовую страницу, на таблице кот. уже открыта другим приложением <br /> SetCP866(&quot;C:aaaprimer.dbf&quot;) </p>
<p> * Далее открываем таблицу как вы привыкли.<br /><a href='cpTools.zip'>Скачать cpTools.zip</a></div>
<div id="sol_avtor">Автор: Прислал Евгений Ермак</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ustanovka-866-kodovoj-straniczy-na-otkrytyh-tabliczah/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/grid-vydelenie-aktivnoj-stroki/</link>
					<title><![CDATA[GRID. Выделение активной строки]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:13 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>GRID. Выделение активной строки</h1>
													</header>
													<div id="sol_opis">Выделение любым цветом активной строки в Grid</div>
<div id="sol_body">
<h3>GRID. Выделение активной строки</h3>
<p> * В Grid вставляется в событие INIT <br /> SELECT xxxxxxxxxx <br /> THISFORM.nRecno = 1 <br /> IF RECNO()#0 <br /> THIS.SetAll(&quot;dynamicbackcolor&quot;, &quot;IIF(RECNO() = THISFORM.nRecno, RGB(255,255,0), RGB(255,255,255))&quot;, &quot;COLUMN&quot;) <br /> ENDIF <br /> * В событие AfterRowColChange </p>
<p> THISFORM.nRecno = RECNO() <br /> THIS.Refresh </p>
<p> * В форму добавить новое Property nRecno и сделать его численным =1 </p>
<p> A.Пинигин, СБОРНИК прибамбасов для VFP по материалам конференций, литературы и собственных разработок. HELP &quot;PRIBAMBASI  for VFP on materials of conferences, literature and own development</p></div>
<div id="sol_avtor">Автор: A.Пинигин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/grid-vydelenie-aktivnoj-stroki/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/cheredovanie-polos-v-grid/</link>
					<title><![CDATA[Чередование полос в Grid]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:13 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Чередование полос в Grid</h1>
													</header>
													<div id="sol_opis">В Гриде первая строка рисуется одним цветом, вторая другим и т.д.</div>
<div id="sol_body">
<h3>Чередование полос в Grid</h3>
<p> * В Grid вставляется в событие INIT </p>
<p> THISFORM.grid1.SETALL(&quot;dynamicBackColor&quot;, &quot;IIF(MOD(RECNO( ), 2)=0, RGB(255,255,255), RGB(234,234,234))&quot;, &quot;Column&quot;) <br /> THISFORM.grid1.SETALL(&quot;dynamicForeColor&quot;, &quot;IIF(MOD(RECNO( ), 2)=0, RGB(0,0,0), RGB(255,0,0))&quot;, &quot;Column&quot;) </p>
<p> A.Пинигин, СБОРНИК прибамбасов для VFP по материалам конференций, литературы и собственных разработок. HELP &quot;PRIBAMBASI  for VFP on materials of conferences, literature and own development</p></div>
<div id="sol_avtor">Автор: A.Пинигин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/cheredovanie-polos-v-grid/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/vydelenie-v-gride-strok-v-zavisimosti-ot-uslovij-samoj-stroki/</link>
					<title><![CDATA[Выделение в GRIDе строк в зависимости от условий самой строки.]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:13 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Выделение в GRIDе строк в зависимости от условий самой строки.</h1>
													</header>
													<div id="sol_opis">Выделение в GRIDе строк в зависимости от условий самой строки (полей таблицы).</div>
<div id="sol_body">
<h3>Выделение в GRIDе строк в зависимости от условий самой строки.</h3>
<p> Структура кодировки поля  “CODE” таблицы “NOMENKL”  C(8) </p>
<p> Кодировка трехуровневая  <br /> 1. Два разряда   01000000 - Фрукты, овощи           	Группа товара <br /> 2. Три разряда   01010000 - Тропические плоды   	Подгруппа товара <br /> 3. Три разряда	 01010001 -  Бананы 			Конкретный товар </p>
<p> * В Grid вставляется в событие INIT </p>
<p> ogrd = THISFORM.grid1 </p>
<p> * установка цвета фона <br /> ogrd.SETALL(&quot;dynamicbackcolor&quot;, &quot;&quot;, &quot;Column&quot;) <br /> ogrd.SETALL(&quot;dynamicforecolor&quot;, &quot;&quot;, &quot;Column&quot;) </p>
<p> * установка жирного шрифта для подгруппы товара </p>
<p> ogrd.SETALL(&quot;dynamicFontBold&quot;,  &quot;iif(substr(nomenkl.code,3,6)='000000', .t., .f.)&quot;, &quot;Column&quot;) </p>
<p> * установка красного цвета для символов для группы товара, и подгруппы товара <br /> ogrd.SETALL(&quot;dynamicforecolor&quot;,   &quot;iif(substr(nomenkl.code,6,3)='000', rgb(255,0,0), rgb(0,0,0))&quot;, &quot;Column&quot;) </p>
<p> THISFORM.grid1.REFRESH() <br /> ogrd.REFRESH </p>
<p> Аналогично можно сделать STORNO в финансовых программах  <br /> Аналогично можно выделить втроки по какому-то условию </p>
<p> THIS.SETALL(&quot;dynamicBackColor&quot;, &quot;IIF(sl_cust.sv_k=0, RGB(255,255,255), RGB(234,234,234))&quot;, &quot;Column&quot;) </p>
<p> THIS.SETALL(&quot;dynamicForeColor&quot;, &quot;IIF(RECNO() = THISFORM.nRecno, ; <br /> RGB(255,0,0),RGB(0,0,0))&quot;, &quot;Column&quot;) </p>
<p> LPARAMETERS nColIndex <br /> THISFORM.nRecno = RECNO() <br /> THIS.Refresh </p>
<p> A.Пинигин, СБОРНИК прибамбасов для VFP по материалам конференций, литературы и собственных разработок. HELP &quot;PRIBAMBASI  for VFP on materials of conferences, literature and own development</p></div>
<div id="sol_avtor">Автор: A.Пинигин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/vydelenie-v-gride-strok-v-zavisimosti-ot-uslovij-samoj-stroki/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/calendar/</link>
					<title><![CDATA[Calendar]]></title>
                    					    <author><![CDATA[SpyFox]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:13 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Calendar</h1>
													</header>
													<div id="sol_opis">Те из Вас, кто читал мою предыдущую статью о CheckListBox, наверное помнят, что я не очень-то люблю использовать ActiveX. Поэтому когда меня "приспичило" применить объект для работы с датами,  ActiveX - DataTimerPicker я сразу отбросил ...</div>
<div id="sol_body">
<h3>Calendar</h3>
<p> Те из Вас, кто читал мою предыдущую статью о CheckListBox, наверное помнят, <br /> что я не очень-то люблю использовать ActiveX. Поэтому когда меня &quot;приспичило&quot; <br /> применить объект для работы с датами,  ActiveX - DataTimerPicker я сразу отбросил,  <br /> хотя он действительно прост и красив. Я решил создать свой календарь(смотри cal.vcx). <br /> Что из этого получилось можно посмотреть на форме SAMPLE. Опишу лишь некоторые моменты. <br /> Объект имеет добавленые свойства  ControlSource и Value они аналогичны стандартным,  <br /> т.е. в ControlSource указывается имя переменной или поле таблицы, Value содержит значение. <br /> Стоит заметить, что эти свойства можно найти на вкладке OTHER, а не на вкладке DATA, т.к. <br /> эти свойства добавленные. <br /> Также добавлены два метода OnActivate и OnDeactivate, которые происходят соответственно  <br /> при активизации календаря и его удалении.   </p>
<p><a href='Calendar.zip'>Скачать Calendar.zip</a></div>
<div id="sol_avtor">Автор: SpyFox</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3809">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3809">SpyFox</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="SpyFox" href="https://foxclub.ru/account/?user=3809">
				<img alt='' src='https://secure.gravatar.com/avatar/e99c4060fb1147c90118fdf1d1f04e7d?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e99c4060fb1147c90118fdf1d1f04e7d?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 07-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/calendar/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/zapusk-win32-prilozhenij-bez-run/</link>
					<title><![CDATA[Запуск win32-приложений без RUN]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:10 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Запуск win32-приложений без RUN</h1>
													</header>
													<div id="sol_opis">Иногда бывает нужно запустить какой-нибудь там блокнот (notepad) из Foxpro. Но делая это командой RUN вы непременно будете несколько секунд смотреть на никому-ненужное DOS-окно</div>
<div id="sol_body">
<p align="center"><b>Запуск win32-приложений без RUN</b></p>
<p align="left">Иногда бывает нужно запустить какой-нибудь там блокнот (notepad)      из Foxpro. Но делая это командой RUN вы непременно будете несколько секунд      смотреть на никому-ненужное DOS-окно. Оно конечно исчезнет вскоре, но все-равно      неприятно ... Используя небольшой класс SHELLEXECUTE можно запускать приложения      цивилизованно. Пример: </p>
<p align="left"><i>set classlib to sh_execute <br />     oex=create('sh_execute')<br />     oex.shellexecute('notepad.exe',,,'c:autoexec.bat')</i></p>
<p align="left">Скачать класс можно <a href="shellexec.zip">здесь.      Скачать ...</a></p>
</div>
<div id="sol_avtor">Автор: Неизвестно</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/zapusk-win32-prilozhenij-bez-run/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/bbreindexer/</link>
					<title><![CDATA[BBreindexer]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:13 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>BBreindexer</h1>
													</header>
													<div id="sol_opis">Модификация нескольких аналогичных индексов в разных таблицах одной командой.</div>
<div id="sol_body">
<h3>BBreindexer</h3>
<p> Модификация нескольких аналогичных индексов в разных таблицах одной командой. Работа со всеми параметрами индексов. Использует прилагаемый ActiveX, регистрируемый автоиатически при первом запуске. </p>
<p> Представлен в виде .app для VFP6, исходники прилагаются.<br /><a href='bbreindexer.zip'>Скачать bbreindexer.zip</a></div>
<div id="sol_avtor">Автор: Bela Bodecs</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/bbreindexer/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ls-rasshirenie-komandy-list-structure/</link>
					<title><![CDATA[LS &#8211; расширение команды List Structure]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:13 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>LS &#8211; расширение команды List Structure</h1>
													</header>
													<div id="sol_opis">Вывод на экран или на печать нормально отформатированной структуры таблицы, в отличие от непонятно какого форматирования команды List stru</div>
<div id="sol_body">
<h3>LS - расширение команды List Structure</h3>
<p> Вывод на экран или на печать нормально отформатированной структуры таблицы, в отличие от непонятно какого форматирования команды List stru </p>
<p> Как использовать: <br /> скопируйте ls.app в директорию вашего проекта </p>
<p> =ls(.t.) - вывод структуры на принтер <br /> =ls(.f.) - вывод структуры на экран </p>
<p> Исходные коды прилагаеются ...<br /><a href='ls.zip'>Скачать ls.zip</a></div>
<div id="sol_avtor">Автор: John Koziol</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ls-rasshirenie-komandy-list-structure/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/valyuty-mira/</link>
					<title><![CDATA[Валюты мира]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:13 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Валюты мира</h1>
													</header>
													<div id="sol_opis">DBF с большинстов валют мира: краткое обозначение, название валюты и государства</div>
<div id="sol_body">
<h3>Валюты мира</h3>
<p> DBF с большинстов валют мира: краткое обозначение, название валюты и государства       </div>
<div id="sol_avtor">Автор: John Koziol</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/valyuty-mira/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/mdb2dbc/</link>
					<title><![CDATA[MDB2DBC]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:13 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>MDB2DBC</h1>
													</header>
													<div id="sol_opis">Конвертор БД Access->VFP</div>
<div id="sol_body">
<h3>MDB2DBC</h3>
<p> Конвертор баз данных из Access (.mdb) в VFP (.dbc). Не работает с полями General. Требует VFP6 и Access 2000. </p>
<p> Представлен в виде .app       </div>
<div id="sol_avtor">Автор: John Koziol</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/mdb2dbc/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/dbutils/</link>
					<title><![CDATA[DBUtils]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Sat, 05 Sep 2020 21:39:20 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>DBUtils</h1>
													</header>
													<div id="sol_opis">Утилита для работы с базами данных (.dbc): сравнение, синхронизация и т.д.</div>
<div id="sol_body">
<h3>DBUtils</h3>
<p>Утилита для работы с базами данных (.dbc): <br />
1. Сравнение двух баз данных и вывод отчета о структурных различиях <br />
2. Печать структуры по полям/таблицам: <br />
- по полям: печатает список всех полей встречаемых в БД и соответсвующих им таблиц <br />
- по таблицам: печатает список всех таблиц и полей в каждой таблице. <br />
3. Синхронизация двух БД <br />
4. Сравнение индексов двух БД </p>
<p>Утилита используется для сохранения одинаковой структуры данных в копии разработчика и копиях клиентов. Или для документирования структуры БД. </p>
<p>Программа представлена в виде скомпилированного exe. Исходный код прилагается.</p>
</div>
<div id="sol_avtor">Автор: Chad Lemmer</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/dbutils/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/dbc2mdb-vfp-access-v-1-0/</link>
					<title><![CDATA[DBC2MDB (VFP-&gt;Access) v 1.0]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:13 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>DBC2MDB (VFP-&gt;Access) v 1.0</h1>
													</header>
													<div id="sol_opis">Конвертор файлов баз данных VFP (.dbc) в MS Access (.mdb)</div>
<div id="sol_body">
<h3>DBC2MDB (VFP-&gt;Access) v 1.0</h3>
<p> Конвертор файлов баз данных VFP (.dbc) в MS Access (.mdb). DBC2MDB работает точно так же, как и визарды в VFP: запускаете и выбираете по шагам файлы VFP и Access. Представлен в виде .app. Требует VFP6 и Access 2000. НЕ КОНВЕРТИРУЕТ поля General и Currency.       </div>
<div id="sol_avtor">Автор: John Koziol</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/dbc2mdb-vfp-access-v-1-0/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/serijnyj-nomer-hdd/</link>
					<title><![CDATA[Серийный номер HDD]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:13 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Серийный номер HDD</h1>
													</header>
													<div id="sol_opis">Функция возвращает серийный номер HDD</div>
<div id="sol_body">
<h3>Серийный номер HDD</h3>
<p> Функция возвращает серийный номер HDD, который присваивается жесткому диску при форматировании. Может служить простейшим элементом защиты программ.       </div>
<div id="sol_avtor">Автор: Benn Kjaer</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/serijnyj-nomer-hdd/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/pereklyuchenie-raskladki-klaviatury/</link>
					<title><![CDATA[Переключение раскладки клавиатуры]]></title>
                    					    <author><![CDATA[fade___]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:13 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Переключение раскладки клавиатуры</h1>
													</header>
													<div id="sol_opis">Пример работы с раскладкой клавиатуры (определение текущей, изменение)</div>
<div id="sol_body">
<h1>Переключение раскладки клавиатуры</h1>
<p> Привет! </p>
<p> Посмотрите на индикатор-преключатель раскладки клавиатуры. <br /> Три файла: проект, экран-пример и класс с объектом <br /> Для использования достаточно просто бросить объект на форму. </p>
<p> Идея индикатора:  <br /> каждые 100 мс (свойство объекта таймера) опрашивается состояние <br /> клавиатуры. Виндёвый индикатор использует перехват (HOOK) <br /> процедуры переключения раскладки, подставляя свой код.  <br /> Средствами Фокса такие фокусы осуществить непросто. </p>
<p> Переключение раскладки производится и клавиатурой, и мышью,  <br /> и из программы. <br /> Отлично работает. Торможения прог не наблюдалось. </p>
<p> Жду вопросов и предложений на fade___@imail.ru <br /> До встреч в киберпространстве. 😉 </p>
<p> 						Fade...       </div>
<div id="sol_avtor">Автор: Fade</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="24">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=24">fade___</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="fade___" href="https://foxclub.ru/account/?user=24">
				<img alt='' src='https://secure.gravatar.com/avatar/5cea3d0ed1a6553946946dadcf486f69?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/5cea3d0ed1a6553946946dadcf486f69?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/pereklyuchenie-raskladki-klaviatury/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/poisk-v-grid/</link>
					<title><![CDATA[Поиск в Grid]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:13 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Поиск в Grid</h1>
													</header>
													<div id="sol_opis">В новостях от 15.09.2000 прочитал о возможностях поиска в Grid и решил поэкспериментировать. Класс работает великолепно, но вот ищет только с начала строки. Да и выводить искомое значение в Header наверное не всегда удобно. На основании своих прежних наработок, данных почерпнутых из статей журнала FoxTalk (русское издание)  и используя, информацию, полученную при анализе работы класса Ingrid, я подготовил класс, который возможно кому-то облегчит жизнь.</div>
<div id="sol_body">
<h3>Поиск в Grid</h3>
<p> В новостях от 15.09.2000 прочитал о возможностях поиска в Grid и решил поэкспериментировать. Класс работает великолепно, но вот ищет только с начала строки. Да и выводить искомое значение в Header наверное не всегда удобно. На основании своих прежних наработок, данных почерпнутых из статей журнала FoxTalk (русское издание)  и используя, информацию, полученную при анализе работы класса Ingrid, я подготовил класс, который возможно кому-то облегчит жизнь. <br /> Описание класса: <br /> 	Класс содержит два объекта:  текстовый:  “Intext” и контейнер “Ins” и создан средствами  VFP 5.0. Назначение производить поиск “Locate”в полях имеющих  типы “Numeric”, “Character” и “Date” c возможностью уточнения и продолжения. <br />  Для нормальной работы класса необходимо выполнить следующие действия. <br /> 1. На форме создайте Property  ”St”. <br /> 2. Поместите контейнер “Ins” на форму имеющую объект “Grid”.(В случае, если “Grid” расположен на закладке “Page Frame”, поместите контейнер “Ins” на туже страницу, что и “Grid”). Высоту контейнера необходимо установить в ручную, ширину класс установит равной ширине колонки в “Grid”. <br /> 3. Удалите из колонок объекты “Text1” <br /> 4. Добавьте объект “Intext” в колонки “Grid”. <br /> В случае, если Вы используете методы удаляемых текстовых объектов, скопируйте эти методы в методы объекта “Intext”. <br /> При попытке ввода символов в активной ячейке “Grid”, класс форматирует контейнер “Ins” под активную колонку, делает его видимым и начинает поиск.Поиск по первому символу не производится. По нажатию комбинации “Ctrl+Enter”, класс выполняет “CONTINUE” на последнее введенное значение поиска. Работа класса была проверена на Pentium100/32mb справочник, скопированный в курсор, содержал 5500 записей. Нареканий у пользователей не было. <br /> С уважением Vadim Hairetdinov. </p>
<p><a href='search.zip'>Скачать search.zip</a></div>
<div id="sol_avtor">Автор: Vadim Hairetdinov</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/poisk-v-grid/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/chastota-proczessora/</link>
					<title><![CDATA[Частота процессора]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:13 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Частота процессора</h1>
													</header>
													<div id="sol_opis">Определение частоты процессора (Mhz)</div>
<div id="sol_body">
<h3>Частота процессора</h3>
<p> CPUSPEED.DLL </p>
<p> Определение частоты процессора (Mhz) <br /> Visual C++ исходный код прилагается </p>
<p> Тестировано на: <br />   Intel Pentiun II, Pentium Celeron <br />   AMD K6 <br />   (WinNT Wks, WinNT Server, Win98) </p>
<p> Пример использования: <br />   Declare Integer GetCPUSpeed in cpuspeed <br />   nspeed = GetCPUSpeed() <br />   MessageBox('CPU Speed: '+str(nspeed)) </p>
<p> Код для свободного распространения </p>
<p> Ramon F. Jaquez <br /> d.jaquez@codetel.net.do </p>
<p><a href='cpuspeed.zip'>Скачать cpuspeed.zip</a></div>
<div id="sol_avtor">Автор: Ramon F. Jaquez</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/chastota-proczessora/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/dbf2html/</link>
					<title><![CDATA[DBF2HTML]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:13 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>DBF2HTML</h1>
													</header>
													<div id="sol_opis">Вывод DBF в виде HTML-файла.</div>
<div id="sol_body">
<h3>DBF2HTML</h3>
<p> Создает HTML-файл с заголовком (имя таблицы), и столбцами, соответсвующими столбцам таблицы. Запускать из области с открытой таблицей: <br /> do dbftohtml with 'filename.htm' </p></div>
<div id="sol_avtor">Автор: Andrus Moor</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/dbf2html/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/programma-dlya-dokumentaczii-tablicz-v-katalogebd-dirdbc/</link>
					<title><![CDATA[Программа для документации таблиц в каталоге(БД)-DIRDBC]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:13 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Программа для документации таблиц в каталоге(БД)-DIRDBC</h1>
													</header>
													<div id="sol_opis">Программа,направляющая в HTML-файл структуру всех таблиц в каталоге или в базе данных VFP (также структура VIEW) c выражениями для индексов, значений полей по умолчанию и т.п.    Требуется библиотека поддержки VFP6.</div>
<div id="sol_body">
<h1>Программа для документации таблиц в каталоге(БД)-DIRDBC</h1>
<p> Программа,направляющая в HTML-файл структуру всех таблиц в каталоге или в базе данных VFP (также структура VIEW) c выражениями для индексов, значений полей по умолчанию и т.п.    Требуется библиотека поддержки VFP6.      <br />                                     С уважением.Алексей. </p>
<p><a href='dirdbc.zip'>Скачать dirdbc</a></div>
<div id="sol_avtor">Автор: Алексей</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/programma-dlya-dokumentaczii-tablicz-v-katalogebd-dirdbc/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Распространение программ]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/tochka-razdelitel-desyatyh-dolej-v-textbox-ah/</link>
					<title><![CDATA[Точка-разделитель десятых долей в textbox-ах]]></title>
                    					    <author><![CDATA[Pyresev]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:13 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Точка-разделитель десятых долей в textbox-ах</h1>
													</header>
													<div id="sol_opis">В текстовых полях на форме, где есть десятые доли не печатается разделяющая запятая с числовой клавиатуры, если активная раскладка русская. Как бороться ...</div>
<div id="sol_body">
<h1>Точка-разделитель десятых в textboxах</h1>
<p> В текстовых полях на форме, где есть десятые доли не печатается разделяющая запятая с числовой клавиатуры, если активная раскладка русская. Если же текущая раскладка английская, то такой проблемы не возникает. В бухгалтерских программам (да и во всех других русскоязычных), где в большинстве своем используется русский язык, постоянно переключаться на английский язык неудобно. Есть несколько решений этой проблемы ... </p>
<p> 1) самая простая ... точка есть рядом с правым шифтом, вполне работоспособная ... но ни один бухгалтер на такое не купится 😉 <br /> 1.1) на WinNT4 такой проблемы нет в принципе, по крайней мере на Server </p>
<p> 2) посложнее 😉 ... в сетах ставим set point to ',', теперь на русском языке разделитель печатается, но на английском не печатается ... если нет нужды переключаться с русского на английский, то вполне рабочий метод. Но иногда винды сами крутят активную раскладку как хотят, и этот метод не подходит ... </p>
<p> 3) можно сделать новый класс на основе textbox, в котором в методе keypress заменять запятую на точку: <br /> if nkeycode=44 <br /> keyb'.' <br /> endif </p>
<p> метод годится, если вы только начали делать программу ... </p>
<p> 4) если у вас уже есть готовая программа с сотнями текстбоксов и второй способ не подходит, то можно ПОСТОЯННО сделать активной РУССКУЮ раскладку и написать тот же set point to ','. Постоянно сделать активной раскладкой русскую можно с помощью winAPI ... на каждую форму ставим таймер, интервал по выбору, но что-то около .1 сек. в событий timer пишем: <br /> DECLARE INTEGER LoadKeyboardLayout IN win32api STRING, INTEGER  <br /> =LOADKEYBOARDLAYOUT("00000419",1) && Ru  </p>
<p> 5) можно поменять файл kbdru.dll в виндах, но счас версий виндов раных как китайцев, поэтому что стоит у заказчика неизвестно. Да и корежить винды - нехорошо 🙂 и так сами чуть не падают ... </p>
<p> Ну вроде и все, что вспомнил и увидел 🙂 Если кто-нибудь знает как еще, пишите iron@serov.ru</p></div>
<div id="sol_avtor">Автор: Sergey</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4174">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 25 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4174">Pyresev</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Pyresev" href="https://foxclub.ru/account/?user=4174">
				<img alt='' src='https://secure.gravatar.com/avatar/fc1acc95c144b518ae7751bfacb7bd6f?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/fc1acc95c144b518ae7751bfacb7bd6f?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 1<i class="rcli fa-calendar-check-o"></i>Регистрация: 27-05-2001        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/tochka-razdelitel-desyatyh-dolej-v-textbox-ah/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/rabota-s-serverami-pop3smtpimap/</link>
					<title><![CDATA[Работа с серверами POP3,SMTP,IMAP]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:13 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Работа с серверами POP3,SMTP,IMAP</h1>
													</header>
													<div id="sol_opis">ActiveX для работы с серверами POP3,SMTP,IMAP. Полное управление почтой: прием, посылка, удаление, печать ... Представлен в виде набора DLL-файлов.</div>
<div id="sol_body">
<h1>Работа с серверами POP3,SMTP,IMAP</h1>
<p> ActiveX для работы с серверами POP3,SMTP,IMAP. Полное управление почтой: прием, посылка, удаление, печать ... Представлен в виде набора DLL-файлов.  </p>
<p> Ниже показан пример, взятый из помощи к компоненту. Все достаточно просто и стабильно работает в VFP. </p>
<p> Файл справки прилагается к архиву компонента, можете разобраться во всем сами. Но позже, я планирую написать несколько примеров работы с компонентом для тех, кому лень разбираться 😉 </p>
<p> Скачать сам компонент можно тут - <a href=http://www.quiksoft.com/dldirect/emsetup.exe>Easymail Objects</a> <br /> Скачивайте, запускайте и у вас появится несколько новых .dll в системе. </p>
<p> Теперь о лицензии ... компонент поставляется как shareware и стоит 399$. Но для русских программистов 😉 есть LicenseKey ...  <br /> в нижеприведенном коде строка POP3.DemoMode=1 заменяется на: <br /> POP3.DemoMode = 0 <br /> POP3.LicenseKey='iron/S18I500R1AX40C0Rb100' <br /> ... и все работает ... лишь бы совесть не грызла 🙂 </p>
<p> ------- <br /> Procedure DisplayMail(strServer, strAccount, strPassword) </p>
<p>   Private x, POP3 </p>
<p>   POP3 = CreateObject("EasyMail.POP3.5") <br />   POP3.Account = strAccount <br />   POP3.Password = strPassword <br />   POP3.MailServer = strServer <br />   POP3.DemoMode = 1 </p>
<p> &&  POP3.DemoMode = 0 <br /> &&  POP3.LicenseKey='iron/S18I500R1AX40C0Rb100' </p>
<p>   x = POP3.Connect() <br />   If x  0 Then <br />      return <br />   EndIf <br />   x = POP3.DownloadMessages(0) </p>
<p>   POP3.Disconnect <br />   If x  0 Then <br />      return <br />   EndIf </p>
<p>   For Each Message In POP3.Messages <br />      MessageBox("SUBJECT: " + Message.Subject, 0, "Message Found") <br />   Next Message </p>
<p>   Release POP3 </p>
<p> EndProc </p>
<p> И запуск функции деается так:<br /> Do DisplayMail With "mail.yourdomain.com", "jdoe", "secret" </p>
</div>
<div id="sol_avtor">Автор: Quiksoft Corp.</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/rabota-s-serverami-pop3smtpimap/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/report-to-docrtfhtml-v1-36/</link>
					<title><![CDATA[Report to DOC,RTF,HTML v1.36]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:10 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Report to DOC,RTF,HTML v1.36</h1>
													</header>
													<div id="sol_opis">Чаще всего на вопрос "Как я могу экспортировать отчет в формат DOC" отвечали "никак". Visual Foxpro мог только печатать отчеты, выводить их на предпросмотр,выводить в текстовый файл</div>
<div id="sol_body">
<p align="center"><b>Report to DOC,RTF,HTML</b></p>
<p align="left">Это краткое переведенное описание по использованию класса. Полное      описание в архиве вместе с самим классом. <a href="frx2doc.zip">Скачать      его можно здесь ...</a></p>
<p align="center">Введение</p>
<p align="left">Чаще всего на вопрос &quot;Как я могу экспортировать отчет в      формат DOC&quot; отвечали &quot;никак&quot;. Visual Foxpro мог только печатать      отчеты, выводить их на предпросмотр,выводить в текстовый файл. Но сегодня      очень важно переносить документы в офисные приложения и Интернет. FRX2WORD      позволяет разработчикам экспортировать существующие отчеты в Microsoft Office      97/2000 или HTML. </p>
<p align="center">Требования</p>
<p align="left">- Visual Foxpro 6.0 Service Pack 3 <br />     - Microsoft Word 2000 (или Word 97, но не полная функциональность)<br />     - 64Mb RAM (32Mb минимум)</p>
<p align="center">Использование</p>
<p align="left">Для использования класса нужно класс msoexp.vcx добавить в ваш      проект. И он может быть вызван, как любой другой класс:</p>
<p>     <i> oF2W=NEWOBJECT(“frx2word”,”msoexp”) <br />     oF2W.SaveFolder=CURDIR() <br />     oF2W.DOC_FileName=”Wordout.doc”<br />     nSuccess=oF2W.ReportForm(“MyReport”) </i></p>
</div>
<div id="sol_avtor">Автор: John Koziol</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/report-to-docrtfhtml-v1-36/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/pdm-dokumentirovanie-proekta-vfp/</link>
					<title><![CDATA[PDM &#8211; документирование проекта VFP]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:12 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>PDM &#8211; документирование проекта VFP</h1>
													</header>
													<div id="sol_opis">Создает полную HTML документацию вашего VFP проекта (.pjx)</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Martin Haluza, Karel Kubicek</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/pdm-dokumentirovanie-proekta-vfp/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/multi-pix-format/</link>
					<title><![CDATA[Multi Pix Format]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:12 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Multi Pix Format</h1>
													</header>
													<div id="sol_opis">Данный OCX поможет пользователям VFP 3(5) размещать на формах рисунки различных форматов.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Неизвестно</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/multi-pix-format/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/postroitel-grid/</link>
					<title><![CDATA[Построитель Grid]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:12 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Построитель Grid</h1>
													</header>
													<div id="sol_opis">Используется в паре со стандартным построителем. Возможности: изменение цвета, фонта, заголовков столбцов и т.д.<br /> Как работает:<br /> На форме выделяете Grid, переходите в Command Windows и запускаете форму (do form grdbuila)</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Gorald Santerre</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/postroitel-grid/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/run-and-wait/</link>
					<title><![CDATA[Run And Wait]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:12 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Run And Wait</h1>
													</header>
													<div id="sol_opis">tools.dll библиотека WinApi Это еще один вариант запуска приложений из VFP. Для этого вам надо только объявить функцию DECLARE Integer RunAndWait in Tools String, Integer В качестве параметров в функцию передаются строка запускаемого приложения и число- вариант запуска. Подробнее читайте в файле Readme.txt</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Неизвестно</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/run-and-wait/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Система]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/konstanty-ms-office/</link>
					<title><![CDATA[Константы MS Office]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:12 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Константы MS Office</h1>
													</header>
													<div id="sol_opis">Внутри архива находятся файлы заголовков приложений MS Office 97 (MS Word, Excel, Outlook)</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Неизвестно</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/konstanty-ms-office/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/zapushheno-li-prilozhenie/</link>
					<title><![CDATA[Запущено-ли приложение ?]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:12 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Запущено-ли приложение ?</h1>
													</header>
													<div id="sol_opis">Функция is_run32 была написана в свете проблем определения активности приложения. Конечно существует API функция FindWindow, которая как раз для этого и служит, но у нее есть большие недоработки.</div>
<div id="sol_body">
<h1>Запущено-ли приложение ?</h1>
<p> Функция is_run32 была написана в свете проблем определения активности приложения. Конечно существует API функция FindWindow, которая как раз для этого и служит, но у нее есть большие недоработки. </p>
<p> Вообще,FindWind служит для определения активности окна, а не приложения, но это понятия достаточно близкие, поэтому она используется и для определения активности окна, и для определения активности приложения. </p>
<p> Но FindWindows требует указания полного заголовка окна или имени класса. А множество приложений имеют динамический заголовок (например отражающий имя открытого файла). И ко всему прочему, эта функция чувствительна к регистру. Имя класса также определеяется нелегко: функция API GetClassName требует указания хэндла (handle) окна, который может меняться. </p>
<p> Is_run32 использует функции API для своей работы. Если приложение запущено, то функция возвращает хэндл окна. Если приложение не запущено, то функция возвращает ноль.  </p>
<p> Как использовать: </p>
<p> Is_run32 работает только с 32-битными приложениями Windows. Для ее использования, просто передайте известную часть заголовка окна в функцию: </p>
<p> handle=Is_run32('word') </p>
<p> **** IS_RUN32.prg </p>
<p> LPARAMETER pctitle <br /> DECLARE INTEGER GetActiveWindow IN Win32API <br /> DECLARE INTEGER GetWindow IN Win32API; <br /> INTEGER hwnd, INTEGER dflag <br /> DECLARE INTEGER GetWindowText IN Win32API ; <br /> INTEGER hwnd, STRING @lptstr, INTEGER cbmax <br /> LOCAL lnhwnd, lnnext, lldone, lctitle_bar, lcsearchfor,; <br /> lntext_len <br /> lcsearchfor = UPPER(ALLTRIM(pctitle)) <br /> lnhwnd = GetActiveWindow() <br /> lnnext = 2 <br /> lldone = .F. <br /> lctitle_bar = "" <br />  DO WHILE NOT lldone <br />   IF NOT EMPTY(lnhwnd) <br />   lctitle_bar = SPACE(200) + CHR(0) <br />   lntext_len = GetWindowText(lnhwnd, @lctitle_bar, 200) <br />   lctitle_bar = UPPER(LEFT(lctitle_bar, lntext_len)) <br />   lldone = (lcsearchfor $ lctitle_bar) <br />    IF NOT lldone <br />    lnhwnd = GetWindow(lnhwnd, lnnext) <br />    ENDIF <br />   ELSE <br />   lldone = .T. <br />   ENDIF <br />  ENDDO <br /> RETURN lnhwnd </p>
</div>
<div id="sol_avtor">Автор: VFC</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/zapushheno-li-prilozhenie/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/runtime-ili-obolochka-foxpro/</link>
					<title><![CDATA[Runtime или оболочка Foxpro ?]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:12 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Runtime или оболочка Foxpro ?</h1>
													</header>
													<div id="sol_opis">Иногда бывает нужным проверить, работает-ли программа под оболочкой Foxpro или под runtime-библиотеками. Чаще всего при использовании read events (при разработке она иногда мешает).</div>
<div id="sol_body">
<h1>Runtime или оболочка Foxpro ? </h1>
<p> Иногда бывает нужным проверить, работает-ли программа под оболочкой Foxpro или под runtime-библиотеками. Чаще всего при использовании read events (при разработке она иногда мешает).  </p>
<p> IF "Support"$VERSION(1)  <br /> read events && работаем в runtime-режиме <br /> ENDIF  </p>
</div>
<div id="sol_avtor">Автор: VFC</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/runtime-ili-obolochka-foxpro/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/poluchenie-po-date-kolichestva-dnej-v-mesyacze-godu-i-pervogo-dnya-nedeli-mesyacza/</link>
					<title><![CDATA[Получение по дате количества дней в месяце, году и первого дня недели месяца]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:12 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Получение по дате количества дней в месяце, году и первого дня недели месяца</h1>
													</header>
													<div id="sol_opis">Функции получения из переменной типа date количества дней в месяце (288-31), году (365,366) и первого дня недели месяца.</div>
<div id="sol_body">
<h1>Получение по дате количества дней в месяце, году и первого дня недели месяца </h1>
<p> Получение первого дня недели месяца: </p>
<p> Используется функция DoW ... <br /> first_day=DoW(PDInputDate + 1 - Day(PDInputDate)) <br /> PDInputDate - передаваемая дата ( например date() или ctod('01.01.2000') ) <br /> Возвращаемое значение first_day может принимать следующие значения: </p>
<p> 1- воскресенье <br /> 2- понедельник <br /> 3-вторник <br /> 4-среда <br /> 5-четверг <br /> 6-пятница <br /> 7-суббота <br /> Такая неделя принята в США и отличается от нашей. </p>
<p> Получение количества дней в месяце: </p>
<p> num_days=Day(GoMonth(PDInput, 1) - Day(GoMonth(PDInput, 1)))  <br /> PDInput - передаваемая дата ( например date() или ctod('01.01.2000') )  <br /> num_days - количество дней в месяце </p>
<p> Получение количества дней в году: </p>
<p> PDInput_tmp = GoMonth(PDInput, 2 - Month(PDInput)) <br /> num_days=337 + Day(GoMonth(PDInput_tmp, 1) - Day(GoMonth(PDInput_tmp, 1)))  <br /> PDInput - передаваемая дата ( например date() или ctod('01.01.2000') )  <br /> num_days - количество дней в месяце  </p>
</div>
<div id="sol_avtor">Автор: VFC</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/poluchenie-po-date-kolichestva-dnej-v-mesyacze-godu-i-pervogo-dnya-nedeli-mesyacza/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/biblioteka-mstbut/</link>
					<title><![CDATA[БИБЛИОТЕКА MSTBUT]]></title>
                    					    <author><![CDATA[SpyFox]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:12 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>БИБЛИОТЕКА MSTBUT</h1>
													</header>
													<div id="sol_opis">Одним из первых желаний при переходе на VFP5 и WINDOWS 95 было создать  опухающие кнопки при наведении на них курсора мыши. На конференциях Было достаточно примеров и подходов, чтобы сравнить и выбрать что-то более или менее подходящее.</div>
<div id="sol_body">
<h1>БИБЛИОТЕКА MSTBUT</h1>
<p> Created by SpyFox </p>
<p> Одним из первых желаний при переходе на VFP5 и WINDOWS 95 было создать  <br /> опухающие кнопки при наведении на них курсора мыши. На конференциях Было <br /> достаточно примеров и подходов, чтобы сравнить и выбрать что-то более или <br /> менее подходящее. Но одной из основных причин, по которым мне не подходили <br /> имеющиеся варианты, это то, что для каждого состояния кнопки было необходимо <br /> создавать картинку. Т.е. для кнопки по умолчанию, активной кнопки и кнопки  <br /> недоступной. Ну рисунок для активной кнопки можно отбросить и обойтись без <br /> неuj, а вот без рисунка для недоступной кнопки никак не получиться нормального <br /> вида программы.  <br /> После долгих поисков я нашел способ обходиться одной картинкой и изюминка моего <br /> подхода вот в чем. <br /> Все мы знаем, что рисунок на стандартном объекте COMMANDBUTTON в зависимости от <br /> значения свойства ENABLED принимает тот или иной вид, т.е показывает доступна  <br /> кнопка или нет. Вот я и решил это использовать.  <br /> Класс COOLBUTTON я создал на основе класса CONTROL, куда и замаскировал объект <br /> COMMANDBUTTON, т.е. использовал этот объект как картинку. Правда при этом пришлось <br /> пожертвовать тем, что нельзя изменять цвет кнопки и вставлять надпись. <br /> После того, как я создал такую кнопку, мне захотелось создать и опухающую кнопку <br /> со списком. <br /> Класс COOLCOMBO я тоже решил создать на основе класса CONTROL, а в нем разместить <br /> две готовые кнопки из класса COOLBUTTON. Правда здесь начались проблемы. Дело в том, <br /> что из методов одной кнопки как бы не существовало другой, вследствии чего мне пришлось <br /> снять с рабочих методов типа HIDEFOCUS, SHOWFOCUS и т.д. атрибут HIDDEN и установить - <br /> PUBLIC.  <br /> Хотя я и оставил возможность устанавливать картинку для активной кнопки, пользоваться  <br /> этой возможнотью или нет - решать вам. <br /> Хотя по-моему получилось достаточно удачно, не обошлось и без проблем. </p>
<p> Проблемы состоят в следующем: <br /> 1. Мне эта проблема до сих пор непонятна, если может кто объяснить, буду очень признателен. <br />    Суть ее вот в чем. Если в форму AS TOP LEVEL встроить TOOLBAR, а на TOOLBAR разместить <br />    кнопку COOLBUTTON и в метод CLICK написать код для завершения работы этой формы, то VFP <br />    "зависает" или невозможно убрать форму с экрана. Поэтому я использую следующий код, <br />    в метод CLICK вписываю KEYBOARD{"ALT+F4"}. При run-time это работает, под оболочкой  <br />    возможно "зависание". <br /> 2. Класс COOLCOMBO нормально будет работать только на TOOLBAR, который встроен в форму  <br />    AS TOP LEVEL. Если его встроить в TOOLBAR на основном окне, то меню будет выводиться  <br />    в активной форме, а не возле кнопки, как это расчитано. (Думаю эта проблема в дальнейшем <br />    разрешиться). <br /> 3. Есть и другие проблемы, но они так сильно не бросаются в глаза и не всегда проявляются.  </p>
<p> Для запуска примера запустите программу MAIN.PRG. <br /> ******************************************************************************************  </p>
<p> Думаю, что вы не сильно будете судить мое творение, так как я не прошу ничего взамен и  <br /> никак не могу вас заставить использовать эти наработки. Может быть кому-то они покажутся <br /> очень даже ничего, а кого-то просто стошнить, так или иначе выставляю это на показ от всей <br /> души и поздравляю с Наступающим Новым Годом Вас и Ваших близких. </p>
<p> 28.12.2000 г. </p>
<p> ******************************************************************************************  </p>
<p> Библиотека MSTBUT.VCX <br /> VFP6+SP3 <br /> ******************************************************************************************  <br /> Основные объекты <br /> ******************************************************************************************  <br /> 1. COOLBUTTON - кнопка <br /> 2. COOLCOMBO  - кнопка с выпадающим меню <br /> 3. COOLSEPARATOR - разделитель между кнопками </p>
<p> ******************************************************************************************  <br /> Вспомогательные объекты <br /> ******************************************************************************************  <br /> 1. BUTTIMER   - таймер, запускающийся при активизации кнопки. <br /> 2. COOLSHAPE  - объект, вставляющийся вместе COOLSEPARATOR </p>
<p> КЛАСС COOLBUTTON <br /> ******************************************************************************************  <br /> У класса COOLBUTTON есть следующие дополнительные свойства. <br /> 1. ACTIVEPICTURE  - содержит имя картинки, которая отображается на кнопке, <br /> 			 при наведении курсора мыши. <br /> 2. DEFAULTPICTURE - содержит имя картинки, которая отображается по умолчанию. <br /> 3. CHECKTYPE	  - при установке этого свойства в .T., кнопка работает как CHECKBOX. <br /> 4. VALUE	  - свойство актуально при значении CHECKTYPE=.T., и определяет  <br />                 	в каком положении находится кнопка (вдавленная или нет). <br /> 5. TOOLTIPTEXT    - содержит текст всплывающей подсказки. <br /> Свойства CMDCAPTION и CMDFONTNAME пока не работают <br /> ******************************************************************************************  <br /> Следует заметить, во внутреннм механизме кнопки задействовоаны следующие методы. <br /> Init, MouseMove, MouseDown, MouseUp, а также другие дополнительные методы. Поэтому <br /> не забывайте при использовании этих методов вставлять строку DODEFAULT(). <br /> ******************************************************************************************* <br /> Обработка ошибок отсутствует. <br /> ******************************************************************************************  </p>
<p> КЛАСС COOLCOMBO <br /> ******************************************************************************************  <br /> У класса COOLCOMBO есть следующие дополнительные свойства. <br /> 1. ACTIVEPICTURE  - содержит имя картинки, которая отображается на кнопке, <br /> 			 при наведении курсора мыши. <br /> 2. DEFAULTPICTURE - содержит имя картинки, которая отображается по умолчанию. <br /> 3. TOOLTIPTEXT    - содержит текст всплывающей подсказки. <br /> Свойства CMDCAPTION пока не работает </p>
<p> Помимо основных методов класса добавлены следующие: <br /> 1. ONCREATEMENU   - вызывается при нажатии на кнопку COMBO, в качестве параметра <br /> 		         передается имя POPUP-меню. В данном методе необходимо  <br /> 			 написать код создания выводимого меню. Для большей ясности <br /> 			 смотрите код примера. <br /> 2. ONSELECTIONMENU- вызывается при выборе пункта меню. В качестве параметра передается <br />     			 номер выбранного пункта меню. <br /> ******************************************************************************************  <br /> Следует заметить, во внутреннм механизме кнопки задействовоаны следующие методы. <br /> Init, MouseMove, MouseDown, MouseUp, а также другие дополнительные методы. Поэтому <br /> не забывайте при использовании этих методов вставлять строку DODEFAULT(). <br /> ******************************************************************************************* <br /> Обработка ошибок отсутствует. <br /> ******************************************************************************************  </p>
<p><a href='MSTBUT.zip'>Скачать дополнителный файл</a></div>
<div id="sol_avtor">Автор: SpyFox</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3809">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3809">SpyFox</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="SpyFox" href="https://foxclub.ru/account/?user=3809">
				<img alt='' src='https://secure.gravatar.com/avatar/e99c4060fb1147c90118fdf1d1f04e7d?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e99c4060fb1147c90118fdf1d1f04e7d?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 07-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/biblioteka-mstbut/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/installyator-gksetup/</link>
					<title><![CDATA[Инсталлятор GkSetup]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:11 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Инсталлятор GkSetup</h1>
													</header>
													<div id="sol_opis">Бесплатный инсталлятор с поддержкой различных языков. Возможности намного превышают "родной" Foxpro инсталлятор. Достаточно сильное сжатие приложения.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Gero Khan</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/installyator-gksetup/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Распространение программ]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/windows-sript-host-reference/</link>
					<title><![CDATA[Windows Sript Host Reference]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:12 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Windows Sript Host Reference</h1>
													</header>
													<div id="sol_opis">Файл справки на ActiveX Wscript. Многие используют Wscript.Shell для запуска приложений. Но возможности Windows Script Shell не ограничены только этим.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: MS</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/windows-sript-host-reference/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/vybor-fajlov/</link>
					<title><![CDATA[Выбор файлов]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:10 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Выбор файлов</h1>
													</header>
													<div id="sol_opis">Немного истории: Почему сделал компонент? Захотелось стартовую форму приложений сделать как при запуске Visual Basic. Стандартный ActiveX - CommonDialog не позволяет иметь окно для выбора файла на многостраничной вкладке, а этого так хочется</div>
<div id="sol_body">
<p align="center"><b>Выбор файлов</b></p>
<p align="left"> Поддержка создания и переименования каталогов. В архиве - класс      и пара примеров. Пользоваться просто. Кидаешь на форму, заполняешь свойство      FilterFile например, Файл BMP (*.bmp),Файл ICO (*.ico) и пользуешься. Версия      для VFP6.0 </p>
<p align="left">В будущем поддержка сети. Сейчас пока определяются подключенные      сетевые диски. Если что не пойдет - жду писем. </p>
<p align="left">Немного истории: Почему сделал компонент? Захотелось стартовую    форму приложений сделать как при запуске Visual Basic. Стандартный ActiveX -    CommonDialog не позволяет иметь окно для выбора файла на многостраничной вкладке,    а этого так хочется :)) Планы: сделать что-то похожее на GETDIR() (зачем? -    см. выше) И все бе привлечения сторонних ActiveX. </p>
<p align="left">
<p align="left">Сергей Титов.</p>
</div>
<div id="sol_avtor">Автор: Сергей Титов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/vybor-fajlov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/avtomaticheskoe-izmenenie-razmerov-obektov-pri-izmenenii-razmerov-formy/</link>
					<title><![CDATA[Автоматическое изменение размеров объектов при изменении размеров формы]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:10 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Автоматическое изменение размеров объектов при изменении размеров формы</h1>
													</header>
													<div id="sol_opis">Используется для автоматического изменения размеров объектов на форме при изменении размеров формы. Вы не должны ничего менять в вашей форме.Только лишь поместите класс на форму, запустите ее,изменяйте размер и увидите, что получится</div>
<div id="sol_body">
<p align="center"><b>Автоматическое изменение размеров    объектов при изменении размеров формы</b></p>
<p align="left">Vresize.vcx содержит только один класс 'vresizer'. Он используется    для автоматического изменения размеров объектов на форме при изменении размеров    формы. Вы не должны ничего менять в вашей форме.Только лишь поместите класс    на форму, запустите ее,изменяйте размер и увидите, что получится. </p>
<p align="left">Известные ограничения: нет поддержки фонтов с дикретными размерами.</p>
<p align="left">Копирайты и гарантии: распространяется as is и без гарантий. </p>
<p align="left">
</div>
<div id="sol_avtor">Автор: Неизвестно</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/avtomaticheskoe-izmenenie-razmerov-obektov-pri-izmenenii-razmerov-formy/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/rasshirennoe-menyu/</link>
					<title><![CDATA[Расширенное меню]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:10 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Расширенное меню</h1>
													</header>
													<div id="sol_opis">В Foxpro всегда не хватало мелких интерфейсных и функциональных возможностей, как например в Delphi. К примеру, нельзя почти никак изменять параметры системного меню, кнопок и других объектов. Но сейчас появился пакет MenuLib для VFP6, с которым добавление всяких приятных мелочей в СИСТЕМНОЕ МЕНЮ становится делом элементарным.</div>
<div id="sol_body">
<p align="center"><b>Расширенное меню</b>    </p>
<p> В Foxpro всегда не хватало мелких интерфейсных и функциональных возможностей,      как например в Delphi. К примеру, нельзя почти никак изменять параметры системного      меню, кнопок и других объектов. Но сейчас появился пакет MenuLib для VFP6,      с которым добавление всяких приятных мелочей в СИСТЕМНОЕ МЕНЮ становится делом      элементарным.    </p>
<p>Пункты меню можно делать как checkbox, невидимыми, менять их порядок и название      и все это можно делать ДИНАМИЧЕСКИ, т.е. в процессе работы программы. Но сперва      можно ознакомиться с демкой.    </p>
<p align="center"><b>Перед тем как все это читать и пробовать, Вам нужно скачать      библиотеки для работы с усовершенствованным меню. (<a href="menulib60.zip">menulib6.zip</a>).      И еще ... здесь краткое, ознакомительное описание библиотеки, а подробное      вы найдете внутри архива, но на английском.</b>    </p>
<p align="center"><b>Запуск демки </b>    </p>
<p>Для запуска демки,    </p>
<p>1) Разархивируйте архив в новую директорию<br />     2) Запустите VFP<br />     3) Перейдите в директорию, которую создали <br />     4) Запустите демку :- DO MENUDEMO <br />     5) FILE -> EXIT    </p>
<p>Ну а теперь, как это делать.    </p>
<p>1. Создаем каркас меню в родном конструкторе меню от VFP. <br />     2. Запускаем bldmenu.prg с указанием созданного меню ( do bldmenu with 'mainmenu')<br />     3. А теперь добавляем новые свойства. И на этом поподробнее.    </p>
<p align="center"><b>Добавление новых свойств в меню.</b>    </p>
<p> VFP у нас вещь объектно-ориентированная и как следствие меню является объектом.      И значит, обращаемся к нему, как к объекту.    </p>
<p><i>Пример:<br />     _screen.menu.file.enabled=.f. <br />     </i><br />     _screen.menu - обращение к меню <br />     file - название пункта меню <br />     enabled - всем известное свойство    </p>
<p> Чтобы обратиться к вертикальному подменю указываем так:    </p>
<p> <i>_screen.menu.file.print.enabled=.f. </i>    </p>
<p>Для добавления в меню новых пунктов используется следующий код: <i>_SCREEN.Menu.AddObject("File","menupad")      && добавления пункта меню File</i>    </p>
<p> По умолчанию, выводимое на экран название (caption) точно такое же, как      и имя пункта меню. Так же при создании, пункт меню получается невидимым. Чтобы      отобразить его используйте код: </p>
<p>     <i>_SCREEN.Menu.File.Visible = .T. </i>    </p>
<p>Для добавления подменю в меню, используйте код: </p>
<p>     <i>_SCREEN.Menu.File.AddObject("Open","menupad")<br />     _SCREEN.Menu.File.AddObject("Close","menupad") _SCREEN.Menu.File.AddObject("Spacer1","menupad")      <br />     _SCREEN.Menu.File.Spacer1.Caption = "-"<br />     _SCREEN.Menu.File.AddObject("Exit","menupad") </i>    </p>
<p>И делаем их видимыми:    </p>
<p> <i>_SCREEN.Menu.File.Open.Visible = .t.<br />     _SCREEN.Menu.File.Close.Visible = .t.<br />     _SCREEN.Menu.File.Spacer1.Visible = .t. <br />     _SCREEN.Menu.File.Exit.Visible = .t. </i>    </p>
<p>Так же можно добавлять подменю в подменю: </p>
<p>     <i>_SCREEN.Menu.File.Open.AddObject("Text","menupad") _SCREEN.Menu.File.Open.AddObject("Picture","menupad")      </i>    </p>
<p align="center"><b>Свойства пунктов меню</b>    </p>
<p> <b>Caption </b><br />     Описание: Используется для показа названия меню (caption) <br />     Тип: Character    </p>
<p> <i>Пример:<br />     _screen.Menu.Edit.Copy.Caption = "Copy" <br />     _screen.Menu.Edit.Sep1.Caption = "-" && разделительная линия </i>    </p>
<p><b>Message<br />     </b> Описание: Используется для вывода сообщения в статусную строку <br />     Тип: Character    </p>
<p> <i>Пример: <br />     _screen.Menu.Edit.Copy.Message = "Used to copy text" </i>    </p>
<p><b>Enabled</b><br />     Описание: Определяет доступен или недоступен пункт меню <br />     Тип: Logical.    </p>
<p><i>Пример:<br />     _SCREEN.Menu.File.Open.Enabled = .f.</i>    </p>
<p> <b>Checked</b><br />     Описание: Определяет выбран-ли пункт меню (check box)<br />     Тип: Logical.    </p>
<p> <i>Пример:<br />     _SCREEN.Menu.File.Changed.Checked = .t.</i>    </p>
<p><b>Command</b><br />     Описание: Определяет команду VFP для выполнения <br />     Тип: Character.    </p>
<p> <i>Пример: <br />     _SCREEN.Menu.File.Exit.Command = "CLEAR EVENTS" <br />     _SCREEN.Menu.Report.Detls.Command = "DO DetRpt WITH THIS" </i>    </p>
<p><b>Position</b><br />     Описание: Порядковый номер в меню<br />     Тип: Numeric    </p>
<p> <i>Пример:<br />     _SCREEN.Menu.File.Exit.Position = _MLAST <br />     _SCREEN.Menu.File.Open.Position = _MFIRST <br />     _SCREEN.Menu.File.Close.Position = 2 </i>    </p>
<p>К этому я бы хотел добавить, что удобнее делать так:    </p>
<p>- создаем обычное VFP-меню<br />     - создаем prg-файл, в котором будут лежать команды усовершенствования меню      (menu.prg)<br />     - и из главной программы можно запускать уже этот файл (do menu.prg)    </p>
<p align="center"><b>Все</b> </div>
<div id="sol_avtor">Автор: Неизвестно</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/rasshirennoe-menyu/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/animirovannaya-ikonka/</link>
					<title><![CDATA[Анимированная иконка]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:10 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Анимированная иконка</h1>
													</header>
													<div id="sol_opis">Анимированная, причем не просто иконка, а та, что в левом верхнем углу формы. Применение этого класса очень удобно, если вы хотите показать, что ваша программа не повисла,а ведет какие-то свои подсчеты и просто не трогает хард - раз иконка анимируется, значит мы еще живы</div>
<div id="sol_body">
<p align="center"><b> Анимированная иконка</b></p>
<p>Анимированная, причем не просто иконка, а та, что в левом верхнем углу формы.    Применение этого класса очень удобно, если вы хотите показать, что ваша программа    не повисла,а ведет какие-то свои подсчеты и просто не трогает хард - раз иконка    анимируется, значит мы еще живы. </p>
<p> <a href="anim.zip">Скачайте класс<b><i> ...</i></b></a> </p>
<p>Теперь выберите место в программе перед каким-нибудь больним вычислением или    поиском и вставьте нижеследующий код ... </p>
<p>&amp;&amp; Классу необходимо передать массив, содержащий названия файлов-иконок: </p>
<p> LOCAL laIconList<br />   DIMENSION laIconList[4]<br />   laIconList[1]="icon01.ico"<br />   laIconList[2]="icon02.ico"<br />   laIconList[3]="icon03.ico"<br />   laIconList[4]="icon04.ico" </p>
<p>&amp;&amp; Теперь нужно программа создать объект таймера: </p>
<p> SET CLASSLIB TO animate<br />   THISFORM.ADDOBJECT("tmrIcon","animicon",@laIconList) </p>
<p>&amp;&amp; И наконец, вам нужно активизировать таймер путем установки интервала: </p>
<p> THISFORM.tmrIcon.Interval=500 && пол-секунды </p>
<p>&amp;&amp; Вот и все 🙂 </p></div>
<div id="sol_avtor">Автор: Неизвестно</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/animirovannaya-ikonka/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/shifrovanie-dannyh/</link>
					<title><![CDATA[Шифрование данных]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:10 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Шифрование данных</h1>
													</header>
													<div id="sol_opis">Классический тип шифрования полей в таблице. Возможность шифровать сразу несколько полей и изменения ключа шифрования.</div>
<div id="sol_body">
<p align="center"><b>Шифрование данных</b> </p>
<p> Еще один класс для шифрования полей таблицы. Его автор - Игорь. Классический    принцип работы, т.е. есть команда шифровки поля и дешифровки. </p>
<p>Как использовать: </p>
<p>Подключаете класс к проекту, ставите экземпляр класса на форму<br />   При открытии таблицы (или при другом событии, как вам будет нужно) вызываете    метод <b>to_tablecode</b> объекта <b>enciphering1</b> с параметрами: алиас таблицы,    поле(или несколько через запятую), признак шифрования (COD,DECOD) </p>
<p>thisform.enciphering1.to_tablecode(&quot;Table1&quot;,&quot;pole1&quot;,&quot;DECOD&quot;)<br />   или<br />   thisform.enciphering1.to_tablecode(&quot;Table1&quot;,&quot;pole1&quot;,&quot;COD&quot;) </p>
<p>Но перед этим вы должны установить в свойство <b>keyword</b> объекта <b>enciphering1    </b>ключ шифра - любую текстовую строку (цифры лучше не использовать) </p>
<p>thisform.enciphering1.keyword=&quot;hfTb&quot; </p>
<p><a href="pass.zip">Скачать класс ...</a></div>
<div id="sol_avtor">Автор: Игорь</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/shifrovanie-dannyh/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/pechat-otchetov/</link>
					<title><![CDATA[Печать отчетов]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:10 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Печать отчетов</h1>
													</header>
													<div id="sol_opis">Русифицированная версия REPORT ... PROMPT. Есть количество копий , предпросмотр , выбор принтера, печать в файл , печать заголовка , выбор страницы или диапазона страниц для печати.</div>
<div id="sol_body">
<p align="center"><b>Печать отчетов</b></p>
<p align="left">Класс Владимира (Torzhok) для печати отчетов. Русифицированная    версия REPORT ... PROMPT. Есть количество копий , предпросмотр , выбор принтера    , печать в файл , печать заголовка , выбор страницы или диапазона страниц для    печати. </p>
<p align="left">В свете проблем работы отчетов с параметром PROMPT его использование    избавляет от многих проблем.</p>
<p align="left">Пример использования:</p>
<p align="left">PRN_REP=NEWOBJECT("setting_print","my_print")<br />   prn_rep.reportname="vedfiz" <br />   Prn_rep.Visible=.T. <br />   Prn_rep.Show</p>
</p>
</div>
<div id="sol_avtor">Автор: Torzhok</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/pechat-otchetov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Отчеты]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/3d-obekty/</link>
					<title><![CDATA[3D-объекты]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:10 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>3D-объекты</h1>
													</header>
													<div id="sol_opis">Класс ww3d используется для создания текстовых полей с тенью, надписей (Label) с тенью, объемных геометрических фигур (Shape) и их же с тенью 🙂</div>
<div id="sol_body">
<p align="center"><b>3D-объекты</b></p>
<p> Класс <b>ww3d</b> используется для создания текстовых полей с тенью, надписей    (Label) с тенью, объемных геометрических фигур (Shape) и их же с тенью 🙂 </p>
<p align="center"><img loading="lazy" decoding="async" src="ww3d.GIF" width="468" height="234"> </p>
<p>   <b>Как работает:</b></p>
<p>Как обычно ;): класс (vcx) подключается в проект и его объекты вставляются    в форму</p>
<p><b>Свойства объектов:</b></p>
<p><b>cshadowcolor</b> - цвет тени, по умолчанию серый (128,128,128). Применим    к объектам Shadowbox, Shadoweditbox, Shadowtextbox, ShadowLabel</p>
<p><b>noffset</b> - размер тени. Применим к объектам Shadowbox, Shadoweditbox,    Shadowtextbox, ShadowLabel</p>
<p><b>lraised</b> - показывает вдавленность (.F.) или выпуклость (.T.) Box3D</p>
<p><a href="ww3d.zip">Скачать класс</a></p>
</div>
<div id="sol_avtor">Автор: UT</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/3d-obekty/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ftp-klient/</link>
					<title><![CDATA[FTP-клиент]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:11 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>FTP-клиент</h1>
													</header>
													<div id="sol_opis">Этот код написан как класс Visual Foxpro. FTP Class предоставляет набор функций, которые позволяют вам работать с FTP-серверами. Для его работы необходима библиотека wininet.dll, которая поставляется с IE 4.0 и выше.</div>
<div id="sol_body">
<p align="center"><b>FTP-клиент</b></p>
<p><b>Обзор</b>  </p>
<p>Этот код написан как класс Visual Foxpro. FTP Class предоставляет набор функций,    которые позволяют вам работать с FTP-серверами. Для его работы необходима библиотека    wininet.dll, которая поставляется с IE 4.0 и выше.  </p>
<p> <b>Как работает</b>  </p>
<p>Для работы с классом вам нужно подключить к вашей программе FTP.PRG:  </p>
<p> <i>Set Procedure To ftp.prg Additive</i>  </p>
<p>Следующая строка создаст экземпляр класса:  </p>
<p> <i>sz_ftp = createobject('ftp_service')</i>  </p>
<p>Теперь использовать класс вы можете через переменную sz_ftp  </p>
<p>Пример открытия соединения с FTP-сервром:  </p>
<p><i>sz_ftp.OpenInternet("user", "password", "ftpaddress", "port") </i>  </p>
<p>Обычно во всех FTP-серверах испольузется порт 21.  </p>
<p><b>Команды для работы</b>  </p>
<p>Здесь приведены лишь основные команды, доступные в этом классе. Хотя скорее    всего этими командами вы и ограничитесь в своей работе. Тем не менее остальные    - приведены в прилагаемом doc-файле в архиве.</p>
<p><b><i>OpenInternet ( </i></b><b><i>Установить    соединение с сервером)</i></b></p>
<p>                            </p>
<p><b>Синтаксис:</b></p>
<p>                                   </p>
<p>OpenInternet (<br />               char UserName, <br />               &#9;char UserPassword, <br />               char FTP Address, <br />               char FTP Port<br />               )</p>
<p>                             </p>
<p><b>Параметры:</b></p>
<p>&#9;UserName &#9;- имя пользователя (ANONYMOUS на общедоступные            сервера) <br />           UserPassword&#9;- пароль<br />           FTP Address &#9;- адрес FTP-сервера<br />           FTP Port&#9;- порт FTP-сервера (обычно 21)</p>
<p><b>Возвращаемое значение:</b></p>
<p>                                   </p>
<p>Возвращаемое значение .T. , если функция успешно                соеденилась с сервером, иначе .F.</p>
<p>                             </p>
<p>&nbsp;</p>
<p>                          </p>
<p><b><i>&#9;CloseInternet (закрыть соединение)</i></b></p>
<p>                            </p>
<p><b>Синтаксис:</b></p>
<p>&#9;CloseInternet ( )</p>
<p><b>Параметры:</b></p>
<p>&#9;None</p>
<p><b>Возвращаемое значение:</b></p>
<p>                                   </p>
<p>Nothing</p>
<p>                             </p>
<p>&nbsp;</p>
<p>                          </p>
<p><b><i>&#9;GetFtpFile (скачать файл)</i></b></p>
<p>                             </p>
<p><b>Синтаксис:</b></p>
<p>                                   </p>
<p>GetFtpFile (<br />               char RemoteFile, <br />               &#9;char LocalFile, <br />               logical FailifExist <br />               )</p>
<p>                             </p>
<p><b>Параметры:</b></p>
<p>&#9;RemoteFile &#9;- имя и путь файла на FTP-сервере            для скачивания с него.</p>
<p>&#9;LocalFile &#9;- имя и путь файла на локальном компьютере</p>
<p>&#9;FailifExist&#9;- .T. прекращения скачивания, если            файл с таким именем уже есть на локальном компьютере, .F. - перезаписать            файл </p>
<p><b>Возвращаемое значение:</b></p>
<p>                                   </p>
<p>Возвращаемое значение .T. если успешно скачано<br />               Возвращаемое значение .F. если ошикбка</p>
<p>                             </p>
<p>&nbsp;</p>
<p>                          </p>
<p><b><i>&#9;PutFtpFile (закачать файл на FTP-сервер)</i></b></p>
<p>                             </p>
<p><b>Синтаксис:</b></p>
<p>                                   </p>
<p>PutFtpFile (<br />               char RemoteFile, <br />               &#9;char LocalFile<br />               )</p>
<p>                             </p>
<p><b>Параметры:</b></p>
<p>&#9;RemoteFile &#9;- путь и имя файла на FTP-сервере</p>
<p>&#9;LocalFile&#9;- локальное имя файла</p>
<p><b>Возвращаемое значение:</b></p>
<p>                                   </p>
<p>Возвращаемое значение .T. если успешно<br />               Возвращаемое значение .F. если неуспешно</p>
<p>                             </p>
<p>&nbsp;</p>
<p>                          </p>
<p><b><i>&#9;DeleteFtpFile (удалить файл)</i></b></p>
<p>                             </p>
<p><b>Синтаксис:</b></p>
<p>                                   </p>
<p>DeleteFtpFile (<br />               Char RemoteFile<br />               )</p>
<p>                             </p>
<p><b>Параметры:</b></p>
<p>&#9;RemoteFile &#9;- имя и путь файла на FTP-сервере</p>
<p><b>Возвращаемое значение:</b></p>
<p>                                   </p>
<p>Возвращаемое значение .T. если файл удален<br />               Возвращаемое значение .F. если не удален</p>
<p>                             </p>
<p>&nbsp;</p>
<p>                          </p>
<p><b><i>&#9;RenameFtpFile (переименовать файл)</i></b></p>
<p>                            </p>
<p><b>Синтаксис:</b></p>
<p>                                   </p>
<p>RenameFtpFile ( <br />               char OldName,<br />               char NewName<br />               )</p>
<p>                             </p>
<p><b>Параметры:</b></p>
<p>&#9;OldName&#9;- текущее имя файла</p>
<p>&#9;NewName&#9;- новое имя файла</p>
<p><b>Возвращаемое значение:</b></p>
<p>                                   </p>
<p>Возвращаемое значение .T. если успешно<br />               Возвращаемое значение .F. если неуспешно</p>
<p>                             </p>
<p>&nbsp;</p>
<p>                 </p>
<p><b><i>&#9;CreateFtpDirectory (создать директорию)</i></b></p>
<p>                             </p>
<p><b>Синтаксис:</b></p>
<p>                                   </p>
<p>CreateFtpDirectory (<br />               char Directory <br />               )</p>
<p>                             </p>
<p><b>Параметры:</b></p>
<p>&#9;Directory&#9;- имя директории</p>
<p><b>Возвращаемое значение:</b></p>
<p>                                   </p>
<p>Возвращаемое значение .T.если успешно<br />               Возвращаемое значение .F. если неуспешно</p>
<p>                             </p>
<p>&#9;</p>
<p>                 </p>
<p><b><i>RemoveFtpDirectory (удалить директорию)</i></b></p>
<p>                             </p>
<p><b>Синтаксис:</b></p>
<p>                                   </p>
<p>RemoveFtpDirectory (<br />               char Directory <br />               )</p>
<p>                             </p>
<p><b>Параметры:</b></p>
<p>&#9;Directory&#9;- имя директории</p>
<p><b>Возвращаемое значение:</b></p>
<p>                                   </p>
<p>Возвращаемое значение .T. если успешно<br />               Возвращаемое значение .F. если неуспешно</p>
<p>                             </p>
<p>&nbsp;</p>
<p>                          </p>
<p><b><i>&#9;ChangeFtpDirectory (сменить текущую директорию)</i></b></p>
<p>                             </p>
<p><b>Синтаксис:</b></p>
<p>                                   </p>
<p>ChangeFtpDirectory (<br />               char Path <br />               )</p>
<p>                             </p>
<p><b>Параметры:</b></p>
<p>&#9;Path&#9; &#9;- путь</p>
<p><b>Возвращаемое значение:</b></p>
<p>                                   </p>
<p>Возвращаемое значение .T. если успешно<br />               Возвращаемое значение .F. если неуспешно</p>
<p>                             </p>
<p>&nbsp;</p>
<p>                 </p>
<p><a href="ftp_class.zip">Скачать класс </a><b><i>&#9;</i></b></p>
</div>
<div id="sol_avtor">Автор: Неизвестно</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ftp-klient/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/inkrementnyj-poisk-v-grid/</link>
					<title><![CDATA[Инкрементный поиск в GRID]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:11 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Инкрементный поиск в GRID</h1>
													</header>
													<div id="sol_opis">Удобный поиск в GRID. Встаете на нужное поле, набираете ключевую фразу и по мере набора курсор переходит на нужную запись.</div>
<div id="sol_body">
<p align="center"><b>Инкрементный поиск в    GRID</b></p>
<p>Установив этот класс в свой Грид, вы сможете без проблем сделать поиск по Гриду.    Устанавливается просто. Добавьте класс в проект. Создайте форму, поставьте на    нее Грид. Теперь с помощью Билдера или сами укажите поля, которые будут в гриде.    Нажимаем правой кнопкой мыши на Грид, затем Edit, выбираем в панели инструментов    класс ingrid и кидаем его на нужное поле в гриде (тут главно не кинуть на header,    нужно на текстовое поле). Ищем в свойствах колонки (column) CurrentControl и    меняем его с text на ingrid. Все. В архиве есть пример работы с классом. </p>
<p><a href="ingrid.zip">Скачать класс</a> </p>
<p><b><i> </i></b></div>
<div id="sol_avtor">Автор: Русификация Leon Tauscheff</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/inkrementnyj-poisk-v-grid/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/gsal/</link>
					<title><![CDATA[GSAL]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:11 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>GSAL</h1>
													</header>
													<div id="sol_opis">Класс предназначен для сохранения и восстановления порядка следования и размеров колонок Grid`a.</div>
<div id="sol_body">
<p align="center">Gsal<br />   Андрей Подоплелов <a href="mailto:pan@sgtrk.e-burg.ru">pan@sgtrk.e-burg.ru</a></p>
<p>    </p>
<p align="left">Класс предназначен для сохранения и восстановления порядка следования    и размеров колонок Grid`a. Для восстановления размеров в методе Init формы следует    вызвать следующий метод класса -- Thisform.gsal1.setsize(), для сохранения размеров    в методе Destroy форму надо вызвать метод класса Thisform.gsal1.savegrid().  </p>
<p align="left">Название Grid`a записывается в переменной gsal._grid. Послабления    в вызове не предусмотрены, но если очень хочется, то можно создать класс формы    с уложенным на него классом и Grid`ом. Данные о размерах и положении колонок    сохраняются в отдельной таблице, название которой указано в переменной gsal._table.    При ее отсутствии она создается автоматически, как свободная таблица.  </p>
<p align="left"><a href="arc/gsal.rar">Скачать класс</a></div>
<div id="sol_avtor">Автор: Андрей Подоплелов 																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/wsal/</link>
					<title><![CDATA[Сохранения и восстановления положения и размеров окна]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 13:10:28 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Сохранения и восстановления положения и размеров окна</h1>
													</header>
													<div id="sol_body">
<p align="left">Класс предназначен для сохранения и восстановления положения и размеров окна по требованию.</p>
<p align="left">Для использования достаточно положить его на форму и в методе Init форму вызвать метод класса -- Thisform.wsal1.setposition(). Если лень писать это каждый раз или нет потребности сохранять или не сохранять положение окна в зависимости от каких либо настроек, можно в методе Init класса написать следующую строку -- This.setposition(), тогда все будет делаться автоматически. Данные о габаритах и положении сохраняются в отдельной таблице, название которой указано в переменной wsal._table. При ее отсутствии она создается автоматически, как свободная таблица.</p>
<p align="left">Свойство _cut отвечает за подгонку окна под размер экрана, по умолчанию выключено.</p>
<p align="left">Свойство _needsave отвечает за сохранение размеров и положения формы, по умолчанию включено.</p>
<p align="left">У метода setposition есть необязательный параметр (текстовая строка) -- под каким именем восстанавливать и сохранять информацию о форме.</p>
<p align="left">
</div>
<div id="sol_avtor">Автор: Андрей Подоплелов <a href="mailto:pan@sgtrk.e-burg.ru">pan@sgtrk.e-burg.ru</a></div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/wsal/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/klass-dlya-raboty-so-strukturami-winapi/</link>
					<title><![CDATA[Класс для работы со структурами WINAPI]]></title>
                    					    <author><![CDATA[SpyFox]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:11 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Класс для работы со структурами WINAPI</h1>
													</header>
													<div id="sol_opis">На сегодняшний день, как бы ни ругали FoxPro,сколько бы не говорили о его кончине, он тем не менее развивается и совершенствуется. У него существует еще много приверженцев и поклонников, появляются новые. FoxPro по-прежнему остается одним из лучших для работы с базами данных.</div>
<div id="sol_body">
<p align="center"><b>Класс    для работы со структурами WINAPI.</b></p>
<p>    </p>
<p>На сегодняшний день, как бы ни ругали FoxPro,сколько    бы не говорили о его кончине, он тем не менее развивается и совершенствуется.    У него существует еще много приверженцев и поклонников, появляются новые. FoxPro    по-прежнему остается одним из лучших для работы с базами данных. Тем более,    что на сегодняшний день с помощью вызова функций API Windows, мы можем придать    своим приложениям ту или иную стандартную функциональность. Единственная проблема    в том, что при вызове той или иной функции API, в качестве параметров, нужен    указатель на структуру, а сам FoxPro, не может полноценно работать со структурами,    как это сделано в VB, VC, Delphi, поэтому приходиться идти на всякие ухищрения    или делать так, как рекомендуется файле помощи.</p>
<p>Вот как показан пример работы со структурами    в файле помощи.</p>
<p>    </p>
<p>Системная функция Windows GetSystemTime(    ) требует в качестве параметра указатель на структуру, состоящую из восьми слов    (WORD), указывающих год, месяц, день, и так далее. </p>
<p>Структура определена таким образом:</p>
<p>typedef struct _SYSTEMTIME { <br />   WORD wYear ;<br />   WORD wMonth ;<br />   WORD wDayOfWeek ;<br />   WORD wDay ;<br />   WORD wHour ;<br />   WORD wMinute ;<br />   WORD wSecond ;<br />   WORD wMilliseconds ;<br />   } SYSTEMTIME</p>
<p>Вот так будет выглядет код на FoxPro:</p>
<p>**************************************************************</p>
<p>DECLARE INTEGER GetSystemTime IN win32api    STRING @<br />   cBuff=SPACE(16)<br />   =GetSystemTime(@cBuff)<br />   tYear = ALLTRIM(STR(ASC(SUBSTR(cBuff,2))    * ; <br />   256 + ASC(SUBSTR(cBuff,1))))<br />   tMonth = ALLTRIM(STR(ASC(SUBSTR(cBuff,4))    * ; <br />   256 + ASC(SUBSTR(cBuff,3))))<br />   tDOW = ALLTRIM(STR(ASC(SUBSTR(cBuff,6))    * ; <br />   256 + ASC(SUBSTR(cBuff,5))))</p>
<p>*************************************************************</p>
<p>Т.е. мы создаем переменную cBuff , а так    как наша структуры занимает 8 слов (WORD) или 16 байт (BYTE), мы ее заполняем    столькими же пробелами. Затем вызываем функцию GetSystemTime(), обратите внимание,    на знак @ перед cBuff, это значит, что мы передаем переменную по ссылке, т.е.    в ней и возвратиться результат, а затем разбираем строку.</p>
<p>    </p>
<p>Вот этот самый момент, формирование или разбор    строки, и является самым не удобным при работе со структурами из FoxPro. Столкнувшись    с этой проблемой я написал простенький класс, который не претендует на оригинальность,    но может помочь в этом деле, а кого-то и подтолкнуть на написание действительно    оригинального и полнофункционального класса, хотя я почему то уверен, что в    версии 7.0 Microsoft сделает более развитой работу со структурами.</p>
<p>    </p>
<p>Класс называется STRUCTURE и находится в    библиотеке <a href="mststruc.zip">MSTSTRUC.PRG</a>.</p>
<p>Он имеет один public-метод SizeOf(), который    возвращает длину структуры. Этот метод полезен в тех функциях, где нужен необходимо    передать размер структуры в качестве параметра или в составе структуры.</p>
<p>Так же есть public-свойство StructureString.    При обращении к этому свойству формируется строка со структурой, а при присвоении    ему какого-либо значения произойдет разбор строки и свойства структуры заполняться    данными.</p>
<p>Вот как будет выглядеть вышеприведенной код    при использовании моего класса:</p>
<p>-------------------------------------</p>
<p>#DEFINE _SYSTEMTIME "WORD wYear;"+;<br />   "WORD wMonth;"+;<br />   "WORD wDayOfWeek;"+;<br />   "WORD wDay;"+;<br />   "WORD wHour;"+;<br />   "WORD wMinute;"+;<br />   "WORD wSecond;"+;<br />   "WORD wMillisecond;"<br />   DECLARE INTEGER GetSystemTime IN win32api    STRING @<br />   oTimeStruc=newobject("STRUCTURE","MSTSTRUC.PRG","",_SYSTEMTIME)<br />   cBuff=oTimeStruc.StructureString<br />   =GetSystemTime(@cBuff)<br />   oTimeStruc.StructureString=cBuff<br />   tYear =oTimeStruc.wYear<br />   tMonth =oTimeStruc.wMonth<br />   tDow =oTimeStruc.wDayOfWeek</p>
<p>----------------------------------</p>
<p>В настоящий момент возможна работа со следующими    типами: BYTE, WORD,DWORD,CHAR, STRING. Но не будет сложным задать и другие типы.</p>
<p>    </p>
<p>Вот еще один пример</p>
<p>#DEFINE _MEMORYSTATUS ;<br />   "DWORD dwLength;"+;<br />   "DWORD dwMemoryLoad;"+; &amp;&amp;    // percent of memory in use <br />   "DWORD dwTotalPhys;"+; &#9;&amp;&amp;    // bytes of physical memory <br />   "DWORD dwAvailPhys;"+; &#9;&amp;&amp;    // free physical memory bytes <br />   "DWORD dwTotalPageFile;"+; &amp;&amp;    // bytes of paging file <br />   "DWORD dwAvailPageFile;"+; &amp;&amp;    // free bytes of paging file <br />   "DWORD dwTotalVirtual;"+; &amp;&amp;    // user bytes of address space <br />   "DWORD dwAvailVirtual;"&#9;&amp;&amp;    // free user bytes <br />   DECLARE INTEGER GlobalMemoryStatus    IN WIN32API STRING @lpBuffer<br />   oMemoryStatus=NEWOBJECT("STRUCTURE","MSTSTRUC.PRG","",_MEMORYSTATUS)<br />   oMemoryStatus.dwLength=oMemoryStatus.SizeOf()<br />   oMemory=omemoryStatus.StructureString<br />   lnRet=GlobalMemoryStatus(@oMemory)<br />   oMemoryStatus.StructureString=oMemory<br />   clear</p>
<p>? "Информация о памяти"<br />   ? "---------------------------------------------------"<br />   ? "Всего физической памяти "+str(oMemoryStatus.dwTotalPhys/1024/1024)+"MB"<br />   ? " Свободно "+str(oMemoryStatus.dwAvailPhys/1024/1024)+"MB"<br />   ? " Использовано "+str(omemoryStatus.dwMemoryLoad)+"%"<br />   ? "---------------------------------------------------"<br />   ? " Всего виртуальной памяти "+str(oMemoryStatus.dwTotalVirtual/1024/1024)+"MB"<br />   ? "Использовано виртуфльной памяти    "+str(oMemoryStatus.dwAvailVirtual/1024/1024)+"MB"<br />   ?</p>
<p>Я надеюсь, что это поможет вам болле полно    работать с функциями API. Буду рад услышать ваши отзывы, не обязательно только    хорошие.</p>
<p>------------------------------------------------------------</p>
<p>SpyFox</p>
</div>
<div id="sol_avtor">Автор: SpyFox</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3809">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3809">SpyFox</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="SpyFox" href="https://foxclub.ru/account/?user=3809">
				<img alt='' src='https://secure.gravatar.com/avatar/e99c4060fb1147c90118fdf1d1f04e7d?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e99c4060fb1147c90118fdf1d1f04e7d?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 07-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/klass-dlya-raboty-so-strukturami-winapi/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/progress-bar/</link>
					<title><![CDATA[Progress bar]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:11 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Progress bar</h1>
													</header>
													<div id="sol_opis">Класс отображает progress bar. Неограниченный максимум.</div>
<div id="sol_body">
<p align="center"><b>Progress    bar</b></p>
<p>    </p>
<p>&nbsp;</p>
<p>Для использования класса сначала выполните метод calc с параметром, равным    максимальному значению для определения переменных, а затем используйте метод    update для изменения значения progress bar. Пример в архиве ...</p>
<p><a href="thermbar.zip">Скачать ...</a></p>
</div>
<div id="sol_avtor">Автор: Михаил Дунькин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/progress-bar/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/propis/</link>
					<title><![CDATA[Propis]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:11 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Propis</h1>
													</header>
													<div id="sol_opis">Еще один способ преобразования числа в строку с рублями и копейками, но в виде класса.</div>
<div id="sol_body">
<p align="center"><b>Класс    propis</b></p>
<p>    </p>
<p>Класс propis - превращает денежную сумму вида 1112.56 в строку типа Одна тысяча    сто двенадцать рублей 56 копеек. </p>
<p>Свойство stroka возвращает искомую строку, в свойство su записывается преобразуемая    сумма, метод propis производит преобразование. Сумма может быть от 1 копейки    до 999 999 999.99 рублей. Пример прилагается. </p>
<p><a href="propis2.zip">Скачать ...</a></p>
<p>С уважением, Михаил Дунькин<br />   <a href="mailto:%20dounkin@yahho.com"> dounkin@yahoo.com</a></p>
</div>
<div id="sol_avtor">Автор: Михаил Дунькин</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/propis/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/checklist/</link>
					<title><![CDATA[CheckList]]></title>
                    					    <author><![CDATA[SpyFox]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:11 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>CheckList</h1>
													</header>
													<div id="sol_opis">Наверное многие сталкивались с проблемой, когда нужно показать список для выбора каких-либо позиций или высветить список сотрудников или товаров, где необходимо было отметить те или иные позиции. Наверняка многие использовали для этого объект GRID или ActiveX. Но я принципиально отказываюсь от использования ...</div>
<div id="sol_body">
<h3>CheckList </h3>
<p> Наверное многие сталкивались с проблемой, когда нужно показать список для выбора каких-либо позиций или высветить список сотрудников или товаров, где необходимо было отметить те или иные позиции. Наверняка многие использовали для этого объект GRID или ActiveX. Но я принципиально отказываюсь от использования GRID, несмотря на то, что этот объект и обладает очень большими возможностями, в нем заложено столько же и всяких непредсказуемых моментов, которые неизвестно когда вылетят.От ActiveX - объектов я стараюсь также отказываться, когда это возможно, хотя и использую их в некоторых случаях.  <br /> Так вот, когда у меня возникла потребность в таком списке, то я решил использовать для этого объект LISTBOX, создав на основе его класс CHEKCLISTBOX, добавил в него несколько свойств и методов. Для отображения меток я использовал картинки BMP, вставляемые для каждой строки. Чтобы посмотреть как это работает, запустите форму SAMPLE. </p>
<p> В класс, в дополнении к базовому классу, добавлены следующие свойства: <br />  CheckBMP- содержит имя файла с картинкой для отмеченых строк; <br /> UNCheckBMP - содержит имя файла с картинкой для не отмеченных строк. </p>
<p> Также добавлены следующие методы: </p>
<p> AddMethod - метод добавляет строки, передаются следующие параметры - <br /> tlCheck - Содержит .T., если строка должна быть отмечена и наборот  tcCol1, tcCol2, tcCol3, tcCol4 -значения четырех столбцов, если они определены.  Checked - принимает в качестве параметра номер строки и возвращает .T. если она отмечена. SetCheck - принимает в качестве параметра номер строки и устанавливает на нее метку. <br /> UNSetCheck - принимает в качестве параметра номер строки и снимает с нее метку. <br /> RET_COL_VAL - принимает в качестве параметра номер строки и номер колонки и возвращается ее значение. </p>
<p> Также используются стандартные методы Click, DblClick, RightClick, поэтому при их использовании необходимо вписывать в них dodefault(). При нажатии правой кнопки выводиться меню. Следует также заметить, что для выбора, т.е. отметки строки или ее снятия мышью можно использовать два варианта: сделать двойной клик на строке или щелкнуть один раз на картинке. Надеюсь, что это кому-то пригодиться.  </p>
</div>
<div id="sol_avtor">Автор: SpyFox</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3809">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 26 лет</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3809">SpyFox</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="SpyFox" href="https://foxclub.ru/account/?user=3809">
				<img alt='' src='https://secure.gravatar.com/avatar/e99c4060fb1147c90118fdf1d1f04e7d?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e99c4060fb1147c90118fdf1d1f04e7d?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 0<i class="rcli fa-file-text-o"></i>Публикации: 4<i class="rcli fa-calendar-check-o"></i>Регистрация: 07-09-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/checklist/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/dbf-structure-fixer-3-15/</link>
					<title><![CDATA[DBF Structure Fixer 3.15]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:11 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>DBF Structure Fixer 3.15</h1>
													</header>
													<div id="sol_opis">DBF Structure Fixer - свободно распространяемая утилита, работающая из командной строки, которая анализирует и восстанавливает dbf-файлы от dBase III/III+/IV,dBase for Windows,Visual dBase,FoxBASE+,Foxpro 3.0/5.0. Работет так: запускается с ключем /s на пока еще неповрежденном dbf. Данные о файле сохраняются для последующего восстановления, когда ваши dbfы накроются. Вы можете запускать утилиту из autoexec.bat для автоматической проверки и восстановления dbfов. DBF Structure fixer создает log-файлы и вы можете посмотреть, что произошло с dbfами. Утилита не восстанавливает индексы и другие файлы, кроме dbf. Следовательно вам нужно будет после восстановления сделать переиндексацию, если есть индексы.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Неизвестно</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/dbf-structure-fixer-3-15/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/podderzhka-russkogo-yazyka-v-gksetup/</link>
					<title><![CDATA[Поддержка русского языка в GkSetup]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:11 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Поддержка русского языка в GkSetup</h1>
													</header>
													<div id="sol_opis">Библиотека поддержки русского языка в инсталляторе GKSetup.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Неизвестно</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/podderzhka-russkogo-yazyka-v-gksetup/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Распространение программ]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/dekompilyator-refox-7/</link>
					<title><![CDATA[Декомпилятор ReFox 7]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:11 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Декомпилятор ReFox 7</h1>
													</header>
													<div id="sol_opis">Популярный декомпилятор для Foxpro. Есть возможность шифрования своего приложения от декомпиляции</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Неизвестно</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/dekompilyator-refox-7/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/aspack/</link>
					<title><![CDATA[ASPack]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:11 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>ASPack</h1>
													</header>
													<div id="sol_opis">Программа, сжимающая EXE и DLL файлы. Степень сжатия от 30 процентов первоначального размера.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Неизвестно</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/aspack/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Распространение программ]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/stru-prg/</link>
					<title><![CDATA[Stru.prg]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:11 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Stru.prg</h1>
													</header>
													<div id="sol_opis">Утилита записи структуры dbf-файла и его индексов в текстовый файл</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Неизвестно</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/stru-prg/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/sscommand/</link>
					<title><![CDATA[SSCommand]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:11 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>SSCommand</h1>
													</header>
													<div id="sol_opis">Программа, эмулирующая Command-окно Foxpro. Пригодится для тех, кому приходится выезжать к заказчикам. Все основные команды для правки баз, форм, отчетов.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Неизвестно</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/sscommand/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/vfpview/</link>
					<title><![CDATA[VFPVIEW]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:11 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>VFPVIEW</h1>
													</header>
													<div id="sol_opis">Программа для просмотра таблиц от DBase и Foxpro всех версий. Включает возможности исправления заголовков. выдачи информации о типе dbf-файла (DBASE или Foxpro + версии) , кодовую страницу, размер. Просмотр memo-полей, поддержка всех кодовых страниц</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Неизвестно</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/vfpview/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/foxview/</link>
					<title><![CDATA[FOXVIEW]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:11 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>FOXVIEW</h1>
													</header>
													<div id="sol_opis">Просмотр и изменение таблиц, выполнение основных команд Foxpro. Требуется среда поддержки VFP</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Василий Фурсов</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/foxview/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/bv/</link>
					<title><![CDATA[BV]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:11 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>BV</h1>
													</header>
													<div id="sol_opis">Русский просмотрщик/редактор таблиц. Очень много различных функций. Написан на VFP6</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Александр Одинец</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/bv/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/vosstanovlenie-dbf-fajlov/</link>
					<title><![CDATA[Восстановление dbf-файлов]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:11 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Восстановление dbf-файлов</h1>
													</header>
													<div id="sol_opis">SALVDBF был написан, потому что иногда, особенно при работе в сети, заголовок dbf-файла повреждается. И когда FOXPRO пытается открыть его, происходит ошибка "NOT A DATABASE FILE". Эта утилита восстанавливает как можно больше записей dbf-файла.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Неизвестно</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/vosstanovlenie-dbf-fajlov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/intellisensex/</link>
					<title><![CDATA[IntelliSenseX]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:11 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>IntelliSenseX</h1>
													</header>
													<div id="sol_opis">Реализация части технологии IntelliSense для VFP6. Эта версия показывает все переменные, которые определены в данном методе или процедуре. <br /> <b>Как работает:</b> просто запустите ее в среде Foxpro, для закрытия запустите ее еще раз передав параметр "QUIT".<br /> Теперь при редактировании когда жмете ALT+I - появляется меню со всеми определенными переменными (следует учесть, что под определенными понимаются указанные в PUBLIC,LOCAL и т.д.)</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: Christof Lange</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/intellisensex/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/planirovshhik-zadach/</link>
					<title><![CDATA[Планировщик задач]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:12 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Планировщик задач</h1>
													</header>
													<div id="sol_opis">Планировщик задач (запуска программ и т.д.). Настраивается по времени, просмотр списка задач и т.д. Возможность работы как COM-объекта.</div>
<div id="sol_body"></div>
<div id="sol_avtor">Автор: BB</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/planirovshhik-zadach/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/chtenie-informaczii-iz-exe-fajla/</link>
					<title><![CDATA[Чтение информации из EXE файла]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:12 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Чтение информации из EXE файла</h1>
													</header>
													<div id="sol_opis">Может применяться в качестве дополнительных функций в приложениях, выяснения версий exe-файлов.</div>
<div id="sol_body"><b>Чтение информации    из EXE файла (например, Copyright) </b><br />       </p>
<p align=left> Этот пример показывает использование      библиотеки FOXTOOLS.FLL. С помощью этой простой программы можно читать информацию      из EXE-файла, ту информацию, которую показывает Windows 95, на станице Свойства      (автор, Copyright и др.)</p>
<p>     * Example of getting exe file info<br />     LOCAL lcLibName<br />     lcLibName = HOME()+"FOXTOOLS.FLL"<br />     SET LIBRARY TO (lcLibName) ADDITIVE <br />     DIMENSION laVersionInfo[16] =GetFileVersion("MyEXE.exe",@laVersionInfo)<br />     DISPLAY MEMO LIKE laVersionInfo </div>
<div id="sol_avtor">Автор: Иван Ник</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/chtenie-informaczii-iz-exe-fajla/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/udalennoe-soedinenie-s-setyu-naprimer-s-provajderom-internet/</link>
					<title><![CDATA[Удаленное соединение с сетью (например, с провайдером Интернет)]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:12 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Удаленное соединение с сетью (например, с провайдером Интернет)</h1>
													</header>
													<div id="sol_opis">Часто бывает необходимым произвести соединение с сетью, используя контроллер удаленного доступа. Именно это и делает приведенная ниже программа. Кстати, это хороший пример использования DLL</div>
<div id="sol_body">Часто бывает необходимым произвести соединение с сетью, используя контроллер удаленного доступа. Именно это и делает приведенная ниже программа. Кстати, это хороший пример использования DLL. Пример взят из книги "Эффективная работа с СУБД" А. Горева и Р. Ахаяна. [code]  PROCEDURE RemoteNet ************************************************************* * Activate Remote network connection * by Andrey Gorev (from the book "Database managment system") *------------------------------------------------------------ * NOTES: * Connection must be present! * At this example is has name "Darial" * My own login is "alef" * and my own password... hmm... I don't say it! *************************************************************  declare integer RasDial in rasapi32 ; string DialExtetions, ; string cPhoneboolfile, ; string @ cParameters, ; integer nCallBack, ; string cCallBack, ; string @ nConnHandle  nConnHandle = chr(0)+chr(0)+chr(0)+chr(0)  *-- Replace your values here cConnName = "Darial" && Your connection here! cPhone = "500750" && Phone number of ISP cUserName = "alef" && Login name cPassWord = "" && Password here! cDomain = "" && Domain name  cParam = chr(28)+chr(4)+chr(0)+chr(0)+; padr(cConnName+chr(0), 256+1)+; padr(chr(0), 128+1)+; padr(chr(0), 128+1)+; padr(cUserName+chr(0), 256+1)+; padr(cPassword+chr(0), 256+1)+; padr(cDomain+chr(0), 15+1)+" "  nRes = RasDial(NULL, NULL, @cParam, 0, NULL, @nConnHandle)  [/code]</div>
<div id="sol_avtor">Автор: А. Горев l</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/udalennoe-soedinenie-s-setyu-naprimer-s-provajderom-internet/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Сети (Интернет и др.)]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/poisk-dubliruyushhihsya-zapisej-v-tablicze/</link>
					<title><![CDATA[Поиск дублирующихся записей в таблице]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Mon, 31 Aug 2020 06:50:27 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Поиск дублирующихся записей в таблице</h1>
													</header>
													<div id="sol_body">
<p align="left">Чтобы показать дублирующиеся записи, можно использовать SQL-запрос показанный ниже. В результате получится курсор содержащий каждую группу дублирующихся записей, показанную один раз и количество повторений в таблице этой записи.</p>
<p align="left"><pre class='bbcode'>  SELECT field1,field2, COUNT(*) AS dups FROM table GROUP BY field1,field2,;<br />  
  HAVING COUNT(*)&gt;1 INTO CURSOR whatever  
</pre></p>
</div>
<div id="sol_avtor"></div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/poisk-dubliruyushhihsya-zapisej-v-tablicze/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/zvuk/</link>
					<title><![CDATA[Звук]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:12 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Звук</h1>
													</header>
													<div id="sol_opis">Это исключительно Visual FoxPro-шная функция. Своим рождением она обязана, во-первых, тому, что Visual FoxPro работает со звуковыми файлами и, во-вторых, моей лени писать каждый раз самостоятельный вызов звукового файла</div>
<div id="sol_body"><b>Звук</b>    </p>
<p align=left> Это исключительно Visual FoxPro-шная функция.      Своим рождением она обязана, во-первых, тому, что Visual FoxPro работает со      звуковыми файлами и, во-вторых, моей лени писать каждый раз самостоятельный      вызов звукового файла. А так достаточно указать do sound with имя.wav .     </p>
<p align=left>Procedure SOUND<br />     Parameter soundF<br />   if file(SoundF)<br />     SET BELL TO &SoundF, 0<br />     ?? CHR(7)<br />     SET BELL TO <br />     endif </div>
<div id="sol_avtor">Автор: Неизвестно</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/zvuk/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/ole-rabota-s-ms-word-i-ie/</link>
					<title><![CDATA[OLE: работа с MS Word и IE]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:12 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>OLE: работа с MS Word и IE</h1>
													</header>
													<div id="sol_opis">Мы не будем здесь влезать в дебри OLE, его сути и различных тонкостей и отличий от аналогичных технологий. OLE есть OLE и применять его иногда бывает очень полезно. Что же он дает ?</div>
<div id="sol_body">
<h3>Часть 1.Работа с Word</h3>
<p>  Мы не будем здесь влезать в дебри OLE, его сути и различных тонкостей и отличий от аналогичных технологий. OLE есть OLE и применять его иногда бывает очень полезно. Что же он дает ? Последнне время, большая часть софтверных компаний (по-крайней мере Microsoft) пишут свои приложения как OLE-объекты. Следовательно, мы можем из Foxpro полностью управлять работой таких программ. К таким программам относятся Word, Excel и другие из MS Office, так же Outlook Express и много других. Достаточно хорошо, что можно легко ввести данные в фокспрошную программу, там их обработать, сделать отчет в формате MS Word и отдать начальнику. Так как Word является намного более используемой программой, с него и начнем.<br />  Перед началом работы с ЛЮБЫМ OLE объектом его сначала нужно проиницилизировать. Для Wordа это выглядит следующим образом: [code] oword=create('word.application') oword.documents.add() [/code] Здесь происходит загрузка Word в память и создание нового(пустого) документа. Теперь можно указать заголовок окна Wordа: [code] oword.caption='Word97 Test' [/code] В принципе, можно и не указывать заголовок окна, но возможность такая есть. Это была обязательная часть кода (исключая заголовок) для работы с Wordом. Теперь будем работать непосредственно с созданным документом. Для вставки текста в документ используется метод INSERTAFTER(text), где text - необходимый для вставки текст 😉<br />  Пример вствки текста в документ: [code] oword.Selection.insertafter(chr(13)) && вставляем ENTER oword.Selection.insertafter('DATE: ') oword.Selection.insertafter(date()) && ... и текущую дату [/code]  Точно также можно вставлять несколько ENTERов (отделяя блоки текста) [code] FOR i = 1 to 3 oword.Selection.insertafter(chr(13)) ENDFOR  [/code] И сразу вставлять текст и перевод курсора на следующую строку: [code] oword.selection.insertafter('Thank you,'+chr(13)) [/code] Также можно вставлять разделительные полосы: [code] oword.selection.insertafter(repl('_',25))[/code]  И осталось только снять выделение с введенного текста: [code] END=oword.activedocument.Bookmarks("ENDOFDOC").select[/code]  Теперь придадим форму самому окну Wordа и сделаем его видимым: [code] oword.top = 1 oword.left = 1 oword.width = 500 oword.height = 450 oword.visible= .t.  [/code]  </p>
<h3>Урок 2. Работа с IE.</h3>
<p> Теперь по аналогии работы с Word, мы нмного поуправляем Internet Explorerом. Вообще, чтобы управлять любым OLE объектом достаточно просто узнать все его совйства и методы, но для этого нужно уметь владеть мало-мальским отладчиком (хотя бы отладчиком от фокспро). Для IE есть несколько следующих методов: переход на нужную страницу и заполнение форм.<br />  Попробуем сделать небольшой пример работы с IE.<br />  Сначала нужно определить запущем-ли уже браузер из нашего примера, для этого проверяется определена-ли переменная oie, если нет, то определяем ее как ссылку на объект IE.<br /> [code] IF type ('oie')='U' PUBLIC oie oie=createobject('internetexplorer.application') ENDIF [/code] Теперь с помощью метода Navigate переходим на страничку поиска людей в Yahoo! [code] oie.navigate('http://www.yahoo.com/search/people') [/code] Делаем небольшую паузу, чтобы бровзер открыл сайт. Если в работе программы будут ошибки из-за медленного Интернет-соединения, то это время нужно увеличть. [code] lntime=seconds() DO while seconds()-lntime< 6 ENDDO [/code] Теперь делаем окно IE видимым и заполняем форму.  [code] oie.visible= .t. [/code]  Нижеследующие обращения к IE весьма напоминают синтаксис JavaScript, и вы можете почерпнув оттуда свойства сделать с IE что-нибудь ужасное ;-). А что происходит тут: идет обращение(заполнение) полей формы forms(1) значениями имени, фамилии и т.д., где firstname - поле имя и т.п. [code] oie.document.script.window.document.forms(1).firstname.value = "john"  oie.document.script.window.document.forms(1).lastname.value = "harvey" oie.document.script.window.document.forms(1).city.value = "memphis"  oie.document.script.window.document.forms(1).state.value = "tn" oie.document.script.window.document.forms(1).submit()  [/code] Ну а последняя строка кода "нажимает" на кнопку отправить. Вы можете ее временно убрать, чтобы посмотреть как заполняются поля формы. </div>
<div id="sol_avtor">Автор: Неизвестно</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/ole-rabota-s-ms-word-i-ie/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Foxpro и другие приложения]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/informacziya-o-bmp-kartinke/</link>
					<title><![CDATA[Информация о BMP-картинке]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:12 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Информация о BMP-картинке</h1>
													</header>
													<div id="sol_opis">Иногда бывает нужным получить размеры BMP-файла, перед тем как занести его в базу данных. У меня такая возможность понадобилась один раз в программе "учета" кадров.</div>
<div id="sol_body">
<p align="center"><b>Информация о BMP-картинке</b></p>
<p>Иногда бывает нужным получить размеры BMP-файла, перед тем как занести его      в базу данных. У меня такая возможность понадобилась один раз в программе      &quot;учета&quot; кадров: перед тем как занести фотографию работника в базу      (это не только у америнканцев такие программы с фотографиями 😉 приходится      проверять ее размеры, иначе кто-нибудь занесет &quot;нужную&quot; картинку,      которая порешит всю форму. А больше я и не знаю зачем это нужно. Для этого      используется небольшая функция bmpinfo. В принципе, там нет ничего сложного,      но тем не менее. Перед тем как вызывать функцию нужно обязательно проинилизировать      переменные:<b> LNHeight </b>(высота в пикселях)<b>, LNWidth </b>(ширина в      пикселях)<b>, LNColors</b> (количество цветов )<b>. </b>Делается это командой:<br />     <i>Store 0 To LNHeight, LNWidth, LNColors. </i> <br />     Затем вызываете функцию, указав в качестве параметра имя BMP-файла: <i>=BMPInfo("Drive:DirFileName.bmp")</i><br />     Теперь значения высоты, ширины и количества цветов находятся в соответсвующих      переменных. </p>
<p><a href="bmpinfo.zip">Скачать BMPINFO</a></p>
</div>
<div id="sol_avtor">Автор: Неизвестно</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/informacziya-o-bmp-kartinke/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/perezagruzka-dannyh-iz-raznyh-katalogov/</link>
					<title><![CDATA[Перезагрузка данных из разных каталогов]]></title>
                    					    <author><![CDATA[Joys]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:12 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Перезагрузка данных из разных каталогов</h1>
													</header>
													<div id="sol_opis">Если Вам приходится часто перегружать в программе данные из разных каталогов и Вы еще не решили как это сделать то данный код для Вас</div>
<div id="sol_body">
<div align="left">
<p align="center"><b>Перезагрузка данных из разных каталогов<br />       </b>Димон (impekt@sci.smolensk.ru)<b><br />       </b></p>
<p>Если Вам приходится часто перегружать в программе данные из разных каталогов        и Вы еще не решили как это сделать то данный код для Вас. Для работы необходимо        вставить код, в <b>DataEnvironment.BeforeOpenTable</b> и перед этим создать        глобальную переменную <b>"Рабочий_каталог"</b>, со слешем на конце в которой        прописать путь к данным, например:</p>
<p><i>C:MyProgaData1999</i></p>
<p> После этого при открытии таблиц в DataEnvironment данные будут браться        из указанного выше каталога. Для перезагрузки данных не надо закрывать форму.        Достаточно сделать следующие действия.</p>
<p> <i>ThisForm.DataEnvironment.CloseTables<br />       Рабочий_Каталог= 'C:MyProgaData2000' <br />       ThisForm.DataEnvironment.OpenTables </i></p>
<p>**** Код процедуры перезагрузки</p>
<p>AMEMBERS(la_Cursors,ThisForm.DataEnvironment,2) <br />     WITH ThisForm.DataEnvironment </p>
<p>     FOR ln_Cot=1 TO ALEN(la_Cursors,1)<br />     lc_Cursor=la_Cursors(ln_Cot) </p>
<p>     IF .&lc_Cursor..BaseClass = 'Cursor' <br />     IF NOT '' $ .&lc_Cursor..CursorSource lc_Table=SUBSTR(.&lc_Cursor..DataBase,RAT('',.&lc_Cursor..DataBase)+1,;      <br />     LEN(.&lc_Cursor..DataBase)-RAT('',.&lc_Cursor..DataBase)) .&lc_Cursor..DataBase=РАБОЧИЙ_КАТАЛОГ+lc_Table      <br />     ELSE<br />     lc_Table=SUBSTR(.&lc_Cursor..CursorSource,RAT('',.&lc_Cursor..CursorSource)+1,;      LEN(.&lc_Cursor..CursorSource)-RAT('',.&lc_Cursor..CursorSource)) .&lc_Cursor..CursorSource=РАБОЧИЙ_КАТАЛОГ+lc_Table<br />     ENDIF <br />     ENDIF</p>
<p>     ENDFOR </p>
<p>     ENDWITH </p>
</p></div>
</div>
<div id="sol_avtor">Автор: Димон</div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="1">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 2 месяца</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=1">Joys</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="Joys" href="https://foxclub.ru/account/?user=1">
				<img alt='' src='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/ab07b29cdc9a6e62f794a54e9ccc85af?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 2<i class="rcli fa-file-text-o"></i>Публикации: 177<i class="rcli fa-calendar-check-o"></i>Регистрация: 25-06-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/perezagruzka-dannyh-iz-raznyh-katalogov/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Работа с данными]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/byutifikator-form/</link>
					<title><![CDATA[Бьютификатор форм]]></title>
                    					    <author><![CDATA[piva]]></author>
                    										    <pubDate>Thu, 01 Feb 2024 03:07:27 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Бьютификатор форм</h1>
													</header>
													<p align="left">Что же это вообще такое ? 😉 А это просто &quot;приглаживание&quot;<br />
  всех объектов на форме. То есть унификация фонта, центровки и т.д. Конечно для<br />
  этого можно использовать классы, но не всегда это делается, или если к вам попала<br />
  программа без использования классов. И вы в один момент сделаете эту форму красивой:<br />
  с красивыми фонтами, без лишних кнопочек и вообще как вам захочется.</p>
<p align="left">Вот пример такой программы </p>
<p align="left"><b>Как работает:<br />
  </b> <i>Открываете форму, переходите в Command window и запускаете процедуру<br />
  (do format) </i></p>
<pre><pre class='bbcode'>    
    
 * Format.PRG   
 * c Пирожков В.В. 1997, 10.04.1997 14:00  
  #define C_FONTNAME	"=_FONTNAME"  
  #define C_FONTSIZE	8  
    
  Private array tmp[1]  
  local i, k, j, n, m.OldErrorHandler, m.nError  
  m.OldErrorHandler=ON("ERROR")  
  ON Error Store Error() to m.nError  
    
  k=ASELOBJ(tmp)  
  if k > 0  
  	for i=1 to k  
  		if vartype(tmp[i])='O'  
  			FormatEx(tmp[i])  
  		endif  
  	next  
  else  
  	k=ASELOBJ(tmp,1)  
  	if k > 0 and not tmp[1].Comment='Formatted'  
  		with tmp[1]  
 			* Make Dialog Window  
    
  			.AutoCenter=.T.  
  			.FontName=C_FONTNAME  
  			.FontSize=C_FONTSIZE  
  			.BorderStyle=2  
  			.MinButton=.F.  
  			.MaxButton=.F.  
  			.DeskTop=.T.  
  			.WindowType=1  
  			.Icon=["_SCREEN.Icon"]  
  		endwith  
  	endif  
  endif  
  on Error &OldErrorHandler  
    
  Procedure FormatEx( oObj )  
 *  
 * Процедура опрашивает базовые классы объекта  
 * и для известных ей устанавливает   
 * ИМЯ ФОНТА  
 * РАЗМЕР ФОНТА  
 * и прочие параметры для разных типов классов  
 *   
 * Для объектов контейнеров опрашивает все   
 * дочерние ( сыновние ? ) объекты и запускает  
 * сама себя для всех встреченных объектов  
 *  
  if vartype( oObj ) # 'O'  
  	Return .F.  
  endif  
    
  local j, n  
  with oObj  
  	FormatFont()  
  	do case  
  	case .BaseClass="CommandButton"  
  		.Height=24  
  		.Width=80  
  	case .BaseClass='TextBox'  
  		.Margin=1  
  		.Height=20  
  	case .BaseClass='EditBox'  
  		.Margin=1  
  	case .BaseClass='Label'  
  		.AutoSize=.T.  
  		.BackStyle=0  
  	case .BaseClass='OptionButton'  
  		.AutoSize=.T.  
  	case .BaseClass='CheckBox'  
  		.AutoSize=.T.  
  	case .BaseClass='Shape'  
  		.SpecialEffect=iif(.SpecialEffect=1,0,.SpecialEffect)  
  	case .BaseClass='ListBox'  
 		* Пока нечего добавить к списку  
  	case .BaseClass='ComboBox'  
  		.Margin=1  
 		* Пока нечего добавить в раскрывающемуся списку  
  	case .BaseClass='PageFrame'  
  		.TabStyle=1  
  		for j=1 to .PageCount  
  			FormatEx(.Pages(j))  
  		next  
  	case Inlist(.BaseClass,'Container','OptionGroup','Page','Column')  
  		if .BaseClass='Container'  
  			.SpecialEffect=iif(.SpecialEffect=2,0,.SpecialEffect)  
  		endif  
  		if .ControlCount > 0  
  			for n=1 to .ControlCount  
  				FormatEx(.Controls(n))  
  			next  
  		endif  
  	case InList(.BaseClass,'CommandGroup')  
  		if .ButtonCount > 0  
  			for n=1 to .ButtonCount  
  				FormatEx(.Buttons(n))  
  			next  
  		endif  
  	case .BaseClass='Grid'  
  		.AllowRowSizing=.F.  
  		.AllowHeaderSizing=.F.  
  		.DeleteMark=.F.  
  		.RecordMark=.F.  
  		.SplitBar=.F.  
  		if .ColumnCount > 0  
  			for n=1 to .ColumnCount  
  				FormatEx(.Columns(n))  
  			next  
  		endif  
  	case .BaseClass='Header'  
  		.Alignment=2  
  	endcase  
  endwith  
    
  Procedure FormatFont  
 *  
 * Установить фонт для текущего объекта,  
 * если он к него есть.  
 *  
  if type('.FontName')='C'  
  	.FontName=C_FONTNAME  
  	.FontSize=C_FONTSIZE  
  endif  
    
  Procedure FormatError( nError )  
  Return  
    
</pre></pre>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="4821">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 22 года</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=4821">piva</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="piva" href="https://foxclub.ru/account/?user=4821">
				<img alt='' src='https://secure.gravatar.com/avatar/0a76ea08e616d2f8a939412913fbb096?s=70&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/0a76ea08e616d2f8a939412913fbb096?s=140&#038;d=mm&#038;r=g 2x' class='avatar avatar-70 photo' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 11<i class="rcli fa-calendar-check-o"></i>Регистрация: 24-03-2004        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/byutifikator-form/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Интерфейс]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/osnovy-yazyka-visual-foxpro/</link>
					<title><![CDATA[Основы языка Visual FoxPro]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Tue, 08 Nov 2022 12:35:23 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Основы языка Visual FoxPro</h1>
													</header>
													<p align="left">Язык VFP это сильно дополненный и расширенный язык xBase. В Visual FoxPro язык программирования объектно-ориентированный, то есть базовой конструкцией языка является понятие класса. Исходный же вариант xBase это чистейший структурный язык, с базовым понятием процедур и функций. Таким образом, современный язык программирования Visual FoxPro допускает совмещать как и программирование "по старинке" описанием массы процедур, так и в стиле ООП, создавая сложную иерархию классов.</p>
<p align="left">Разумный же выбор стиля программирования сделает Ваши программы читабельными, легкими для понимания, с другой стороны, позволит Вам быстро создавать мощные приложения. Как уже говорилось, язык Visual FoxPro сильно перегружен языковыми конструкциями, стандартными функциями и операторами. Это сделано из-за соображений совместимости со старыми версиями FoxPro. Дать полное описание всех конструкций языка представляется невозможным из-за огромного количества материала. Поэтому мы отсылаем читателя к Visual FoxPro Online Documentation справочной базе данных по программированию VFP. Размер этой базы данных около 80 Mb, и ее можно установить при установке самого VFP себе на жесткий диск или же оставить на оригинальном CD-диске. Здесь же мы будем стараться приводить описания только тех языковых конструкций, которые потребуются нам для более полного изложения материала. Если в приводимых программах Вы встретите незнакомую функцию или оператор, попробуйте найти его описание в Visual FoxPro Online Documentation, в крайнем случае, напишите мне, и я обязательно подробно про него расскажу.</p>
<p align="left">Итак, здесь рассматриваются:</p>
<p align="left"><b>1. Понятие типов данных и массивов<br />
2. Венгерская нотация<br />
3. Понятие программной единицы (процедуры) и их типы<br />
</b><b>4. Операторы<br />
</b><b>5. Организация процедур и функций<br />
</b><b>6. Циклы и условные операторы<br />
</b><b>7. Реакция на события<br />
</b><b>9. Форма элемент Вашего приложения</b></p>
<h3 align="center"><b>Понятие типов данных и массивов</b></h3>
<p align="center"><b>Типы данных.</b></p>
<p align="left">Если Вы уже имели какой-то опыт в программировании, Вам не нужно особенно объяснять что такое типы данных и с чем их едят. Если же Вы понятия не имеете о данных и об их типах, внимательно прочитайте этот раздел. Здесь же мы рассмотрим основные особенности типов данных в VFP.</p>
<p align="left">Первое, что отличает VFP от других языков программирования, это то, что в VFP все переменные динамические с неявным объявлением типа. То есть, Вы всегда можете создать переменную, некоторое время ее использовать и потом удалить. При создании переменная всегда имеет тип logical со значением false и тип ее фиксируется (определяется) при первом присваивании переменной какого-либо значения. То есть, при первом присваивании переменная меняет свой тип на тип присваиваемых ей данных. Изменить свой тип переменная может только один раз, при первом присваивании. Переменные могут быть следующих типов:</p>
<p align="left"><b>Logical:</b> Логический тип, возможные значения .T. или .F. Точки обязательны это наследство старого языка xBase</p>
<p align="left"><b>Numeric (float):</b> Числовой с плавающей точкой</p>
<p align="left"><b>Character (string)</b>: Строковый - строка символов. Раньше максимальная длина строки была равна 255 символов, теперь 64 Kb.</p>
<p align="left"><b>Date</b>: Дата. Значение определяется как дата с установленным разделителем в установленном формате в {} скобках. Например, по умолчанию, {12/31/99}. Более подробно см. команду определения типа даты SET DATE.</p>
<p align="left"><b>DateTime</b>: Дата и время. Тоже что и дата, но хранит также и время. Более подробно мы рассмотрим этот тип позже.</p>
<p align="left"><b>Object:</b> Тип-объект. Переменная такого типа хранит или ссылку на объект или значение NULL В этой таблице перечислены наиболее часто используемые типы.</p>
<p align="left">Кроме того, в некоторых случаях, могут создаваться переменные с любым типом данных, разрешенном в таблицах, то есть, например, memo, general и др. (См. команды SCATTER и GATHER).</p>
<p align="left">Кроме определения типа весьма важным является и определения области действия переменной. В VFP наиболее часто используются переменные глобальные, частные и локальные. Кроме того, есть еще региональные и некоторые другие, но мы заострим внимание только на первых трех типах области действия.</p>
<p align="left">Объявление типа области действия переменной производится ниже указанными командами. Внимание! Объявление типа области действия переменной всегда должно предшествовать ее первому присваиванию! По умолчанию, переменные без объявления области действия становятся частными (приватными) о чем более подробно будет сказано чуть ниже.</p>
<p align="left">Глобальные переменные объявляются командой <i>PUBLIC</i> и существуют в течение выполнения всей программы или всего приложения. При отладке (в среде VFP) глобальные переменные существуют в течение всего сеанса работы с VFP, пока они не будут явно удалены из памяти. Пример объявления глобальных переменных:</p>
<p align="left"><i>PUBLIC gcMyName, gdCurrentDate gcMyName = Иван Никитин gdCurrentDate = date()</i></p>
<p align="left">Частные переменные (приватные) существуют в течение выполнения текущего программного модуля и доступны во всех вызываемых им модулях. Эти переменные автоматически удаляются из памяти при окончании выполнения модуля, в котором они были объявлены и созданы. Такой тип области действия получают все необъявленные явно переменные, кроме массивов. По умолчанию, массивы становятся глобальными. Явно объявить этот тип области действия можно командой <i>PRIVATE</i>.</p>
<p align="left">Локальные переменные существуют и доступны только в том модуле, в котором они объявлены. Эти переменные объявляются командой <i>LOCAL</i> и удаляются из памяти автоматически при завершении выполнения программного модуля. Как мы уже говорили, в VFP все переменные динамические.</p>
<p align="left">Как мы убедились, VFP очень бережно работает с памятью, создавая переменные частными по умолчанию и удаляя их из памяти при завершении модуля, в котором они были созданы. Иногда, правда, приходятся самим удалить переменные. Это можно сделать командой RELEASE. Как мы отмечали выше, переменные не могут менять свой тип. Но, используя удаление переменной из памяти, можно создавать такую же переменную, но с другим типом. Я не представляю себе, для чего это нужно реально, но все же вот пример, как это сделать (После символов &amp;&amp; - примечания): PUBLIC gMultiTypeVar &amp;&amp; Это глобальная переменная<br />
</p>
<p align="left">gMultiTypeVar = 1.00 &amp;&amp; Ее тип числовойRelease gMultiTypeVar<br />
gMultiTypeVar = "Hello" &amp;&amp; Теперь это строка<br />
Release gMultiTypeVar<br />
gMultiTypeVar = {01/01/2000} &amp;&amp; А сейчас - дата</p>
<p align="center"><b>Венгерская нотация</b></p>
<p align="left">В Вашем приложении могут быть сотни и тысячи переменных. Чтобы избежать путаницы и долгих размышлений при отладке программы типа: "A[i,j] что за массив и чего он здесь вообще делает?" была предложена и успешно используется стройная система именования переменных и других объектов программы.</p>
<p align="left">По родине предложившего эту систему программиста она названа Венгерская нотация. Система именования очень проста. Прилагаемо к VFP, имя переменной начинается с 2-х буквенного префикса, 1-я буква которого область действия переменной, 2-я буква ее тип. То есть:</p>
<p align="left"><b>lc</b> - (local character) локальная символьная<br />
<b>ld</b> - (local date) локальная типа дата<br />
<b>gn</b> - (global numeric) глобальная числовая<br />
<b>ga</b> - (global array) глобальный массив и так далее.</p>
<p align="left">Кроме того, желательно все объекты и классы также объявлять согласно венгерской нотации, но об этом позже. Само имя переменной должно быть максимально информативным. Например, хорошо объявленные переменные:</p>
<p align="left"><b>ldCurrentDate<br />
gaMyCustomers<br />
gnAppVersion</b></p>
<p align="left">Всячески следует избегать имен переменных типа A[i,j], K1, L2 R0 и т.п. так часто приводимых в старых учебниках по программированию. Единственным исключением, пожалуй, являются переменные циклов I и J. Это "вечные" имена для создания циклов.</p>
<h3 align="center"><b>Понятие программной единицы (процедуры) и их типы</b></h3>
<p align="left">Как мы уже говорили, Ваше приложение состоит из какого-то определенного набора программных единиц, или модулей (этот термин авторский, "чистого" понятия модуля в VFP нет). В VFP есть несколько типов программных единиц. На наш взгляд все исполняемые программные единицы в VFP можно отнести к двум большим группам:</p>
<p align="left"><b>Программные единицы<br />
Формы</b></p>
<p align="left">В отличие от старых версий FoxPro, VFP имеет понятие формы определенного описания окна (формы), которое может самостоятельно исполнятся. В старых версиях FoxPro существовало понятие Экрана (screen).Это не одно и то же, что и форма.</p>
<p align="left">Экран в FoxPro просто способ визуального построения окна, который в дальнейшем в любом случае переводился в исполняемую программу, строящую это окно (файл SPR). Форма же по своей сути является описанием класса окна, который при исполнении порождает объект, готовый к работе (см. ООП).</p>
<p align="left">Таким образом, в отличие от экранов FoxPro форма может быть самостоятельно исполнена без генерации программного модуля. Более подробно мы рассмотрим формы позже, а пока перейдем к другой группе программных единиц.</p>
<p align="left">Любая программная единица это набор операторов VFP, выполнение которых приводит к желаемому результату. В зависимости от назначения и способа построения программные единицы делятся на следующие группы:</p>
<p align="left"><b>Программы и процедуры<br />
Процедурные файлы и описание классов<br />
Функции, определенные пользователем (UDF)<br />
Хранимые процедуры и триггеры<br />
Программы запросов<br />
Программы меню</b></p>
<p align="left">Четкого различия на уровне операторов между всеми этими группами нет. Просто они по разному строятся (например, запросы и меню стоятся автоматически), и соответственно имеют разное назначение. Здесь мы пока не приводим подробное описание каждой группы, лишь обозначим общую идеологию этого построения и типы файлов, в которых сохраняются эти программные единицы. Любая программная единица хранится в файле. Стандартным расширением для такого файла является расширение PRG. При выполнении или при построении проекта этот файл компилируется в p-код и затем выполняется. Компиляция проходит очень быстро и обычно пользователь VFP даже не замечает время, потраченное VFP на компиляцию при выполнении. Соответственно, при выполнении построенного проекта компиляция уже не нужна, так как проект строится на основе уже скомпилированных модулей.</p>
<p align="left">Наборы готовых "кирпичиков" процедур можно объединять в файлы (об этом см. ниже), что дает нам процедурные файлы. Кроме того, есть большой класс програмных элементов, именуемый User defined function (UDF), но об этом ниже.</p>
<p align="left">Хранимые процедуры это такие же наборы процедур, хранимых в базе данных. Об этом см. раздел "Понятие базы данных". Программы запросов и программы меню строятся автоматически и соответственно имеют расширения QPR и MPR. Как правило, Вам не нужно их менять или править. Более подробно об этом мы рассмотрим в разделах применение RQBE и Построение меню.</p>
<h3 align="center"><b>Операторы</b></h3>
<p align="left">Операторы это элементарные командные единицы Вашей программы. При работе с VFP, Вам доступно окно Command, позволяющее выполнять эти команды поодиночке, в принципе, последовательное выполнение операторов и есть работа Вашего приложения. Конечно же, на практике дело обстоит несколько сложнее, так как мы имеем дело с системой, управляемой событиями, но в первом приближении, можно представить дело именно так: "Ваше приложение представляет набор некоторых, команд, выполнение которых и есть работа Вашего приложения".</p>
<p align="left">Операторы (команды) VFP могут быть как простыми, так и очень сложными и длинными, равно как и команда, выполняемая оператором, может быть простой, а может быть и весьма сложной и емкой. Конечно же, здесь мы не ставим перед собой цель подробно объяснить все команды VFP, для этого у нас попросту нет ни времени, ни сил, ни объема, и, в конце концов, для этого существует Help (справочная информация), но несколько простых оператором мы рассмотрим.</p>
<p align="left">Итак, оператором в VFP считается одна строка программы. Пустые строки игнорируются. Если оператор не умещается на одной строке, или программисту кажется более наглядным разместить один оператор на нескольких строках, то это можно сделать, поставив в конце строки, которую требуется продолжить символ "точка с запятой", например, здесь приведен один оператор:</p>
<p><i>SELECT ;<br />
Name, Address ;<br />
FROM Customers ;<br />
INTO TABLE Forieners ;<br />
WHERE not Country = Россия</i></p>
<h3 align="center"><b>Организация процедур и функций</b></h3>
<p align="left">Процедуры и программы по сути своей одно и тоже. Обычно процедура начинается ключевым словом PROCEDURE, что показывает компилятору что это и есть процедура. Заканчивается процедура словом RETURN, что завершает выполнение процедуры и возвращает управление в вызываемую программу. Обычно имя процедуры и имя файла, в котором она хранится, совпадают. Однако, можно с одном файле разместить несколько процедур, что даст нам процедурный файл. Особой разницы, как хранить процедуры вместе или врозь, в отдельных файлах, нет.</p>
<p align="left">При построении проекта они все равно будут объединены в файл приложения, поэтому мы рекомендуем оформлять разные процедуры разными файлами, так легче с ними работать. Процедура может быть вызвана из любого места программы или другой процедуры, выполниться и вернуться в вызывающую программу.</p>
<p align="left">Самая верхняя процедура обычно называется главной (стартовой) программой и, собственно, и есть основной единицей Вашего приложения (хотя это и необязательно, как мы покажем ниже). При вызовах процедуры может случиться так, что какая-то процедура (или функция) вызывает саму себя. Это называется рекурсией. С рекурсией в VFP следует обращаться крайне осторожно. VFP поддерживает до 128 рекурсивных вызовов, не более, поэтому мы настоятельно рекомендуем не пользоваться рекурсивными вызовами.</p>
<p align="left">Процедура может принимать при ее вызове параметры от вызывающей программы. Параметры могут объявляться как частные переменные (ключевое слово <b>PARAMETERS</b>) или как локальные переменные (ключевое слово <b>LPARAMETERS</b>). Как именно объявлять параметры дело Вашего вкуса. Число передаваемых параметров может быть меньше, чем число объявленных параметров. В этом случае "лишние" параметры процедуры инициализируются в значение false (.F.). Пример оформления процедуры:</p>
<p align="left"><i><pre class='bbcode'>  Procedure MyProc<br />  
  parameter nScope<br />  
  ? "Число pi="+str(nScope)<br />  
  return  
</pre></i></p>
<p align="left">Соответственно вызов этой процедуры выглядит так:</p>
<p align="left"><i><pre class='bbcode'>  Do MyProc with 3.14  
</pre></i></p>
<p align="left">Программа, дойдя до оператора Do MyProc, произведет поиск файла myproc.prg (или откомпилированного myproc.fxp) и произведет вызов этой процедуры. При вызове переменной-параметру nScope будет передано значение 3.14, и начнет исполняться процедура, пока не будет достигнут конец файла myproc.prg или не будет встречен оператор RETURN. При этом управление будет передано на следующий оператор после Do MyProc.</p>
<p align="left">Наборы процедур можно хранить в одном файле, что дает нам процедурный файл. В этом случае вызов выглядит так:</p>
<p align="left"><i>Do MyProc with 3.14 in MyProcFile</i>,</p>
<p align="left">где MyProcFile имя процедурного файла.</p>
<p align="left">Функции очень похожи на процедуры, за исключением двух ключевых моментов:</p>
<p align="left"><b>Функции могут вызываться из выражения, а не только прямым вызовом DO;<br />
Функции могут возвращать результат своей работы;</b></p>
<p align="left">То есть, можно сказать и так, если процедура что-то выполняет, то функция что-то вычисляет и сообщает об этом вызывающей программе. Конечно же, это деление весьма условно, и, как мы убедимся, более удобно использовать функции.</p>
<p align="left">Итак, функция начинается ключевым словом <b>FUNCTION</b> и завершается словом <b>RETURN</b>. После RETURN обычно следует переменная или выражение, которое будет возвращено вызывающей программе. Если это выражение отсутствует или отсутствует само ключевое слово RETURN, то предполагается возврат логического выражения .T. (истина).</p>
<p align="left">Пример функции, которая вычисляет что-то:</p>
<pre align="left"><pre class='bbcode'>  FUNCTION MyFUNC  
  PARAMETER X, Y, Z  
  LOCAL Result  
  Result=x+y+z  
  RETURN Result  
</pre></pre>
<p align="left">Вызов этой функции может быть таким:</p>
<p align="left"><i>MyVar = MyFunc(MyParam1, MyParam2, MyParam3)</i></p>
<p align="left">или таким:</p>
<p align="left"><i>Something = MyFunc(Param1) + MyFunc(Param2)</i></p>
<p align="left">или даже так:</p>
<p align="left"><i>=MyFunc()</i></p>
<p align="left">Как видно, во втором и третьем случае число передаваемых в функцию параметров меньше, чем объявлено в самой функции. Это не ошибка, "лишние" параметры принимаются как переменные логического типа со значением .F. (ложно). Этот момент следует учитывать,</p>
<p align="left">Число переданных параметров в функции всегда можно узнать с помощью функции PARAMETERS(), или проверить параметры функцией EMPTY(), которая вернет .T., если выражение, переданное в нее, является пустым (то есть, .F. или пустая строка или 0 или пустая дата или NULL)</p>
<p align="left">В последнем примере видно как функция вызывается без фиксации возвращаемого результата (кстати говоря, тут и сам знак = не нужен, но так читабельнее). То есть в этом случае, возвращаемый результат нигде не сохраняется. В этом случае, функция ведет себя как типичная процедура, выполняя что-то, а не вычисляя. Кстати, большинство функциональных возможностей VFP реализовано именно как функции.</p>
<p align="left">Далее мы увидим, что методы классов тоже реализуются именно как функции. Функции, определенные Вами, в VFP называются User Defined Function, то есть функции, определенные пользователем. UDF это очень мощный инструмент структурного программирования.</p>
<h3 align="center"><b>Циклы и условные операторы</b></h3>
<p align="left">Если Вы знакомы со структурным программированием, то Вам особенно не нужно объяснять, что такое циклы и условные операторы. Но все же вкратце на этом остановимся.</p>
<p align="left">Условный оператор позволяет выполнять тот или иной блок программы в зависимости от какого-то условия:</p>
<p align="left"><i>IF lExpression &lt;часть кода 1&gt; ELSE &lt;часть кода 2&gt;<br />
ENDIF</i></p>
<p align="left"><b>lExpression</b> любое логическое выражение. Если оно истинно, то выполняется "часть кода 1", иначе "часть кода 2". В VFP существует масса функций, результат которых является логическим и поэтому может использоваться в этой конструкции.</p>
<p align="left">Циклы позволяют выполнить какую либо часть кода несколько раз. Соответственно, в VFP существуют несколько видов циклов:</p>
<p align="left"><b>Циклы с предусловием<br />
Циклы перечисления<br />
Циклы "для каждого"</b></p>
<p align="left">Циклов с послесловием, таких как Паскалевский цикл repeat until, в VFP нет. Но, при желании, их можно легко реализовать. Циклы с предусловием это циклы, выполняющиеся до тех пор, пока условие выполнения истинно. Проверка условия происходит перед очередным циклом, отсюда и название.</p>
<p align="left">Такой цикл строится такой конструкцией :</p>
<p align="left"><i>DO WHILE lExpression<br />
&lt;операторы тело цикла&gt;<br />
ENDDO</i></p>
<p align="left">Цикл перечисления это цикл, в котором происходит последовательное наращивание (или уменьшение) какого либо значения, то есть его перечисление.</p>
<p align="left">Типичный цикл перечисления:</p>
<p align="left">FOR I = nMin TO nMax STEP nStep<br />
&lt;операторы тело цикла&gt;<br />
ENDFOR</p>
<p align="left">В этом случае, происходит последовательное увеличение переменной цикла (в данном примере I) от минимального значения nMin, до максимального nMax, с шагом приращения nStep.</p>
<p align="left">Циклы "для каждого" очень удобно использовать для последовательного просмотра массивов или коллекций (о них мы поговорим позже). В этом случае, произойдет выполнение операторов цикла для каждого элемента этого массива или коллекции:</p>
<p align="left">Приведем два примера использования этого цикла. Первый пример создается массив и затем последовательно выводятся его элементы оператором (?) :</p>
<pre align="left"><pre class='bbcode'>  DIMENSION cMyArray(3)  
  cMyArray[1] = 'A'  
  cMyArray[2] = 'B'  
  cMyArray[3] = 'C'  
  FOR EACH cMyVar IN cMyArray  
  ? cMyVar  
  ENDFOR  
</pre></pre>
<p align="left">В следующем примере с помощью OLE Automation создается объект книги Excel и последовательно выводятся имена листов этой книги:</p>
<pre align="left"><pre class='bbcode'>  oExcel = CREATE("Excel.Application")  
  oExcel.Workbooks.ADD  
  FOR EACH oMyVar IN oExcel.sheets  
  ? oMyVar.name  
  ENDFOR  
</pre></pre>
<p align="left">Во всех циклах можно прервать выполнение цикла оператором EXIT или прекратить выполнение текущей итерации (перейти на следующую итерацию) с помощью команды LOOP.</p>
<p align="center"><b>Реакция на события</b></p>
<p align="left">Как мы уже отмечали, VFP реализует систему, управляемую событиями. Поговорим об этом более подробно. Первые языки программирования и первые подходы к программированию реализовали модель, управляемую данными. То есть программа чего-то там обрабатывала, и в зависимости от данных (исходных, вычисленных, сохраненных и проч.) выполняла тот или иной свой блок.</p>
<p align="left">Характерным отличием такой модели является наличие алгоритма обработки, то есть четкой схемы, показывающей работу программы. К сожалению (или к счастью?) мир устроен по-другому. Динамичное развитие ситуации невозможно представить в виде законченных схем, блоков готовых решений. Мы не знаем, что случится через секунду или через минуту, мы также не знаем когда вообще что-нибудь случится. И, соответственно, мы не можем получить законченный алгоритм обработки.</p>
<p align="left">Таким образом, мы приходим к понятию события. Событие это некоторое изменение окружающего нас мира. Событием может быть все что угодно, например (применимо к компьютеру), пользователь передвинул мышку, нажал кнопку, модем получил очередной байт или блок байтов, кто-то ломится к нам по сети, прошло столько-то секунд после какой-то команды и прочее.</p>
<p align="left">Соответственно, суть системы управляемой событиями это описание реакции системы на определенные события. Нетрудно видеть, что алгоритма здесь нет, потому что мы не можем предсказать события. Мы можем лишь заявить следующее: "В случае того-то и того-то система поведет себя так-то и так-то". Таким образом, программирование системы заключается в описании реакции на события. Это очень важный момент в понимании подобных систем. Основное отличие от обычных подходов в том, что мы описываем только те события, которые нас интересуют, оставляя для остальных стандартную (ранее описанную) реакцию. То есть, если при создании обычных программ, Вы были обязаны описать все функциональные блоки Вашей программы, то в данном случае, Вы описываете лишь то, что отличает Вашу программу от стандартного поведения системы, как бы говоря: "А в остальном веди себя, как и прежде".</p>
<p align="left">Кто и как расписал это "прежде" сейчас Вас не интересует, главное то, что программа может себя вести стандартным образом, пусть даже никак, весь пустая реакция это тоже реакция. Наиболее полно система, управляемая событиями, реализуется в объектной модели программирования, и мы рассмотрим ее позже, но в VFP есть еще несколько способов управлением реакцией на события. Первое, что необходимо знать, это понятие обработчика событий. Когда Вы отлаживаете Ваше приложение в среде VFP, или просто экспериментируете с VFP, Вам об этом заботиться не надо, так как сам VFP уже имеет свой обработчик событий, другое дело, когда стартует Ваше уже законченное приложение. Вы должны включить его при старте и выключить при окончании работы Вашего приложения. При всей своей сложности это делается весьма просто:</p>
<p align="left"><i>* Старт &lt;инициализация Вашего приложения&gt;<br />
READ EVENTS<br />
* Завершение<br />
CLEAR EVENTS</i></p>
<p align="left">И все. Где именно это размещать мы покажем позже. А пока просто примите это к сведению.</p>
<p align="left">Наиболее ярким примером средств управления событиями, за исключением классов, пожалуй, является меню VFP. Система программирования VFP является весьма мощной, настолько, что Вы всегда можете не просто создать меню в своем приложении, но и изменить, дополнить или кардинальным способом поменять меню самого VFP. Это делается с помощью команд управления меню, которых довольно много. Однако, к счастью, концепция RAD, и именно построитель меню позволяет Вам создать сложное, полнофункциональное меню, вообще не прибегая к написанию кода. Сам процесс построения меню мы рассмотрим позже, здесь лишь отметим, что его результатом обычно является полученная программа (файл с расширением *.MPR) , которая будучи однократно запущенной, довольно быстро завершит свое выполнение и начнет отслеживать события (мышку, горячие клавиши) как обычное Windows-меню.</p>
<p align="left">Кроме этого примера, можно привести команды VFP ON :</p>
<p align="left"><b>ON KEY LABEL</b> - отслеживает нажатия на клавиши или мышь<br />
<b>ON ERROR</b> - отслеживает ошибки выполнения</p>
<p align="left">Попробуйте следующее. В среде VFP в командном окне введите строку:</p>
<p align="left"><i>On error MessageBox( Ошибка! )</i></p>
<p align="left">После чего, до тех пор, пока вы не отключите это отслеживание, вместо сообщения об ошибке будет окно с Вашим сообщением (MessageBox). Это же будет происходить и в Ваших программах (об исключениях мы поговорим позже). Вот хороший пример использования такого отслеживания.</p>
<p align="left">Функция <b>LocFile()</b> возвращает имя выбранного пользователем файла, но если пользователь отказывается от выбора, то происходит ошибка. Попробуем ее отследить:</p>
<pre align="left"><pre class='bbcode'>  local lcSelectedFile, llError, lcOnError  
  llError = .F.  
  lcOnError = ON("ERROR")  
  On Error llError = .T.  
  lcSelectedFile = locfile("readme.txt", "txt, me", "Файл")  
  On Error &amp;lcOnError  
  if llError MessageBox("Файл не выбран")  
  else  
  Modify file (lcSelectedFile)  
  endIf  
</pre></pre>
<p align="left">Комментарии к примеру: В переменной lcSelectedFile сохраняется полное имя выбранного файла, переменная llError сначала устанавливается в .F. и, в случае ошибки в .T., lcOnError сохраняет предыдущую установку ON ERROR, которая считывается функцией ON( ERROR ), восстанавливается установка макроподстановкой &amp;lcOnError, файл открывается с помощью команды Modify file (lcSelectedFile). И еще комментарий, не нужно принимать этот пример в качестве оптимального решения. На самом деле все можно сделать куда более элегантнее, это всего лишь пример перехвата ошибки (реакции на ошибку) в процессе выполнения программы.</p>
<p align="center"><b>Форма элемент Вашего приложения</b></p>
<p align="left">Форма это не программа. В старых версиях FoxPro существовало понятие экрана, то есть программы, строящей какое либо окно, набор окон или оформление экрана со всеми элементами управления. Такие программы автоматически создавались при построении проекта или с помощью команды Generate в меню. В любом случае, после изменения в образе этого экрана, Вы должны были снова сгенерировать экранную программу (файл SPR), чтобы изменения вступили в силу. Как уже отмечалось выше, Visual FoxPro это объектно-ориентированная среда, и здесь уже появляется понятие формы.</p>
<p align="left">Форма это класс, позволяющий породить объект (окно, набор окон, панель управления), который начинает немедленно существовать (выполнятся, если угодно). В отличие от экранов, форма может быть запущена (выполнена) без дополнительной генерации программы, с помощью команды: DO FORM </p>
<p>Соответственно, одна форма (класс) может породить несколько экземпляров (объектов), каждый из которых существует своей жизнью.</p>
<p>&nbsp;</p>
<p align="left">Формы это очень мощный инструмент инкапсуляции функциональных возможностей вашего приложения. Мы отдельно и подробно рассмотрим процесс построения форм и их использования в Вашем проекте, а пока просто немного информации для общего развития.</p>
<p align="left">Итак, форма это не программа, а класс. Класс формы хранится в файле с расширением SCX (SCT дополнительный файл). Экземпляр формы создается командой DO FORM, при этом, соответственно выполняются события (методы) формы, которые возникают при ее загрузке. При выполнении формы (если это не указана специально) создается объектная переменная. Этим процессом можно управлять, указывая имя переменной в команде DO FORM:</p>
<p align="left"><i>* Объявим переменную для формы<br />
public goMyForm<br />
* Запустим форму, в переменной будет создан объект<br />
DO FORM MyForm.scx NAME goMyForm<br />
* а теперь закроем форму, обращаясь к ее методу<br />
goMyForm.Release</i></p>
<p align="left">Иван Никитин</p>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/osnovy-yazyka-visual-foxpro/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Статьи]]></category>				</item>
											<item turbo="true">
					<link>https://foxclub.ru/knowledgebase/arhivirovanie-dannyh-v-prilozheniyah-na-ms-visual-foxpro/</link>
					<title><![CDATA[Архивирование данных в приложениях на MS Visual FoxPro]]></title>
                    					    <author><![CDATA[admin]]></author>
                    										    <pubDate>Fri, 28 Aug 2020 11:32:10 +0000</pubDate>
										<turbo:content>
						<![CDATA[
						<header>
														<h1>Архивирование данных в приложениях на MS Visual FoxPro</h1>
													</header>
													<div id="sol_body">
<div align="left">
<h3 align="center">Предистория</h3>
<p>Под созданием архивов подразумевается создание копий баз данных, таблиц, индексов и прочих файлов в <b>сжатом</b> виде. Использование консольных архиваторов типа PKZIP и PKUNZIP раздражает открытием окна сессии MSDOS. Хотелось найти что-нибудь 32-разрядное. В Инете предлагается некоторое количество подобных решений, например:</p>
<p><a href="http://www.bigspeedsoft.com/bszipdll/bszipdll.html">BigSpeedZip DLL - the faster and the smallest compression library</a>Все они SHAREWARE или EVALUATION. А хочется бесплатного... Тут и вспомнился <a href="http://www.gnu.org/software/software.html">GNU Project - Free Software Foundation (FSF)</a>, где обнаружилась библиотека ZLIB версии 1.13. В том числе и для Windows в самых разных видах:</p>
<p>&nbsp;</p>
<pre>The 16 bits DLL of ZLib 1.13 The 16 bits import library for the DLL of ZLib 1.13  The 32 bits DLL of ZLib 1.13 The 32 bits import library for the DLL of ZLib 1.13 The 32 bits static library of ZLib 1.13 for Visual C++ The 32 bits import library for the DLL of ZLib 1.13 for Borland C++  The 32 bits DLL of ZLib 1.13 for WinNT on Dec Alpha The 32 bits import library for the DLL of ZLib 1.13 for WinNT on Dec Alpha The 32 bits static library of ZLib 1.13 for Visual C++ for WinNT on Dec Alpha</pre>
<p>Для нашей задачки подходит третья в списке. Творчески переработав файл ZLIB.H получаем программку для VFP, регистрирующую некоторые функции из ZLIB.DLL</p>
<p>&nbsp;</p>
<pre>DECLARE INTEGER gzopen IN zlib STRING cPath, STRING cMode DECLARE INTEGER gzread IN zlib INTEGER iFileID, STRING @cBuffer, LONG lLength DECLARE INTEGER gzwrite IN zlib INTEGER iFileID, STRING @cBuffer, LONG lLength DECLARE INTEGER gzeof IN zlib INTEGER iFileID DECLARE INTEGER gzclose IN zlib INTEGER iFileID</pre>
<p>Этого набора вполне достаточно, чтобы написать функции ZipFile и UnzipFile для компрессии/декомпресии <b>отдельного</b> файла. Никаких ZIP-архивов... Что, впрочем, понятно, если вспомнить о UNIX происхождении библиотеки. Ну и ладно... Вот только как именовать получающиеся сжатые файлы? Если следовать принципам UNIX, то нужно просто к исходному имени файла добавить <b>еще одно расширение</b> - GZ, то есть</p>
<p>&nbsp;</p>
<pre>MAIN.DBF --&gt; MAIN.DBF.GZ</pre>
<p>Вопрос только в том, чтобы Windows "переварила" такое издевательство... Пробуем и убеждаемся, что Windows не только спокойно относится к таким именам файлов, но и правильно интерпретирует их. То есть под расширением фала понимается именно GZ, а не DBF.GZ. К тому же при установленном WinZip эти файлы отображаются в виде иконок архива и открываются с легкостью.</p>
<p>Теперь пишем функции ZipDir и UnzipDir, добавляем простенький индикатор типа ProgressBar и оформляем все это в виде библиотеки VCX.</p>
<h3>Как пользоваться всем этим?</h3>
<ol>
<li>Скачиваем архив zlib.zip</li>
<li>Копируем 32-разрядную ZLIB.DLL в папку WindowsSystem (или WinNTSystem32)</li>
<li>Помещаем ZLIB.VCX и ZLIB.VCT в папку с проектом</li>
<li>Открываем VFP и указываем путь к библиотеке
<pre> SET CLASSLIB TO &lt;path&gt;ZLIB.VCX ADDITIVE</pre>
</li>
<li>Создаем объект
<pre> z=CreateObject("zlib")</pre>
</li>
<li>Пользуемся им с помощью методов ZipFile, UnzipFile, ZipDir, UnzipDir. Синтаксис смотри ниже.</li>
<li>Удаляем объект
<pre> RELEASE z</pre>
</li>
</ol>
<h3>Синтаксис методов класса ZLIB</h3>
<h4>Object.ZipFile(cSrcFile,cDestFile)<br />
Object.UnzipFile(cSrcFile,cDestFile)</h4>
<p>cSrcFile - исходный файл<br />
cDestFile - сжатый файл</p>
<p>Возвращают результат .T. если все хорошо, или .F. в противном случае</p>
<p>Обе функции ничего не производят с именами файлов, поэтому исходный и сжатый файлы должны быть разными. Рекомендуется сжатым файлам назначать расширение GZ.</p>
<h4>Object.ZipDir(cSrcPath,cDestPath)</h4>
<p>cSrcFile - путь к папке с файлами<br />
cDestFile - путь к папке куда помещаются сжатые файлы</p>
<p>Возвращает число обработанных файлов если все хорошо, или -1 в противном случае</p>
<p>Функция обрабатывает файлы с атрибутом A по маске *.*<br />
Сжатые файлы имеют расширение GZ, а первая точка меняется на подчеркивание (из соображений совместимости). Например</p>
<p>&nbsp;</p>
<pre> MAIN.DBF --&gt; MAIN_DBF.GZ</pre>
<p>&nbsp;</p>
<h4>Object.UnzipDir(cSrcPath,cDestPath)</h4>
<p>cSrcFile - путь к папке со сжатыми файлами<br />
cDestFile - путь к папке куда помещаются распакованные файлы</p>
<p>Возвращает число обработанных файлов если все хорошо, или -1 в противном случае</p>
<p>Функция обрабатывает файлы с атрибутом A по маске *.GZ<br />
У конечных файлов удаляется расширение GZ и подчеркивание меняется на точку, то есть возвращается исходное расширение.</p>
<hr />
<p><i> Автор: Илья Тепликов<br />
E-mail: <a href="mailto:itp@karelia.ru">itp@karelia.ru</a> </i></p>
</div>
</div>
<div id="sol_avtor"></div>
<div id=block_author-rcl><h3>Автор публикации</h3><div class="rcl-userlist"><div class="userlist rows-list"><div class="user-single" data-user-id="3650">
    <div class="userlist_top">
		<div class="status_author_mess offline">не в сети 6 месяцев</div>        <h3 class="user-name">
            <a href="https://foxclub.ru/account/?user=3650">admin</a>
        </h3>
    </div>

    <div class="userlist_cntr">
        <div class="thumb-user">
            <a title="admin" href="https://foxclub.ru/account/?user=3650">
				<img alt='' src='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-70.jpg?ver=1666937900' srcset='https://foxclub.ru/wp-content/uploads/rcl-uploads/avatars/3650-150.jpg?ver=1666937900 2x' class='avatar avatar-70 photo avatar-default' height='70' width='70' />            </a>
			        </div>

        <div class="user-content-rcl">
			<i class="rcli fa-comment"></i>Комментарии: 1<i class="rcli fa-file-text-o"></i>Публикации: 123<i class="rcli fa-calendar-check-o"></i>Регистрация: 10-12-2000        </div>
    </div>
</div></div></div></div><p><a href="https://foxclub.ru/knowledgebase/arhivirovanie-dannyh-v-prilozheniyah-na-ms-visual-foxpro/?utm_source=turbo" target="_blank">(далее&hellip;)</a></p>																		]]>
					</turbo:content>
					<category><![CDATA[Разное]]></category>				</item>
								</channel>
</rss>
