 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Fernando Diaz Master


Registrado: 18 Jul 2004Mensajes: 273Ubicación: Talavera de la Reina (Toledo)
|
Publicado: Jue 28 Abr, 2005 9:03 pm Asunto: Barra de progreso infinita |
|
|
Como puedo simular el efecto de una barra de progreso infinita,a ser posible sin el uso de componentes que no vengan por defecto, esta enfocado para mostrarlo mientras se ejecuta una consulta sql por si el servidor (en algunos casos) esta saturado y hace creer que se ha quedado colgada la aplicación
Gracias de antemano _________________ Los problemas mas dificiles tienen las soluciones mas sencillas
 |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 29 Abr, 2005 5:42 am Asunto: |
|
|
Bien, esto es un poco largo de explicar, ya que realice la barra, tipo Marquee, tipo navegador Netscape, usando el archivo manifest, para dar los toques, de windows xp
lo primero, que debes hacer es crear un nuevo proyecto..
y establecer 2 botones..
en el primer boton, debes poner lo siguiente
| Código: |
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int inicio=0;
infinito=true; //iniciamos el ciclo
while(infinito)
{
Application->ProcessMessages();
if(inicio==0)
{
//Establecemos el rango incio , final
SendMessage(hwndBarra, PBM_SETRANGE, 0, MAKELPARAM(0 , 1000));
//establecemos el incremento
SendMessage(hwndBarra, PBM_SETSTEP, (WPARAM) 1, 0);
////////////////////////////////
}
else
inicio++; //incrementamos.
// vamos llenado la barra
SendMessage(hwndBarra, PBM_STEPIT, 1, 0);
if(inicio>1000) // si mayor que el rango volvemos a empezar
{
inicio=0;
}
Sleep(100);
}
}
//---------------------------------------------------------------------------
|
En el segundo Boton, debes detener a la barra, se puede mejorar, pero el funcionamiento es mera necesidad del desarrollador.
| Código: |
void __fastcall TForm1::Button2Click(TObject *Sender)
{
// terminamos el ciclo
infinito = false;
}
//---------------------------------------------------------------------------
|
bien lo que a continuacion, se explica, es lo utilizado dentro de los archivos .h y cpp, del proyecto.
esto va dentro del CPP que es la parte principal para la creacion de la barra
archivo UNIT1.CPP
| Código: |
//---------------------------------------------------------------------------
#define PBM_SETMARQUEE (WM_USER + 10) // creamos la barra, tipo marquee
#include "windows.h"
#include "commctrl.h"
#include <vcl>
#include <wingdi>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
InitCommonControls();
// creamos la barra de progreso..
hwndBarra = CreateWindowEx(0, PROGRESS_CLASS, NULL,
WS_CHILD | WS_VISIBLE | PBS_VERTICAL |PBM_SETMARQUEE ,
120, 20, 18, 170,
// x , y , x1, y1, coordenadas
this->Handle, NULL, HInstance, NULL);
SendMessage(hwndBarra, PBM_SETBARCOLOR, 0, clRed);
}
//---------------------------------------------------------------------------
|
esto es la declaracion, del archivo UNIT1.H
| Código: |
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TStatusBar *StatusBar1;
TButton *Button1;
TButton *Button2;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
HWND hwndBarra; // handel del progress Bar
bool infinito; //control del ciclo
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif |
Para dar el efecto del XP, en el control tuve que agregar al proyecto un archivo de texto. denominado XP.RC, que _LEO, ha explicado en otros posts (un Saludo, para Él)
bien sin tanto que decir, el contendio del archivo es el siguiente, recuerda agregarlo al proyecto, para dar la apariencia del XP
archivo XP.RC
| Código: |
#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
#define RT_MANIFEST 24
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST LOADONCALL MOVEABLE
{
"<xml> "
"<assembly> "
"<assemblyIdentity> "
"<description>Your application description here.</description> "
"<dependency> "
"<dependentAssembly> "
"<assemblyIdentity> "
"</dependentAssembly> "
"</dependency> "
"</assembly> "
} |
Esta es una barra, creada sin necesidad del Componente TProgresBarr, espero te sirva, y la muestra
Saludos _________________

Ultima edición por Cesar C. Salazar Gonzalez el Vie 13 Ago, 2010 5:18 am, editado 2 veces |
|
| Volver arriba |
|
 |
Fernando Diaz Master


Registrado: 18 Jul 2004Mensajes: 273Ubicación: Talavera de la Reina (Toledo)
|
Publicado: Vie 29 Abr, 2005 9:13 am Asunto: |
|
|
César lo primero mil gracias, pues dudaba que se pudiera hacer, cada vez me sorprende mas este foro y los entresijos del c++
Al compilar el código me sale el TProgresBar que sube y cuando llega a arriba del todo baja, pero me sale un ProgressBar normal, sin separarse del borde como a ti ¿por que puede ser? , como puedo ¿ hacer para que sea horizontal? , supongo que cambiando PBS_VERTICAL pero no se que tegno que poner _________________ Los problemas mas dificiles tienen las soluciones mas sencillas
 |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 29 Abr, 2005 12:57 pm Asunto: |
|
|
| Fernando Diaz escribió: | pero me sale un ProgressBar normal, sin separarse del borde como a ti ¿por que puede ser? |
Esta no la entiendo, como sin separarse del borde ? (no compredo, explicame un poquito
| Fernando Diaz escribió: | | como puedo ¿ hacer para que sea horizontal? , supongo que cambiando PBS_VERTICAL pero no se que tegno que poner |
en esta si te contesto. jej e
| Código: | hwndBarra = CreateWindowEx(0, PROGRESS_CLASS, NULL,
WS_CHILD | WS_VISIBLE |PBM_SETMARQUEE , // QUITAMOS EL VERTICAL
20, 120, 118, 25, // PONEMOS NUEVAS COORDENADAS
// x , y , x1, y1, coordenadas
this->Handle, NULL, HInstance, NULL); |
_________________
 |
|
| Volver arriba |
|
 |
Fernando Diaz Master


Registrado: 18 Jul 2004Mensajes: 273Ubicación: Talavera de la Reina (Toledo)
|
Publicado: Vie 29 Abr, 2005 10:47 pm Asunto: |
|
|
jejej si mira, veras ati en tu ScreenShot la barra sale tipo infinita, es decir no empieza abajo del todo como empezaria una barra normal es asi
I-I
I I
III
III
I I
I I
I-I
xDD, y en cambio , no se porque ami siguiendo tus pasos me sale como una normal puesta en vertical asi
I-I
I I
I I
III
III
III
no son muy explicitos los AsciiArt pero bueno... ejjeje es decir no es infinita ami me va subiendo y cuando llega al 100% me va bajando como si empezara ++ hasta el 100 y luego -- hasta el 0 y asi todo el rato.. ati la tuya es...'infinita'... lo unico que no he hecho es darla estilo XP, pero porque no e sido capaz..
Que puede seR??
Gracias _________________ Los problemas mas dificiles tienen las soluciones mas sencillas
 |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 29 Abr, 2005 11:39 pm Asunto: |
|
|
como antes te comente, puede ser, por el estilo XP, solo crea un archivo de texto. plano, con la extencion rc. por ejemplo Fernando.rc
y dentro del archivo, copia lo que se marca como el manifest, de la aplicacion, despues te vas a project - add to project, es la primera opcion, y cuando te sale el cuadro para agregar, el archivo, pon *.rc, seleccionas tu archivo, llamado en este caso. Fernando.rc, y listo compilas nuevamente, y ya debe funcionarte..
Saludos!!! _________________
 |
|
| Volver arriba |
|
 |
Fernando Diaz Master


Registrado: 18 Jul 2004Mensajes: 273Ubicación: Talavera de la Reina (Toledo)
|
Publicado: Sab 30 Abr, 2005 9:55 am Asunto: |
|
|
Muchas gracias funciona perfectamente, solo una cosa mas, hay algun sitio donde ver los parametros del
SendMessage(hwndBarra, PBM_SETBARCOLOR, 0, clLime);
para poder aprender algo mas sobre handles y para poner parent=StatusBar1 ?? y no preguntar tanto  _________________ Los problemas mas dificiles tienen las soluciones mas sencillas
 |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Sab 30 Abr, 2005 1:56 pm Asunto: |
|
|
Generalmente busco en la ayuda de borland y cuando no encuentro algo, busco en algunos libros, como el de charles petzoild, o el de Jefrey Richter "programacion avanzada", asi mismo busco tambien en internet, paginas japonesas, jej e no le entiendo a las paginas, pero traen codigo, y eso me sirve para realizar pruebas.
para ponerlo dentro de una barra de estado, (statusbar), cambia el handle y las coordenaas.. para que aparezca dentro..
ejemplo:
| Código: | hwndBarra = CreateWindowEx(0, PROGRESS_CLASS, NULL,
WS_CHILD | WS_VISIBLE |PBM_SETMARQUEE ,
this->StatusBar1->Left, 3,
this->StatusBar1->Top, this->StatusBar1->Height, // PONEMOS NUEVAS COORDENADAS
// x , y , x1, y1, coordenadas
this->StatusBar1->Handle, NULL, HInstance, NULL); |
_________________
 |
|
| Volver arriba |
|
 |
seth Cmdr

Registrado: 16 Nov 2003Mensajes: 129
|
Publicado: Vie 03 Nov, 2006 11:29 pm Asunto: xp.rc |
|
|
Buenas Tardes.
Cesar me podrias ayudar dandome los post que ha colocado leo sobre el archivo xp.rc me gustaria leer un poco hacerca del tema.
saludos |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 03 Nov, 2006 11:37 pm Asunto: |
|
|
https://cppbuilder.es/viewtopic.php?t=3687&highlight=xp+rc
el chiste es asi, creas el siguiente archivo con extencion .rc
y lo agregas a tu proyecto con la Opcion - Proyect - Add
el contenido del archivo es el siguiente
| Código: | #define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
#define RT_MANIFEST 24
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST LOADONCALL MOVEABLE
{
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?> "
"<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\"> "
"<assemblyIdentity "
"version=\"1.0.0.0\" "
"processorArchitecture=\"X86\" "
"name=\"CompanyName.ProductName.YourApp\" "
"type=\"win32\" "
"/> "
"<description>Your application description here.</description> "
"<dependency> "
"<dependentAssembly> "
"<assemblyIdentity "
"type=\"win32\" "
"name=\"Microsoft.Windows.Common-Controls\" "
"version=\"6.0.0.0\" "
"processorArchitecture=\"X86\" "
"publicKeyToken=\"6595b64144ccf1df\" "
"language=\"*\" "
"/> "
"</dependentAssembly> "
"</dependency> "
"</assembly> "
} |
_________________
 |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 26 Oct, 2009 1:03 pm Asunto: |
|
|
Estaba mirando este código que había colgado César que, como no puede ser menos, funciona de lujo. Tras probarlo para ver si me podía valer para una aplicación mía me surgen algunas dudas:
1. El color de la barra me sale siempre verde (no puedo precisar si verde verde o verde lima); con la estructura del código yo entendía que en | Código: | SendMessage(hwndBarra, PBM_SETBARCOLOR, 0, clRed) | ese clRed indicaba el color de la barra móvil.
2. Para incluir la barra dentro de otro elemento, imagino que bastará con cambiar el this->Handle por el del elemento que nos interese, ¿me equivoco? _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Lun 26 Oct, 2009 7:07 pm Asunto: |
|
|
Al usar XP Manifest el color será siempre verde.
La API SetParent te soluciona el problema de cambierlode ventana padre.
Por otro lado, puedes trasladar el código para modificar un TProgressBar muy facilmente:
| Código: |
/*
Crea un formulario con dos botones, Start y Stop
Añade un TProgressBar como tu quieras
Coloca el código.
*/
//---------------------------------------------------------------------------
#define PBM_SETMARQUEE (WM_USER + 10) // creamos la barra, tipo marquee
#include "windows.h"
#include "commctrl.h"
#include <vcl.h>
#include <wingdi.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
SetWindowLong(ProgressBar1->Handle,GWL_STYLE,GetWindowLong(ProgressBar1->Handle,GWL_STYLE) | PBM_SETMARQUEE);
}
//---------------------------------------------------------------------------
// Botón llamado Start
void __fastcall TForm1::StartClick(TObject *Sender)
{
ProgressBar1->Tag = true; // Activa la barra
while (ProgressBar1->Tag)
{
Application->ProcessMessages();
ProgressBar1->Position++;
// Esto puedes colocarlo también en un Timer, claro, sin el bucle y sin el Sleep.
if(ProgressBar1->Position >= ProgressBar1->Max)
ProgressBar1->Position = 0;
Sleep(100);
}
}
//---------------------------------------------------------------------------
// Botón llamado Stop
void __fastcall TForm1::StopClick(TObject *Sender)
{
ProgressBar1->Tag = false; //Para la barra
}
//--------------------------------------------------------------------------- |
Saludos. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mie 28 Oct, 2009 1:19 am Asunto: |
|
|
Simplificando mucho mas el problema y sobre el anterior ejemplo:
| Código: | /*
Crea un formulario con dos botones, Start y Stop
Añade un TProgressBar como tu quieras
Coloca el código.
*/
//---------------------------------------------------------------------------
#define PBM_SETMARQUEE (WM_USER + 10) // creamos la barra, tipo marquee
#include "windows.h"
#include "commctrl.h"
#include <vcl.h>
#include <wingdi.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
SetWindowLong(ProgressBar1->Handle,GWL_STYLE,GetWindowLong(ProgressBar1->Handle,GWL_STYLE) | PBM_SETMARQUEE);
}
//---------------------------------------------------------------------------
// Botón llamado Start
void __fastcall TForm1::StartClick(TObject *Sender)
{
SendMessage (ProgressBar1->Handle, PBM_SETMARQUEE, 1, 100); // Activa. Tiempo 100 ms
}
//---------------------------------------------------------------------------
// Botón llamado Stop
void __fastcall TForm1::StopClick(TObject *Sender)
{
SendMessage (ProgressBar1->Handle, PBM_SETMARQUEE, 0, 100); // Desactiva
}
//---------------------------------------------------------------------------
|
Saludos. |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|