| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 03 Nov, 2006 11:10 pm Asunto: Resizing y Move Controls |
|
|
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!! _________________

Ultima edición por Cesar C. Salazar Gonzalez el Vie 17 Abr, 2009 12:44 am, editado 4 veces |
|
| Volver arriba |
|
 |
zemifes Cdt

Registrado: 01 Mar 2006Mensajes: 11Ubicación: Morelos, Mexico
|
Publicado: Lun 03 Sep, 2007 5:56 pm Asunto: |
|
|
Hola Cesar, muy interesante tu aporte y es justamente muy necesario. Pero no me funciona , 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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mar 04 Sep, 2007 4:47 am Asunto: |
|
|
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 |
_________________
 |
|
| Volver arriba |
|
 |
zemifes Cdt

Registrado: 01 Mar 2006Mensajes: 11Ubicación: Morelos, Mexico
|
Publicado: Mar 04 Sep, 2007 4:00 pm Asunto: |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mar 04 Sep, 2007 6:29 pm Asunto: |
|
|
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]); |
_________________
 |
|
| Volver arriba |
|
 |
zemifes Cdt

Registrado: 01 Mar 2006Mensajes: 11Ubicación: Morelos, Mexico
|
Publicado: Mar 04 Sep, 2007 7:24 pm Asunto: |
|
|
Efectivamente es esa linea, pero ya la cambie por la otra opcion que me pusiste y me sigue dando exactamente el mismo error . No entiendo que pasa , sera por la version del builder? uso el 6... |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mar 04 Sep, 2007 7:50 pm Asunto: |
|
|
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. _________________

Ultima edición por Cesar C. Salazar Gonzalez el Mar 04 Sep, 2007 8:52 pm, editado 1 vez |
|
| Volver arriba |
|
 |
zemifes Cdt

Registrado: 01 Mar 2006Mensajes: 11Ubicación: Morelos, Mexico
|
Publicado: Mar 04 Sep, 2007 8:37 pm Asunto: |
|
|
Pues ya funciona, era eso.
Muy buena tu funcion!, muchas gracias!  |
|
| Volver arriba |
|
 |
likibuay Master


Registrado: 24 Abr 2006Mensajes: 190Ubicación: COLOMBIA
|
Publicado: Jue 16 Abr, 2009 1:03 pm Asunto: |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 17 Abr, 2009 12:37 am Asunto: |
|
|
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));
|
_________________
 |
|
| Volver arriba |
|
 |
likibuay Master


Registrado: 24 Abr 2006Mensajes: 190Ubicación: COLOMBIA
|
Publicado: Mie 29 Abr, 2009 6:54 am Asunto: |
|
|
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  _________________ ><(((((º> From °l||l° §ÂN ÅNЮ€$ i§Lã$ °l||l°
_____________________ |
|
| Volver arriba |
|
 |
Mario Cdt


Registrado: 23 Sep 2004Mensajes: 22Ubicación: Tijuana B.C., México
|
Publicado: Vie 01 May, 2009 11:38 pm Asunto: |
|
|
¿No seria lo mismo (y mas facil) usar las propiedad Anchor de cada componente?. _________________ Mario. |
|
| Volver arriba |
|
 |
|