<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; LangMF 9/11: хранение файлов в БД Access]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=4022</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=4022&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «LangMF 9/11: хранение файлов в БД Access».]]></description>
		<lastBuildDate>Tue, 28 Sep 2021 17:27:52 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: LangMF 9/11: хранение файлов в БД Access]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=149783#p149783</link>
			<description><![CDATA[<p><em>Без гарантий. Используете на свой страх и риск.</em></p><p>Вариант предыдущего скрипта, простой файловый Wsk-сервер с базой Access(ADO), с возможностью прослушивания/загрузки в базу данных mp3 саундтреков используя Web-интерфейс. При загрузке mp3 в БД используется временный файл. Файл БД &quot;base_wsk.mdb&quot; расположен рядом со скриптом.</p><p>http://127.0.0.1/1/sound.mp3 - формат на ссылку саундтрека в БД(с сохранением имени файла). <br />Формат таблицы хранения mp3-файлов: CREATE TABLE filestore(id COUNTER, name varchar, crc varchar, file longbinary). Для загрузки mp3 файла в БД используется TextStream.</p><p>Потребуется установленный LangMF 11<br />OC Win 7</p><p><strong>wsksrv.mf</strong><br /></p><div class="codebox"><pre><code>
Private Declare Function RtlComputeCrc32 Lib &quot;ntdll.dll&quot; (ByVal dwInitial As Long, ByVal pData As Long, ByVal iLen As Long) As Long
&lt;#Module=Simple_WSK&gt;

	Public objADODBRst
	Public objADODBConn 
	&#039;-----------------------------------------------------------------------------------
	Public Const adOpenDynamic = 2
	Public Const adOpenStatic = 3

	Public Const adLockBatchOptimistic = 4
	Public Const adLockReadOnly = 1

	Public Const adAffectCurrent = 1
	Public Const adUseServer = 2

	&#039;-----------------------------------------------------------------------------------
	Public Const sckTCPProtocol = 0
	Public Const sckClosed = 0
	&#039;-----------------------------------------------------------------------------------
	Public oCns
	Public sDBQCur
	Public sTempFile
	Public cnt
	Public oFs
	Public oStream
	

&#039;[Создание формы]
&#039;-------------------------------------------------------------------------------------------
Sub Load(cmdstr)

	sTempFile = Sys.Path &amp; &quot;upload.txt&quot;
	Set oCns = new CNSTR
	
	Set objADODBConn = CreateObject(&quot;ADODB.Connection&quot;)
	Set objADODBRst = CreateObject(&quot;ADODB.Recordset&quot;)
	Set oFs = CreateObject(&quot;Scripting.FileSystemObject&quot;)
	objADODBConn.CursorLocation = adUseServer
	
	&#039;/Установка параметров формы/
	&#039;----------------------------------------------------------------------------------		
	With Form

		.Hide
	
		On Error Resume Next
		Set .Tray.TrayIcon = LoadPicture(Sys.Path &amp; &quot;icon.ico&quot;)
		On Error GoTo 0

		.Tray.TrayTip = &quot;Simple Wsk Server [upload]&quot;
		.Tray.InTray = True
		
		.Menu.Popup = True
		.Menu.Add 1, &quot;Выбрать БД&quot;
		.Menu.Add 2, &quot;Выход&quot;

		.Add &quot;Wsk&quot;,1
		.Add &quot;Wsk&quot;,2

		.Add &quot;Wsk&quot;,11
		.Add &quot;Wsk&quot;,22
	
	End With

	&#039;/WSK для отображения страницы/
	&#039;----------------------------------------------------------------------------------
	With Form.Wsk(1)
		.Protocol = sckTCPProtocol
		.LocalPort = 80
		.Listen()
	End With

	With Form.Wsk(2)
		.Protocol = sckTCPProtocol
		.LocalPort = 0
	End With

	&#039;/WSK для загрузки файла mp3 в БД/
	&#039;----------------------------------------------------------------------------------
	With Form.Wsk(11)
		.Protocol = sckTCPProtocol
		.LocalPort = 10000
		.Listen()
	End With

	With Form.Wsk(22)
		.Protocol = sckTCPProtocol
		.LocalPort = 0
	End With

	&#039;----------------------------------------------------------------------------------
	ConnectDB False

End Sub

&#039;[Подключение к уже существующей БД]
&#039;-------------------------------------------------------------------------------------------
Sub ConnectDB(q)
	

	&#039;------------------------------------------------------------------------------------	
	If q Then
		&#039;Выбранная БД
		sDBQCur = Sys.CDlg.ShowOpen(&quot;Access database files (*.mdb)|*.mdb&quot;, _
                                            &quot;Открыть БД Access:&quot;,&quot;&quot;, _
                                            Sys.Path, &quot;mdb&quot;, 1, 1)
		If Len(sDBQCur) = 0 Then Exit Sub
	Else
		&#039;Расположенная рядом со скриптом БД
		sDBQCur = Sys.Path &amp; &quot;base_wsk.mdb&quot;
	End If

	&#039;------------------------------------------------------------------------------------	
	Err.Clear
	On Error Resume Next
		If objADODBConn.State &lt;&gt; 0 Then objADODBConn.Close()
		objADODBConn.Open oCns.ConnString(sDBQCur)

	If Err.Number&lt;&gt;0 Then 
		GetConnError()
		Unload Form
		Exit Sub
	End If

	If q Then MsgBox &quot;Обновите заглавную страницу.&quot;,vbInformation + vbSystemModal,&quot;Simple Server&quot;

End Sub

&#039;/Сообщение об ошибке/
&#039;-------------------------------------------------------------------------------------------	
Sub GetConnError()

		MsgBox 	Err.Source &amp; vbCR &amp; _
			Err.Description, _
			vbExclamation Or vbSystemModal, _
			&quot;Произошла ошибка&quot;	
		Err.Clear
			
End Sub

&#039;[Строки]
&#039;-------------------------------------------------------------------------------------------
Class CNSTR

	Private Sub Class_Initialize
	End Sub
	
	Private Sub Class_Terminate
	End Sub
	
	Public Property Get ConnString(stDBQ)
		ConnString = &quot;Driver={Microsoft Access Driver (*.mdb)};&quot; &amp; _	
				&quot;DBQ=&quot; &amp; stDBQ &amp; &quot;;&quot; &amp; _	
				&quot;ExtendedAnsiSQL=0;&quot; &amp; _	
				&quot;FIL=MS Access;&quot; &amp; _			
				&quot;ImplicitCommitSync=Yes;&quot; &amp; _	
				&quot;MaxBufferSize=4096;&quot; &amp; _	
				&quot;MaxScanRows=5;&quot; &amp; _	
				&quot;PageTimeout=5;&quot; &amp; _	
				&quot;ReadOnly=0;&quot; &amp; _	
				&quot;SafeTransactions=0;&quot; &amp; _	
				&quot;Threads=3;&quot; &amp; _	
				&quot;UserCommitSync=Yes&quot;
	End Property

	Public Property Get ServHeader()
		ServHeader = 	&quot;HTTP/1.1 200 OK&quot; &amp; vbCRLF &amp; _
				&quot;Cache-Control: no-cache, pre-check=0, post-check=0&quot; &amp; vbCRLF &amp; _
				&quot;Pragma: no-cache&quot; &amp; vbCRLF
	End Property


End Class

&#039;[Отправка саундтрека браузеру]
&#039;-------------------------------------------------------------------------------------------
Sub SendMp3Track(sRequest)

		Dim id, name

		&#039;/Индекс в БД/ 
		&#039;---------------------------------------------------------------------------
		Set mts = Sys.RXP.Execute(sRequest,&quot;GET\s+\/([0-9]+)\/(.+)\s+HTTP&quot;, True, False)
			id = mts(0).submatches(0)
			name = CStr(mts(0).submatches(1))

			&#039; Избавиться от escape-символов
			If name=~ig/\%// Then name = nameScr.decodeURL(name)
			

		&#039;/Выборка файла/ 
		&#039;---------------------------------------------------------------------------
		Err.Clear
		On Error Resume Next

		If objADODBRst.State &lt;&gt; 0 Then objADODBRst.Close()
		objADODBRst.Open &quot;SELECT filestore.file FROM filestore WHERE filestore.name=&#039;&quot; &amp; name &amp; _
				 &quot;&#039; AND filestore.id=&quot; &amp; id, objADODBConn, adOpenStatic, adLockReadOnly
		
		If Err.Number&lt;&gt;0 Then GetConnError()
		&#039;---------------------------------------------------------------------------
		Form.Wsk(2).SendData 	oCns.ServHeader &amp; _
					&quot;Content-Type: audio/*&quot; &amp; vbCRLF &amp; vbCRLF &amp; Sys.Conv.Buf(objADODBRst.Fields(0).Value, vbString)

		&#039; Важно
		DoEvents
		objADODBRst.Close()	
End Sub

&#039;[Отправка страницы браузеру]
&#039;--------------------------------------------------------------------------------------------
Sub SendIndexPage()

		Dim sDataStr
		
		sDataStr = vbCRLF &amp; &quot;&lt;OPTION VALUE=&#039;0&#039;&gt;Выберите пункт списка...&lt;/OPTION&gt;&quot; &amp; vbCRLF

		Err.Clear
		On Error Resume Next
		&#039;----------------------------------------------------------------------------
		If objADODBRst.State &lt;&gt; 0 Then objADODBRst.Close()
		objADODBRst.Open &quot;SELECT filestore.id, filestore.name FROM filestore&quot;, objADODBConn, adOpenStatic, adLockReadOnly

		With objADODBRst
			If Not .EOF Then
				.MoveFirst
				While Not .EOF
					sDataStr = sDataStr &amp; &quot;&lt;OPTION VALUE=&#039;&quot; &amp; CStr(.Fields(0).Value) &amp; &quot;&#039;&gt;&quot; &amp; CStr(.Fields(1).Value) &amp; &quot;&lt;/OPTION&gt;&quot; &amp; vbCRLF
					.MoveNext
				Wend
			End If
			.Close()
		End With
		If Err.Number&lt;&gt;0 Then GetConnError()

		&#039;----------------------------------------------------------------------------
		Form.Wsk(2).SendData oCns.ServHeader &amp; _
				&quot;Content-Type: text/html&quot; &amp; vbCRLF &amp; vbCRLF &amp; Sys.SHD.ResToStr(&quot;1&quot;) &amp; sDataStr &amp; Sys.SHD.ResToStr(&quot;2&quot;)
		&#039; Важно
		DoEvents

End Sub

&#039;[Добавление upload-файла в БД]
&#039;--------------------------------------------------------------------------------------------
Sub AddUploadFile2DB()

	Dim oTxtStream
	Dim lPos1, lPos2
	Dim sText

	Dim crc32
	Dim lSize
	Dim lfSZ
	Dim div, chunk
	Dim SZ1

	Const OPEN_EXISTING = 3
	Const GENERIC_READ = &amp;H80000000

	Const RONLY = 1
	Const NOCRNEW = False
	Const FMTASCII = 0
	
	Const BUFSZ = 1048576
	SZ1 = 1024
	
	&#039;/Разобрать upload-файл(найти начальную и конечную позицию данных)/
	&#039;------------------------------------------------------------------------------------
	&#039;------------------------------------------------------------------------------------
	Set f = sys.file.api
	If f.FOpen(sTempFile, OPEN_EXISTING, GENERIC_READ) = -1 Then 
		MsgBox &quot;Не найден файл данных&quot;,vbExclamation + vbSystemModal,&quot;Reply&quot;
		Exit Sub
	End If

	lfSZ = f.LOF
	If SZ1&gt;lfSZ Then SZ1 = lfSZ

	&#039; Найти начало upload-файла
	&#039;=========================================================
	sText = String(SZ1, Chr(32))
	f.FGet sText, 1

	Set mts = Sys.RXP.Execute(sText,&quot;boundary=(.+)\r\n[\W\w]+filename=&quot;&quot;(.+)&quot;&quot;\r\n&quot;,True,True)
	If mts.Count = 0 Then
		f.FClose
		MsgBox &quot;Форма не содержит корректных данных&quot;,vbExclamation + vbSystemModal,&quot;Reply&quot;
		Exit Sub
	End If
	sBound = CStr(mts(0).submatches(0))
	sFileName = CStr(mts(0).submatches(1))

	lPos1 = SZ1 - Len(Sys.RXP.Replace(sText, &quot;[\w\W]+Content-Type.*[\r\n]{1,}&quot;,&quot;&quot;, True, True))

	&#039; Найти конец upload-файла
	&#039;=========================================================
	f.FGet sText, lfSZ - SZ1 + 1
	lPos2 = lfSZ - SZ1 + Len(Sys.RXP.Replace(sText, sBound &amp; &quot;[\w\W]*&quot;,&quot;&quot;, True, True)) - 4
	&#039;=========================================================

	&#039;/Получение контрольной суммы crc32 upload-данных/
	&#039;------------------------------------------------------------------------------------
	&#039;------------------------------------------------------------------------------------
	lSize = lPos2 - lPos1	&#039;Размер данных
	crc32 = GetCRC32(f, lPos1 + 1, lSize)
	&#039;/MsgBox &quot;Файл: &quot; &amp; sFileName &amp; vbCRLF &amp; &quot;Размер: &quot; &amp; lSize &amp; vbCRLF &amp; &quot;CRC32: &quot; &amp; Hex(crc32),vbSystemModal Or vbInformation
	f.FClose

	&#039;/Запись файла в БД/
	&#039;------------------------------------------------------------------------------------	
	&#039;------------------------------------------------------------------------------------
	chunk = lSize Mod BUFSZ
	div = (lSize-chunk)/BUFSZ

	Err.Clear
	On Error Resume Next

	If objADODBRst.State &lt;&gt; 0 Then objADODBRst.Close()
	objADODBRst.Open &quot;SELECT * FROM filestore&quot;, objADODBConn, adOpenStatic, adLockBatchOptimistic

	With objADODBRst
		.AddNew
		.Fields(1).Value = CStr(sFileName)
		.Fields(2).Value = CStr(crc32)
	End With
		
	&#039;/Вставка файла фрагментами с использованием TextStream/
	&#039;------------------------------------------------------------------------------------			
	Set otxtStream = oFs.OpenTextFile(sTempFile, RONLY, NOCRNEW, FMTASCII)
	otxtStream.Skip lPos1
		
	SZ1 = BUFSZ
	For u=0 To div
		If u = div Then SZ1 = chunk
		objADODBRst.Fields(3).AppendChunk Sys.Conv.Buf(otxtStream.Read(SZ1),vbByte Or vbArray)
		DoEvents
		objADODBRst.Update
		DoEvents
	Next

	&#039;/Применить изменения/
	&#039;------------------------------------------------------------------------------------			
	objADODBRst.UpdateBatch adAffectCurrent
	DoEvents
	otxtStream.Close()	
	objADODBRst.Close()
	&#039;------------------------------------------------------------------------------------	
	If Err.Number&lt;&gt;0 Then GetConnError()

End Sub

&#039;/Получить CRC32 участка upload-файла/
&#039;-----------------------------------------------------------------------
Function GetCRC32(obj, startpos, ldSize)

	Dim pos
	Dim chunk, div, SZ
	Dim u
	Dim buf, ptr
	Dim crc

	Const BUF_SIZE = 65536

	&#039; Получение контрольной суммы фрагментами
	&#039;---------------------------------------------------------------
	Set buf = Sys.NewBuf()

	If BUF_SIZE &lt; ldSize Then

		chunk = ldSize Mod BUF_SIZE
		div = (ldSize - chunk)/BUF_SIZE

		SZ = BUF_SIZE
		buf.Size = SZ
		ptr = buf.Ptr

	Else	
		chunk = ldSize
		div = 0
	End If
	&#039;---------------------------------------------------------------

	crc = 0
	pos = startpos
	For u=0 To div

		If u = div Then 
			SZ = chunk
			buf.Size = SZ
			ptr = buf.Ptr
		End If

		obj.GetMem ptr, SZ, pos
		crc = RtlComputeCrc32(crc, ptr, SZ)
		pos = pos + SZ
	Next
	&#039;---------------------------------------------------------------
	buf.Size = 0
	GetCRC32 = crc

End Function

&lt;#Module&gt;

&#039;[Обработчики событий элементов управления формы]
&#039;-------------------------------------------------------------------------------------------
&lt;#Form=Form&gt;

	&#039;/Отправка страницы/саундтрека обозревателю/ 
	&#039;------------------------------------------------------------------------------------
	Sub Wsk1_ConnectionRequest(RequestID)
		
		If Form.Wsk(2).State = 0 Then 
			Form.Wsk(2).Accept(RequestId)
		Else
			&#039; Принудительно закрыть порт
			Form.Wsk(2).Close()
			Form.Wsk(2).Accept(RequestId)
		End If

	End Sub

	&#039;------------------------------------------------------------------------------------
	Sub Wsk2_DataArrival(lBytes)

		Dim sData
		Dim r
		
		sData = CStr(sData)
		Form.Wsk(2).GetData sData, vbString
		
		&#039;Проверка на соответствие формата адреса файла
		r = Sys.RXP.Test(sData,&quot;GET\s+\/[0-9]+\/.+\s+HTTP&quot;,True,False) 
		If r Then
			Call SendMp3Track(sData)			
		Else 
			Call SendIndexPage()
		End If

	End Sub

	&#039;/Загрузка файла в БД/
	&#039;------------------------------------------------------------------------------------
	Sub Wsk11_ConnectionRequest(RequestID)
		
		cnt = False

		If Form.Wsk(22).State = 0 Then 
			Form.Wsk(22).Accept(RequestId)
		Else
			&#039; Принудительно закрыть порт
			Form.Wsk(22).Close()
			Form.Wsk(22).Accept(RequestId)
		End If

		&#039;/Закрыть слушающий порт приема файла/
		Form.Wsk(11).Close()
		&#039; Важно
		DoEvents

		&#039;/Приостановить другие запросы, которые могут исходить от обозревателя/
		WaitMs(2000)	
		
		oStream.Close
		Call AddUploadFile2DB()	

		&#039;/Вернуться на заглавную/
		&#039;----------------------------------------------------------------------------
		Form.Wsk(22).SendData 	oCns.ServHeader &amp; _
					&quot;Content-Type: text/html&quot; &amp; vbCRLF &amp; vbCRLF &amp; Sys.SHD.ResToStr(&quot;3&quot;)
		
		&#039; Важно
		DoEvents

		cnt = False
		
	End Sub

	&#039;//Асинхронный приемник данных//
	&#039;------------------------------------------------------------------------------------
	Sub Wsk22_DataArrival(lBytes)
		
		Dim sData
		Dim r

		sData = CStr(sData)
		&#039;sData = String(lBytes, Chr(0))
		Form.Wsk(22).GetData sData, vbString

		&#039;/Убедиться что данные содержат файл/
		&#039;----------------------------------------------------------------------------
		If Not cnt Then	
			r = Sys.RXP.Test(sData,&quot;boundary=(.+)\r\n&quot;,True,True)
			cnt = True
			If Not r Then 
				Exit Sub
			Else
				Set oStream = oFs.OpenTextFile(sTempFile, 2, True, 0) 
			End If
		End If

		&#039;/Записать данные в файл/
		oStream.Write sData

	End Sub

	&#039;------------------------------------------------------------------------------------
	Sub Wsk2_SendComplete() 
		Form.Wsk(2).Close()
		&#039; Важно
		DoEvents

		&#039;/Открыть слушающий порт приема файла/
		If Form.Wsk(11).State = sckClosed Then 
			
			&#039;/Приостановить другие запросы, которые могут исходить от обозревателя/
			WaitMs(1000)

			Form.Wsk(11).Listen()
		End If
	End Sub

	&#039;------------------------------------------------------------------------------------
	Sub Wsk22_SendComplete() 
		Form.Wsk(22).Close()
		&#039; Важно
		DoEvents
	End Sub

	&#039;------------------------------------------------------------------------------------
	Sub Tray_MouseDown(button)
		If button=2 Then Form.Menu.Show()
	End Sub

	&#039;------------------------------------------------------------------------------------
	Sub Menu1_Click()
		ConnectDB True
	End Sub

	&#039;------------------------------------------------------------------------------------
	Sub Menu2_Click()
		Unload Form
	End Sub

	&#039;------------------------------------------------------------------------------------
	Sub Form_Load()
		
	End Sub

	&#039;-----------------------------------------------------------------------------------
	Sub Form_Unload()
		EndMF
		DoEvents
	End Sub

&lt;#Form&gt;

&#039;-------------------------------------------------------------------------------------------
&lt;#Script=nameScr#&gt;
function decodeURL(sTxt)
{
	return decodeURI(String(sTxt));
}  
&lt;#Script#&gt;


&#039;[Ресурсы (заглавная страница)]
&#039;/Начало заглавной страницы/
&#039;-------------------------------------------------------------------------------------------
&lt;#res id=&quot;1&quot; name=&quot;begin&quot; #&gt;
&lt;HTML&gt; 
&lt;HEAD&gt;
&lt;meta http-equiv=&quot;Content-Language&quot; content=&quot;ru&quot;&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=windows-1251&quot;&gt;
&lt;meta http-equiv=&quot;Content-Script-Type&quot; content=&quot;text/javascript&quot;&gt;
&lt;link rel=&quot;icon&quot; href=&quot;data:,&quot;&gt;
&lt;link rel=&quot;shortcut icon&quot; href=&quot;#&quot; /&gt;
&lt;TITLE&gt;Simple Server&lt;/TITLE&gt;

&lt;STYLE type=text/css&gt;
	TD {border:1px solid black;}
&lt;/STYLE&gt;
&lt;/HEAD&gt;

&lt;BODY&gt;
&lt;TABLE align=center&gt;
&lt;TR align=center&gt;
&lt;TD&gt;
&lt;SELECT ID=&quot;fld1&quot; SIZE=1 style=&quot;width: 300px&quot; onchange=&quot;setimage()&quot;&gt;
&lt;#res#&gt;

&#039;[OPTIONS]

&#039;/Конец заглавной страницы/
&#039;-------------------------------------------------------------------------------------------
&lt;#res id=&quot;2&quot; name=&quot;end&quot; #&gt;
&lt;/SELECT&gt;
&lt;/TD&gt;

&lt;TD&gt;
&lt;FORM METHOD=&quot;post&quot; ENCTYPE=&quot;multipart/form-data&quot; ACTION=&quot;http://127.0.0.1:10000/&quot;&gt;
	&lt;INPUT TYPE=&quot;FILE&quot; NAME=&quot;filesender&quot; SIZE=30 ACCEPT=&quot;audio/mpeg&quot;&gt;
	&lt;INPUT TYPE=&quot;SUBMIT&quot; NAME=&quot;submit1&quot; VALUE=&quot;Отправить&quot;/&gt;
	&lt;INPUT TYPE=&quot;RESET&quot; NAME=&quot;reset1&quot; VALUE=&quot;Сброс&quot;/&gt;
&lt;/FORM&gt;
&lt;/TD&gt;
&lt;/TR&gt;

&lt;TR align=center&gt;
&lt;TD COLSPAN=2&gt;
&lt;AUDIO ID=&quot;sound1&quot; controls preload=&quot;metadata&quot; style=&quot;width:100%&quot;&gt;&lt;/AUDIO&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TABLE&gt;

&lt;SCRIPT&gt;
var obj = document.getElementById(&quot;fld1&quot;);
var objSound = document.getElementById(&quot;sound1&quot;);
obj.selectedIndex = 0;

function setimage()
{
	var i = obj.selectedIndex;
	if (i==0){return;}

	var id = obj.value;
	var name = obj.item(i).text;
	sURL = String(&quot;http://127.0.0.1/&quot; + id + &quot;/&quot; + name);
	//alert(sURL);
	objSound.src = sURL;

}
&lt;/SCRIPT&gt;
&lt;/BODY&gt;
&lt;/HTML&gt;
&lt;#res#&gt;


&#039;/Перенаправление на заглавную/
&#039;-------------------------------------------------------------------------------------------
&lt;#res id=&quot;3&quot; name=&quot;refer&quot; #&gt;
&lt;HTML&gt; 
&lt;HEAD&gt;
&lt;meta http-equiv=&quot;Content-Language&quot; content=&quot;ru&quot;&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=windows-1251&quot;&gt;
&lt;meta http-equiv=&quot;Content-Script-Type&quot; content=&quot;text/javascript&quot;&gt;
&lt;A HREf=&quot;http://127.0.0.1/&quot;&gt;Вернуться&lt;/A&gt;
&lt;BODY&gt;
&lt;SCRIPT&gt;
window.location.href=&quot;http://127.0.0.1/&quot;
&lt;/SCRIPT&gt;
&lt;/BODY&gt;
&lt;/HTML&gt;
&lt;#res#&gt;
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Tue, 28 Sep 2021 17:27:52 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=149783#p149783</guid>
		</item>
		<item>
			<title><![CDATA[Re: LangMF 9/11: хранение файлов в БД Access]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=32421#p32421</link>
			<description><![CDATA[<p><em>Без гарантий. Используете на свой страх и риск.</em></p><p>Аналогичный пример с использованием Web-интерфейса, использующий формат БД Access предыдущего скрипта. Простой Wsk(Winsock Control)-сервер изображений с базой Access(ADO), с возможностью просмотра/загрузки небольших(jpg, jpeg, gif, png) изображений через Web-интерфейс. Для загрузки изображения в БД используется буфер в памяти. Файл БД Access &quot;base_wsk.mdb&quot; расположен рядом со скриптом. После запуска скрипта нужно открыть заглавную страницу http://127.0.0.1/ в обозревателе. Меню иконки в трее позволяет остановить скрипт.</p><p>http://127.0.0.1/1/pic.jpg - формат на ссылку изображения в БД(с сохранением имени файла). <br />Формат таблицы хранения файлов: CREATE TABLE filestore(id COUNTER, name varchar, crc varchar, file longbinary).</p><p>Потребуется установленный LangMF 11<br />OC Win 7</p><p><strong>wsksrv.mf</strong><br /></p><div class="codebox"><pre><code>
Private Declare Function RtlComputeCrc32 Lib &quot;ntdll.dll&quot; (ByVal dwInitial As Long, ByVal pData As Long, ByVal iLen As Long) As Long
&lt;#Module=Simple_WSK&gt;

	Public objADODBRst
	Public objADODBConn 
	&#039;-----------------------------------------------------------------------------------
	Public Const adOpenDynamic = 2
	Public Const adOpenStatic = 3

	Public Const adLockBatchOptimistic = 4
	Public Const adLockReadOnly = 1

	Public Const adAffectCurrent = 1
	Public Const adUseServer = 2

	&#039;-----------------------------------------------------------------------------------
	Public Const sckTCPProtocol = 0
	Public Const sckClosed = 0
	&#039;-----------------------------------------------------------------------------------
	Public oCns
	Public sDBQCur
	Public cnt
	Public sUPLOAD

&#039;[Создание формы]
&#039;-------------------------------------------------------------------------------------------
Sub Load(cmdstr)

	Set oCns = new CNSTR

	&#039;/Буфер приема файла/
	Set sUPLOAD = Sys.NewBuf()
	
	Set objADODBConn = CreateObject(&quot;ADODB.Connection&quot;)
	Set objADODBRst = CreateObject(&quot;ADODB.Recordset&quot;)
	objADODBConn.CursorLocation = adUseServer
	
	&#039;/Установка параметров формы/
	&#039;----------------------------------------------------------------------------------		
	With Form

		.Hide
	
		On Error Resume Next
		Set .Tray.TrayIcon = LoadPicture(Sys.Path &amp; &quot;icon.ico&quot;)
		On Error GoTo 0

		.Tray.TrayTip = &quot;Simple Wsk Server [mem_buf]&quot;
		.Tray.InTray = True
		
		.Menu.Popup = True
		.Menu.Add 1, &quot;Выбрать БД&quot;
		.Menu.Add 2, &quot;Выход&quot;

		.Add &quot;Wsk&quot;,1
		.Add &quot;Wsk&quot;,2

		.Add &quot;Wsk&quot;,11
		.Add &quot;Wsk&quot;,22
	
	End With

	&#039;/WSK для отображения страницы/изобажений/
	&#039;----------------------------------------------------------------------------------
	With Form.Wsk(1)
		.Protocol = sckTCPProtocol
		.LocalPort = 80
		.Listen()
	End With

	With Form.Wsk(2)
		.Protocol = sckTCPProtocol
		.LocalPort = 0
	End With

	&#039;/WSK для загрузки файла изображения в БД/
	&#039;----------------------------------------------------------------------------------
	With Form.Wsk(11)
		.Protocol = sckTCPProtocol
		.LocalPort = 10000
		.Listen()
	End With

	With Form.Wsk(22)
		.Protocol = sckTCPProtocol
		.LocalPort = 0
	End With

	&#039;----------------------------------------------------------------------------------
	ConnectDB False

End Sub

&#039;[Подключение к уже существующей БД]
&#039;-------------------------------------------------------------------------------------------
Sub ConnectDB(q)
	

	&#039;------------------------------------------------------------------------------------	
	If q Then
		&#039;Выбранная БД
		sDBQCur = Sys.CDlg.ShowOpen(&quot;Access database files (*.mdb)|*.mdb&quot;, _
                                            &quot;Открыть БД Access:&quot;,&quot;&quot;, _
                                            Sys.Path, &quot;mdb&quot;, 1, 1)
		If Len(sDBQCur) = 0 Then Exit Sub
	Else
		&#039;Расположенная рядом со скриптом БД
		sDBQCur = Sys.Path &amp; &quot;base_wsk.mdb&quot;
	End If

	&#039;------------------------------------------------------------------------------------	
	Err.Clear
	On Error Resume Next
		If objADODBConn.State &lt;&gt; 0 Then objADODBConn.Close()
		objADODBConn.Open oCns.ConnString(sDBQCur)

	If Err.Number&lt;&gt;0 Then 
		GetConnError()
		Unload Form
		Exit Sub
	End If

	If q Then MsgBox &quot;Обновите заглавную страницу.&quot;,vbInformation + vbSystemModal,&quot;Simple Server&quot;

End Sub

&#039;/Сообщение об ошибке/
&#039;-------------------------------------------------------------------------------------------	
Sub GetConnError()
	MsgBox Err.Source &amp; vbCRLF &amp; Err.Description, vbExclamation Or vbSystemModal, &quot;Error&quot;	
	Err.Clear
End Sub

&#039;[Строки]
&#039;-------------------------------------------------------------------------------------------
Class CNSTR

	Private Sub Class_Initialize
	End Sub
	
	Private Sub Class_Terminate
	End Sub
	
	Public Property Get ConnString(stDBQ)
		ConnString = &quot;Driver={Microsoft Access Driver (*.mdb)};&quot; &amp; _	
				&quot;DBQ=&quot; &amp; stDBQ &amp; &quot;;&quot; &amp; _	
				&quot;ExtendedAnsiSQL=0;&quot; &amp; _	
				&quot;FIL=MS Access;&quot; &amp; _			
				&quot;ImplicitCommitSync=Yes;&quot; &amp; _	
				&quot;MaxBufferSize=4096;&quot; &amp; _	
				&quot;MaxScanRows=5;&quot; &amp; _	
				&quot;PageTimeout=5;&quot; &amp; _	
				&quot;ReadOnly=0;&quot; &amp; _	
				&quot;SafeTransactions=0;&quot; &amp; _	
				&quot;Threads=3;&quot; &amp; _	
				&quot;UserCommitSync=Yes&quot;
	End Property

	Public Property Get ServHeader()
		ServHeader = 	&quot;HTTP/1.1 200 OK&quot; &amp; vbCRLF &amp; _
				&quot;Cache-Control: no-cache, pre-check=0, post-check=0&quot; &amp; vbCRLF &amp; _
				&quot;Pragma: no-cache&quot; &amp; vbCRLF
	End Property


End Class

&#039;[Отправка изображения браузеру]
&#039;-------------------------------------------------------------------------------------------
Sub SendPicture(sRequest)

		Dim id, name

		&#039;/Индекс в БД/ 
		&#039;---------------------------------------------------------------------------
		Set mts = Sys.RXP.Execute(sRequest,&quot;GET\s+\/([0-9]+)\/(.+)\s+HTTP&quot;, True, False)
			id = mts(0).submatches(0)
			name = CStr(mts(0).submatches(1))

			&#039; Избавиться от escape-символов
			If name=~ig/\%// Then name = nameScr.decodeURL(name)

		&#039;/Выборка изображения/ 
		&#039;---------------------------------------------------------------------------
		Err.Clear
		On Error Resume Next

		If objADODBRst.State &lt;&gt; 0 Then objADODBRst.Close()
		objADODBRst.Open &quot;SELECT filestore.file FROM filestore WHERE filestore.name=&#039;&quot; &amp; name &amp; _
				 &quot;&#039; AND filestore.id=&quot; &amp; id, objADODBConn, adOpenStatic, adLockReadOnly
		
		If Err.Number&lt;&gt;0 Then GetConnError()
		&#039;---------------------------------------------------------------------------
		Form.Wsk(2).SendData 	oCns.ServHeader &amp; _
					&quot;Content-Type: image/*&quot; &amp; vbCRLF &amp; vbCRLF &amp; Sys.Conv.Buf(objADODBRst.Fields(0).Value, vbString)

		&#039; Важно
		DoEvents
		objADODBRst.Close()	
End Sub

&#039;[Отправка страницы браузеру]
&#039;--------------------------------------------------------------------------------------------
Sub SendIndexPage()

		Dim sDataStr
		
		sDataStr = vbCRLF &amp; &quot;&lt;OPTION VALUE=&#039;0&#039;&gt;Выберите пункт списка...&lt;/OPTION&gt;&quot; &amp; vbCRLF

		Err.Clear
		On Error Resume Next
		&#039;----------------------------------------------------------------------------
		If objADODBRst.State &lt;&gt; 0 Then objADODBRst.Close()
		objADODBRst.Open &quot;SELECT filestore.id, filestore.name FROM filestore&quot;, objADODBConn, adOpenStatic, adLockReadOnly

		With objADODBRst
			If Not .EOF Then
				.MoveFirst
				While Not .EOF
					sDataStr = sDataStr &amp; &quot;&lt;OPTION VALUE=&#039;&quot; &amp; CStr(.Fields(0).Value) &amp; &quot;&#039;&gt;&quot; &amp; CStr(.Fields(1).Value) &amp; &quot;&lt;/OPTION&gt;&quot; &amp; vbCRLF
					.MoveNext
				Wend
			End If
			.Close()
		End With
		If Err.Number&lt;&gt;0 Then GetConnError()

		&#039;----------------------------------------------------------------------------
		Form.Wsk(2).SendData oCns.ServHeader &amp; _
				&quot;Content-Type: text/html&quot; &amp; vbCRLF &amp; vbCRLF &amp; Sys.SHD.ResToStr(&quot;1&quot;) &amp; sDataStr &amp; Sys.SHD.ResToStr(&quot;2&quot;)
		&#039; Важно
		DoEvents

End Sub

&#039;[Добавление файла в БД (используется буфер в памяти)]
&#039;--------------------------------------------------------------------------------------------
Sub AddFile2DB()

	Dim sFileName
	Dim sText
	
	Dim lPos1, lPos2
	Dim lSZ
	Dim lCHUNK
	Dim lFILE_SZ

	Dim crc32
	&#039;----------------------------------------
	lCHUNK = 1024
	lSZ = sUPLOAD.Size

	If lCHUNK&gt;lSZ Then lCHUNK = lSZ

	&#039;/Найти начальную позицию файла/
	&#039;------------------------------------------------------------------------------------
	sText = sUPLOAD.PString(0,lCHUNK)
		Set mts = Sys.RXP.Execute(sText,&quot;boundary=(.+)\r\n[\W\w]+filename=&quot;&quot;(.+)&quot;&quot;\r\n&quot;,True,True)
		If mts.Count = 0 Then
			sUPLOAD.Size = 0
			MsgBox &quot;Форма не содержит корректных данных&quot;,vbExclamation + vbSystemModal,&quot;Reply&quot;
			Exit Sub
		End If

		sBound = CStr(mts(0).submatches(0))
		sFileName = CStr(mts(0).submatches(1))

	lPos1 = lCHUNK - Len(Sys.RXP.Replace(sText, &quot;[\w\W]+Content-Type.*[\r\n]{1,}&quot;,&quot;&quot;, True, True))

	&#039;/Найти конечную позицию и размер файла/
	&#039;------------------------------------------------------------------------------------
	sText = sUPLOAD.PString(lSZ-lCHUNK, lCHUNK)
	lPos2 = lSZ - lCHUNK + Len(Sys.RXP.Replace(sText, sBound &amp; &quot;[\w\W]*&quot;,&quot;&quot;, True, True)) - 4
	lFILE_SZ = lPos2-lPos1

	&#039; Обновить буфер 
	sUPLOAD.SetData Sys.SHD.ArrayByte(sUPLOAD.PArray(lPos1,lFILE_SZ))	&#039;Byte()

	&#039; crc32
	crc32 = RtlComputeCrc32(0, sUPLOAD.Ptr, lFILE_SZ)
	&#039;/MsgBox &quot;Файл: &quot; &amp; sFileName &amp; vbCRLF &amp; &quot;CRC32: &quot; &amp; Hex(crc32),vbSystemModal Or vbInformation

	&#039;/Запись файла в БД/
	&#039;------------------------------------------------------------------------------------		
	Err.Clear
	On Error Resume Next

	If objADODBRst.State &lt;&gt; 0 Then objADODBRst.Close()
	
	objADODBRst.Open &quot;SELECT * FROM filestore&quot;, objADODBConn, adOpenStatic, adLockBatchOptimistic
	
	With objADODBRst
		.AddNew
		.Fields(1).Value = CStr(sFileName)
		.Fields(2).Value = CStr(crc32)
		.Fields(3).Value = sUPLOAD.GetData(vbArray Or vbByte)
		.UpdateBatch adAffectCurrent
	End With
		
	objADODBRst.Close()	
	&#039;------------------------------------------------------------------------------------	
	If Err.Number&lt;&gt;0 Then GetConnError()

	sUPLOAD.Size = 0	&#039;Очистить буфер
	
End Sub

&lt;#Module&gt;

&#039;[Обработчики событий элементов управления формы]
&#039;-------------------------------------------------------------------------------------------
&lt;#Form=Form&gt;

	&#039;/Отправка страницы/изображений обозревателю/ 
	&#039;------------------------------------------------------------------------------------
	Sub Wsk1_ConnectionRequest(RequestID)
		
		If Form.Wsk(2).State = 0 Then 
			Form.Wsk(2).Accept(RequestId)
		Else
			&#039; Принудительно закрыть порт
			Form.Wsk(2).Close()
			Form.Wsk(2).Accept(RequestId)
		End If

	End Sub

	&#039;------------------------------------------------------------------------------------
	Sub Wsk2_DataArrival(lBytes)

		Dim sData
		Dim r
		
		sData = CStr(sData)
		Form.Wsk(2).GetData sData, vbString
		
		&#039;Проверка на соответствие формата адреса изображения
		r = Sys.RXP.Test(sData,&quot;GET\s+\/[0-9]+\/.+\s+HTTP&quot;,True,False) 
		If r Then
			Call SendPicture(sData)			
		Else 
			Call SendIndexPage()
		End If

	End Sub

	&#039;/Загрузка файла в БД/
	&#039;------------------------------------------------------------------------------------
	Sub Wsk11_ConnectionRequest(RequestID)
		
		cnt = False
		sUPLOAD.Size = 0

		If Form.Wsk(22).State = 0 Then 
			Form.Wsk(22).Accept(RequestId)
		Else
			&#039; Принудительно закрыть порт
			Form.Wsk(22).Close()
			Form.Wsk(22).Accept(RequestId)
		End If

		&#039;/Закрыть слушающий порт приема файла/
		Form.Wsk(11).Close()
		&#039; Важно
		DoEvents

		&#039;/Приостановить другие запросы, которые могут исходить от обозревателя/
		WaitMs(2000)	
		
		Call AddFile2DB()	

		&#039;/Вернуться на заглавную/
		&#039;----------------------------------------------------------------------------
		Form.Wsk(22).SendData 	oCns.ServHeader &amp; _
					&quot;Content-Type: text/html&quot; &amp; vbCRLF &amp; vbCRLF &amp; Sys.SHD.ResToStr(&quot;3&quot;)
		
		&#039; Важно
		DoEvents

		cnt = False
		
	End Sub

	&#039;//Асинхронный приемник данных//
	&#039;------------------------------------------------------------------------------------
	Sub Wsk22_DataArrival(lBytes)
		
		Dim sData
		Dim lSZ
		Dim r

		sData = CStr(sData)
		Form.Wsk(22).PeekData sData, vbString
		&#039;Не допустимо DoEvents

		&#039;/Убедиться что данные содержат файл/
		&#039;----------------------------------------------------------------------------
		If Not cnt Then	
			r = Sys.RXP.Test(sData,&quot;boundary=(.+)\r\n&quot;,True,True)
			cnt = True
			If Not r Then Exit Sub
		End If

		&#039;/Записать данные в буфер/
		&#039;----------------------------------------------------------------------------
		With sUPLOAD
			lSZ = .Size
			.Size = lSZ + lBytes
			.Offset = lSZ
			.SetData sData
		End With

	End Sub

	&#039;------------------------------------------------------------------------------------
	Sub Wsk2_SendComplete() 
		Form.Wsk(2).Close()
		&#039; Важно
		DoEvents

		&#039;/Открыть слушающий порт приема файла/
		If Form.Wsk(11).State = sckClosed Then 
			
			&#039;/Приостановить другие запросы, которые могут исходить от обозревателя/
			WaitMs(1000)

			Form.Wsk(11).Listen()
		End If
	End Sub

	&#039;------------------------------------------------------------------------------------
	Sub Wsk22_SendComplete() 
		Form.Wsk(22).Close()
		&#039; Важно
		DoEvents
	End Sub

	&#039;------------------------------------------------------------------------------------
	Sub Tray_MouseDown(button)
		If button=2 Then Form.Menu.Show()
	End Sub

	&#039;------------------------------------------------------------------------------------
	Sub Menu1_Click()
		ConnectDB True
	End Sub

	&#039;------------------------------------------------------------------------------------
	Sub Menu2_Click()
		Unload Form
	End Sub

	&#039;------------------------------------------------------------------------------------
	Sub Form_Load()
		
	End Sub

	&#039;-----------------------------------------------------------------------------------
	Sub Form_Unload()
		EndMF
		DoEvents
	End Sub

&lt;#Form&gt;

&#039;-------------------------------------------------------------------------------------------
&lt;#Script=nameScr#&gt;
function decodeURL(sTxt)
{
	return decodeURI(String(sTxt));
}  
&lt;#Script#&gt;


&#039;[Ресурсы (заглавная страница)]
&#039;/Начало заглавной страницы/
&#039;-------------------------------------------------------------------------------------------
&lt;#res id=&quot;1&quot; name=&quot;begin&quot; #&gt;
&lt;HTML&gt; 
&lt;HEAD&gt;
&lt;meta http-equiv=&quot;Content-Language&quot; content=&quot;ru&quot;&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=windows-1251&quot;&gt;
&lt;meta http-equiv=&quot;Content-Script-Type&quot; content=&quot;text/javascript&quot;&gt;
&lt;link rel=&quot;icon&quot; href=&quot;data:,&quot;&gt;
&lt;link rel=&quot;shortcut icon&quot; href=&quot;#&quot; /&gt;
&lt;TITLE&gt;Simple Server&lt;/TITLE&gt;

&lt;STYLE type=text/css&gt;
	TD {border:1px solid black;}
&lt;/STYLE&gt;
&lt;/HEAD&gt;

&lt;BODY&gt;
&lt;TABLE align=center&gt;
&lt;TR align=center&gt;
&lt;TD&gt;
&lt;SELECT ID=&quot;fld1&quot; SIZE=1 style=&quot;width: 300px&quot; onchange=&quot;setimage()&quot;&gt;
&lt;#res#&gt;

&#039;[OPTIONS]

&#039;/Конец заглавной страницы/
&#039;-------------------------------------------------------------------------------------------
&lt;#res id=&quot;2&quot; name=&quot;end&quot; #&gt;
&lt;/SELECT&gt;
&lt;/TD&gt;
&lt;TD&gt;
&lt;FORM METHOD=&quot;post&quot; ENCTYPE=&quot;multipart/form-data&quot; ACTION=&quot;http://127.0.0.1:10000/&quot;&gt;
&lt;INPUT TYPE=&quot;FILE&quot; NAME=&quot;filesender&quot; SIZE=30 ACCEPT=&quot;image/jpeg,image/gif,image/png&quot;&gt;
&lt;INPUT TYPE=&quot;SUBMIT&quot; NAME=&quot;submit1&quot; VALUE=&quot;Отправить&quot;/&gt;
&lt;INPUT TYPE=&quot;RESET&quot; NAME=&quot;reset1&quot; VALUE=&quot;Сброс&quot;/&gt;
&lt;/FORM&gt;
&lt;/TD&gt;
&lt;/TR&gt;

&lt;TR align=center&gt;
&lt;TD COLSPAN=2&gt;
&lt;IMG ID=&quot;img1&quot;&gt;&lt;/IMG&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TABLE&gt;

&lt;SCRIPT&gt;
var obj = document.getElementById(&quot;fld1&quot;);
var objImg = document.getElementById(&quot;img1&quot;);
obj.selectedIndex = 0;

function setimage()
{
	var i = obj.selectedIndex;
	if (i==0){return;}

	var id = obj.value;
	var name = obj.item(i).text;
	sURL = String(&quot;http://127.0.0.1/&quot; + id + &quot;/&quot; + name);
	//alert(sURL);
	objImg.src = sURL;
}
&lt;/SCRIPT&gt;
&lt;/BODY&gt;
&lt;/HTML&gt;
&lt;#res#&gt;


&#039;/Перенаправление на заглавную/
&#039;-------------------------------------------------------------------------------------------
&lt;#res id=&quot;3&quot; name=&quot;refer&quot; #&gt;
&lt;HTML&gt; 
&lt;HEAD&gt;
&lt;meta http-equiv=&quot;Content-Language&quot; content=&quot;ru&quot;&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=windows-1251&quot;&gt;
&lt;meta http-equiv=&quot;Content-Script-Type&quot; content=&quot;text/javascript&quot;&gt;
&lt;A HREf=&quot;http://127.0.0.1/&quot;&gt;Вернуться&lt;/A&gt;
&lt;BODY&gt;
&lt;SCRIPT&gt;
window.location.href=&quot;http://127.0.0.1/&quot;
&lt;/SCRIPT&gt;
&lt;/BODY&gt;
&lt;/HTML&gt;
&lt;#res#&gt;
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Tue, 19 Jan 2010 18:49:38 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=32421#p32421</guid>
		</item>
		<item>
			<title><![CDATA[LangMF 9/11: хранение файлов в БД Access]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=31839#p31839</link>
			<description><![CDATA[<p><em>Без гарантий. Используете на свой страх и риск.</em></p><p>Скрипт предназначен для управления файловой базой данных в формате Access(ADO). Пользуясь пунктами меню &quot;Файл&quot; можно создавать новую базу, открывать соединение с уже созданной БД, добавлять и извлекать файлы. Добавление группы файлов, также, происходит при перетаскивании значков файлов из проводника на форму. Если файл является изображением (gif, jpg, jpeg, bmp), то выбор пункта списка(одиночный щелчок) выводит изображение в область просмотра. Двойной щелчок по списку выводит контекстное меню, позволяющее обновлять, извлекать или удалять заданный файл из БД.</p><p>Формат таблицы хранения файлов: CREATE TABLE filestore(id COUNTER, name varchar, crc varchar, file longbinary). Для добавления файлов используется TextStream.</p><p>Потребуется установленный <a href="http://langmf.ru/ftp/archive/LangMF_9.0.exe">LangMF 9.0</a>.<br />OC Win 7</p><p><strong>f_access.mf</strong><br /></p><div class="codebox"><pre><code>
&lt;#Module=FileBaseAccess_ADO&gt;

	&#039;-----------------------------------------------------------------------------------
	Public objADODBRst
	Public objADODBConn 
	Public objFs
	&#039;-----------------------------------------------------------------------------------
	Public Const adOpenDynamic = 2
	Public Const adOpenStatic = 3

	Public Const adLockBatchOptimistic = 4
	Public Const adLockReadOnly = 1
	Public Const adLockOptimistic = 3

	Public Const adAffectCurrent = 1
	Public Const adSaveCreateOverWrite = 2

	Public Const adUseServer = 2
	Public Const adUseNone = 1
	Public Const adUseClient = 3
	Public Const adUseClientBatch = 3

	&#039;-----------------------------------------------------------------------------------
	Public Const ODBC_ADD_DSN = 1
	Public Const ODBC_CONFIG_DSN = 2
	Public Const ODBC_REMOVE_DSN = 3
	Public Const ODBC_ADD_SYS_DSN = 4
	Public Const ODBC_CONFIG_SYS_DSN = 5
	Public Const ODBC_REMOVE_SYS_DSN = 6
	Public Const ODBC_REMOVE_DEFAULT_DSN = 7

	&#039;-----------------------------------------------------------------------------------
	Public Const WS_BORDER = &amp;H00800000
	Public Const WS_CHILD = &amp;H40000000
	Public Const WS_OVERLAPPED = 0
	Public Const WS_OVERLAPPEDWINDOW = &amp;H00CF0000
	Public Const WS_VISIBLE = &amp;H10000000

	Public Const SB_SETTEXTA = &amp;H0401
	Public Const SB_SETTEXTW = &amp;H040B
	Public Const SB_GETTEXTA = &amp;H0402
	Public Const SB_GETTEXTW = &amp;H040D
	Public Const SB_GETTEXTLENGTHA = &amp;H0403
	Public Const SB_GETTEXTLENGTHW = &amp;H040C

	Public Const SB_SETPARTS = &amp;H0404
	Public Const SB_GETPARTS = &amp;H0406
	Public Const SB_GETBORDERS = &amp;H0407
	Public Const SB_SETMINHEIGHT = &amp;H0408
	Public Const SB_SIMPLE = &amp;H0409
	Public Const SB_GETRECT = &amp;H040A


	Public Const SBT_OWNERDRAW = &amp;H1000
	Public Const SBT_NOBORDERS = &amp;H0100
	Public Const SBT_POPOUT = &amp;H0200
	Public Const SBT_RTLREADING = &amp;H0400

	&#039;-----------------------------------------------------------------------------------
	Public hBar
	Public oCns
	Public sDBQCur

	Public bImg
	Public objPic
	Public lpicW,lpicH
	
	
&#039;[Создание формы]
&#039;-------------------------------------------------------------------------------------------
Sub Load(cmdstr)

	bImg = False
	Set oCns = new CNSTR

	Set objPic = Sys.CreateImage()
	objPic.AutoSize = True
	
	Set objADODBConn = CreateObject(&quot;ADODB.Connection&quot;)
	Set objADODBRst = CreateObject(&quot;ADODB.Recordset&quot;)
	Set objFs = CreateObject(&quot;Scripting.FileSystemObject&quot;)

	objADODBConn.CursorLocation = adUseServer
	

	&#039;/Установка параметров формы/
	&#039;----------------------------------------------------------------------------------		
	With Form
		
		.ScaleMode = 3
		.Caption = &quot;Файловая БД Access(ADO)[LangMF 9.0](text_stream_no_enc) v2&quot;
		.Width = 800 * vbPx
		.Height	= 550 * vbPy
		.Style.MinButton = True
		.Style.MaxButton = True
		.Style.SizeBorder= True
		&#039;-------------------------------------------------------------------------
		.Add &quot;List&quot;, 1, &quot;move2 -3, 0.005,-10,,200, 0.95, 1&quot;
		.Add &quot;CImage&quot;, 1, &quot;BorderStyle=0&quot;, &quot;Stretch=True&quot;
		&#039;-------------------------------------------------------------------------
		.Menu.Add 1, &quot;Файл&quot;, &quot;Menu1&quot;
		.Menu.SubMenu(&quot;Menu1&quot;).Add 1, &quot;Создать БД&quot;
		.Menu.SubMenu(&quot;Menu1&quot;).Add 2, &quot;Открыть БД&quot;
		.Menu.SubMenu(&quot;Menu1&quot;).Add 3, &quot;Добавить файл&quot;
		.Menu.SubMenu(&quot;Menu1&quot;).Add 4, &quot;Извлечь файл&quot;
		.Menu.SubMenu(&quot;Menu1&quot;).Add 5, &quot;Сжать БД&quot;
		.Menu.SubMenu(&quot;Menu1&quot;).Add 6, &quot;Выход&quot;
		.Menu.Show

		.Menu.SubMenu(&quot;Menu1&quot;).State(3, &amp;H1) = True
		.Menu.SubMenu(&quot;Menu1&quot;).State(4, &amp;H1) = True
		.Menu.SubMenu(&quot;Menu1&quot;).State(5, &amp;H1) = True

		.Menu.Add 2, &quot;&quot;, &quot;Menu2&quot;
		.Menu.SubMenu(&quot;Menu2&quot;).PopUp = True
		.Menu.SubMenu(&quot;Menu2&quot;).Add 7, &quot;Извлечь файл&quot;
		.Menu.SubMenu(&quot;Menu2&quot;).Add 8, &quot;Обновить файл&quot;
		.Menu.SubMenu(&quot;Menu2&quot;).Add 9, &quot;Удалить файл&quot;

		.CImage(1).Picture = Nothing
		.CImage(1).Visible = False
		.List(1).Visible = False
		&#039;-------------------------------------------------------------------------
		hBar = CreateStatusBar()
		.Visible = True	
		DoEvents
		&#039;-------------------------------------------------------------------------
	End With
		
	
End Sub

&#039;[Создание БД Access]
&#039;-------------------------------------------------------------------------------------------
Sub CreateDB()
	
	Dim sDBQ1
	
	&#039;Диалог выбора нового файла базы данных
	&#039;------------------------------------------------------------------------------------
	sDBQ1 = Sys.CDlg.ShowSave(&quot;Access database files (*.mdb)|*.mdb&quot;, _
                                  &quot;Создать файл БД Access:&quot;, _
                                  Sys.Path, &quot;mdb&quot;, Form.hWnd, 1, 1, &quot;base_wsk.mdb&quot;)

	If Len(sDBQ1) = 0 Then Exit Sub
	If Sys.File.IsDirFile(sDBQ1) Then
		MsgBox &quot;БД уже существует, укажите новое имя.&quot;, vbExclamation Or vbSystemModal,&quot;Error&quot;
		Exit Sub
	End If

	GrayForm()

	Err.Clear
	On Error Resume Next

	&#039;Отключение предыдущего соединения
	&#039;------------------------------------------------------------------------------------	
	If objADODBConn.State &lt;&gt; 0 Then objADODBConn.Close()
		
	&#039;/Генерация файла БД/
	&#039;------------------------------------------------------------------------------------
	hRes = Sys.DynApi.CallFunction(	&quot;ODBCCP32.DLL&quot;, _
                                        &quot;SQLConfigDataSource&quot;, _
                                        0, _
                                        ODBC_ADD_DSN, _
                                        &quot;Microsoft Access Driver (*.mdb)&quot;, _
                                        &quot;CREATE_DB=&quot;&quot;&quot; &amp; sDBQ1 &amp; &quot;&quot;&quot;&quot; &amp; Chr(0))

	If Not Sys.File.IsDirFile(sDBQ1) Or hRes = 0 Then	
		MsgBox &quot;Ошибка создания файла БД&quot;, vbExclamation Or vbSystemModal,&quot;Error&quot;
		Exit Sub
	End If

	&#039;/Создание таблицы хранения файлов/
	&#039;------------------------------------------------------------------------------------
	objADODBConn.Open oCns.ConnString(sDBQ1)

	&#039; Тип данных COUNTER это первичный ключ
	objADODBConn.Execute &quot;CREATE TABLE filestore(id COUNTER, name varchar, crc varchar, file longbinary)&quot;
	&#039;///objADODBConn1.Execute &quot;CREATE TABLE filestore(id COUNTER, name varchar, crc varchar, file longbinary, CONSTRAINT PrimaryKey PRIMARY KEY (id))&quot;///
	objADODBConn.Close()

	If Err.Number&lt;&gt;0 Then GetConnError():Exit Sub
	
	res = SendMsg(hBar, SB_SETTEXTW, 0, &quot;Выберите базу данных Access...&quot;)
	MsgBox &quot;Создана БД &quot; &amp; sDBQ1 &amp; &quot;.&quot;, vbInformation Or vbSystemModal,&quot;Reply&quot;

End Sub

&#039;[Сжатие БД]
&#039;--------------------------------------------------------------------------------------------
Sub CompactDB()

	Dim sDBQShort

	GrayForm()
	res = SendMsg(hBar, SB_SETTEXTW, 0, &quot;Сжатие БД &quot; &amp; sDBQCur &amp; &quot;...&quot;)

	&#039;Отключение соединения
	&#039;------------------------------------------------------------------------------------
	If objADODBConn.State &lt;&gt; 0 Then objADODBConn.Close
		
	sDBQShort = Sys.File.ShortName(sDBQCur)
	hRes = Sys.DynApi.CallFunction(&quot;ODBCCP32.DLL&quot;, _
                                       &quot;SQLConfigDataSource&quot;, _
                                       0, _
                                       ODBC_CONFIG_SYS_DSN, _
                                       &quot;Microsoft Access Driver (*.mdb)&quot;, _
                                       &quot;COMPACT_DB=&quot; &amp; sDBQShort &amp; Chr(32) &amp; sDBQShort &amp; Chr(0))

	If hRes = 0 Then	
		MsgBox &quot;Ошибка сжатия файла БД&quot;, vbExclamation Or vbSystemModal,&quot;Error&quot;
		Exit Sub
	End If
	MsgBox &quot;Сжата БД: &quot; &amp; sDBQCur &amp; &quot;.&quot;, vbInformation Or vbSystemModal,&quot;Reply&quot;
	ConnectDB False

End Sub

&#039;[Подключение к уже существующей БД]
&#039;--------------------------------------------------------------------------------------------
Sub ConnectDB(q)

	Dim sPth
	
	&#039;/Запрос на параметры открываемой БД/	
	&#039;------------------------------------------------------------------------------------	
	If q Then
		
		sPth = Sys.CDlg.ShowOpen(&quot;Access database files (*.mdb)|*.mdb&quot;, _
                                            &quot;Открыть БД Access:&quot;, _
                                            Sys.Path, &quot;mdb&quot;, Form.hWnd, 1, 1, &quot;&quot;)

		If Len(sPth) = 0 Then 
			Exit Sub
		Else
			sDBQCur = sPth 
		End If
	End If
	&#039;------------------------------------------------------------------------------------	
	GrayForm()

	Err.Clear
	On Error Resume Next

	If objADODBConn.State &lt;&gt; 0 Then objADODBConn.Close()
	objADODBConn.Open oCns.ConnString(sDBQCur)
	
	If Err.Number&lt;&gt;0 Then GetConnError():Exit Sub

	With Form 
		.List(1).Visible = True	
		.Menu.SubMenu(&quot;Menu1&quot;).State(3, &amp;H1) = False
		.Menu.SubMenu(&quot;Menu1&quot;).State(4, &amp;H1) = False
		.Menu.SubMenu(&quot;Menu1&quot;).State(5, &amp;H1) = False
	End With

	res = SendMsg(hBar, SB_SETTEXTW, 0, &quot;Выбрана БД: &quot; &amp; sDBQCur)
	ViewDB()
	MsgBox &quot;Открыта БД &quot; &amp; sDBQCur &amp; &quot;.&quot;, vbInformation Or vbSystemModal,&quot;Reply&quot;

End Sub


&#039;[Добавление файла в БД]
&#039;--------------------------------------------------------------------------------------------
Sub AddFile2DB(xColl)

	Err.Clear
	On Error Resume Next

	&#039;/Добавление записи/
	&#039;------------------------------------------------------------------------------------
	If objADODBRst.State &lt;&gt; 0 Then objADODBRst.Close()
	objADODBRst.Open &quot;filestore&quot;, objADODBConn, adOpenStatic, adLockBatchOptimistic

	For i = 1 To xColl.Count
		InsertFile CStr(xColl.Item(i)), False
	Next
	objADODBRst.Close()	
	If Err.Number&lt;&gt;0 Then GetConnError(): Exit Sub
	&#039;------------------------------------------------------------------------------------
	res = SendMsg(hBar, SB_SETTEXTW, 0, &quot;Выбрана БД: &quot; &amp; sDBQCur)
	ViewDB()
	Form.List(1).ListIndex = Form.List(1).ListCount - 1	

End Sub

&#039;[Обновление файла в БД]
&#039;--------------------------------------------------------------------------------------------
Sub UpdateFile()

	Dim sFilePath
	Dim index
	Dim sfname, sfindex

	If Form.List(1).ListIndex = -1 Then Exit Sub
	
	&#039;Диалог выбора файла
	&#039;--------------------------------------------------------------------------	
	sFilePath = Sys.CDlg.ShowOpen( &quot;All files (*.*)|*.*&quot;, _
                                   &quot;Файл для обновления в БД:&quot;, _
                                    Sys.Path, &quot;&quot;, Form.hWnd, 1, 1,&quot;&quot;)

	If Len(sFilePath) = 0 Then Exit Sub
	&#039;--------------------------------------------------------------------------	
	
	index = Form.List(1).ListIndex	&#039;Запомнить текущее выделение
	
	sfname = Form.List(1).Text
	sfindex = CStr(Form.List(1).ItemData(Form.List(1).ListIndex))	

	Err.Clear
	On Error Resume Next

	&#039;/Обновление записи/
	&#039;--------------------------------------------------------------------------
	If objADODBRst.State &lt;&gt; 0 Then objADODBRst.Close()
	objADODBRst.Open &quot;SELECT * FROM filestore WHERE filestore.name=&#039;&quot; &amp; sfname &amp; _
                      &quot;&#039; AND filestore.id=&quot; &amp; sfindex, objADODBConn, adOpenStatic, adLockBatchOptimistic
		
	InsertFile sFilePath, True
	objADODBRst.Close()
	If Err.Number&lt;&gt;0 Then GetConnError(): Exit Sub
	&#039;--------------------------------------------------------------------------
	ViewDB()	
	Form.List(1).ListIndex = index
	MsgBox &quot;Данные обновлены.&quot;, vbInformation Or vbSystemModal,&quot;Reply&quot;

End Sub


&#039;//Вставка файла фрагментами с использованием TextStream(снижение нагрузки на память)//
&#039;--------------------------------------------------------------------------------------------
Sub InsertFile(sFilePth, bUpdate)

	Dim oFile
	Dim lfSz, chunk, div, u, i, SZ
	Dim crcfile

	Const BUFSZ = 1048576
	Const RONLY = 1
	Const NOCRNEW = False
	Const FMTASCII = 0

	&#039;------------------------------------------------------------------------------------
	Set oFile = objFs.GetFile(sFilePth)	
	lfSz = oFile.Size
	chunk = lfSz Mod BUFSZ
	div = (lfSz-chunk)/BUFSZ

	Sys.File.CRC32.File sFilePth
	crcfile = Sys.File.CRC32.crc32Result Xor -1
	&#039;------------------------------------------------------------------------------------
	With objADODBRst

		If bUpdate Then
			.Update			
		Else
			.AddNew
		End If

		.Fields(1).Value = CStr(Sys.File.GetFName(sFilePth))
		.Fields(2).Value = CStr(crcfile)			
	End With
		
	&#039;/Вставка файла фрагментами с использованием TextStream/
	&#039;------------------------------------------------------------------------------------			
	Set oStream = objFs.OpenTextFile(sFilePth, RONLY, NOCRNEW, FMTASCII)
		
	SZ = BUFSZ
	For u=0 To div
		If u = div Then SZ = chunk
		objADODBRst.Fields(3).AppendChunk Sys.Conv.Buf(oStream.Read(SZ),vbByte Or vbArray)
		DoEvents
		objADODBRst.Update
		DoEvents

		If div&gt;0 Then res = SendMsg(hBar, SB_SETTEXTW, 0, &quot;Запись файла: &quot; &amp; Int((u/div)*100) &amp; &quot;%&quot;)			
		DoEvents
	Next

	&#039;/Применить изменения/
	&#039;------------------------------------------------------------------------------------			
	objADODBRst.UpdateBatch adAffectCurrent
	DoEvents
	oStream.Close()			
	
End Sub

&#039;[Извлечение файла из БД]
&#039;--------------------------------------------------------------------------------------------
Sub ExtractFile()
	
	Dim sFilePath
	Dim crc32
	Dim crcfile
	Dim sfname, sfindex

	Const OVRWRT = 2
	Const CRNEW = True
	Const FMTASCII = 0

	If Form.List(1).ListIndex = -1 Then Exit Sub

	&#039;Диалог сохранения
	&#039;--------------------------------------------------------------------------
	sFilePath = Sys.CDlg.ShowSave(&quot;All files (*.*)|*.*&quot;, _
                                  &quot;Файл для сохранения:&quot;, _
                                   Sys.Path, &quot;*.*&quot;, Form.hWnd, 2, 1, Form.List(1).Text)

	If Len(sFilePath) = 0 Then Exit Sub
	&#039;--------------------------------------------------------------------------
	res = SendMsg(hBar, SB_SETTEXTW, 0, &quot;Извлечение файла &quot; &amp; Form.List(1).Text &amp; &quot;...&quot;)

	sfname = Form.List(1).Text
	sfindex = CStr(Form.List(1).ItemData(Form.List(1).ListIndex))

	Err.Clear
	On Error Resume Next

	&#039;/Выборка записи и извлечение файла на диск/
	&#039;--------------------------------------------------------------------------
	If objADODBRst.State &lt;&gt; 0 Then objADODBRst.Close()
	objADODBRst.Open &quot;SELECT filestore.crc,filestore.file FROM filestore WHERE filestore.name=&#039;&quot; &amp; sfname &amp; _
                      &quot;&#039; AND filestore.id=&quot; &amp; sfindex, objADODBConn, adOpenStatic, adLockReadOnly

	crc32 = objADODBRst.Fields(0).Value

	&#039;/Извлечение файла/
	&#039;--------------------------------------------------------------------------
	&#039;/text stream/
		Set oStream = objFs.OpenTextFile(sFilePath, OVRWRT, CRNEW, FMTASCII)
		oStream.Write Sys.Conv.Buf(objADODBRst.Fields(1).Value, vbString)	 
		DoEvents
		oStream.Close()

	&#039;/Buf2File/
		&#039;/Sys.Conv.Buf2File objADODBRst.Fields(1).Value, sFilePath
		&#039;/DoEvents

	objADODBRst.Close()
	If Err.Number &lt;&gt; 0 Then GetConnError(): Exit Sub
		
	&#039;/Проверка контрольной суммы/
	&#039;--------------------------------------------------------------------------
	If Sys.File.IsDirFile(sFilePath) Then

		Sys.File.CRC32.File sFilePath
		crcfile = Sys.File.CRC32.crc32Result Xor -1
 
		If CCur(crc32) = CCur(crcfile) Then
			MsgBox &quot;Файл &quot;&amp; sFilePath &amp;&quot; успешно извлечен.&quot;, vbInformation Or vbSystemModal,&quot;Reply&quot;
		Else
			MsgBox &quot;Ошибка контрольной суммы &quot; &amp; sFilePath, vbExclamation Or vbSystemModal,&quot;Error&quot;
		End If
	End If
	&#039;--------------------------------------------------------------------------
	res = SendMsg(hBar, SB_SETTEXTW, 0, &quot;Выбрана БД: &quot; &amp; sDBQCur)

End Sub

&#039;[Удаление файла из БД]
&#039;--------------------------------------------------------------------------------------------
Sub RemoveRecord()

	Dim sfname, sfindex
	Dim iAnsw

	If Form.List(1).ListIndex = -1 Then Exit Sub
	iAnsw = MsgBox(&quot;Удалить запись &quot; &amp; Form.List(1).Text &amp; &quot;?&quot;,vbQuestion + vbOKCancel + vbSystemModal, &quot;Reply&quot;)
	If iAnsw = vbCancel Then Exit Sub

	sfname = Form.List(1).Text
	sfindex = CStr(Form.List(1).ItemData(Form.List(1).ListIndex))

	Err.Clear
	On Error Resume Next

	&#039;/Удаление записи/
	&#039;--------------------------------------------------------------------------		
	If objADODBRst.State &lt;&gt; 0 Then objADODBRst.Close()
	objADODBConn.Execute &quot;DELETE * FROM filestore WHERE filestore.name=&#039;&quot; &amp; sfname &amp; _
                      &quot;&#039; AND filestore.id=&quot; &amp; sfindex
	DoEvents	
	If Err.Number&lt;&gt;0 Then GetConnError(): Exit Sub
	&#039;--------------------------------------------------------------------------
	
	Form.List(1).RemoveItem Form.List(1).ListIndex
	Form.List(1).SetFocus

	If bImg Then 
		Form.CImage(1).Picture = Nothing
		Form.CImage(1).Visible = False
		objPic.Picture = Nothing
		bImg = False
	End If

	MsgBox &quot;Запись, содержащая файл [&quot; &amp; sfname &amp; &quot;] удалена.&quot;, vbInformation Or vbSystemModal, &quot;Reply&quot;

End Sub


&#039;[Вывод списка файлов содержащихся в БД]
&#039;--------------------------------------------------------------------------------------------
Sub ViewDB()


	Form.OLEDropMode = 1
	Form.List(1).OLEDropMode = 1
	Form.CImage(1).OLEDropMode = 1

	Form.List(1).Clear

	Err.Clear
	On Error Resume Next
	&#039;----------------------------------------------------------------------------
	If objADODBRst.State &lt;&gt; 0 Then objADODBRst.Close()
	objADODBRst.Open &quot;SELECT filestore.id, filestore.name FROM filestore&quot;, objADODBConn, adOpenStatic, adLockReadOnly
	
	With objADODBRst 
		If .EOF Then .Close(): Exit Sub
		.MoveFirst
		While Not .EOF
			Form.List(1).AddItem .Fields(1).Value
			Form.List(1).ItemData(Form.List(1).ListCount-1) = .Fields(0).Value
			DoEvents
			.MoveNext
		Wend
		.Close()
	End With
	If Err.Number&lt;&gt;0 Then GetConnError()

End Sub

&#039;[Вывод изображения]
&#039;--------------------------------------------------------------------------------------------
Sub ShowImage(sImgname)

	Dim sfname, sfindex

	sfname = Form.List(1).Text
	sfindex = CStr(Form.List(1).ItemData(Form.List(1).ListIndex))

	Err.Clear
	On Error Resume Next

	&#039;/Выборка записи и извлечение файла/
	&#039;--------------------------------------------------------------------------
	If objADODBRst.State &lt;&gt; 0 Then objADODBRst.Close()
	objADODBRst.Open &quot;SELECT filestore.file FROM filestore WHERE filestore.name=&#039;&quot; &amp; sfname &amp; _
                      &quot;&#039; AND filestore.id=&quot; &amp; sfindex, objADODBConn, adOpenStatic, adLockReadOnly
	
	objPic.Picture = Sys.Conv.Str2Image(objADODBRst.Fields(0).Value)

	objADODBRst.Close()
	If Err.Number&lt;&gt;0 Then GetConnError()	
	&#039;--------------------------------------------------------------------------	
	lpicW = objPic.Width
	lpicH = objPic.Height	
	
	Form.CImage(1).Picture = objPic
	Form.CImage(1).Visible = True
	bImg = True
	ResizeImg()

End Sub

&#039;[Подгонка размеров изображения]
&#039;--------------------------------------------------------------------------------------------
Sub ResizeImg()

	Dim a,b,xw,yh,x1,x2,s1,s2

	a = Form.ScaleWidth-Form.List(1).Width-20
	b = Form.List(1).Height

	If (lpicW &lt; a) And (lpicH &lt; b) Then
		
		&#039;Отображать небольшие изображения в натуральную величину
		&#039;--------------------------------------------------------
		xw = lpicW
		yh = lpicH
		x1 = (a - xw)/2 + 5
		x2 = (b - yh)/2 + 5		
		
	Else
		&#039;Масштабировать большие изображения
		&#039;--------------------------------------------------------
		s1 = a/lpicW
		s2 = b/lpicH

		If (lpicH*s1&gt;b) And (lpicW*s2&lt;a) Then
		
			xw = lpicW*s2
			yh = b
			x1 = (a - xw)/2+5
			x2 = 5
		Else
			xw = a
			yh = lpicH*s1	
			x1 = 5
			x2 = (b - yh)/2	+5	
			
		End If
	End If
	
	Form.Move2 Form.CImage(1),-2,-2,x1,x2,xw,yh
	
End Sub

&#039;/Отключение элементов управления/
&#039;-------------------------------------------------------------------------------------------
Sub GrayForm()

	With Form	
		.List(1).Visible = False	
		.CImage(1).Picture = Nothing
		.CImage(1).Visible = False
			objPic.Picture = Nothing
			bImg = False
		.Menu.SubMenu(&quot;Menu1&quot;).State(3, &amp;H1) = True
		.Menu.SubMenu(&quot;Menu1&quot;).State(4, &amp;H1) = True
		.Menu.SubMenu(&quot;Menu1&quot;).State(5, &amp;H1) = True
		.OLEDropMode = 0
		.List(1).OLEDropMode = 0
		.CImage(1).OLEDropMode = 0
	
	End With
	DoEvents
End Sub

&#039;/Сообщение об ошибке/
&#039;-------------------------------------------------------------------------------------------	
Sub GetConnError()

		MsgBox 	Err.Source &amp; vbCR &amp; _
			Err.Description, _
			vbExclamation Or vbSystemModal, _
			&quot;Произошла ошибка&quot;	
		Err.Clear
			
End Sub

&#039;[Строки подключения]
&#039;--------------------------------------------------------------------------------------------
Class CNSTR
	Private Sub Class_Initialize
	End Sub
	
	Private Sub Class_Terminate
	End Sub
	
	Public Property Get ConnString(stDBQ)
	ConnString = &quot;Driver={Microsoft Access Driver (*.mdb)};&quot; &amp; _	
                     &quot;DBQ=&quot; &amp; stDBQ &amp; &quot;;&quot; &amp; _	
                     &quot;ExtendedAnsiSQL=0;&quot; &amp; _	
                     &quot;FIL=MS Access;&quot; &amp; _			
                     &quot;ImplicitCommitSync=Yes;&quot; &amp; _	
                     &quot;MaxBufferSize=32768;&quot; &amp; _	
                     &quot;MaxScanRows=5;&quot; &amp; _	
                     &quot;PageTimeout=5;&quot; &amp; _	
                     &quot;ReadOnly=0;&quot; &amp; _	
                     &quot;SafeTransactions=0;&quot; &amp; _	
                     &quot;Threads=3;&quot; &amp; _	
                     &quot;UserCommitSync=Yes&quot;
	End Property

	
End Class

&#039;[Посылка сообщения дочернему окну(StatusBar)]
&#039;--------------------------------------------------------------------------------------------
Function SendMsg(hWnd,MsgID,LParam,WParam)

	SendMsg	= Sys.DynApi.CallFunction( _
					&quot;USER32.DLL&quot;, _
					&quot;SendMessageW&quot;, _
					hWnd, _
					MsgID, _
					LParam, _
					WParam)
	
	
End Function

&#039;[Создание строки состояния]
&#039;--------------------------------------------------------------------------------------------
Function CreateStatusBar()

	CreateStatusBar	= Sys.DynApi.CallFunction( _
					&quot;COMCTL32.DLL&quot;, _
					&quot;CreateStatusWindowW&quot;, _
					WS_OVERLAPPEDWINDOW + WS_VISIBLE + WS_CHILD, _
					&quot;Выберите базу данных Access...&quot;, _
					Form.hWnd, _
					0)
	
End Function
&lt;#Module&gt;

&#039;[Обработчики событий элементов управления формы]
&#039;-------------------------------------------------------------------------------------------
&lt;#Form=form&gt;
	
	&#039;-----------------------------------------------------------------------------------
	Sub Menu1_Click()
		CreateDB()
	End Sub

	&#039;-----------------------------------------------------------------------------------
	Sub Menu2_Click()
		ConnectDB True
	End Sub

	&#039;-----------------------------------------------------------------------------------
	Sub Menu3_Click()

		sFile = Sys.CDlg.ShowOpen(&quot;All files (*.*)|*.*&quot;, _
                                          &quot;Добавление файла в БД:&quot;, _
                                          Sys.Path, &quot;&quot;, Form.hWnd, 1, 1, &quot;&quot;)

		If Len(sFile) = 0 Then Exit Sub

		Set x = Sys.NewCollection()
		x.Add CStr(sFile)
		AddFile2DB x
	End Sub

	&#039;-----------------------------------------------------------------------------------
	Sub Menu4_Click()
		ExtractFile()
	End Sub

	&#039;-----------------------------------------------------------------------------------
	Sub Menu5_Click()
		CompactDB()
	End Sub

	&#039;-----------------------------------------------------------------------------------
	Sub Menu6_Click()
		Form.UnloadForm()
	End Sub

	&#039;-----------------------------------------------------------------------------------
	Sub Menu7_Click()
		Menu4_Click()
	End Sub

	&#039;-----------------------------------------------------------------------------------
	Sub Menu8_Click()
		UpdateFile()
	End Sub

	&#039;-----------------------------------------------------------------------------------
	Sub Menu9_Click()
		RemoveRecord()
	End Sub
	
	&#039;------------------------------------------------------------------------------------
	Sub List1_DblClick()
		Form.Menu.SubMenu(&quot;Menu2&quot;).Show
	End Sub

	&#039;[Перетаскивание группы файлов на список БД]
	&#039;------------------------------------------------------------------------------------
	Sub List1_OLEDragDrop(Data,Effect,Button,Shift,X,Y)
		DropFiles Data		
	End Sub

	Sub CImage1_OLEDragDrop(Data,Effect,Button,Shift,X,Y)
		DropFiles Data	
	End Sub

	Sub Form_OLEDragDrop(Data,Effect,Button,Shift,X,Y)
		DropFiles Data	
	End Sub

	Sub DropFiles(oData)
		iC = oData.Files.Count
		If iC =0 Then Exit Sub
		
		Set x = Sys.NewCollection()
		For i=1 To iC
			x.Add CStr(oData.Files.Item(i))
		Next
		AddFile2DB x
		Form.SetFocus()
	End Sub

	&#039;[Вывод изображения]
	&#039;------------------------------------------------------------------------------------
	Sub List1_Click()

		Dim sFItem
		sFItem = CStr(Form.List(1).Text)
		result=sFItem=~ig/\.gif|\.jpg|\.jpeg|\.bmp//

		If result Then 
			ShowImage sFItem
			bImg = True
		Else
			Form.CImage(1).Picture = Nothing
			Form.CImage(1).Visible = False
			objPic.Picture = Nothing
			bImg = False
		End If

	End Sub

	&#039;------------------------------------------------------------------------------------
	Sub Form_Resize()
		
		If Form.ScaleWidth &lt; 250 Then Exit Sub
		If Form.ScaleHeight &lt; 200 Then Exit Sub
		If Form.WindowState = 1 Then Exit Sub	&#039;Выйти из процедуры при минимизированном окне
		If bImg Then ResizeImg()
		&#039;----------------------------------------------------------------------------
		res = Sys.DynApi.CallFunction( _
					&quot;USER32.DLL&quot;, _
					&quot;MoveWindow&quot;, _
					hBar, _
					0, _
					Form.ScaleHeight, _
					Form.ScaleWidth, _
					0, _
					True)
		
	End Sub
	&#039;------------------------------------------------------------------------------------
	Sub Form_Load()
		
		
	End Sub

	&#039;[Завершение работы]
	&#039;-----------------------------------------------------------------------------------
	Sub Form_Unload()
		
		If objADODBRst.State &lt;&gt; 0 Then objADODBRst.Close()
		If objADODBConn.State &lt;&gt; 0 Then objADODBConn.Close()
		
		Set objADODBRst = Nothing
		Set objADODBConn = Nothing
		
		EndMF
		DoEvents
		
	End Sub

&lt;#Form&gt;
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Sun, 27 Dec 2009 20:21:30 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=31839#p31839</guid>
		</item>
	</channel>
</rss>
