miércoles 22 de agosto de 2007

Restringir caracteres en un StringGrid


Esta función sirve para limitar (¿o debería decir restringir?) caracteres en un StringGrid, una vez que lo hice me di cuenta de que en el evento OnGetEditMask la cosa sería aparentemente mucho más sencilla pero como ya lo había hecho naturalmente no iba a tirar mi trabajo a la basura. Lo que la función hace es que solo permite la introducción de números enteros y retroceso (la tecla que se usa para borrar) y que la longitud del texto solo sea de 4 bits (como si se usase la propiedad Maxlength de un Edit).

Código:
void __fastcall TForm1::filtro_int_grid(TStringGrid * grid,char &Key)
{
char caracter=Key;
//formato: 9999
if((caracter=='\b') || (caracter=='\t'))
Key=caracter;
else
{
int longitud;
longitud=grid->Cells[grid->Col][grid->Row].Length();
if(longitud>=4)
Key=NULL;
else
{
if((caracter>='0')&& (caracter<='9'))
Key=caracter;
else
{
Key=NULL;
ShowMessage("Solo caracteres númericos (enteros).");
}
}
}
}
//---------------------------------------------------------------------------

Y la form de usarlo:
Form1->filtro_int_grid(StringGrid1,Key)
en el OnkeyPress del StringGrid.

martes 27 de febrero de 2007

Apagar equipos

Esta función sirve para apagar una computadora. Lo he probado con Windows 200, ME y XP y lo compile con Windows XP. Sería interesante adaptarlo a un sistema de apagado automático, por ejemplo, se podría dejar la computadora encendida descargando un poco de música, irse a dormir y programarla para que se apague por si sola.

Bueno, tal vez a alguien se le ocurra darle una utilidad mejor.

bool apagar(void)
{
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx( &osvi );
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;

if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return false;

LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);

tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);

if (GetLastError() != ERROR_SUCCESS)
return false;
}
if (!ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
return false;

return true;
}

Y la forma de utilizarlo simplemente es así:

Form1->apagar();

Hasta la próxima.

lunes 8 de enero de 2007


Me permito publicar el siguiente código el cual muestra como puede manejarse un StringGrid junto con variables String, double e Int. El programa es para calcular volumenes de producción de madera en una Aserradero, posteriormente esos resultados son almacenados en una base de datos (claro que eso no lo muestro en esta ocasión) y permite introducir las medidas comerciales utilizas en México (en pulgadas).

Claro que bien puede escribirse 1.25 en lugar de 5/4, solo que la gente esta acostumbrada a usar fracciones y es más dificil hacerles cambiar de sistema que adaptarse a ellos. Espero les sea de utilidad y publiquen sus comentarios.

String cadena, cadena2, a2, b2, c2, aux, aux2, x2, y2, z2;
int i, j, longitud, longitud2, n;
double a, b, c, x, y, z, grueso, ancho, largo, volumen,suma=0;

for(i=1;i<=31;i++) { for(j=0;j<=31;j++) { cadena=StringGrid2->Cells[0][i];
aux=cadena;
longitud=cadena.Length();

if((longitud==1) (longitud==2))
{
a2=cadena.SubString(1,longitud);
a=a2.ToDouble();
grueso=a;
}
else if(longitud==3)
{
a2=cadena.SubString(1,longitud);
a=cadena.Delete(2,longitud).ToDouble();
b2=aux.SubString(1,longitud);
b=aux.Delete(1,2).ToDouble();
grueso=a/b;
}
else if(longitud==5)
{
a2=cadena.SubString(1,longitud);
b2=cadena.SubString(1,longitud);
b2=b2.Delete(1,2);
c2=cadena.SubString(1,longitud);

if(a2.IsEmpty()==true)
a=0;
else a=a2.Delete(2,longitud).ToDouble();
if(b2.IsEmpty()==true)
b=0;
else b=b2.Delete(2,2).ToDouble();
if(c2.IsEmpty()==true)
c=1;
else c=cadena.Delete(1,longitud-1).ToDouble();
grueso=(b/c)+a;
}
else if(longitud==6)
{
a2=cadena.SubString(1,longitud);
b2=cadena.SubString(1,longitud);
b2=b2.Delete(1,3);
c2=cadena.SubString(1,longitud);

if(a2.IsEmpty()==true)
a=0;
else a=a2.Delete(3,longitud).ToDouble();
if(b2.IsEmpty()==true)
b=0;
else b=b2.Delete(2,2).ToDouble();
if(c2.IsEmpty()==true)
c=1;
else c=cadena.Delete(1,longitud-1).ToDouble();
grueso=(b/c)+a;
}

cadena2=StringGrid2->Cells[1][i];
aux2=cadena2;
longitud2=cadena2.Length();

if((longitud2==1) (longitud2==2))
{
x2=cadena2.SubString(1,longitud2);
x=x2.ToDouble();
ancho=x;
}
else if(longitud2==3)
{
x2=cadena2.SubString(1,longitud2);
x=cadena2.Delete(2,longitud2).ToDouble();
y2=aux2.SubString(1,longitud2);
y=aux2.Delete(1,2).ToDouble();
ancho=x/y;
}
else if(longitud2==5)
{
x2=cadena2.SubString(1,longitud2);
y2=cadena2.SubString(1,longitud2);
y2=y2.Delete(1,2);
z2=cadena2.SubString(1,longitud2);

if(x2.IsEmpty()==true)
x=0;
else x=x2.Delete(2,longitud2).ToDouble();
if(y2.IsEmpty()==true)
y=0;
else y=y2.Delete(2,2).ToDouble();
if(z2.IsEmpty()==true)
z=1;
else z=cadena2.Delete(1,longitud2-1).ToDouble();
//grueso=(b/c)+a;
ancho=(y/z)+x;
}
else if(longitud2==6)
{
x2=cadena2.SubString(1,longitud2);
y2=cadena2.SubString(1,longitud2);
y2=y2.Delete(1,3);
z2=cadena2.SubString(1,longitud2);

if(x2.IsEmpty()==true)
x=0;
else x=x2.Delete(3,longitud2).ToDouble();
if(y2.IsEmpty()==true)
y=0;
else y=y2.Delete(2,2).ToDouble();
if(z2.IsEmpty()==true)
z=1;
else z=cadena2.Delete(1,longitud2-1).ToDouble();
// grueso=(b/c)+a;
ancho=(y/z)+x;
}
}
/*if(StringGrid2->Cells[1][i].IsEmpty()==true)
ancho=0;
else ancho=StringGrid2->Cells[1][i].ToDouble();*/
if(StringGrid2->Cells[2][i].IsEmpty()==true)
largo=0;
else largo=StringGrid2->Cells[2][i].ToDouble();
if(StringGrid2->Cells[3][i].IsEmpty()==true)
n=0;
else n=StringGrid2->Cells[3][i].ToDouble();

volumen=((grueso*ancho*largo)/12)*n;
suma+=volumen;
if(volumen==0)
StringGrid2->Cells[4][i]="";
else StringGrid2->Cells[4][i]=FormatFloat("0.000",volumen);
StringGrid2->Cells[5][1]=FormatFloat("0.000",suma);
StringGrid2->Cells[5][i+1]="";
//Edit3->Text=FormatFloat("0.000",suma);
StringGrid4->Cells[1][3]=FormatFloat("0.000",suma);
}

domingo 7 de enero de 2007

Hola, bienvenid@s

Publico este primer mensaje para darles la bienvenida a todos los visitantes e informarles que durante los próximos días y hasta que así se decida, iré publicando los códigos que he desarrollado y recopilado de C++Builder.

Pretendo brindar alguna ayuda a aquellos programadores que están iniciándose en este mundo (en el de la programación visual) y también deseo que sea un espacio para compartir ideas pertinentes al maravilloso mundo de la Informática.

Hasta pronto y gracias por visitar mi blog.