La escritura (no com) complementos de excel en delphi


Escribir complementos de Excel con Delphi es un proyecto desafiante. Voy a mostrar cómo se puede hacer, y poner de relieve las distintas trampas que se espera para el inconsciente viajero en esta frontera en gran parte inexplorada.
la Escritura de complementos de Excel con Delphi es un proyecto desafiante. Aquí donde me muestran cómo se puede hacer, y poner de relieve las distintas trampas que se espera para el inconsciente viajero en esta frontera en gran parte inexplorada.
a Pesar de que Microsoft aparente de impopularidad en algunos trimestres, Excel realmente deberían lugar alto en las listas de 'mejores software jamás creado'. Por supuesto teniendo más de diez años para obtener el derecho ayudado. Creo que una fuerza particular de Excel es su API abierta, que permite a los desarrolladores crear macros y el uso de Visual Basic Para Excel/VBA para las aplicaciones.
Uno de los menos conocidos características de Excel es complementos. Aunque puede crear con VBA, pero también puede escribir agregar-en archivos Dll en C y Delphi. Para aquellos que hacen del desarrollo grave que necesita para comprar el Excel 97 Developer Kit (ISBN 1-57231-498-2) (EDK) libro, pero, por supuesto, de su C/C orientado y hay algunas trampas para el programador Delphi. En este artículo te muestro lo suficiente para ponerse en marcha. Como desarrollador en Excel un ambiente de trabajo que he desarrollado con éxito muchos complementos con Delphi 3, y sé de saber de nadie más haciendo este. Hay Financiera CAD, una firma Canadiense, cuyos complementos puede ser utilizado a partir de Delphi, pero creo que está escrito en C . Hey yo podría ser la única persona en el mundo haciendo esto!
Delphi complementos hacen que sea fácil para usted para ampliar Excel en muchas formas, tales como la captura de datos de los puertos serie, fuentes de datos, todas con la velocidad de Delphi código compilado que es significativamente más rápido que interpreta VBA de Excel. Permite empezar a trabajar, hay mucho que cubrir.
Enormes Cadenas son un Gran Error
Como el complemento es un archivo DLL y Excel utiliza cadenas cortas, debe asegurarse de que las Enormes Cadenas de opción del compilador está claro (o $H - usa). Usted probablemente podría utilizar cadenas largas internamente, pero asegúrese de que convertir antes de pasarlos a Excel. Para mayor seguridad de uso de los elementos de tipo shortstring o String[n] tipos donde n es 1-255. Incluso si usted tiene Hugestrings enabled, puede utilizar string[n] para la transmisión de parámetros como estos son siempre de tipo tipo shortstring. Sólo recuerde la regla de oro, no de cadenas largas en parámetros pasados o registros.
Reconocimiento en el pasado
Excel sólo reconocer su archivo DLL como un complemento en el caso de ciertas funciones son exportados. Usted siempre debe proporcionar estas funciones, así como aquellos para el usuario. Estos xlAuto de la familia de funciones que se enumeran en la tabla de abajo y documentado en el Edk libro y en el código de ejemplo de este artículo. Todas sus funciones exportadas debe utilizar la convención de llamada STDCALL.
& nbsp & nbsp;
FunctionPurpose
xlAutoFreeCalled por Excel para liberar el Complemento de la memoria asignada.
XlAutoAddCalled cuando el Complemento se registra por primera vez.
XlAutoOpenCalled cuando Excel carga.
XlAutoCloseCalled cuando Excel se cierra.
XlAutoRemoveCalled cuando el Complemento es eliminado de Excel.
XlAutoRegisterOnly se llama a si una función no ha sido registrado.
XlAddInManagerInfoProvides una cadena de texto descripción de la Addin.
el uso De cualquier construida en función de Excel que su función llama a la función de Excel Excel4V. Este se define como
función Excel4v(
xlfn: word
operRes: lpxloper
conteo: integer
opers: matriz de lpxloper):integer
stdcall externos 'xlcall32.dll'
xlfn es la Función de número de la Función de Excel llamada.
Operfn es el resultado y es un puntero a una xloper llamado lpxloper (véase la sección siguiente)
Count es el número de elementos en Opers.
Opers es una matriz de lpxloper, es decir, una matriz de punteros a xlopers.
Nota: Para muchos la función puede pasar un valor nulo de la matriz para la Opers parámetro. Bajo D3, la matriz vacía de la construcción [] no está permitido, .como en D4 para uso [nil] en D3.
Mi desarrollo ha sido la insistencia en ofrecer a los usuarios nuevas funciones. El EDK documentos de cómo agregar los botones y controles de Excel, pero esos son un poco más de trabajo y no estoy de acuerdo con ellos aquí. Si usted desea enviar datos en Excel hay otros dos enfoques, tanto de shareware basada en la TadvExcel componente tiene muy rápida transferencia de datos con DDE. El TxlsReadWrite leer los componentes de salida de formato de los datos y las fórmulas directas en libro de Excel archivos.
Antes de empezar a llamar a las funciones de Excel, usted tiene que saber acerca de la XLOper tipo. Este es un pascal registro (C struct) unos 10 bytes de tamaño, que se alinean a 16 bytes párrafos en las matrices que corresponde a las celdas de una hoja de cálculo de Excel. La definición es la que se muestra a continuación. La culpa de Microsoft para el breve nombres de campo. El Tval tipo utiliza el antiguo pascal variante de tipo de registro, que no debe confundirse con OLE de Windows variantes, aunque utilizado en una manera similar. El xltype campo de XlOper especifica cual de los 9 tipos utilizados en juego. Así que si el xloper tiene un tipo de 1, val.num tiene un válido el número de precisión doble.
me he encontrado con que los tipos 1, 2, y 8 son los más utilizados. El tipo 4 es devuelto por Excel cuando se le mete algo mal. Hay un tipo entero (5) pero num (1) parece mucho más común. Tipo 6 se utiliza para los rangos, con el tipo 9 para las colecciones de células separadas donde usted mantenga presionada la tecla Ctrl al seleccionar las células. No hay ningún tipo 7.
Xloper Definición
TVal = lleno de Registro
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Caso de Bytes de
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 1: (num: Double) (* xltypeNum *)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 2: (str: ^tipo shortstring) (* xltypeStr *)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 3: (bool: Word) (* xltypeBool *)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 4: (err: Word) (* xltypeErr *)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 5: (n: Entero) (* xltypeInt *)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 6: (sref : lleno de registro
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp recuento:la palabra
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ref: Xlref
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 8: (_array : lleno de Registro (* xltypeMulti *)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp lparray: LPXLOPERArray
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp filas: La PALABRA
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp columnas: La PALABRA
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 9: (mref : lleno de registro // xltyperef
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp lpmref : lpxlmref
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp idsheet : integer
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final // tval
& nbsp & nbsp XlOper = lleno de Registro
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp val: TVal
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp xltype: WORD
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ficticio:array[0..5] de byte // almohadillas de 16 bytes tamaño
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final
lpxloper = ^xloper
Problema con Excel llama
a partir De Delphi la gran piedra de tropiezo con los complementos es el parámetro adicional después de que la dirección de retorno en la pila. Esto viene gratis con cada llamada a Excel. Nunca he encontrado que es lo que se tiene, pero siempre que tirarlo a la basura, su complemento funcione bien. Agregue la línea asm pop variable final después de cada llamada donde la variable puede ser cualquier global, local o variable de objeto que es al menos de 4 bytes de longitud entero está muy bien. A repetir que ESTO DEBE SER INCLUIDO después de cada Excel4v llamada. De lo contrario, usted está construyendo una bomba de tiempo.
Ejemplo
Eresult:= Excel4V(xlfCaller,@xres,0,[nil])
asm pop disipador de final // Nunca Quitar
tenga en cuenta que con Delphi sintaxis, si xres es un xloper, puede utilizar @xres para definir un lpxloper.
Precaución - Recálculo de Alerta!
Si las entradas a la función se calculan en cualquier forma, el código debe comprobar el estado de la call de Excel (Eresult en el ejemplo anterior), así como el resultado de la función de Excel llamada que será en xres arriba. Recuerde, usted llame Excel4V a la cal de la función especificada.
Eresult da 0 si aceptar, o un conjunto de bits para indicar los errores. Usted siempre debe manejar los valores 1 y 64. 1 es xlabort indicando que el usuario pulsa la tecla esc. 64 es una incalculado referencia de celda. No es un error, pero que pasa cuando su función utiliza las funciones o cálculos en la hoja de cálculo que son evaluadas completamente después de su rutina es la primera llamada. Si esto sucede, el código debe liberar la memoria que ya han sido asignados en la convocatoria y en la salida. Excel le llame a su función de nuevo.
& nbsp;
la Estructura de su código como este
1. Obtener los Parámetros de Entrada
2. Si un error de 64 o 1 (abortar clave) se produce, en la salida después de la liberación de la memoria ya asignados (si alguna) en esta función.
3. Hacer la función principal de procesamiento.
Si el paso 3 se va a consumir mucho tiempo, dicen que más de 1/10th de un segundo, el código debe comprobar la anulación estado llamando a xlAbort periódicamente.
Inicio
Cuando el Complemento es el primero que se agrega a Excel, cada una de las funciones exportadas deben ser registrados. Esto implica llamar al Excel de Registro de rutina para cada rutina. Hay ocho parámetros pasados como XlOpers.
ParameterTypeUse
Módulo textStringFull nombre del archivo DLL con la ruta de acceso
ProcedureString o numberFunction nombre o número al que desea llamar
Tipo de TextStringArgument y tipos de retorno
Función TextStringFunction nombre en el Asistente para funciones
Argumento TextStringOptional Cadena de Texto que describe los parámetros en función de Asistente de
Macro TypeNumber0,1, o 2
CategoryString o NumberCategory en virtud de la cual la función aparece
acceso directo TextStringOnly utiliza para los comandos, pase en null para la función
El parámetro más importante para inscribirse es el tipo de texto. Este utiliza las letras de la a-R para representar el valor de retorno y los parámetros proporcionados. Los valores se pasan como era de esperar en un Api en C por referencia (es decir, puntero - que es siempre una lpxloper) o por valor.
E. g. la hoja de cálculo de Excel =MyFunction(a1:b1) pasa una referencia al =InterestRate('GBP') se utiliza un valor.
Ejemplo
& nbsp & nbsp & nbsp & nbsp DLLName :=GetName // función para devolver el nombre/ruta de acceso desde Excel
& nbsp & nbsp & nbsp & nbsp pxModuleText.SetStr(s) // Nota (1)
& nbsp & nbsp & nbsp & nbsp pxProcedure.SetStr('AddDate') // Nombre de la Función
& nbsp & nbsp & nbsp & nbsp pxTypeText.SetStr('JJDD!') // (2) Tipo de Retorno = J, de Entrada = JDD
& nbsp & nbsp & nbsp & nbsp pxFunctionText.setStr('AddDate') // Nombre en Fx Asistente
& nbsp & nbsp & nbsp & nbsp pxArgumentText.SetStr('la Fecha,Plazo,Moneda') // Parm de texto en FX Wiz
& nbsp & nbsp & nbsp & nbsp pxMacrotype.SetNum(1) // Tipo = Sinmple func(3)
& nbsp & nbsp & nbsp & nbsp pxCategory.SetStr(AddInCategory) // Categoría para Func. wiz
& nbsp & nbsp & nbsp & nbsp EResult:=Excel4V(xlfregister,@res,8, // Pasar en 8 parámetros
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp [pxModuletext.thelpxloper,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp pxProcedure.thelpxloper,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp pxTypeText.thelpxloper,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp pxFunctionText.thelpxloper,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp pxArgumentText.thelpxloper,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp pxMacroType.thelpxloper,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp pxCategory.thelpxloper,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp zlpxloper]) // Null
& nbsp & nbsp & nbsp asm pop disipador de final // Nunca Quitar
& nbsp & nbsp & nbsp Resultado := trunc(res.val.num) // Código de IDENTIFICACIÓN (4)
El px variables son todos de la txloper clase, lo que simplifica la inicialización de xlopers.
Notas
(1) El DLLName y la ruta de acceso debe ser obtenido a partir de Excel, a través de la XlGetName función - usted puede ver esto en el código de ejemplo. No codificarlo, ya que incluye la ruta de acceso.
(2) Ver Registro (página 219 en EdK) para obtener más detalles de Tipo de Texto. El primer parámetro es el parámetro de retorno (J=32 bits entero) el próximo 3 son los insumos (JDD = Integer, String, String) y el ! significa que Excel siempre llama a la función cuando se vuelve a calcular. Sin el !, Excel llama a la función una vez, pestillos el resultado y utiliza el trabado resultado en las llamadas posteriores.
(3) Tipo 1 = Función. Otros tipos incluyen cotizadas de la función (tipo 0) y los comandos (tipo 2). Si desea que las funciones que no aparecen en el Asistente para funciones, utilice 0.
(4) Después de registrarse, el valor numérico en la resolución (res.val.num) contiene un número entero de id de código para esta función, con el mango. Guardar este y se pasa a la función Anular el registro cuando el archivo DLL se cierra. Olvidar esto y vas a tener problemas con el uso de las versiones más recientes de la biblioteca.
Obtener Valores a partir de una Hoja de cálculo de Excel
Valores puede ser pasado, en tres maneras.
1. Como en el pasado-por-valor. Eg =CalcMean(4,5,8) xltypenum o xltypestr
2. Como una Simple referencia, decir una celda a1 o el rango a3:b56. xltypesref
3. Como compuesto de Referencia. Básicamente una colección de distintos referencias de celda. xltypemref
1 y 2 son los más comunes. 3 es un poco raro y a menos que realmente se necesita, es mejor filtrar este. Si usted quiere usar, la entrada es una matriz de referencias de celda (tipo 2), por lo que usted tiene que usar cada uno de ellos.
Excel filtrará el tipo de datos si se especifica (número, cadena, etc), pero si estás esperando un rango, a continuación, debe comprobar el tipo y rangos de valores, informes de errores, si procede..
Devolver Errores
Su función debe devolver un lpxloper (tipo R) si desea volver Excel códigos de Error. Para establecer un error en la resolución (un xloper) acaba de hacer
res.xltype := xltypeerr
res.val.err := número // devuelve los siguientes valores, a continuación, acabo de volver de @res de su función
NumberExcel Err
0#NULL
7#DIV/0
15#VALOR
23#REF
29#NOMBRE
36#NUM
42#N/A
Con complicados, muchas funciones de parámetros creo que los errores estándar de excel son un poco antipático y, entonces, yo sugiero un GetlastError() función que devuelve el último error de la cadena. Cualquier función que devuelve un error, debe establecer la cadena de error devuelto por GetLastError(). Esto le ahorrará a los usuarios una gran cantidad de tiempo cuando están utilizando sus funciones por primera vez.
la Lectura de los Valores de las celdas
de Haber sido aprobada una referencia de celda (xltypeSref) de la que desea obtener en los valores contenidos en las celdas. Para hacer esto usted debe 'obligar' a la referencia de celda xloper. Este coaccionar (una función de Excel), las fuerzas de Excel para la construcción de un vector de xlopers, con exactamente (#Filas * #Cols) xlopers. Es decir, para un 2 x 3 matriz de celdas, se obtienen seis xlopers. El objetivo xloper se convierte en un encabezado con el xltype campo = 64 (xltypearray). El val._array miembro contiene el número de filas y columnas, y un puntero al cuerpo xloper.
Estos xlopers están dispuestos en orden de fila de modo que las seis células en dos filas por 3 columnas se almacenan como
1 2 3
4 5 6
Cada uno tiene el tipo fundamental (xltype num o Str) y el valor.
Ejemplo de Coerción
Desttype.xltype := xltypeInt
Desttype.val.w := xltypeMulti
Eresult := Excel4v(xlcoerce,@Xval,2,[Valores,@desttype])
asm pop disipador de final // Nunca Quitar
& nbsp & nbsp;
La xlopers/lpxlopers que aquí se utilizan son
Desttype - Un xloper que especifica la coacción tipo de destino (xltypemulti - Sobresale el nombre de un array de xlopers)
los Valores Del pasado en la celda de referencia - un lpxloper
Xval - El objetivo xloper. Después de una exitosa coaccionar, este es el encabezado de una matriz. Con el 2 x 3 matriz, habrá seis xlopers, cada uno con un valor de la celda.
Excel ha asignado la memoria en su nombre y este tiene que ser tratada, pero más en que más tarde..
Ejemplo del uso de los valores
Este ejemplo se comprueba la
si xval.val._array.filas<>1 y
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Error('Debería tener una única fila')
& nbsp & nbsp & nbsp & nbsp goto myexit
& nbsp & nbsp final
xlar := xval.val._array.lparray
index:=0
para col:= 1 a xr.NumCols hacer
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp si xlar^[índice].xltype <> xltypenum, a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Error('Elemento' inttostr(fila) 'No es un número')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp break
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp Valor[col] := xlar^[índice].val.num
& nbsp & nbsp & nbsp & nbsp inc(índice)
& nbsp & nbsp final
xlar es un puntero a una matriz de xlopers. En este ejemplo, esto comprueba que hay una fila de datos no numéricos. Luego copia el valor en el Valor de la matriz [].
Poner los valores en las Celdas de Excel
a Pesar de que hay un equivalente (más o menos) de xlcoerce, llamado xlset, que sólo puede ser llamado desde la línea de comandos (menú o botón de barra de herramientas) y no de una función. Su muy anti sociales de todos modos que acaba de volcar un montón de valores en una hoja de cálculo que sólo podría sobrescribir una de las mañanas de trabajo no guardado y no se que mejorar su popularidad!
Una característica bien conocida de Excel llamada Función de las Matrices (o fórmula de matrices) es lo que se necesita. Si usted no está familiarizado con ellos, tratar de esto en un vacío de la hoja de Excel.
1. Seleccionar un área rectangular con el ratón. Ahora haga clic en la línea de edición (justo debajo de las barras de herramientas, por encima de las células) y escriba =g1. En este punto usted debe ver a =g1 en la línea de edición y el área seleccionada debe todavía ser seleccionado. Si se borra la selección por error, volver atrás e intentarlo de nuevo.
2. Ahora, mantenga presionada la tecla ctrl y shift y pulse enter. El =g1 debe ser pegado en todas las células anteriormente en el área seleccionada.
además debe tener en cuenta algunas cosas acerca de esto si usted haga clic en cualquier celda en esta área.
1. La línea de edición se muestra la ecuación entre paréntesis.
2. Usted no puede cambiar o borrar la celda.
3. No ajustar la referencia de la celda.
Esta es la única manera (tan lejos como pude averiguar) para poner los valores en las celdas de Excel. Su función de excel debe construir una matriz de xlopers, con el encabezado señalando el cuerpo. Si la función devuelve una matriz, debe utilizar una Función de Matriz para mostrar el resultado. Excel es muy inteligente, con este. Si usted devuelve un 3 x 5 área y el usuario pega una Función de la Matriz en un 4 x 6 rectángulo, las células adicionales se mostrarán a N/A.
la Gestión de la Memoria
Si un Excel4v llamada devuelve un xloper con un puntero (o cadenas de xltypemulti por ejemplo) y luego, cuando el código ha terminado con el valor de su código siempre debe llamar xlfree en el xloper. De hecho, como regla general, llamando xlfree en cualquier xloper no hace daño a todos.
Hay dos asignación de memoria en los casos que el código DEBE manejar..
1. Has llamado a una rutina que devuelve un xloper con los datos en la misma, por ejemplo xlcoerce para convertir un xltypesref/xltyperef a un xltypemulti (matriz). Excel asigna su propia memoria y cuando haya terminado con los datos, debe O en el valor de $1000 (4096 decimal) en el xltype - $1000 valor es conocido como xlbitXLfree. Cuando llame xlfree, se libera el 'Excel asigna memoria.
2. Si el código devuelve un array de xlopers que Excel muestra como una función de la matriz, debe O en el valor $4000 (16384 decimal) en el xltype campo, antes de que se sale de la función. Después de copiar los valores de Excel hará una devolución de llamada a su xlAutoFree función (que hizo implementar uno, ¿no?) con un lpxloper a sus datos. Usted puede entonces libre de ella. Si usted crea la matriz con n elementos, en (n 1) xlopers, donde arrayname[0] es el encabezado que apunta a arrayname[1] a continuación, el puntero devuelto los puntos a arrayname[0] y freemem(call back puntero), a continuación, liberar el puntero correcto.
Un ejemplo De Complemento
El ejemplo que acompaña a este artículo es auto-contenida en cerca de 650 líneas de código con el no delphi componentes o unidades necesarias. Se implementa una Función de Distribución Acumulativa GetCDF que toma un número en el rango de -4 a 4 como entrada y devuelve la altura en virtud de la ojiva de la curva. Sé que Excel viene con varios Normal de las funciones de distribución, pero sirve como ejemplo. Se ha probado en Excel 95 y 97 con Delphi 3 en win 95/98 y NT y ha demostrado ser sólida como una roca. No puedo enfatizar lo importante que es revisar todas las entradas y tratar de obtener su código de tan resistente como sea posible. Algo desagradable probablemente bomba o colgar de Excel y los usuarios rápidamente se convierten en abusadores. No olvides que la Stdcalls en todas las funciones exportadas!
Aparte de la obligatoriedad de xlauto familia de funciones, se incluye otras cinco funciones, dos de los cuales son invisibles. Estos dos GetXlStack y FreeRam están destinados para su uso por el desarrollador sólo. Los otros tres (GetCDF, LastError y Versión) son para el usuario. Puede utilizar los dos tipos de funciones directamente, sino que sólo son visibles se pueden ver en el Asistente para funciones. Y no te olvides de los paréntesis en las llamadas a la función. Excel estará feliz de tomar =Versión (sin ()) y devuelven un valor de -30408699 (no tengo idea) cuando en realidad significaba =Versión().
he incluido la principal función de excel números que se utilizan en el programa, la lista completa tiene casi 400. El EDK tiene el lote completo e incluye cabeceras de C que se puede editar fácilmente.
En muchos sentidos, este es un poco anticuado, no OOP programa. Elegí ese camino originalmente como me estaba sintiendo mi camino ronda complementos de excel y yo no quiero tener problemas con los Objetos al mismo tiempo. La única clase que he utilizado aquí es Txloper para simplificar la creación de Xlopers pero que era mantener concisa. Envíenos sus consultas y ofertas de trabajo a [email protected].
El archivo de abajo es completa - fuente para un archivo dll. Asegúrese de que la extensión es .xll

{$A ,B,C ,D ,E,F,G ,H,I ,J ,K,L ,M,N ,O,P ,Q ,R,S,T,U,V ,W ,X ,Y,Z1}
biblioteca cdfcalc
usos
& nbsp & nbsp SysUtils,
& nbsp & nbsp windows,
& nbsp & nbsp diálogos,
& nbsp & nbsp formas,
& nbsp & nbsp Clases,
& nbsp & nbsp Matemáticas
// XLREF estructura
& nbsp & nbsp tipo xlref = lleno de registro
& nbsp & nbsp & nbsp & nbsp & nbsp rwFirst : smallint
& nbsp & nbsp & nbsp & nbsp & nbsp rwLast : smallint
& nbsp & nbsp & nbsp & nbsp & nbsp colFirst : byte
& nbsp & nbsp & nbsp & nbsp & nbsp colLast : byte
& nbsp & nbsp final
& nbsp & nbsp // Devuelve un rango de selección
& nbsp & nbsp XlRangeRecord = lleno de registro
& nbsp & nbsp & nbsp & nbsp & nbsp Count : palabra // siempre debe ser de $1
& nbsp & nbsp & nbsp & nbsp & nbsp Sref : xlref
& nbsp & nbsp final
& nbsp & nbsp xlmref= lleno de registro
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp count : word
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp RefTbl : array[0..1000] de XlRef
& nbsp & nbsp final
& nbsp & nbsp lpxloper = ^XLOPER
& nbsp & nbsp lpxloperArray = ^XLArray
& nbsp & nbsp lpxlmref = ^xlmref
& nbsp & nbsp TVal = lleno de Registro
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Caso de Bytes de
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 1: (num : Doble) // xltypeNum
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 2: (str : ^tipo shortstring) // xltypeStr
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 3: (bool : Word) // xltypeBool
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 4: (err : Word) // xltypeErr
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 5: (n : Entero) // xltypeInt
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 6: (sref : lleno de registro
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Recuento : la palabra
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ref : Xlref
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 8: (_array : lleno de Registro // xltypeMulti
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp lparray: lpxloperArray
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp filas: La PALABRA
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp columnas: La PALABRA
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 9: (mref : lleno de registro // xltyperef
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp lpmref : lpxlmref
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp idsheet : integer
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final // tval
& nbsp & nbsp XLOPER = lleno de Registro
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp val : TVal
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp xltype : WORD
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ficticio:array[0..5] de byte // relleno
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final
xlarray=array[0..1000] de xloper
lpxlarray=^xlarray
txloper = clase // Simple xloper clase de apoyo
& nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp fxloper : xloper
& nbsp & nbsp & nbsp & nbsp fActualStr : tipo shortstring
& nbsp & nbsp & nbsp & nbsp función Getlpxloper:lpxloper
& nbsp & nbsp pública
& nbsp & nbsp & nbsp & nbsp constructor Create

& nbsp & nbsp & nbsp & nbsp Destructor Destruir reemplazar
& nbsp & nbsp & nbsp & nbsp Constructor Create_Str(NewStr : tipo shortstring)
& nbsp & nbsp & nbsp & nbsp procedimiento SetStr(NewStr : tipo shortstring)
& nbsp & nbsp & nbsp & nbsp procedimiento SetNum(NewNumber : Integer)
& nbsp & nbsp & nbsp & nbsp procedimiento SetInt(NewNumber : Integer)
& nbsp & nbsp & nbsp & nbsp procedimiento SetErr
& nbsp & nbsp & nbsp & nbsp propiedad thelpxloper : lpxloper leer Getlpxloper
fin
// Excel
función Excel4v(xlfn:palabra operRes:lpxloper count:integer opers:matriz de lpxloper):integer
stdcall externos 'xlcall32.dll'
// XLMREF estructura Describe múltiples rectangular referencias.
const
& nbsp xltypeNum = $0001
& nbsp xltypeStr = $0002
& nbsp xltypeBool = $0004
& nbsp xltypeRef = $0008
& nbsp xltypeErr = $0010
& nbsp xltypeFlow = $0020
& nbsp xltypeMulti = $0040
& nbsp xltypeMissing = $0080
& nbsp xltypeNil = $0100
& nbsp xltypeSRef = $0400
& nbsp xltypeInt = $0800
& nbsp xlbitXLFree = $1000
& nbsp xlbitDLLFree = $4000
& nbsp xltypeBigData =xltypeStr o xltypeInt
// códigos de Error se Utiliza para val.err campo de XLOPER estructura
& nbsp xlerrNull =0
& nbsp xlerrDiv0 =7
& nbsp xlerrValue =15
& nbsp xlerrRef =23
& nbsp xlerrName =29
& nbsp xlerrNum =36
& nbsp xlerrNA =42
// códigos de Retorno
& nbsp xlretSuccess =0 // éxito
& nbsp xlretAbort =1 // macro detuvo
& nbsp xlretInvXlfn =2 // no válido número de función
& nbsp xlretInvCount =4 // número de argumentos no válido
& nbsp xlretInvXloper =8 // no válido OPER estructura
& nbsp xlretStackOvfl =16 // desbordamiento de pila
& nbsp xlretFailed =32 // error de comando
& nbsp xlretUncalced =64 // uncalced celular
// Función número de bits
& nbsp xlCommand = $8000
& nbsp xlSpecial = $4000
& nbsp xlIntl = $2000
& nbsp xlPrompt = $1000
// función Especial de los números
& nbsp xlFree =(0 o xlspecial)
& nbsp xlStack =(1 o xlspecial)
& nbsp xlCoerce =(2 o xlspecial)
& nbsp xlSet =(3 o xlspecial)
& nbsp xlSheetId =(4 o xlspecial)
& nbsp xlSheetNm =(5 o xlspecial)
& nbsp xlAbort =(6 o xlspecial)
& nbsp xlGetInst =(7 o xlspecial)
& nbsp xlGetHwnd =(8 o xlspecial)
& nbsp xlGetName =(9 o xlspecial)
& nbsp xlEnableXLMsgs =(10 o xlspecial)
& nbsp xlDisableXLMsgs =(11 o xlspecial)
& nbsp xlDefine inaryName =(12 o xlspecial)
& nbsp xlGetBinaryName =(13 o xlspecial)
// funciones definidas por el Usuario necesita para llamar a las funciones de Excel
& nbsp & nbsp xlfCaller=89
& nbsp & nbsp xlfRegister=149
& nbsp & nbsp xlfUnregister=201
//
& nbsp & nbsp DLLversion:tipo shortstring='CDF Calc V1.02'
& nbsp & nbsp AddInCategory='CDF Calculadora'
& nbsp & nbsp const zlpxloper=lpxloper(nil)
& nbsp & nbsp tipo retarray=array[0..1000] de xloper
& nbsp & nbsp pretarray=^retarray
var // Global de los datos
& nbsp & nbsp res : xloper
& nbsp & nbsp GetCDF_Id : Integer
& nbsp & nbsp xlStack_Id : Integer
& nbsp & nbsp EResult : Integer
& nbsp & nbsp fregadero : integer
& nbsp & nbsp GetStack_Id : Integer
& nbsp & nbsp LastError_Id :








La escritura (no com) complementos de excel en delphi


La escritura (no com) complementos de excel en delphi : Multi-millones de consejos para hacer su vida mas facil.


Escribir complementos de Excel con Delphi es un proyecto desafiante. Voy a mostrar como se puede hacer, y poner de relieve las distintas trampas que se espera para el inconsciente viajero en esta frontera en gran parte inexplorada.
la Escritura de complementos de Excel con Delphi es un proyecto desafiante. Aqui donde me muestran como se puede hacer, y poner de relieve las distintas trampas que se espera para el inconsciente viajero en esta frontera en gran parte inexplorada.
a Pesar de que Microsoft aparente de impopularidad en algunos trimestres, Excel realmente deberian lugar alto en las listas de 'mejores software jamas creado'. Por supuesto teniendo mas de diez años para obtener el derecho ayudado. Creo que una fuerza particular de Excel es su API abierta, que permite a los desarrolladores crear macros y el uso de Visual Basic Para Excel/VBA para las aplicaciones.
Uno de los menos conocidos caracteristicas de Excel es complementos. Aunque puede crear con VBA, pero tambien puede escribir agregar-en archivos Dll en C y Delphi. Para aquellos que hacen del desarrollo grave que necesita para comprar el Excel 97 Developer Kit (ISBN 1-57231-498-2) (EDK) libro, pero, por supuesto, de su C/C orientado y hay algunas trampas para el programador Delphi. En este articulo te muestro lo suficiente para ponerse en marcha. Como desarrollador en Excel un ambiente de trabajo que he desarrollado con exito muchos complementos con Delphi 3, y se de saber de nadie mas haciendo este. Hay Financiera CAD, una firma Canadiense, cuyos complementos puede ser utilizado a partir de Delphi, pero creo que esta escrito en C . Hey yo podria ser la unica persona en el mundo haciendo esto!
Delphi complementos hacen que sea facil para usted para ampliar Excel en muchas formas, tales como la captura de datos de los puertos serie, fuentes de datos, todas con la velocidad de Delphi codigo compilado que es significativamente mas rapido que interpreta VBA de Excel. Permite empezar a trabajar, hay mucho que cubrir.
Enormes Cadenas son un Gran Error
Como el complemento es un archivo DLL y Excel utiliza cadenas cortas, debe asegurarse de que las Enormes Cadenas de opcion del compilador esta claro (o $H - usa). Usted probablemente podria utilizar cadenas largas internamente, pero asegurese de que convertir antes de pasarlos a Excel. Para mayor seguridad de uso de los elementos de tipo shortstring o String[n] tipos donde n es 1-255. Incluso si usted tiene Hugestrings enabled, puede utilizar string[n] para la transmision de parametros como estos son siempre de tipo tipo shortstring. Solo recuerde la regla de oro, no de cadenas largas en parametros pasados o registros.
Reconocimiento en el pasado
Excel solo reconocer su archivo DLL como un complemento en el caso de ciertas funciones son exportados. Usted siempre debe proporcionar estas funciones, asi como aquellos para el usuario. Estos xlAuto de la familia de funciones que se enumeran en la tabla de abajo y documentado en el Edk libro y en el codigo de ejemplo de este articulo. Todas sus funciones exportadas debe utilizar la convencion de llamada STDCALL.
& nbsp & nbsp;
FunctionPurpose
xlAutoFreeCalled por Excel para liberar el Complemento de la memoria asignada.
XlAutoAddCalled cuando el Complemento se registra por primera vez.
XlAutoOpenCalled cuando Excel carga.
XlAutoCloseCalled cuando Excel se cierra.
XlAutoRemoveCalled cuando el Complemento es eliminado de Excel.
XlAutoRegisterOnly se llama a si una funcion no ha sido registrado.
XlAddInManagerInfoProvides una cadena de texto descripcion de la Addin.
el uso De cualquier construida en funcion de Excel que su funcion llama a la funcion de Excel Excel4V. Este se define como
funcion Excel4v(
xlfn: word
operRes: lpxloper
conteo: integer
opers: matriz de lpxloper):integer
stdcall externos 'xlcall32.dll'
xlfn es la Funcion de numero de la Funcion de Excel llamada.
Operfn es el resultado y es un puntero a una xloper llamado lpxloper (vease la seccion siguiente)
Count es el numero de elementos en Opers.
Opers es una matriz de lpxloper, es decir, una matriz de punteros a xlopers.
Nota: Para muchos la funcion puede pasar un valor nulo de la matriz para la Opers parametro. Bajo D3, la matriz vacia de la construccion [] no esta permitido, .como en D4 para uso [nil] en D3.
Mi desarrollo ha sido la insistencia en ofrecer a los usuarios nuevas funciones. El EDK documentos de como agregar los botones y controles de Excel, pero esos son un poco mas de trabajo y no estoy de acuerdo con ellos aqui. Si usted desea enviar datos en Excel hay otros dos enfoques, tanto de shareware basada en la TadvExcel componente tiene muy rapida transferencia de datos con DDE. El TxlsReadWrite leer los componentes de salida de formato de los datos y las formulas directas en libro de Excel archivos.
Antes de empezar a llamar a las funciones de Excel, usted tiene que saber acerca de la XLOper tipo. Este es un pascal registro (C struct) unos 10 bytes de tamaño, que se alinean a 16 bytes parrafos en las matrices que corresponde a las celdas de una hoja de calculo de Excel. La definicion es la que se muestra a continuacion. La culpa de Microsoft para el breve nombres de campo. El Tval tipo utiliza el antiguo pascal variante de tipo de registro, que no debe confundirse con OLE de Windows variantes, aunque utilizado en una manera similar. El xltype campo de XlOper especifica cual de los 9 tipos utilizados en juego. Asi que si el xloper tiene un tipo de 1, val.num tiene un valido el numero de precision doble.
me he encontrado con que los tipos 1, 2, y 8 son los mas utilizados. El tipo 4 es devuelto por Excel cuando se le mete algo mal. Hay un tipo entero (5) pero num (1) parece mucho mas comun. Tipo 6 se utiliza para los rangos, con el tipo 9 para las colecciones de celulas separadas donde usted mantenga presionada la tecla Ctrl al seleccionar las celulas. No hay ningun tipo 7.
Xloper Definicion
TVal = lleno de Registro
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Caso de Bytes de
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 1: (num: Double) (* xltypeNum *)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 2: (str: ^tipo shortstring) (* xltypeStr *)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 3: (bool: Word) (* xltypeBool *)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 4: (err: Word) (* xltypeErr *)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 5: (n: Entero) (* xltypeInt *)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 6: (sref : lleno de registro
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp recuento:la palabra
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ref: Xlref
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 8: (_array : lleno de Registro (* xltypeMulti *)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp lparray: LPXLOPERArray
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp filas: La PALABRA
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp columnas: La PALABRA
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 9: (mref : lleno de registro // xltyperef
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp lpmref : lpxlmref
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp idsheet : integer
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final // tval
& nbsp & nbsp XlOper = lleno de Registro
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp val: TVal
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp xltype: WORD
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ficticio:array[0..5] de byte // almohadillas de 16 bytes tamaño
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final
lpxloper = ^xloper
Problema con Excel llama
a partir De Delphi la gran piedra de tropiezo con los complementos es el parametro adicional despues de que la direccion de retorno en la pila. Esto viene gratis con cada llamada a Excel. Nunca he encontrado que es lo que se tiene, pero siempre que tirarlo a la basura, su complemento funcione bien. Agregue la linea asm pop variable final despues de cada llamada donde la variable puede ser cualquier global, local o variable de objeto que es al menos de 4 bytes de longitud entero esta muy bien. A repetir que ESTO DEBE SER INCLUIDO despues de cada Excel4v llamada. De lo contrario, usted esta construyendo una bomba de tiempo.
Ejemplo
Eresult:= Excel4V(xlfCaller,@xres,0,[nil])
asm pop disipador de final // Nunca Quitar
tenga en cuenta que con Delphi sintaxis, si xres es un xloper, puede utilizar @xres para definir un lpxloper.
Precaucion - Recalculo de Alerta!
Si las entradas a la funcion se calculan en cualquier forma, el codigo debe comprobar el estado de la call de Excel (Eresult en el ejemplo anterior), asi como el resultado de la funcion de Excel llamada que sera en xres arriba. Recuerde, usted llame Excel4V a la cal de la funcion especificada.
Eresult da 0 si aceptar, o un conjunto de bits para indicar los errores. Usted siempre debe manejar los valores 1 y 64. 1 es xlabort indicando que el usuario pulsa la tecla esc. 64 es una incalculado referencia de celda. No es un error, pero que pasa cuando su funcion utiliza las funciones o calculos en la hoja de calculo que son evaluadas completamente despues de su rutina es la primera llamada. Si esto sucede, el codigo debe liberar la memoria que ya han sido asignados en la convocatoria y en la salida. Excel le llame a su funcion de nuevo.
& nbsp;
la Estructura de su codigo como este
1. Obtener los Parametros de Entrada
2. Si un error de 64 o 1 (abortar clave) se produce, en la salida despues de la liberacion de la memoria ya asignados (si alguna) en esta funcion.
3. Hacer la funcion principal de procesamiento.
Si el paso 3 se va a consumir mucho tiempo, dicen que mas de 1/10th de un segundo, el codigo debe comprobar la anulacion estado llamando a xlAbort periodicamente.
Inicio
Cuando el Complemento es el primero que se agrega a Excel, cada una de las funciones exportadas deben ser registrados. Esto implica llamar al Excel de Registro de rutina para cada rutina. Hay ocho parametros pasados como XlOpers.
ParameterTypeUse
Modulo textStringFull nombre del archivo DLL con la ruta de acceso
ProcedureString o numberFunction nombre o numero al que desea llamar
Tipo de TextStringArgument y tipos de retorno
Funcion TextStringFunction nombre en el Asistente para funciones
Argumento TextStringOptional Cadena de Texto que describe los parametros en funcion de Asistente de
Macro TypeNumber0,1, o 2
CategoryString o NumberCategory en virtud de la cual la funcion aparece
acceso directo TextStringOnly utiliza para los comandos, pase en null para la funcion
El parametro mas importante para inscribirse es el tipo de texto. Este utiliza las letras de la a-R para representar el valor de retorno y los parametros proporcionados. Los valores se pasan como era de esperar en un Api en C por referencia (es decir, puntero - que es siempre una lpxloper) o por valor.
E. g. la hoja de calculo de Excel =MyFunction(a1:b1) pasa una referencia al =InterestRate('GBP') se utiliza un valor.
Ejemplo
& nbsp & nbsp & nbsp & nbsp DLLName :=GetName // funcion para devolver el nombre/ruta de acceso desde Excel
& nbsp & nbsp & nbsp & nbsp pxModuleText.SetStr(s) // Nota (1)
& nbsp & nbsp & nbsp & nbsp pxProcedure.SetStr('AddDate') // Nombre de la Funcion
& nbsp & nbsp & nbsp & nbsp pxTypeText.SetStr('JJDD!') // (2) Tipo de Retorno = J, de Entrada = JDD
& nbsp & nbsp & nbsp & nbsp pxFunctionText.setStr('AddDate') // Nombre en Fx Asistente
& nbsp & nbsp & nbsp & nbsp pxArgumentText.SetStr('la Fecha,Plazo,Moneda') // Parm de texto en FX Wiz
& nbsp & nbsp & nbsp & nbsp pxMacrotype.SetNum(1) // Tipo = Sinmple func(3)
& nbsp & nbsp & nbsp & nbsp pxCategory.SetStr(AddInCategory) // Categoria para Func. wiz
& nbsp & nbsp & nbsp & nbsp EResult:=Excel4V(xlfregister,@res,8, // Pasar en 8 parametros
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp [pxModuletext.thelpxloper,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp pxProcedure.thelpxloper,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp pxTypeText.thelpxloper,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp pxFunctionText.thelpxloper,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp pxArgumentText.thelpxloper,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp pxMacroType.thelpxloper,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp pxCategory.thelpxloper,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp zlpxloper]) // Null
& nbsp & nbsp & nbsp asm pop disipador de final // Nunca Quitar
& nbsp & nbsp & nbsp Resultado := trunc(res.val.num) // Codigo de IDENTIFICACION (4)
El px variables son todos de la txloper clase, lo que simplifica la inicializacion de xlopers.
Notas
(1) El DLLName y la ruta de acceso debe ser obtenido a partir de Excel, a traves de la XlGetName funcion - usted puede ver esto en el codigo de ejemplo. No codificarlo, ya que incluye la ruta de acceso.
(2) Ver Registro (pagina 219 en EdK) para obtener mas detalles de Tipo de Texto. El primer parametro es el parametro de retorno (J=32 bits entero) el proximo 3 son los insumos (JDD = Integer, String, String) y el ! significa que Excel siempre llama a la funcion cuando se vuelve a calcular. Sin el !, Excel llama a la funcion una vez, pestillos el resultado y utiliza el trabado resultado en las llamadas posteriores.
(3) Tipo 1 = Funcion. Otros tipos incluyen cotizadas de la funcion (tipo 0) y los comandos (tipo 2). Si desea que las funciones que no aparecen en el Asistente para funciones, utilice 0.
(4) Despues de registrarse, el valor numerico en la resolucion (res.val.num) contiene un numero entero de id de codigo para esta funcion, con el mango. Guardar este y se pasa a la funcion Anular el registro cuando el archivo DLL se cierra. Olvidar esto y vas a tener problemas con el uso de las versiones mas recientes de la biblioteca.
Obtener Valores a partir de una Hoja de calculo de Excel
Valores puede ser pasado, en tres maneras.
1. Como en el pasado-por-valor. Eg =CalcMean(4,5,8) xltypenum o xltypestr
2. Como una Simple referencia, decir una celda a1 o el rango a3:b56. xltypesref
3. Como compuesto de Referencia. Basicamente una coleccion de distintos referencias de celda. xltypemref
1 y 2 son los mas comunes. 3 es un poco raro y a menos que realmente se necesita, es mejor filtrar este. Si usted quiere usar, la entrada es una matriz de referencias de celda (tipo 2), por lo que usted tiene que usar cada uno de ellos.
Excel filtrara el tipo de datos si se especifica (numero, cadena, etc), pero si estas esperando un rango, a continuacion, debe comprobar el tipo y rangos de valores, informes de errores, si procede..
Devolver Errores
Su funcion debe devolver un lpxloper (tipo R) si desea volver Excel codigos de Error. Para establecer un error en la resolucion (un xloper) acaba de hacer
res.xltype := xltypeerr
res.val.err := numero // devuelve los siguientes valores, a continuacion, acabo de volver de @res de su funcion
NumberExcel Err
0#NULL
7#DIV/0
15#VALOR
23#REF
29#NOMBRE
36#NUM
42#N/A
Con complicados, muchas funciones de parametros creo que los errores estandar de excel son un poco antipatico y, entonces, yo sugiero un GetlastError() funcion que devuelve el ultimo error de la cadena. Cualquier funcion que devuelve un error, debe establecer la cadena de error devuelto por GetLastError(). Esto le ahorrara a los usuarios una gran cantidad de tiempo cuando estan utilizando sus funciones por primera vez.
la Lectura de los Valores de las celdas
de Haber sido aprobada una referencia de celda (xltypeSref) de la que desea obtener en los valores contenidos en las celdas. Para hacer esto usted debe 'obligar' a la referencia de celda xloper. Este coaccionar (una funcion de Excel), las fuerzas de Excel para la construccion de un vector de xlopers, con exactamente (#Filas * #Cols) xlopers. Es decir, para un 2 x 3 matriz de celdas, se obtienen seis xlopers. El objetivo xloper se convierte en un encabezado con el xltype campo = 64 (xltypearray). El val._array miembro contiene el numero de filas y columnas, y un puntero al cuerpo xloper.
Estos xlopers estan dispuestos en orden de fila de modo que las seis celulas en dos filas por 3 columnas se almacenan como
1 2 3
4 5 6
Cada uno tiene el tipo fundamental (xltype num o Str) y el valor.
Ejemplo de Coercion
Desttype.xltype := xltypeInt
Desttype.val.w := xltypeMulti
Eresult := Excel4v(xlcoerce,@Xval,2,[Valores,@desttype])
asm pop disipador de final // Nunca Quitar
& nbsp & nbsp;
La xlopers/lpxlopers que aqui se utilizan son
Desttype - Un xloper que especifica la coaccion tipo de destino (xltypemulti - Sobresale el nombre de un array de xlopers)
los Valores Del pasado en la celda de referencia - un lpxloper
Xval - El objetivo xloper. Despues de una exitosa coaccionar, este es el encabezado de una matriz. Con el 2 x 3 matriz, habra seis xlopers, cada uno con un valor de la celda.
Excel ha asignado la memoria en su nombre y este tiene que ser tratada, pero mas en que mas tarde..
Ejemplo del uso de los valores
Este ejemplo se comprueba la
si xval.val._array.filas<>1 y
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Error('Deberia tener una unica fila')
& nbsp & nbsp & nbsp & nbsp goto myexit
& nbsp & nbsp final
xlar := xval.val._array.lparray
index:=0
para col:= 1 a xr.NumCols hacer
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp si xlar^[indice].xltype <> xltypenum, a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Error('Elemento' inttostr(fila) 'No es un numero')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp break
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp Valor[col] := xlar^[indice].val.num
& nbsp & nbsp & nbsp & nbsp inc(indice)
& nbsp & nbsp final
xlar es un puntero a una matriz de xlopers. En este ejemplo, esto comprueba que hay una fila de datos no numericos. Luego copia el valor en el Valor de la matriz [].
Poner los valores en las Celdas de Excel
a Pesar de que hay un equivalente (mas o menos) de xlcoerce, llamado xlset, que solo puede ser llamado desde la linea de comandos (menu o boton de barra de herramientas) y no de una funcion. Su muy anti sociales de todos modos que acaba de volcar un monton de valores en una hoja de calculo que solo podria sobrescribir una de las mañanas de trabajo no guardado y no se que mejorar su popularidad!
Una caracteristica bien conocida de Excel llamada Funcion de las Matrices (o formula de matrices) es lo que se necesita. Si usted no esta familiarizado con ellos, tratar de esto en un vacio de la hoja de Excel.
1. Seleccionar un area rectangular con el raton. Ahora haga clic en la linea de edicion (justo debajo de las barras de herramientas, por encima de las celulas) y escriba =g1. En este punto usted debe ver a =g1 en la linea de edicion y el area seleccionada debe todavia ser seleccionado. Si se borra la seleccion por error, volver atras e intentarlo de nuevo.
2. Ahora, mantenga presionada la tecla ctrl y shift y pulse enter. El =g1 debe ser pegado en todas las celulas anteriormente en el area seleccionada.
ademas debe tener en cuenta algunas cosas acerca de esto si usted haga clic en cualquier celda en esta area.
1. La linea de edicion se muestra la ecuacion entre parentesis.
2. Usted no puede cambiar o borrar la celda.
3. No ajustar la referencia de la celda.
Esta es la unica manera (tan lejos como pude averiguar) para poner los valores en las celdas de Excel. Su funcion de excel debe construir una matriz de xlopers, con el encabezado señalando el cuerpo. Si la funcion devuelve una matriz, debe utilizar una Funcion de Matriz para mostrar el resultado. Excel es muy inteligente, con este. Si usted devuelve un 3 x 5 area y el usuario pega una Funcion de la Matriz en un 4 x 6 rectangulo, las celulas adicionales se mostraran a N/A.
la Gestion de la Memoria
Si un Excel4v llamada devuelve un xloper con un puntero (o cadenas de xltypemulti por ejemplo) y luego, cuando el codigo ha terminado con el valor de su codigo siempre debe llamar xlfree en el xloper. De hecho, como regla general, llamando xlfree en cualquier xloper no hace daño a todos.
Hay dos asignacion de memoria en los casos que el codigo DEBE manejar..
1. Has llamado a una rutina que devuelve un xloper con los datos en la misma, por ejemplo xlcoerce para convertir un xltypesref/xltyperef a un xltypemulti (matriz). Excel asigna su propia memoria y cuando haya terminado con los datos, debe O en el valor de $1000 (4096 decimal) en el xltype - $1000 valor es conocido como xlbitXLfree. Cuando llame xlfree, se libera el 'Excel asigna memoria.
2. Si el codigo devuelve un array de xlopers que Excel muestra como una funcion de la matriz, debe O en el valor $4000 (16384 decimal) en el xltype campo, antes de que se sale de la funcion. Despues de copiar los valores de Excel hara una devolucion de llamada a su xlAutoFree funcion (que hizo implementar uno, ¿no?) con un lpxloper a sus datos. Usted puede entonces libre de ella. Si usted crea la matriz con n elementos, en (n 1) xlopers, donde arrayname[0] es el encabezado que apunta a arrayname[1] a continuacion, el puntero devuelto los puntos a arrayname[0] y freemem(call back puntero), a continuacion, liberar el puntero correcto.
Un ejemplo De Complemento
El ejemplo que acompaña a este articulo es auto-contenida en cerca de 650 lineas de codigo con el no delphi componentes o unidades necesarias. Se implementa una Funcion de Distribucion Acumulativa GetCDF que toma un numero en el rango de -4 a 4 como entrada y devuelve la altura en virtud de la ojiva de la curva. Se que Excel viene con varios Normal de las funciones de distribucion, pero sirve como ejemplo. Se ha probado en Excel 95 y 97 con Delphi 3 en win 95/98 y NT y ha demostrado ser solida como una roca. No puedo enfatizar lo importante que es revisar todas las entradas y tratar de obtener su codigo de tan resistente como sea posible. Algo desagradable probablemente bomba o colgar de Excel y los usuarios rapidamente se convierten en abusadores. No olvides que la Stdcalls en todas las funciones exportadas!
Aparte de la obligatoriedad de xlauto familia de funciones, se incluye otras cinco funciones, dos de los cuales son invisibles. Estos dos GetXlStack y FreeRam estan destinados para su uso por el desarrollador solo. Los otros tres (GetCDF, LastError y Version) son para el usuario. Puede utilizar los dos tipos de funciones directamente, sino que solo son visibles se pueden ver en el Asistente para funciones. Y no te olvides de los parentesis en las llamadas a la funcion. Excel estara feliz de tomar =Version (sin ()) y devuelven un valor de -30408699 (no tengo idea) cuando en realidad significaba =Version().
he incluido la principal funcion de excel numeros que se utilizan en el programa, la lista completa tiene casi 400. El EDK tiene el lote completo e incluye cabeceras de C que se puede editar facilmente.
En muchos sentidos, este es un poco anticuado, no OOP programa. Elegi ese camino originalmente como me estaba sintiendo mi camino ronda complementos de excel y yo no quiero tener problemas con los Objetos al mismo tiempo. La unica clase que he utilizado aqui es Txloper para simplificar la creacion de Xlopers pero que era mantener concisa. Envienos sus consultas y ofertas de trabajo a [email protected].
El archivo de abajo es completa - fuente para un archivo dll. Asegurese de que la extension es .xll

{$A ,B,C ,D ,E,F,G ,H,I ,J ,K,L ,M,N ,O,P ,Q ,R,S,T,U,V ,W ,X ,Y,Z1}
biblioteca cdfcalc
usos
& nbsp & nbsp SysUtils,
& nbsp & nbsp windows,
& nbsp & nbsp dialogos,
& nbsp & nbsp formas,
& nbsp & nbsp Clases,
& nbsp & nbsp Matematicas
// XLREF estructura
& nbsp & nbsp tipo xlref = lleno de registro
& nbsp & nbsp & nbsp & nbsp & nbsp rwFirst : smallint
& nbsp & nbsp & nbsp & nbsp & nbsp rwLast : smallint
& nbsp & nbsp & nbsp & nbsp & nbsp colFirst : byte
& nbsp & nbsp & nbsp & nbsp & nbsp colLast : byte
& nbsp & nbsp final
& nbsp & nbsp // Devuelve un rango de seleccion
& nbsp & nbsp XlRangeRecord = lleno de registro
& nbsp & nbsp & nbsp & nbsp & nbsp Count : palabra // siempre debe ser de $1
& nbsp & nbsp & nbsp & nbsp & nbsp Sref : xlref
& nbsp & nbsp final
& nbsp & nbsp xlmref= lleno de registro
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp count : word
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp RefTbl : array[0..1000] de XlRef
& nbsp & nbsp final
& nbsp & nbsp lpxloper = ^XLOPER
& nbsp & nbsp lpxloperArray = ^XLArray
& nbsp & nbsp lpxlmref = ^xlmref
& nbsp & nbsp TVal = lleno de Registro
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Caso de Bytes de
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 1: (num : Doble) // xltypeNum
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 2: (str : ^tipo shortstring) // xltypeStr
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 3: (bool : Word) // xltypeBool
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 4: (err : Word) // xltypeErr
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 5: (n : Entero) // xltypeInt
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 6: (sref : lleno de registro
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Recuento : la palabra
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ref : Xlref
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 8: (_array : lleno de Registro // xltypeMulti
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp lparray: lpxloperArray
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp filas: La PALABRA
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp columnas: La PALABRA
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 9: (mref : lleno de registro // xltyperef
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp lpmref : lpxlmref
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp idsheet : integer
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final // tval
& nbsp & nbsp XLOPER = lleno de Registro
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp val : TVal
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp xltype : WORD
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ficticio:array[0..5] de byte // relleno
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Final
xlarray=array[0..1000] de xloper
lpxlarray=^xlarray
txloper = clase // Simple xloper clase de apoyo
& nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp fxloper : xloper
& nbsp & nbsp & nbsp & nbsp fActualStr : tipo shortstring
& nbsp & nbsp & nbsp & nbsp funcion Getlpxloper:lpxloper
& nbsp & nbsp publica
& nbsp & nbsp & nbsp & nbsp constructor Create

& nbsp & nbsp & nbsp & nbsp Destructor Destruir reemplazar
& nbsp & nbsp & nbsp & nbsp Constructor Create_Str(NewStr : tipo shortstring)
& nbsp & nbsp & nbsp & nbsp procedimiento SetStr(NewStr : tipo shortstring)
& nbsp & nbsp & nbsp & nbsp procedimiento SetNum(NewNumber : Integer)
& nbsp & nbsp & nbsp & nbsp procedimiento SetInt(NewNumber : Integer)
& nbsp & nbsp & nbsp & nbsp procedimiento SetErr
& nbsp & nbsp & nbsp & nbsp propiedad thelpxloper : lpxloper leer Getlpxloper
fin
// Excel
funcion Excel4v(xlfn:palabra operRes:lpxloper count:integer opers:matriz de lpxloper):integer
stdcall externos 'xlcall32.dll'
// XLMREF estructura Describe multiples rectangular referencias.
const
& nbsp xltypeNum = $0001
& nbsp xltypeStr = $0002
& nbsp xltypeBool = $0004
& nbsp xltypeRef = $0008
& nbsp xltypeErr = $0010
& nbsp xltypeFlow = $0020
& nbsp xltypeMulti = $0040
& nbsp xltypeMissing = $0080
& nbsp xltypeNil = $0100
& nbsp xltypeSRef = $0400
& nbsp xltypeInt = $0800
& nbsp xlbitXLFree = $1000
& nbsp xlbitDLLFree = $4000
& nbsp xltypeBigData =xltypeStr o xltypeInt
// codigos de Error se Utiliza para val.err campo de XLOPER estructura
& nbsp xlerrNull =0
& nbsp xlerrDiv0 =7
& nbsp xlerrValue =15
& nbsp xlerrRef =23
& nbsp xlerrName =29
& nbsp xlerrNum =36
& nbsp xlerrNA =42
// codigos de Retorno
& nbsp xlretSuccess =0 // exito
& nbsp xlretAbort =1 // macro detuvo
& nbsp xlretInvXlfn =2 // no valido numero de funcion
& nbsp xlretInvCount =4 // numero de argumentos no valido
& nbsp xlretInvXloper =8 // no valido OPER estructura
& nbsp xlretStackOvfl =16 // desbordamiento de pila
& nbsp xlretFailed =32 // error de comando
& nbsp xlretUncalced =64 // uncalced celular
// Funcion numero de bits
& nbsp xlCommand = $8000
& nbsp xlSpecial = $4000
& nbsp xlIntl = $2000
& nbsp xlPrompt = $1000
// funcion Especial de los numeros
& nbsp xlFree =(0 o xlspecial)
& nbsp xlStack =(1 o xlspecial)
& nbsp xlCoerce =(2 o xlspecial)
& nbsp xlSet =(3 o xlspecial)
& nbsp xlSheetId =(4 o xlspecial)
& nbsp xlSheetNm =(5 o xlspecial)
& nbsp xlAbort =(6 o xlspecial)
& nbsp xlGetInst =(7 o xlspecial)
& nbsp xlGetHwnd =(8 o xlspecial)
& nbsp xlGetName =(9 o xlspecial)
& nbsp xlEnableXLMsgs =(10 o xlspecial)
& nbsp xlDisableXLMsgs =(11 o xlspecial)
& nbsp xlDefine inaryName =(12 o xlspecial)
& nbsp xlGetBinaryName =(13 o xlspecial)
// funciones definidas por el Usuario necesita para llamar a las funciones de Excel
& nbsp & nbsp xlfCaller=89
& nbsp & nbsp xlfRegister=149
& nbsp & nbsp xlfUnregister=201
//
& nbsp & nbsp DLLversion:tipo shortstring='CDF Calc V1.02'
& nbsp & nbsp AddInCategory='CDF Calculadora'
& nbsp & nbsp const zlpxloper=lpxloper(nil)
& nbsp & nbsp tipo retarray=array[0..1000] de xloper
& nbsp & nbsp pretarray=^retarray
var // Global de los datos
& nbsp & nbsp res : xloper
& nbsp & nbsp GetCDF_Id : Integer
& nbsp & nbsp xlStack_Id : Integer
& nbsp & nbsp EResult : Integer
& nbsp & nbsp fregadero : integer
& nbsp & nbsp GetStack_Id : Integer
& nbsp & nbsp LastError_Id :

La escritura (no com) complementos de excel en delphi

La escritura (no com) complementos de excel en delphi : Multi-millones de consejos para hacer su vida más fácil.
Recommander aux amis
  • gplus
  • pinterest

Comentario

Dejar un comentario

Clasificación