Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Barra de progreso infinita

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Barra de progreso infinita Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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
_________________
Cool


Ultima edición por Cesar C. Salazar Gonzalez el Vie 13 Ago, 2010 5:18 am, editado 2 veces
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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 Sad ¿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
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Fernando Diaz escribió:
pero me sale un ProgressBar normal, sin separarse del borde como a ti Sad ¿por que puede ser?

Esta no la entiendo, como sin separarse del borde Shocked ? (no compredo, explicame un poquito Embarassed

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);

_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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!!!
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Muchas gracias Wink 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 Wink
_________________
Los problemas mas dificiles tienen las soluciones mas sencillas
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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);

_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: xp.rc Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email Yahoo Messenger MSN Messenger
Mensaje    Asunto: Responder citando

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> "
}

_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchas gracias por la respuesta.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
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


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.