Como exportar imagens dos campos gerais usando a classe base ReportListener no Visual FoxPro 9

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 894819
Sumário
Este artigo descreve como exportar imagens dos campos Geral do Microsoft Visual FoxPro arquivos no disco usando o class. base ReportListener
INTRODUÇÃO
Visual FoxPro Geral campos são usados com freqüência para armazenar arquivos de imagem. Por exemplo, arquivos .jpg e .bmp são arquivos de imagem. O tipo de campo Geral contém não apenas informações sobre a imagem que é armazenada mas também informações sobre o servidor registrado que foi usado para gravar a imagem para o campo. Por exemplo, se o servidor registrado para arquivos .jpg no seu computador for Microsoft Photo Editor, informações sobre o Microsoft Photo Editor e sobre o arquivo .jpg são concatenadas. Em seguida, essa informação é armazenada no campo Geral .

Quando uma tabela FoxPro que possui um campo Geral é movida para outro computador, as imagens no campo talvez não sejam exibidos corretamente devido as informações de servidor adicional são armazenadas no campo. Esse comportamento pode ocorrer em formulários ou relatórios. Esse comportamento pode ocorrer mesmo quando você apenas exibir a tabela e modificar o campo Geral . O campo não pode exibir a imagem real. Em vez disso, o usuário só poderá ver um ícone.

Você sempre não é possível saber se um servidor válido está presente nos computadores onde você tem as tabelas. Portanto, não convém usar o tipo de campo Geral quando seu aplicativo usa extensivamente imagens que são armazenadas em tabelas. Por exemplo, você pode querer armazenar imagens em um campo Memorando (binário) . Em seguida, você pode usar a função StrToFile para gravar as imagens no disco quando você precisa. Você também pode usar o tipo de campo do blob que foi introduzido no Visual FoxPro 9. Ou você pode usar a propriedade PictureVal do controle Image .

No entanto, se você decidir usar um método diferente, você deve usar as imagens que você já tem armazenados nos campos Geral . Não é fácil para recuperar essas imagens da tabela FoxPro e colocá-los no disco. No entanto, o seguinte processo no Visual FoxPro 9 pode ajudar resolver esse problema.
Mais Informações
Esta seção mostra dois exemplos de como extrair imagens o campo de FOTO na tabela Funcionário exemplo que acompanha o Visual FoxPro 9. Você pode fazer isso usando a nova classe base ReportListener . A classe base ReportListener foi introduzida no Visual FoxPro 9.

Observação Esses exemplos só funcionará no Visual FoxPro 9.

O primeiro exemplo mostra como criar manualmente um relatório e, em seguida, como executar o relatório para extrair as imagens. O segundo exemplo mostra uma abordagem programática para o processo. Este segundo exemplo demonstra como criar e modificar um relatório por meio de código. Este segundo exemplo também demonstra como substituir o processamento e AfterBand eventos do FoxPro Foundation Class (FFC) o XMLListener para ajustar o processo de extração.

Observação Você deve executar esse processo em um computador onde as imagens que estão em seu campo Geral são exibidas corretamente. As imagens não devem ser exibidas como ícones. Se você executar esse processo em um computador onde você pode somente ver ícones, somente os ícones serão extraídos para o disco.

Exemplo 1: Manualmente extrair imagens de um campo geral usando uma classe ReportListener

  1. Verifique se o Visual FoxPro é configurado para executar assistido objeto relatório. Para fazer isso, execute o seguinte comando na janela de comando :
    SET REPORTBEHAVIOR 90
  2. Para abrir o Report Designer, executando o comando CREATE REPORT na janela de comando .
  3. Reduza a altura de faixas Cabeçalho da página e Rodapé da página para que sejam 0 polegadas de altura. Essas faixas não são necessários para que este exemplo.
  4. Da barra de ferramentas Controles de relatório , adicione um controle Imagem/OLE acoplado para a faixa de detalhes. Em seguida, redimensione a banda de detalhe e o controle de Imagem/OLE acoplado para estarem grandes o suficiente para exibir as imagens que estão em seu campo Geral .
  5. Se a caixa de diálogo Propriedades do controle acoplado imagem/OLE não estiver já aberto, clique duas vezes o controle de Imagem/OLE acoplado para abri-lo e, em seguida, definir as seguintes opções na guia Geral :
    1. Em tipo de controle de origem , clique em Nome do campo geral .
    2. Na caixa OrigemDoControle , digite FOTO . Este é o nome do campo Geral na tabela de funcionários .
    3. Clique para selecionar a caixa de seleção Central campo geral horizontalmente no quadro .
  6. Salve e feche o relatório. Observe onde você salvou o relatório.
  7. Salve o exemplo de código a seguir para um novo programa e executá-lo. Quando solicitado, escolha o relatório que você salvou na etapa 6. Quando o código for concluído, todas as imagens no campo Geral que é chamado de FOTO serão extraídas para uma pasta. Além disso, o caminho de imagens extraídos é copiado para a área de transferência.
    *-----------------------------------* Microsoft Knowledge Base Article 894819* EXAMPLE 1 * AUTHOR: Trevor Hancock* CREATED: February 22, 2005 09:59:32* ABSTRACT: This code extracts pictures to disk from the *                      General field that is named PHOTO in the *                      EMPLOYEE sample table.*-----------------------------------CLEARLOCAL lcTestDir AS STRING, ;	loListener AS REPORTLISTENER*-- Create a subfolder of the current*-- Visual FoxPro TEMP folder to hold the extracted pictures.lcTestDir = ADDBS( SYS( 2023 ) ) + 'GenTst\'IF !DIRECTORY( lcTestDir, 1 )	MD ( lcTestDir )ELSE	*-- If DIR is already there, empty it.	LOCAL lcOldSetSafe AS STRING	lcOldSetSafe = SET( 'Safety' )	SET SAFETY OFF	ERASE ( lcTestDir + '*.*' )	SET SAFETY &lcOldSetSafeENDIF*-- Open the EMPLOYEE table. The General field that is named*-- PHOTO has pictures in it.USE ADDBS( HOME() ) + 'Samples\Data\Employee.dbf'*-- Here we run the Report Output Application (ReportOutput.app) in HOME().*-- We pass it a 5. This means that we want the Report Output Application*-- to store an object reference to an HTMLListener-type*-- ReportListener base class to the second parameter that we pass: loListener.DO HOME() + 'ReportOutput.app' WITH 5, loListener*-- Tell the HTMLListener to save the output (the .HTM page)*-- to a specific folder. This folder is the one created earlier.loListener.TargetFileName = lcTestDir + 'tmp.htm'*-- Typically, a report that is run by using an HTMLListener*-- displays wait windows during processing and a*-- message box at the end. We want to turn this off. Therefore,*-- we set QuietMode = .T.*-- Note: This also turns off error reports from the ReportListener.loListener.QUIETMODE = .T.*-- Run the report by using the Listener.REPORT FORM GETFILE('FRX') OBJECT loListener*-- This command deletes the .html file that is produced.*-- We do not need it.ERASE ( loListener.TargetFileName )*-- Clean up, and then report that the process has finished.*-- To see the results, use Microsoft Windows Explorer to*-- view the folder path that is stored in the Windows Clipboard.CLOSE DATA ALL_CLIPTEXT = lcTestDir? 'Pictures have been extracted to ', lcTestDir? 'This path is in your Clipboard.'

Exemplo 2: Programaticamente extrair imagens de um campo geral usando uma classe ReportListener

Salve este exemplo de código para um novo arquivo .prg. Em seguida, execute o programa para criar automaticamente um relatório e usar o relatório para extrair as fotos da tabela de funcionários .

Observação Crie uma pasta na unidade C é chamado TmpTst ou redefinir a variável lcTargetDir para apontar para a pasta de sua escolha.
*-----------------------------------* Microsoft Knowledge Base Article 894819* EXAMPLE 2* AUTHOR: Trevor Hancock* CREATED: February 22, 2005 09:59:32* ABSTRACT: This code extracts pictures to disk from the *                 General field that is named PHOTO in the *                 EMPLOYEE sample table.*-----------------------------------*-- This opposite value of the constant will be used to set the QuietMode*-- property of the ReportListener base class. When the value is .T., *-- wait windows that indicate processing appear. At the end, a message box*-- appears. Any errors in the ReportListener base class also appear.#DEFINE ShowReportFlow_Errs  .F.LOCAL lcReportName AS STRING, ;	lcGenFldName AS STRING, ;	lnGenFldHeight AS INTEGER, ;	lnGenFldWidth AS INTEGER, ;	lcTargetDir AS STRING, ;	lcFileNameExpr AS STRING, ;	lcGenTable AS STRING*-- Choose the name of a table to extract one General*-- field from.lcGenTable = ADDBS( HOME() ) + 'Samples\Data\employee.dbf'*-- Set the name of the General field that you want to extract from.lcGenFldName = 'PHOTO'*-- Set the height that you want for the General field.lnGenFldHeight = 8000.00*-- Set the width that you want for the General field.lnGenFldWidth = 7000.00*-- Set the folder into which the General field*-- pictures will be extracted.lcTargetDir = 'C:\TmpTst\'*-- By default, pictures that are rendered to disk by the ReportListener class*-- use the following file name format: _n.jpg. In this format, n*-- is a number. If you set this next variable to an expression, you *-- can override that behavior. In this example, we name*-- the .jpg files based on the FIRST_NAME and LAST_NAME*-- fields from the EMPLOYEE table that we are reporting from.*-- This expression will be wrapped in the EVAL function when it is called. *-- Therefore, make sure that you specify an expression, a variable, or something else. *-- Possible choices include the RECNO function and other table field names.lcFileNameExpr = ;	"ALLT(Employee.First_Name) + '_' + ALLTRIM(Employee.Last_Name)"*------ START REPORT CREATION*CLOSE DATA ALLIF !DIRECTORY( lcTargetDir, 1 )	MESSAGEBOX( 'Target output folder does not exist. Process stopped.', 48, '' )	RETURN .F.ENDIFCD ( lcTargetDir )*-- Clean up the folder first to prevent any file name conflicts.LOCAL lcOldSetSafe as StringlcOldSetSafe = SET("Safety")SET SAFETY OFFDELETE FILE *.*SET SAFETY &lcOldSetSafe*-- Create a temporary cursor to base the report*-- on, make the report, and then close the cursor.*-- This temporary cursor is used to set up the report for the first time.*-- It is not needed after the report is made.lcReportName = lcTargetDir + 'GenReport'CREATE CURSOR TEMP ( Fld1 G )CREATE REPORT ( lcReportName ) FROM TEMPUSE IN TEMP*-- Open the report file (FRX) as a table.USE ( FORCEEXT( lcReportName, 'FRX' ) ) IN 0 ALIAS TheReport EXCLUSIVESELECT TheReport*-- This command removes objects that are not required *-- from the report surface and from the report table itself.*-- ObjType = 5 or 8: Removes the label and field objects from the footer.*-- ObjType = 23 & FontStyle = 1: Removes a font resource*-- that is not needed. The resource belonged to the label that was deleted.DELETE ALL FOR (ObjType = 23 AND FontStyle = 1) ;	OR INLIST(ObjType, 5, 8) IN TheReport*-- This command adjusts the layout of the header and footer bands.*-- ObjType = 9 & ObjCode = 1 means Page Header band.*-- ObjType = 9 & ObjCode = 7 means Page Footer band.*-  Reduce them because they are not required for this code.UPDATE TheReport SET Vpos = 0, Hpos = 0, HEIGHT = 0 ;	WHERE ObjType = 9 AND (ObjCode = 1 OR ObjCode = 7)*-- Increase the height of the Detail band*-- (ObjType = 9 & ObjCode = 4) to fit the*-- Picture/OLE Bound control that is inserted by using the next command.UPDATE TheReport SET Vpos = 0, Hpos = 0, HEIGHT = lnGenFldHeight ;	WHERE ObjType = 9 AND ObjCode = 4*-- Add a Picture/OLE Bound control to the report by inserting a*-- record with appropriate values. Using an object that is based on the EMPTY*-- class here and the GATHER NAME class later to insert the record makes it easier to*-- see which values line up to which fields when compared to a large*-- SQL-INSERT command).LOCAL loNewRecObj AS EMPTYloNewRecObj = NEWOBJECT('EMPTY')ADDPROPERTY( loNewRecObj, 'PLATFORM', 'WINDOWS' )ADDPROPERTY( loNewRecObj, 'Uniqueid', SYS(2015) )ADDPROPERTY( loNewRecObj, 'ObjType', 17 ) && "Picture/OLE Bound control"ADDPROPERTY( loNewRecObj, 'NAME', lcGenFldName ) && Name of the General field in the cursor.ADDPROPERTY( loNewRecObj, 'Vpos', 2083.333) && Put it in the Detail band.ADDPROPERTY( loNewRecObj, 'HEIGHT', lnGenFldHeight )ADDPROPERTY( loNewRecObj, 'WIDTH', lnGenFldWidth )ADDPROPERTY( loNewRecObj, 'DOUBLE', .T. ) && The picture is centered in the Picture/OLE Bound controlADDPROPERTY( loNewRecObj, 'Supalways', .T. )*-- For the Picture/OLE Bound control, the contents of the OFFSET field specify whether*-- File name (0), General field name (1), or Expression (2) is the source.ADDPROPERTY( loNewRecObj, 'Offset', 1 )*-- Add the Picture/OLE Bound control record to the report.APPEND BLANK IN TheReportGATHER NAME loNewRecObj MEMO*-- Clean up and then close the report table.PACK MEMOUSE**------ END REPORT CREATION*-- Rerun the report by using the Listener subclass*-- that is defined in later code.USE ( lcGenTable )LOCAL loXMLD_Listener AS ;	XMLDISPLAYLISTENER OF ADDBS( HOME( ) ) + 'Ffc\_reportlistener.vcx'loXMLD_Listener = NEWOBJECT( 'MyListener' )loXMLD_Listener.TargetFileName = ADDBS( lcTargetDir ) + 'tmp.htm'loXMLD_Listener.ImgFileNameExpr = lcFileNameExprloXMLD_Listener.QUIETMODE = !ShowReportFlow_ErrsWAIT WINDOW 'Rendering pictures.' NOWAIT NOCLEARREPORT FORM ( lcReportName ) OBJECT loXMLD_ListenerERASE (loXMLD_Listener.TargetFileName)ERASE ( FORCEEXT( lcReportName , '*' ) )RELEASE loXMLD_ListenerWAIT WINDOW 'Complete!' TIMEOUT 2RETURN*----------------------------------*----------------------------------DEFINE CLASS MyListener AS XMLDISPLAYLISTENER OF ADDBS(HOME()) + 'Ffc\_reportlistener.vcx'	ImgFileNameExpr = ''	ImgFile = ''	PROCEDURE RENDER(nFRXRecNo, nLeft, nTop, nWidth, nHeight, ;			nObjectContinuationType, cContentsToBeRendered, GDIPlusImage)		NODEFAULT		*-- ImageFileBaseName is an optional prefix to be added		*-- to generated image file names when image files are saved		*-- to disk during the rendering of general fields in a report run.		THIS.ImageFileBaseName = EVAL( THIS.ImgFileNameExpr )		*-- This is the full path and file name of the picture file that will		*-- be rendered to disk when the DODEFAULT function is called. This information is retrieved here		*-- so we can clean it up in the AfterBand event.		THIS.ImgFile	 = FORCEPATH(THIS.ImageFileBaseName + "_" + ;			TRANSFORM(THIS.ImageFieldInstance + 1) + ".jpg", ;			FULLPATH(THIS.ExternalFileLocation,ADDBS(JUSTPATH(THIS.TargetFileName))))		DODEFAULT(nFRXRecNo,nLeft,nTop,nWidth,nHeight, ;			nObjectContinuationType, cContentsToBeRendered, GDIPlusImage)	ENDPROC	PROCEDURE AFTERBAND(nBandObjCode, nFRXRecNo)		NODEFAULT		IF nBandObjCode = 4 && In Detail Band			*-- Look for the image file on the disk.			*-- If the image file is there, the code inside the IF...ENDIF			*-- construct strips off the _n that is at the end of the file name,			*-- just before the extension. This is added in the Render event by the			*-- XMLDISPLAYLISTENER class. You do not have to clean up the file name.  However,			*-- it looks cleaner. For example, "Scott_Rockfeld_1.jpg" would change to			*-- "Scott_Rockfeld.jpg".			IF FILE( THIS.ImgFile )				LOCAL lnLastUnderscorePos AS INTEGER				lnLastUnderscorePos = ATC('_', THIS.ImgFile, OCCURS( '_', THIS.ImgFile ) )				RENAME ( THIS.ImgFile ) TO ;					FORCEEXT( SUBSTR( THIS.ImgFile, 1, lnLastUnderscorePos - 1 ), 'JPG' )			ENDIF		ENDIF		DODEFAULT( nBandObjCode, nFRXRecNo )	ENDPROCENDDEFINE
Para obter mais informações sobre como exportar incorporado imagens de bitmap, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
161832Como exportar uma imagem .bmp incorporado em um arquivo
Para obter informações adicionais sobre FRX estrutura da tabela, consulte o tópico "Estruturas de tabela de arquivos de tabela (.dbc, FRx, .lbx, .mnx, .pjx, .scx, .vcx)" na Ajuda do Visual FoxPro.

Para revisar a estrutura de tabela do Visual FoxPro 9.0 FRX diretamente, execute o seguinte comando na janela de comando :
REPORT FORM HOME() + "\Tools\Filespec\90frx.frx" visualização
Referências
Para obter mais informações sobre a classe de base do estilo de exibição XML ReportListener, visite a seguinte site da Microsoft Developer Network (MSDN):

Propriedades

ID do Artigo: 894819 - Última Revisão: 11/16/2007 07:08:58 - Revisão: 3.3

Microsoft Visual FoxPro 9.0 Professional Edition

  • kbmt kbcodesnippet kbhowto KB894819 KbMtpt
Comentários