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 

Resizing y Move Controls

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Tips & Tricks
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Resizing y Move Controls Responder citando

bien haciendo un poco de diseño y viendo la penosa necesidad de no querer estar recompilando a cada rato, para cambiar los tamaños de los coponentes aqui dejo 2 funciones que permiten redimiensionar los controles que se encuentran en un Form

funcion 1 para registrar los coponentes con el nombre del Formulario que se esta habriendo.

Código:
void __fastcall RegistrarControles(TWinControl *F)
{
   AnsiString asResize=ExtractFilePath(Application->ExeName)+F->Name.Trim()+".ini";
   std::auto_ptr<TIniFile> pIni(new TIniFile(asResize));
   TControl *pControl;
   float ccLeft,ccHeight,ccTop,ccWidth;
   for(int control = 0; control <F->ComponentCount; control++)
   {
      Application->ProcessMessages();
      if (F->Components[control]->InheritsFrom(__classid(TControl)))
      {
         Application->ProcessMessages();
         pControl = dynamic_cast<TControl*>(F->Components[control]);
         // sacamos los porcentajes
         ccTop    = ( pControl->Top    * 100 ) / F->Height;
         ccLeft   = ( pControl->Left   * 100 ) / F->Width;
         ccHeight = ( pControl->Height * 100 ) / F->Height;
         ccWidth  = ( pControl->Width  * 100 ) / F->Width;
         // grabamos en Archivo de Configuracion
         pIni->WriteFloat(pControl->Name,"Top",ccTop) ;
         pIni->WriteFloat(pControl->Name,"Left",ccLeft) ;
         pIni->WriteFloat(pControl->Name,"Width",ccWidth) ;
         pIni->WriteFloat(pControl->Name,"Height",ccHeight) ;
      }
   }
   pIni->UpdateFile();
}
//---------------------------------------------------------------------------


Esta funcion debe establecerse dentro del constructor del Form de la siguiente manera

Código:
//---------------------------------------------------------------------------
#include <vcl>
#include<Tlhelp32>
#include<memory>
#pragma hdrstop
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;

void __fastcall RegistrarControles(TWinControl *F);
void __fastcall AcomodarControles(TWinControl *F);
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
   : TForm(Owner)
{
   RegistrarControles(this);
}
//---------------------------------------------------------------------------


la siguiente funcion se usa dentro del Evento OnResize() del Form a redimensionar los Controles

Código:
void __fastcall AcomodarControles(TWinControl *F)
{
   AnsiString asResize=ExtractFilePath(Application->ExeName)+F->Name.Trim()+".ini";
   std::auto_ptr<TIniFile> pIni(new TIniFile(asResize));
   TControl *pControl;
   float ccLeft,ccHeight,ccTop,ccWidth;
   for(int control = 0; control <F->ComponentCount; control++)
   {
      if (F->Components[control]->InheritsFrom(__classid(TControl)))
      {
         Application->ProcessMessages();
         pControl = dynamic_cast<TControl*>(F->Components[control]);
         // recuperamos los porcenajes en relacion al form
         ccTop   = pIni->ReadFloat(pControl->Name,"Top",ccTop);
         ccLeft  = pIni->ReadFloat(pControl->Name,"Left",ccLeft) ;
         ccWidth = pIni->ReadFloat(pControl->Name,"Width",ccWidth) ;
         ccHeight= pIni->ReadFloat(pControl->Name,"Height",ccHeight) ;
            pControl->Left   = (ccLeft  *  F->Width) / 100 ;
            pControl->Top    = (ccTop   *  F->Height) / 100 ;
            pControl->ClientWidth  = (ccWidth *  F->Width) / 100 ;
            pControl->ClientHeight = (ccHeight * F->Height) / 100 ;
      }
   }
}


y dentro del Evento OnResize(), algo como esto

Código:
//---------------------------------------------------------------------------
void __fastcall TForm2::FormResize(TObject *Sender)
{
   AcomodarControles(this);
}
//---------------------------------------------------------------------------


y para que nose diga más presento 3 imagenes algo grandes, jeje pero es que me dieron ganas de probarlo en monitores grandes, jeje
Imagen 1


Imagen 2


Imagen 3



Saludos estamos en contacto!!
_________________
Cool


Ultima edición por Cesar C. Salazar Gonzalez el Vie 17 Abr, 2009 12:44 am, editado 4 veces
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola Cesar, muy interesante tu aporte y es justamente muy necesario. Pero no me funciona Embarassed , he puesto las funciones tal y como las pones (copy paste) y en donde lo indicas pero me genera 15 errores y otros tantos warnings. por ejemplo:

E2451 Undefinided symbol 'TIniFile'
E2299 Cannot generate template specialization from '_STL::auto_ptr<_Tp>'
E2379 Statement missing ;
E2034 Cannot convert 'int' to 'TWinControl'
E2451 Undefined symbol 'ComponenCount'
etc, etc

Que me esta faltando?, estoy usando CB6. Ojala me puedas ayudar.
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

Agrega las cabeceras siguientes en los archivos donde te los piden

Código:
#include <memory> // para el auto_ptr
#include <Inifiles.hpp> // para los archivos INI

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

Cesar gracias por responder. Te cuento que el #include <memory> ya lo habia puesto pero agregando la linea #include <Inifiles.hpp> se ha reducido el numero de errores a 6 y han desaparecido todos los warnings.

Loe errores E2451 Undefined symbol 'ComponenCount' y
E2034 Cannot convert 'int' to 'TWinControl'

los he corregido cambiando:

control <F>ComponentCount por control <F->ComponentCount


Pero como puedo resolver este error?

E2031 Cannot cast fron 'TComponent *' to 'TControl'
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

me puedes indicar la linea que te marca el error.

pero puede ser esta
Código:
pControl = dynamic_cast<TControl>(F->Components[control]);

y cambiarla por esta otra, pero asi como esta el codigo funciona correctamente
Código:
pControl = reinterpret_cast<TControl>(F->Components[control]);

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

Efectivamente es esa linea, pero ya la cambie por la otra opcion que me pusiste y me sigue dando exactamente el mismo error Crying or Very sad . No entiendo que pasa Embarassed , sera por la version del builder? uso el 6...
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

Vaya no vi la opcion de Deshabilitar HTML en este mensaje cuando respondí

la linea correcta debe ser asi

Código:
pControl = reinterpret_cast<TControl*>(F->Components[control]);


Falta un asterisco entre "TControl" y ">", pero como se debe deshabilitar el HTML en los mensajes cada vez que se responde, no me di cuenta.
_________________
Cool


Ultima edición por Cesar C. Salazar Gonzalez el Mar 04 Sep, 2007 8:52 pm, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Pues ya funciona, era eso.

Muy buena tu funcion!, muchas gracias! Very Happy
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

Buenas....
César pues tengo un problema.. en la siguiente linea
Código:
std::auto_ptr<TIniFile> pIni(new TIniFile(asResize));

tengo un error el cual es

Código:
Could not find a match for '_STL::auto_ptr<TIniFile>::auto_ptr(TIniFile*)'


las cabeceras listas.
Código:

#include <memory> // para el auto_ptr
#include <Inifiles> // para los archivos INI



que puede ser?
tengo Builder 6, Gracias de antemano como siempre!
_________________
><(((((º> From °l||l° §ÂN ÅNЮ€$ i§Lã$ °l||l°
_____________________
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Pues compilado exclusivamente estas dos lineas y no me ha saltado ningun error

Código:
   String asResize=ExtractFilePath(Application->ExeName)+F->Name.Trim()+".ini";
   std::auto_ptr<TIniFile> pIni(new TIniFile(asResize));


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

mmmm pues... ya logre hacer q funcione..
el error era o supongo yo que ademas trabajo con archivos .ini y en lineas anteriores al código del Resize tenia esta TIniFile *Conf; coloque las funciones arriba de esa y walaaa funcione..

Gracias Cesar Wink
_________________
><(((((º> From °l||l° §ÂN ÅNЮ€$ i§Lã$ °l||l°
_____________________
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

¿No seria lo mismo (y mas facil) usar las propiedad Anchor de cada componente?.
_________________
Mario.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Yahoo Messenger
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.