Краткое изложение.

В Microsoft Visual FoxPro 9.0 был представлен новый для Visual FoxPro тип данных Blob. Вы можете использовать поля Blob для хранения бинарных данных, например, для хранения картинок. Картинки, которые хранятся в поле Blob могут быть отпечатаны в отчетах и отображены на формах. В этой статье описывается, как напечатать картинки и как отобразить картинки на форме, если картинки хранятся в поле с типом Blob.

Введение

В Visual FoxPro 9.0 был представлен тип данных Blob. Вы можете использовать поля Blob для хранения бинарных данных любого вида и неопределенной длины. Например, в таком поле вы можете хранить картинки.

Вы можете отпечатать картинки, которые хранятся в поле Blob, в отчете с помощью элемента управления Picture/OLE Bound. Для печати картинок, которые хранятся в поле Blob, вы должны установить источник (source) элемента Picture/OLE Bound, который будет использоваться в объектную ссылку. В качестве объектной ссылки может выступать экземпляр элемента управления Image. Свойство PictureVal этого экземпляра должно быть установлено в поле Blob, которое содержит картинки.

Вы можете отображать картинки, которые хранятся в поле Blob, на форме с помощью элемента управления Image. Вы кладете элемент управления Image непосредственно на форму и затем устанавливаете его свойство PictureVal. Такая адресация связывает Image с полем Blob. Однако, для того, чтобы принудить элемент управления Image перерисовываться при перемещении указателя таблицы, в которой имеется поле Blob, требуется выполнить дополнительные шаги.

Представленный ниже образцы кода были разработаны для  Visual FoxPro 9.0. Эти образцы показывают, как отпечатать картинки, хранящиеся в поле Blob, и как отобразить картинки из такого поля на форме. Для тестирования этих примеров следуйте лписанным ниже шагам:

Образец 1: Печать картинок, которые хранятся в поле Blob, в отчете.

1. Start Visual FoxPro 9.0, and create two new programs. 2. Copy and then paste sample 1 into one of the new programs. 3. Copy and then paste sample 2 into the other new program. 4. Save and then run the programs.
  1. Создайте в Visual FoxPro два программных файла.
  2. Скопируйте в первый файл код, приведенный ниже:
Скопировать код
*------------ START CODE
*
*-----------------------------------
*  AUTHOR:    Trevor Hancock
*  CREATED:   03/04/05 01:03:07 P.M.
*  ABSTRACT: Code from Microsoft Knowledge Base article 895602. Visual FoxPro code that shows how
*  to use pictures that are stored in a BLOB field in a report.
*  This is accomplished by using an object reference to an instance of an IMAGE class as the control source for
*  an OLE Bound control on the report. The IMAGE object has its PictureVal property set to a BLOB field in a cursor.
*-----------------------------------
LOCAL lcDataDIR AS STRING, ;
	lcThisDir AS STRING, ;
	loRL AS REPORTLISTENER

lcDataDIR = HOME( ) + 'Samples\Tastrade\'
lcThisDir = ADDBS( JUSTPATH( SYS( 16 ) ) )

CD ( lcThisDir )
CLOSE DATA ALL
*-- Создайте временный курсор с несколькими полями, одно из которых BLOB
*-- Сохраните в этом поле картинки, как raw binary data.
SELECT CAST( ALLTRIM( First_Name ) AS VARCHAR ( 10 ) ) AS 'FNAME', ;
	CAST( ALLTRIM( Last_Name ) AS VARCHAR (10 ) ) AS 'LNAME', ;
	CAST( FILETOSTR( lcDataDIR + Photo_File ) AS BLOB ) AS 'PIC' ;
	FROM ( lcDataDIR + 'data\Employee.dbf' ) ;
	INTO CURSOR ReportTemp

*-- Закрываем таблицу, из которой произволась выборка. Она более не нужна.
USE IN SELECT( 'EMPLOYEE' )

*-- Далее вызываем функци, которая программно создасть отчет.
*-- Это включено сюда только для того, чтобы запустить код образца "как есть",
*-- без требования к разработчику вручную создать отчет.
MakeReport()

*-- Создаем экземпляр PreviewListener, класс которого определен ниже в этом коде
*-- Вызываем его настраиваемый метод InitBLOBImage(), который создает экземлпяр объекта IMAGE.
*-- Свойство PictureVal этого объекта IMAGE установлено в поле BLOB ( 'ReportTemp.PIC' ), а его ссылка ( loRL.oBlobImage )
*-- используется как source элемента управления для OLE Bound control в отчете.
loRL = NEWOBJECT( 'PreviewListener' )
loRL.InitBLOBImage( 'ReportTemp.PIC' )

*-- Убеждаемся, что курсор выбран,и затем запускаем отчет на просмотр с помощью
*-- экземпляра Report Listener.
SELECT ReportTemp
REPORT FORM BlobReport OBJECT loRL
CLOSE DATA ALL
RETURN





*--------------------------------
*-- Ниже представлен один из способов перерисовки картинки 
*-- в классе IMAGE когда изменяется указатель записи в управляемом отчетом курсоре;
*-- это не происходит автоматически. Это может быть сделано с помощью определенной пользователем функции
*-- в PrintWhen элемента управления OLE Bound в отчете или так, как показано здесь,
*-- с помощью события BEFOREBAND() Event объекта Report Listener .
DEFINE CLASS PreviewListener AS REPORTLISTENER
	oBlobImage = NULL
	PicBlobFld = ''
	LISTENERTYPE = 1  && Preview Listener

	PROCEDURE InitBLOBImage(lpcBlobField AS STRING)
		THIS.PicBlobFld = lpcBlobField
		THIS.oBlobImage = NEWOBJECT( 'IMAGE' )
		THIS.oBlobImage.PICTUREVAL = THIS.PicBlobFld
	ENDPROC

	PROCEDURE BEFOREBAND( nBandObjCode, nFRXRecNo )
		*-- До того, как полоса DETAIL будет визуализирована, ;
		*-- просто перерисовываем объект IMAGE так, чтобы он имел корректную
		*-- картинку из поля BLOB.
		IF nBandObjCode = 4 && Detail band
			THIS.oBlobImage.PICTUREVAL =;
				EVALUATE( THIS.PicBlobFld )
		ENDIF
	ENDPROC
ENDDEFINE




*--------------------------------
*-- Приведенная ниже функция программно создает отчет
*-- с элементом управления OLE Bound и прочими полями. This is included
*-- Это включено только для целей демонстрации, чтобы код статьи мог бы быть запущен.
*-- Обычно, вы должны сами, вручную создать отчет с помощью конструктора отчета 
FUNCTION MakeReport
	CREATE REPORT BlobReport FROM ReportTemp

	*-- Открывает файл отчета (FRX) как таблицу.
	USE BlobReport.FRX IN 0 ALIAS TheReport EXCLUSIVE
	SELECT TheReport

	*-- Увеличиваем высоту полосы Detai
	*-- (ObjType = 9 & ObjCode = 4) для того, чтобы она вместила элемент управления
	*-- Picture/OLE Bound, который будет вставлен далее.
	UPDATE TheReport SET Vpos = 0, Hpos = 0, HEIGHT = 23542;
		WHERE ObjType = 9 AND ObjCode = 4

	*-- Так как мы увеличили высоту Detail Band, нам необходимо переместить
	*-- элементы из подножия вниз, так чтобы они вновь вернулись в область подножия.
	UPDATE TheReport SET Vpos = 29479.167 ;
		WHERE ( ObjType = 8 OR ObjType = 5 ) AND ;
		INLIST( EXPR, 'DATE()', '"Page "', '_PAGENO' )

	*-- Добавляем в отчет элемент управления Picture/OLE Bound вставкой записи
	*-- с соответствующими значениями. Использование здесь объекта, который основан на классе EMPTY
	*-- и класса GATHER NAME позднее, для вставки записей, позволит легко увидеть,
	*-- какие значения какому полю принадлежат (по сравнению с большой командой
	*-- SQL-INSERT ).
	LOCAL loNewRecObj AS EMPTY
	loNewRecObj = NEWOBJECT( 'EMPTY' )
	ADDPROPERTY( loNewRecObj, 'PLATFORM', 'WINDOWS' )
	ADDPROPERTY( loNewRecObj, 'Uniqueid', SYS(2015) )
	ADDPROPERTY( loNewRecObj, 'ObjType', 17 ) && "Picture/OLE Bound Control"
	ADDPROPERTY( loNewRecObj, 'NAME', 'loRL.oBlobImage' ) && The object ref to the IMAGE object.
	ADDPROPERTY( loNewRecObj, 'Hpos', 27500.000) && Place it in DETAIL band.
	ADDPROPERTY( loNewRecObj, 'Vpos', 3854.167)
	ADDPROPERTY( loNewRecObj, 'HEIGHT', 21354.167)
	ADDPROPERTY( loNewRecObj, 'WIDTH', 25104.167)
	ADDPROPERTY( loNewRecObj, 'DOUBLE', .T. ) && Picture is centered in the "Picture/OLE Bound Control"
	ADDPROPERTY( loNewRecObj, 'Supalways', .T. )
	*-- Для элемента управления Picture/OLE Bound, содержимое поля OFFSET определяет -field specify whether
	*-- что будет использовано в качестве источника Filename (0), General field name (1) или Expression (2).
	ADDPROPERTY( loNewRecObj, 'Offset', 2 )

	*-- Добавляет в отчет запись, касающуюся Picture/OLE Bound.
	APPEND BLANK IN TheReport
	GATHER NAME loNewRecObj MEMO

	*-- Чистимся и затем закрывает таблицу отчета.
	PACK MEMO
	USE IN SELECT( 'TheReport' )
ENDFUNC
*
*------------ END CODE
  1. Скопируйте во второй файл приведенный ниже код. Этот код демонстрирует отображение картинок, хранящихся в поле BLOB на форме.
Скопировать код
*------------ START CODE
*
*-----------------------------------
* AUTHOR:    Trevor Hancock
* CREATED:   03/04/05 01:03:07 P.M.
* ABSTRACT: Code from Microsoft Knowledge Base
*                 article 895602. Visual FoxPro code that shows how
*                 to display pictures that are
*                 stored in a BLOB field on a form.
*-----------------------------------
CLOSE DATA ALL

*-- Создайте временный курсор с несколькими полями, одно из которых BLOB
*-- Сохраните в этом поле картинки, как raw binary data.
SELECT 	;
	CAST( ;
	FILETOSTR( HOME( ) + 'Samples\Tastrade\' + Photo_File ) ;
	AS BLOB ) AS 'PIC' FROM ;
	HOME( ) + 'Samples\Tastrade\data\Employee.dbf' ;
	INTO CURSOR BlobTemp

*-- Закрываем таблицу, из которой произволась выборка. Она более не нужна.
USE IN SELECT( 'EMPLOYEE' )

*-- Создаем форму для отображения картинок.
PUBLIC goForm
goForm = NEWOBJECT( 'Form' )

WITH goForm AS FORM
	*-- Добавляет класс IMAGE для отображения картинок.
	*-- Это сделано путем установки свойства PICTUREVAL элемента управления IMAGE.
	.ADDOBJECT( 'IMG1', 'Image' )
	.Img1.PICTUREVAL = BlobTemp.PIC

	*-- Добавляем EditBox для отображения бинарных данных непосредственно из поля BLOB.
	*-- Хотя это и не требуется, но сделаем это, так как забавно посмотреть на бинарные данные :).
	.ADDOBJECT( 'Edt1', 'EditBox' )
	.Edt1.MOVE(.Img1.WIDTH + 5, 0, .Img1.WIDTH, .Img1.HEIGHT)
	.Edt1.CONTROLSOURCE = 'BlobTemp.PIC'

	*-- Добавляем кнопки навигации, для того, чтобы вы смогли перемещаться по записям курсора
	*-- Класс NAV определен ниже в этом коде.
	.ADDOBJECT( 'NAV', 'NavBtns' )
	.NAV.MOVE( (.WIDTH - .NAV.WIDTH) + 13 , .Edt1.HEIGHT + 2 )

	.WIDTH = .Img1.WIDTH + .Edt1.WIDTH + 7
	*-- Делаем форму более изящной установкой нескольких якорей и определения ее минимальной ширины/высоты.
	.NAV.ANCHOR = 192
	.Edt1.ANCHOR = 15
	.MINWIDTH = .WIDTH
	.MINHEIGHT = .HEIGHT
	.AUTOCENTER = .T.
	.CAPTION = 'Picture and Raw BLOB Data'
	.SETALL( 'VISIBLE', .T. )
ENDWITH

goForm.SHOW(1)
CLOSE DATA ALL


*--------------------------------
*-- Представленное ниже является просто субклассом фундаментального класса FoxPro
*-- с именем _DataNavBtns (размещенного в HOME() + '\FFC\_datanav.vcx').
*-- Это то место, где мы перерисовываем данные поля BLOB, отображаемые классом IMAGE
*-- сбросом значения PICTUREVAL непосредственно перед переходом к другой записи.
*-- В отличие от OLE Bound, заполняемого из поля GENERAL, 
*-- IMAGE автоматически не перерисовыет данные из BLOB, когда указатель записи смещается.
*-- Здесь мы принуждаем его сделать это.
DEFINE CLASS NavBtns AS _datanavbtns OF HOME() + '\FFC\_datanav.vcx'
	BORDERWIDTH = 0
	PROCEDURE EnableDisableButtons
		THIS.PARENT.Img1.PICTUREVAL = BlobTemp.PIC
		DODEFAULT()
ENDDEFINE
*
*------------ END CODE

Теперь сохраните и запустите обе программы.

Смотрите также