PDA

Ver la Versión Completa : Truco de pasar a excel sin componentes no corre...


Alfredo
19-06-2012, 15:57:19
Saludos, compañeros...
Aca retomando un programita que tenia tiempo sin toca...

Le estoy añadiendo la caracteristica de poder exportar desde un datagrid a excel y vi este truco:
http://www.clubdelphi.com/trucos/index.php?id=385&scroll=0&scrollb=0

pero me presenta el error de compilacion:

Undeclared identifier: 'Application'

¿Alguien sabra que es lo que falta?

Desde ya muchas gracias!

roman
19-06-2012, 16:11:38
Tienes que incluir la unidad Forms en la unidad donde definas esa rutina.

// Saludos

Alfredo
27-06-2012, 17:57:17
Uff. gracias por ese dato, de hecho paso, pero ahora se queda en esta linea:

Application.CreateForm( TfrmAnimacion, frmAnimacion) ;

y salta:

Undeclared identifier: 'TfrmAnimacion'
Undeclared identifier: 'frmAnimacion'
y estoy casi seguro que la lista que sigue, y algunos otros vienen como consecuencia de lo anterior...
Undeclared identifier: 'crHourglass'
Undeclared identifier: 'CreateOleObject'
Undeclared identifier: 'crDefault'

Y es que no consigo entre los componentes o la ayuda de delphi la respuesta...
Un millon Roman

roman
27-06-2012, 18:08:20
Bueno, es que lo mismo aplica ahora.

"Undeclare identifier" significa "identificador no declarado" y quiere decir que el compilador encuentra un identificador en tu código que no sábe de dónde proviene. Por eso, en laa cláusulas uses se indican las unidades que contienen las declaraciones de los símbolos que usa nuestro código. Así que, cada vez que veas un error de este tipo debes ver en qué unidades están declarados los identificadores y agregarlas en alguna de las cláusulas uses.

Sin embargo, viendo el ejemplo original, no sé de dónde pueda provenir TfrmAnimación. Parece ser un formulario propio del autor del truco, de manera que poca utilidad tiene dicho truco.

// Saludos

Alfredo
27-06-2012, 19:51:14
Exacto ....

Pense que se referia a algun componente de tipo reloj de arena, algo asi como la barra Gauge del la paleta de samples.

Quede en el aire..... no hay problema (lo malo es la caida :confused:)


Gracias de todos modos...

roman
27-06-2012, 20:10:53
Bueno, supongo que ese formulario era para mostrar alguna animación mientras se realizaba la exportación. Pero eso no es parte esencial del proceso. Por ejemplo, si omitimos lo relacionado a dicho formulario y dos o tres cosas no esenciales quedaría algo así:


unit Unit2;

interface

uses DB, Forms;

procedure ExportarExcel( DataSet:TDataSet ; cNomArchivo: string);

implementation

uses ComObj;

procedure ExportarExcel( DataSet:TDataSet ; cNomArchivo: string);
var
Excel: variant; // Aplicación Excel
Libro: variant; // Libro de trabajo
Hoja: variant; // Hoja de cálculo
fila, columna, campo: integer;
marca: string;
begin
//Application. CreateForm( TfrmAnimacion, frmAnimacion) ;
//With frmAnimacion do
try
//Show;
//Screen.Cursor := crHourGlass;
// Creamos el objeto de automatizació n OLE
try
Excel := CreateOleObject( 'Excel.Applicati on');
try
Excel.visible := False;

// Creamos un nuevo libro de trabajo
Excel.SheetsInNewWorkbook := 1;
Libro := Excel.WorkBooks. Add;

// Obtenemos una referencia a la página del libro
Hoja := Libro.WorkSheets[ 1];

with DataSet do begin
// Recorremos los campos para poner sus nombres como
// encabezado en la primera fila
fila := 1;
columna := 1;
for campo := 0 to FieldCount - 1 do
with Fields[campo] do
begin
//if Visible then begin // Sólo se incluyen los campos visibles
Hoja.Cells[fila, columna] := DisplayName;
Inc(columna) ;
//end;
end;
Hoja.Rows[fila] .Font.Bold := True;

//Screen.Cursor := crHourglass; // cambio a reloj arena
DisableControls;

try
Marca:= Dataset.Bookmark; // guardo donde estaba el dataset
First;
// Recorremos los registros del dataset
while not Eof do begin
Inc(fila); // Cada registro va en una nueva fila
columna := 1;
// Recorremos los campos para ir llenando las celdas de la fila
for campo := 0 to FieldCount - 1 do
with Fields[campo] do begin
//if Visible then begin // Sólo se incluyen los campos visibles
if not IsNull then // Si el valor es nulo, no lo asignamos
if DataType = ftString then
Hoja.Cells[fila, columna] := '''' + AsString
else
try
Hoja.Cells[fila, columna] := Value;
except
Hoja.Cells[fila, columna] := DisplayText;
end;
Inc(columna) ;
//end;
end;
Next; // Avanzamos al siguiente registro
end;

finally
Dataset.Bookmark := Marca; // dejo el dataset donde estaba
EnableControls;
end;
end;

finally
try Hoja.Cells.Columns. AutoFit; except end; // Autoajuste
//Excel.Visible :== True; // Mostramos el Excel
// Grabamos el archivo
Libro.saveas( cNomArchivo) ;
Excel.quit ;
//Screen.Cursor := crDefault;
end;

except
//Application. MessageBox( 'Excel no se encuentra instalado en este equipo, no se puede exportar','Error' ,mb_OK + mb_IconExclamation) ;
end;
finally
//Free;
end;

end;

end.


Eso debe compilar sin problemas.

// Saludos

Alfredo
27-06-2012, 22:37:06
Tienes toda la razón....
Monte el procedimiento tal como lo preparaste y compilo sin problemas.
Falta verificar el funcionamiento que lamentablemente sera mañana....
Asi que mañana veremos el desenlace... jeje
Roman, como seguro no tengo conocimientos para aportarte, te ofrezco mi gratitud.