Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-02-2007
Jose Roman Jose Roman is offline
Miembro
 
Registrado: jul 2006
Ubicación: Colombia
Posts: 364
Poder: 21
Jose Roman Va por buen camino
Muchas gracias FLECHA, esta ayuda me responde las dudas que me surgieron.
Responder Con Cita
  #2  
Antiguo 20-02-2007
Flecha Flecha is offline
Miembro
 
Registrado: nov 2006
Posts: 59
Poder: 20
Flecha Va por buen camino
Exclamation Una cosita más


De nada, hombre. Para eso estamos.

Por cierto acabo de acordarme de que no es necesario recurrir al TMemo para utilizar el Clipboard.

Existe una unidad llamada ClipBrd que implementa el uso de objetos TClipboard, los cuales permiten trabajar con el ClipBoard de Windows.

A continuación el mismo truco que antes, pero con el uso de la unidad ClipBrd.

Código Delphi [-]
procedure TMiForm.PegarDatos;
var x:integer;
begin
      x:=0;
      Clipboard.Clear;                     // Borrar el contenido del ClipBoard
      Clipboard.SetTextBuf(Datos.GetText); // Copiar texto en el ClipBoard
      try
        repeat
          try
            MiExcel.ActiveSheet.Paste( MiExcel.ActiveSheet.Cells[ 1,1 ], False);
            break;
          except
            inc(x);
            if x>=20 Then raise;
          end;
        until false;
      finally
        Clipboard.Clear; // Borrar el contenido del ClipBoard
      end;
      FilasDatos := 0;
      Datos.Clear;
end;

En este ejemplo Datos es del tipo TStringList. ClipBoard no es un objeto, sino una función perteneciente a la unidad ClipBrd que retorna un objeto TClipBoard. El método SetTextBuf es el que copia texto en el ClipBoard de Windows. Este método recibe un PChar, por eso le paso el GetText del TStringList en vez del Text.
En este ejemplo, además, el ClipBoard de Windows queda vacío después de cada copia.

Como dije antes, el lado bueno de este truco es la velocidad de copiado sobre el documento Excel. Pero olvidé decir que hay que tener cuidado con los posibles copy-paste que el usuario esté haciendo por otro lado mientras este proceso se está ejecutando. Si el documento Excel que estás construyendo es tan sumamente grande que aunque utilices este truco, tarda mucho tiempo en terminarse de construir, el usuario podría aprovechar su tiempo abriendo otra aplicación distinta (por ejemplo un documento Word) para trabajar con ello mientras tu proceso termina. Los copy-paste que el usuario haga en esa otra aplicación podrían interferir perjudicialmente en la creación de tu documento Excel. Podrían copiarse en tu Excel los copy que el usuario hace en su Word, o copiarse sobre el Word del usuario lo que estas intentando exportar a tu documento Excel.

No todo podían ser buenas noticias.
Responder Con Cita
  #3  
Antiguo 11-01-2011
Avatar de Wbarrantes
Wbarrantes Wbarrantes is offline
Miembro
 
Registrado: ago 2010
Posts: 119
Poder: 16
Wbarrantes Va por buen camino
buenas

se que ha pasdo algun tiempo de este hilo, pero me interesa saber si alguien tiene un ejemploun poco mas concreto de como usar este unit... se ve interesante
Responder Con Cita
  #4  
Antiguo 12-01-2011
Jose Roman Jose Roman is offline
Miembro
 
Registrado: jul 2006
Ubicación: Colombia
Posts: 364
Poder: 21
Jose Roman Va por buen camino
No sabes como utilizarlo??
Responder Con Cita
  #5  
Antiguo 12-01-2011
Avatar de Wbarrantes
Wbarrantes Wbarrantes is offline
Miembro
 
Registrado: ago 2010
Posts: 119
Poder: 16
Wbarrantes Va por buen camino
pos no

pues no por eso pregunto... tendria que instalarlo como un pakage? o importarlo en cada aplicacion como un unit? lo debo incluir el codigo dentro de la unit que este usando? como ejecuto algo desde mi aplicacion?


Aclaro, estoy hablando del codigo chorreado que puso Flecha... por que gracias a Dios ya encontre bastante informacion sobre el uso del TExcelApplication... pero igual me gustaria si tienes informacion sobre este ultimo, aprender mas sobre algunas otras funciones como el merge de celdas por ejemplo
Responder Con Cita
  #6  
Antiguo 12-01-2011
Flecha Flecha is offline
Miembro
 
Registrado: nov 2006
Posts: 59
Poder: 20
Flecha Va por buen camino
Hola Wbarrantes.

Hace mucho de ésto, y... es cierto..., quizá debí acompañarlo de un pequeño manual de usuario, jejejejeje...
Intentaré ayudarte. A ver qué recuerdo...

La unit que me creé no es para cogerla y hacer copy-paste dentro de otro código. Es una unit totalmente independiente. Basicamente lo que contiene es una clase que me creé (la llamé TAplExcel), y varias constantes que también me creé.

Así que para utilizarlo lo que tienes que hacer es añadir la unit a tu proyecto (el archivo .PAS que te crees con mi unit llamala uExportExcel, que es como yo la llamé; o si le das otro nombre no olvides cambiarlo también en la cabecera del unit). Luego, desde tu programa, te creas una instancia a TAplExcel.

Código Delphi [-]
...
var MyAplExcel : TAplExcel;
begin
...
MyExcel : TAplExcel.Create;
try
... // utilización de la clase
 finally
 MyExcel.Destroy;
 end;
...
end;


Por lo demás decirte que la clase me la creé 100% basada en la utilización de macros de VisualBasic de Excel. Si echas un vistazo al código fuente, encontrarás que practicamente utilizo funciones y procedimientos que no existen en Delphi y que sólo pertenecen a VB Excel.

¿Cómo consigo utilizar VB Excel entremezclado con código Delphi? Es gracias a que me creo un objeto OLE del tipo "Excel.Application". Esto lo explico al principio de mi chorro-mensaje.

Un truco que utilicé. Yo no domino VB de Excel. Lo que yo hacía mientras diseñaba mi clase fue grabar una macro de Excel con las operaciones que yo quería recrear en mi clase. Luego hacía copy-paste sobre mi unidad, y poco más. Por desgracia hay algunas cosas que no se pueden adaptar.

Preguntas sobre cómo hacer un "merge" de celdas con la clase que me creé. Esto no lo implementé. No recuerdo si es que no lo intenté o si es que no pude.

El "merge" se aplica a un rango de celdas, y dicho rango ha de ser acotado entre 2 referencias a celda (cada una representando una esquina opuesta).
En VB de Excel, para hacer un "merge" acotado pora las celdas E1 y G5, sería éste código:
Código:
Range(Cells(1, "E"), Cells(5, "G")).Merge
Para hacer lo mismo desde Delphi tocaría cambiar varias cosas. Para empezar no se puede hacer uso de letras para indicar columnas. Hay que utilizar el valór numérico (5 para "E", y 7 para "G"). Y en vez de paréntesis (), muchas veces hay que sustituirlo por corchetes [].
No lo he provado, pero quizá esto equivalga al código en VB Excel.
Código Delphi [-]
MyExcel.Excel.Range[ MyExcel.Excel.Cells[1, 5], MyExcel.Excel.Cells[5, 7] ].Merge;
Si con ésto saltara una excepction, quizá habría que cambiarlo por esto otro:
Código Delphi [-]
var esquina1, esquina2, rango:variant;
begin
...
  esquina1 := MyExcel.Excel.Cells[1, 5];
  esquina2 := MyExcel.Excel.Cells[5, 7];
  rango := MyExcel.Excel.Range[ esquina1, esquina2 ];
  rango.Merge;
...
end;
Y si aún así sigue sin funcionar..., pues no se me ocurro ahora nada. Quizá es que no se pueda hacer.





Aprovecho y añado una breve desccripción de las propiedades, funciones y procedimientos públicos de la clase TAplExcel.


property Excel:Variant read Get_Obj_Excel;

Esta propiedad es la más importante.
Te da acceso al objeto OLE que es creado internamente dentro de la clase, y por medio del cual, a su vez, se accede a Excel. Por tanto, te da acceso al uso de código de VisualBasic de Excel.
Por ejemplo. Lo que en VB de Excel se escribe así:
Código:
vble = Cells(25, 3).Text
Utilizando la clase que me creé, sería así:
Código Delphi [-]
vble := MyExcel.Excel.Cells[25, 3].Text;
Esa línea de código lo que hace es tomar el valor que haya en la fila 25, columna 3 (letra "C"), del documento Excel.
Observa que lo que en VB va encerrado entre paréntesis (), en Delphi va entre corchetes [].


property WBook:Variant read Get_Obj_WBook;

El uso de esta propiedad equivale a lo que en VB de Excel sería utilizar el ActiveWorkBook, o lo que es lo mismo, el documento Excel activo.
Por tanto..., MyExcel.Excel.ActiveWorkBook equivaldría a MyExcel.WBook.


function CrearNuevoWBook : variant;

Esto equivale a lo que dentro de Excel sería "File" -> "New..." -> "Blank workbook". O sea, crear un nuevo documento Excel.
Esta función además retorna un objeto que da acceso directo a dicho nuevo documento. En cierto sentido equivaldría al WBook de antes.


procedure QuitarWBook(WorkBook:variant);

Como sabes, dentro de Excel puedes tener varios documentos abiertos. Con esta función, le pasas un documento y lo cierra. Es como en Excel ir a "File" -> "Close".


procedure QuitarWSheet (WorkSheet:variant);

Es como QuitarWBook, pero en vez de quitar un documento, quita una de las hojas del documento. Funciona igual. Hay que pasarle como parámetro algo que apunte a dicha hoja.


procedure GuardarDocumento(WorkBook:variant; PathAndName:string; MostrarAlertas:boolean);

Con ésto guardas el documento abierto en Excel. Hay que pasarle el objeto que contiene el documento, un nombre con la ruta para el archivo a crear, y decirle TRUE o FALSE dependiendo de si quieres que muestre o no posibles mensajes de alerta.


procedure CargarDocumento(PathAndName:string);

Para abrir con Excel un documento que tengas guardado. A dicho documento puedes acceder luego por medio de la propiedad WBook.


procedure NoGuardarDocumento(WorkBook:variant);

Simplemente se le quita al documento Excel la marca de "pendiente de grabar", pero el documento permanece abierto.
La consecuencia es que al querer cerrar el documento, éste consta como ya grabado, aunque sea mentira.


procedure MostrarAplExcel;

Con la clase que me creé, se puede trabajar con Excel sin que Excel sea visible por el usuario (ni siquiera aparece el botón abajo como si estubiera minimizado).
Al ejecutar este procedimiento, la aplicación Excel aparece en pantalla, y el usuario puede ver el documento que tengas abierto.


procedure OcultarAplExcel;

Lo mismo que MostrarAplExcel, pero para ocultar la aplicación Excel.
Es muy aconsejable mantener Excel oculto mientras trabajas con el documento. Así se evitan refrescos de pantalla, que es algo que resta mucha CPU, y consigues más velocidad. Aparte de que así también evitas que el usuario esté viendo "las tripas" del curro que estás haciendo.


procedure ControlErrorExcel;

Esto lo que hace es liberar la memoria (se borra de memoria el documento Excel), y lanzar una Exception.
Me lo creé para mi apaño personal, para tener un texto común como mensaje cuando detectase una situación que me impidiera crear el documento Excel que estaba intentando crear.


procedure ColorFondo (Selection:Variant; Color:integer);

Esto cambia el color de fondo de las celdas del documento. Dichas celdas deben ir indicadas en el parámetro Selection.
Por ejemplo, para poner de color rojo el fondo de la celda B1...
Código Delphi [-]
  MyExcel.ColorFondo ( MyExcel.Excel.Cells[2,1] , xl_CL_Rojo );
Que equivale en VB de Excel a poner ésto...
Código:
Cells(2,1).Interior.ColorIndex = $00000003
Hay varias constantes declaradas en la unit para trabajar con colores.


procedure PonerGrid (Selection:Variant; GrosorMarco, GrosorVerti, GrosorHoriz:integer);

Esto es para resaltar los bordes de las celdas contenidas dentro de un rango de celdas.
Se ha de indicar dicho rango de celdas (Selecction), y el grosor que se quiere para
- borde exterior (el marco)
- líneas interiores verticales
- líneas interiores horizontales
Para los tipos de grosores hay constantes declaradas en la unit.


procedure PonerMarco (Selection:Variant; Grosor:integer);

Lo mismo que PonerGrid, pero sólo para el borde exterior.


function LetraColumna (x:integer):string;

A esta función le pasas un número, y te devuelve la letra de columna correspondiente.


procedure SetPrintArea (Hoja : variant; x1,y1, x2,y2 : integer);

Esto es para definier el área de impresión de una hoja de un documento Excel. Hay que pasarle como parámetro la hoja en cuestión, y también el área (como coordenadas x-y, de las esquinas superior izquierda, e inferior derecha).

procedure SetSaltoPagVert (Hoja : variant; NumSalto, Columna : integer);

Al igual que SetPrintArea, este procedimiento es para preparar el documento Excel para su salida por impreosra. Como sabrás, Excel pagina automáticamente dependiendo de cuántas columnas hayas ocupado en la hoja Excel. Es posible que la paginación automática establezca cortes en lugares que no te resulten apropiados. Con SetSaltoPagVert puedes establecer "puntos de corte" que Excel deberá respetar a la hora de imprimir la hoja.
Debes pasarle la hoja en cuestión, un identificador para el punto de corte (se pueden poner varios), y la columna donde lo situas.






Para entender mejor el funcionamiento, te aconsejo que profundices en la utilización de VB de Excel, porque como habrás podido comprobar, la clase que me creé hace un continuo uso de dicho VB de Excel, permitiendo utilizar códigos fuente de VB (macros) intercalados dentro del código fuente de Delphi.
Sólo así podrás sacarle el máximo rendimiento a la clase que me creé.
Lo mejor es creárte macros en VB de Excel que hagan exactamente lo que tu quieres que luego se haga en Delphi. Luego coges esas macros, y haces copy-paste sobre tu código Delphi. Luego, cada vez que en dichas macros se haga uso de objetos propios de VB de Excel, dentro de Delphi lo traduces anteponiendo la propiedad TAplExcel.Excel a dicho objeto.
Por ejemplo..., para en VB Excel poner el valor "Hola mundo" dentro de la celda C5, se escribiría esto:
Código:
Cells(5, "C").Text = "Hola mundo"
En Delphi sería así:
Código Delphi [-]
MyExcel.Excel.Cells[5, 3].Text := 'Hola mundo';
Observa que se cambian también paréntesis () por corchetes [], y dobles comillas (") por simples ('), aparte de referenciar columnas con un número en vez de por su letra.




No puedo evitar escribir ladrillos. Cualquier explicación me parece poca para dejarlo suficientemente claro.
Lo siento.
Espero haber sido de ayuda.

Un saludo.
Responder Con Cita
  #7  
Antiguo 12-01-2011
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.442
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Thumbs up

Cita:
Empezado por Flecha Ver Mensaje
No puedo evitar escribir ladrillos. Cualquier explicación me parece poca para dejarlo suficientemente claro.
Bueno, a mi más que un ladrillo, me parece una fantástica y detallada explicación.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como utilizar Apis? JoeyJordison Varios 5 12-01-2007 21:48:52
como Utilizar una DLL de VB KaTo Varios 0 30-05-2004 19:01:30
como utilizar el UpdateSQL Irina SQL 10 17-03-2004 15:35:39
Como utilizar un DCR y PAS andrestsas Varios 1 26-10-2003 19:31:58
como utilizar sql plus fcran Oracle 2 10-09-2003 02:44:01


La franja horaria es GMT +2. Ahora son las 05:40:58.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi