Краткое изложение.
В 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.- Создайте в Visual FoxPro два программных файла.
- Скопируйте в первый файл код, приведенный ниже:
Скопировать код | |
---|---|
*------------ 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 |
- Скопируйте во второй файл приведенный ниже код. Этот код демонстрирует отображение картинок, хранящихся в поле 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 |
Теперь сохраните и запустите обе программы.