#include #include #include #include #include #include #include #include "c:\program\src_dos\libs\make_bot\make_bot.h" #include "c:\program\src_dos\libs\bdatos\bdatos.hh" #include "tpv_def.h" #define NLINEAS_EMPR 9 #define NLINEAS_EMPRelegir 10 #define CONTRAE 0 #define EXPANDE 1 extern INFO_EMPRESAS SEmpr; // Estructura de Empreedores typedef struct { // Datos de uso p£blico (->ú<-) char file[13]; // archivo vinculado a la rama // Datos privados char Titulo[80]; // Titulo de la rama char Disponible; // Indica si esta o no el item disponible unsigned char nivel; // Nivel de profundidad en el cual estamos char ExpCont; // La rama es: // Expansible 1 Nada -1 // Contraible 0 char Estado; // La rama esta: // Expandida 1 // Contraida 0 char Visible; // Es visible en estos momentos? } ARBOL_EXPANSIBLE; ARBOL_EXPANSIBLE *InfoGBD; // Informacion sobre la empresa /*************************************\ | | | Parte Principal del M¢dulo | | | \*************************************/ void ImportaFicheros(void); void ExportaFicheros( int CurrRow ); void GestionBaseDatos(void); void EscalaLogotipo( char * File, int X, int Y ); void ContraeExpandeRama( ARBOL_EXPANSIBLE *DesdeAqui, char ContraeExpande ); void IntroduceDatos( char *titulo, char *file, unsigned char nivel, char ExpCont, char Estado, char Visible, int i ); int RecopilaInformacion( int *Nodos ); void MuestraDatosGBD( ARBOL_EXPANSIBLE *DesdeAqui ); void MuestraGDB( ARBOL_EXPANSIBLE *EstaRama, char RowPhysic, char COMO ); /*************************************\ | | | Parte Tercera del M¢dulo | | | | Secci¢n para la impresi¢n | | | \*************************************/ void ImprimeInformacion(void); // ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß // Û Parte principal del m¢dulo Û // ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ /**************************************************************************\ |* *| |* GestionBaseDatos *| |* *| |* Descripci¢n: *| |* Controla todas las bases de datos, existentes en el disco *| |* duro, de la empresa activa. *| |* Los datos cuelgan del nombre de la empresa, clasificados *| |* por a¤o, tema y dentro de este, mes, si corresponde... *| |* *| |* *| |* Entradas: (ninguna) *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void GestionBaseDatos(void) { char buffer2[100], ok = 0; char buffer[100]; int BPush, key, i; int CurrRow; // Linea sobre la que estamos int RowPhysic; // Linea F¡sica sobre la que estamos int NLineasT; // N§ total de lineas // Rellenamos la pantalla con un fondo atractivo... setfillstyle( Config.FillBgS, Config.FillBgC ); bar( 0, 0, 640, 480 ); Imprime_Estaticos( 130, "systm\\Tpv.img"); // Imprime botones estaticos 'Seccion 30' sprintf( buffer, "datos\\%s\\tpv.pcx", NEmpresa ); if ( access( buffer, 0 ) != 0 ) sprintf( buffer, "systm\\tpv.pcx" ); EscalaLogotipo( buffer, 275, 5 ); Optar( ENCUADRE, "Recopilando informaci¢n", "Se esta recopilando toda", "la informaci¢n disponible", "acerca de su empresa:", "Por favor, espere...", NULL ); if ( RecopilaInformacion( &NLineasT ) == ERROR ) { Optar( ENCUADRE, "Recopilando informaci¢n", "Se esta recopilando toda", "la informaci¢n disponible", "acerca de su empresa:", "Por favor, espere...", NULL ); Optar( 0, "Memoria insuficiente", "No se a podido alojar la", "cantidad de memoria requerida", "libere memoria antes de", "volver a intertarlo.", NULL ); return; } Optar( ENCUADRE, "Recopilando informaci¢n", "Se esta recopilando toda", "la informaci¢n disponible", "acerca de su empresa:", "Por favor, espere...", NULL ); settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); // Mostramos datos hasta que se nos acabe la pantalla RowPhysic = CurrRow = 0; MuestraDatosGBD( &InfoGBD[CurrRow] ); do { MuestraGDB( &InfoGBD[CurrRow], RowPhysic, INTENSO ); BPush = Comprueba_Secuencia( 2, NULL ); MuestraGDB( &InfoGBD[CurrRow], RowPhysic, NORMAL ); switch ( BPush ) { case 0: // No se pulso ningun BOTON while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER break; case -2: // Hay una tecla normal en BUFFER switch ( getch() ) { // Contrae la rama case 27: ContraeExpandeRama( &InfoGBD[CurrRow], CONTRAE ); setfillstyle( SOLID_FILL, 0 ); bar ( 12, 12, 263, 443 ); RowPhysic = CurrRow = 0; MuestraDatosGBD( &InfoGBD[CurrRow] ); break; // Contrae/Expande rama, dependiendo del estado case 13: ContraeExpandeRama( &InfoGBD[CurrRow], InfoGBD[CurrRow].Estado == EXPANDE ? CONTRAE : EXPANDE ); setfillstyle( SOLID_FILL, 0 ); bar ( 12, 12, 263, 443 ); RowPhysic = CurrRow = 0; MuestraDatosGBD( &InfoGBD[CurrRow] ); break; } break; case -1: // Hay una tecla especial en BUFFER switch( getch() ) { // Flecha Izquierda case 75: case 15: // Flecha Arriba case 72: if ( CurrRow > 0 ) { RowPhysic --; do { CurrRow--; } while( CurrRow > 0 && !InfoGBD[CurrRow].Visible ); } if ( RowPhysic < 0 ) { i = 0; do { CurrRow--; if ( InfoGBD[CurrRow].Visible ) i ++; } while( CurrRow > 0 && i != 28 ); setfillstyle( SOLID_FILL, 0 ); bar ( 12, 12, 263, 443 ); MuestraDatosGBD( &InfoGBD[CurrRow] ); RowPhysic = 0; // RowPhysic += 27; i = 0; do { CurrRow++; if ( InfoGBD[CurrRow].Visible ) i++; } while( i != 27 && strcmp( InfoGBD[CurrRow].Titulo, "TOPE_FINAL" ) != 0 ); if ( !InfoGBD[CurrRow].Visible || strcmp( InfoGBD[CurrRow].Titulo, "TOPE_FINAL" ) == 0 ) { RowPhysic --; do { CurrRow--; } while( CurrRow > 0 && !InfoGBD[CurrRow].Visible ); } // } break; // Flecha Derecha case 77: case 9: // Flecha Abajo case 80: RowPhysic ++; do { CurrRow++; } while( !InfoGBD[CurrRow].Visible && strcmp( InfoGBD[CurrRow].Titulo, "TOPE_FINAL" ) != 0 ); if ( !InfoGBD[CurrRow].Visible || strcmp( InfoGBD[CurrRow].Titulo, "TOPE_FINAL" ) == 0 ) { RowPhysic --; do { CurrRow--; } while( CurrRow > 0 && !InfoGBD[CurrRow].Visible ); } if ( RowPhysic >= 28 ) { RowPhysic = 0; setfillstyle( SOLID_FILL, 0 ); bar ( 12, 12, 263, 443 ); MuestraDatosGBD( &InfoGBD[CurrRow] ); } break; // Inicio case 71: // RowPhysic = CurrRow = 0; break; // Fin case 79: /* CurrRow = NLineas-1; if ( InfoGBD[CurrRow].Estado == CONTRAIDO ) do { CurrRow--; } while( CurrRow > 0 && InfoGBD[CurrRow].Estado == CONTRAIDO ); */ break; } break; // Imprimir Informe detallado case 1: break; // Menu Principal case 2: ok = 1; break; // Exportar case 3: ExportaFicheros( CurrRow ); break; // Importar case 4: ImportaFicheros(); break; // Retroceso R pido case 5: ungetch(75); ungetch(0); // Inicio case 6: ungetch(71); ungetch(0); break; // Eliminar Clave case 7: // No se permite eliminar TODO, TODO, del tiron if ( CurrRow == 0 ) break; if ( InfoGBD[CurrRow].nivel <= InfoGBD[CurrRow+1].nivel ) sprintf( buffer, "toda la clave COMPLETA." ); else sprintf( buffer, "el siguiente fichero: %s", InfoGBD[CurrRow].file ); Optar( 0, "ALERTA de ELIMINACION!!!", "Se dispone a eliminar", buffer, "¨ Desea continuar ?", NULL ); if ( Optar( 1, "ALERTA de ELIMINACION!!!", "Se dispone a eliminar", buffer, "¨ Esta realmente seguro ?", NULL ) ) { i = 0; do { sprintf( buffer, "datos\\%s\\%s", NEmpresa, InfoGBD[CurrRow + i].file ); unlink( buffer ); i ++; } while ( InfoGBD[CurrRow + i].nivel <= InfoGBD[CurrRow + i + 1].nivel ); } // ReEscaneamos el  rbol free( InfoGBD ); Optar( ENCUADRE, "Recopilando informaci¢n", "Se esta recopilando toda", "la informaci¢n disponible", "acerca de su empresa:", "Por favor, espere...", NULL ); if ( RecopilaInformacion( &NLineasT ) == ERROR ) { Optar( ENCUADRE, "Recopilando informaci¢n", "Se esta recopilando toda", "la informaci¢n disponible", "acerca de su empresa:", "Por favor, espere...", NULL ); Optar( 0, "Memoria insuficiente", "No se a podido alojar la", "cantidad de memoria requerida", "libere memoria antes de", "volver a intertarlo.", NULL ); return; } Optar( ENCUADRE, "Recopilando informaci¢n", "Se esta recopilando toda", "la informaci¢n disponible", "acerca de su empresa:", "Por favor, espere...", NULL ); // Volvemos a mostrar todo CurrRow--; MuestraDatosGBD( &InfoGBD[CurrRow] ); break; // Fin case 8: ungetch(79); ungetch(0); break; // AvanceR pido case 9: ungetch(77); ungetch(0); break; #ifndef DEMOSTRACION #else #endif default: break; } } while( !ok ); #ifndef DEMOSTRACION // Do nothing #else Optar( 0, "VERSION DEMOSTRACION", "Cambios realizados no ser n", "llevados a cabo.", NULL ); #endif free( InfoGBD ); } void MuestraDatosGBD( ARBOL_EXPANSIBLE *DesdeAqui ) { int i, j; for ( i = 0, j = 0; j < 28 && strcmp( DesdeAqui[i].Titulo, "TOPE_FINAL" ) != 0; i++ ) { if ( DesdeAqui[i].Visible ) { MuestraGDB( &DesdeAqui[i], j, NORMAL ); j++; } } } void MuestraGDB( ARBOL_EXPANSIBLE *EstaRama, char RowPhysic, char COMO ) { char buffer[80]; int Y0, Y1, X0, X1; Y0 = 20 + 15*RowPhysic; Y1 = Y0 + 17; // Ymin => 425 X0 = 20; X1 = 255; setfillstyle( COMO == NORMAL ? SOLID_FILL : CLOSE_DOT_FILL, COMO == NORMAL ? 0 : Config.TxtBgI ); bar ( X0, Y0, X1, Y1 ); setcolor( COMO == NORMAL ? Config.TxtFgN + 1 : Config.TxtBgN ); // Mostramos si es posible CONTRAERLA/EXPANDIRLA o no se puede hacer nada sprintf ( buffer, "%s", (EstaRama -> ExpCont) == EXPANDE ? ( (EstaRama -> Estado ) == CONTRAE ? "+" : "-" ) : " " ); outtextxy ( 20 + 20*(EstaRama -> nivel), Y0, buffer ); if ( strcmp( (EstaRama -> file), "--------.---" ) == 0 ) sprintf ( buffer, "%s", (EstaRama -> Titulo) ); else sprintf ( buffer, "%s <%s>", (EstaRama -> Titulo), (EstaRama -> file) ); outtextxy ( 35 + 20*(EstaRama -> nivel), Y0, buffer ); } /**************************************************************************\ |* *| |* ExportaFicheros *| |* *| |* Descripci¢n: *| |* Lleva la clave seleccionada hacia A:\[NEmpresa] *| |* *| |* Entradas: (ninguna) *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void ExportaFicheros( int CurrRow ) { char buffer[80]; int i; Optar( 0, "Inicio de Exportaci¢n", "Inserte un disco limpio en A:", "Se dispone a copiar la clave", "seleccionada para llevarla", "a otro ordenador, o guardarla.", NULL ); // Iniciamos la exportacion // Vemos si tenemos suficiente espacio libre // Creamos en la unidad A:\ el directorio de la empresa, lo // limpiamos y comenzamos... sprintf( buffer, "A:\\%s", NEmpresa ); if ( !mkdir(buffer) ) { Optar( 0, "Error de escritura", "Me es imposible acceder", "a la unidad A:\\", "Proceso Abortado", NULL ); } i = 0; do { // Solo si no es una cabecera... if ( strcmp( InfoGBD[CurrRow + i].file, "--------.---" ) != 0 ) { sprintf( buffer, "datos\\%s\\%s", NEmpresa, InfoGBD[CurrRow + i].file ); // ... a copiar los ficheros de [ buffer ] ---->>> [ A:\NEmpresa\InfoGBD[CurrRow + i ].file ] } i ++; } while ( InfoGBD[CurrRow + i].nivel <= InfoGBD[CurrRow + i + 1].nivel ); } /**************************************************************************\ |* *| |* ImportaFicheros *| |* *| |* Descripci¢n: *| |* Se trae lo ficheros previamente exportados de A:\[NEmpresa] *| |* hasta \[NEmpresa] *| |* *| |* Entradas: (ninguna) *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void ImportaFicheros(void) { int i; struct ffblk ffblk; char buffer2[80], buffer[80]; if ( !Optar( 1, "Alerta ­­­ Importaci¢n !!!", "Este proceso eliminar  las", "versiones existentes de BDatos", "¨ Desea continuar ?", NULL ) ) return; Optar( 0, "Inicio de Exportaci¢n", "Inserte un disco limpio en A:", "Se dispone a restaurar la", "clave seleccionada para", "reponerla o actualizarla.", NULL ); // Iniciamos la importacion sprintf( buffer, "A:\\%s\\*.*", NEmpresa ); i = findfirst(buffer, &ffblk, 0); while (!i) { sprintf( buffer2, "datos\\%s\\%s", NEmpresa, ffblk.ff_name ); // ... a copiar los ficheros de [ A:\NEmpresa\ffblk.ff_name] ---> [ buffer ] i = findnext(&ffblk); }; } #define MOD_SCAL 2 void EscalaLogotipo( char * File, int X, int Y ) { FILE *fp; int alto, ancho; unsigned char byte; int alto2, ancho2; int scalH = 0, scalV = 0; int contador; char color[17] = { 0, EGA_RED, EGA_GREEN, EGA_LIGHTGRAY, EGA_LIGHTRED, EGA_LIGHTRED, EGA_LIGHTRED, EGA_LIGHTRED, EGA_LIGHTRED, EGA_LIGHTRED, EGA_LIGHTRED, EGA_LIGHTRED, EGA_LIGHTRED, EGA_LIGHTRED, EGA_LIGHTRED, EGA_LIGHTRED, EGA_LIGHTRED }; if ( ( fp = fopen ( File, "rb" ) ) != NULL ) { // Saltamos la cabecera fseek( fp, 128, SEEK_SET ); alto2 = 0; for(alto=0; alto<279; alto++) { ancho2 = 0; scalV = (scalV++)%MOD_SCAL; { if ( scalV == 1 ) alto2++; for(ancho=0; ancho<240; ) { byte=getc(fp); if(byte<=0xC0) { scalH = (scalH++)%MOD_SCAL; if ( scalH == 1 && scalV == 1) { if ( byte != 255 ) putpixel( ancho2+X, alto2+Y, color[byte%16] ); ancho2++; } ancho++; } else { contador=byte&0x3F; byte=getc(fp); for(; contador>0; contador--) { scalH = (scalH++)%MOD_SCAL; if ( scalH == 1 && scalV == 1) { if ( byte != 255 ) putpixel( ancho2+X, alto2+Y, color[byte%16] ); ancho2++; } ancho++; } } } } } fclose( fp ); } } /**************************************************************************\ |* *| |* RecopilaInformaci¢n *| |* *| |* Descripci¢n: *| |* Recopila una extensa informaci¢n sobre el estado de las *| |* bases de datos existentes para la empresa dada, y la *| |* clasifica por niveles expansibles... *| |* *| |* *| |* Entradas: (ninguna) *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ int RecopilaInformacion(int *Nodos) { struct ffblk ffblk; int done; char buffer[80], buffer1[80]; int Anyos[50], N_Anyos; // Como muchos gestionaremos, 50 a¤os int i, j, k; char Mes[12][12] = { "Enero ", "Febrero ", "Marzo ", "Abril ", "Mayo ", "Junio ", "Julio ", "Agosto ", "Septiembre", "Octubre ", "Noviembre ", "Diciembre " }; // Total de ficheros: for ( i=0; i < 50; i++ ) Anyos[i] = 0; i = 0; j = 0; N_Anyos = 0; sprintf( buffer, "datos\\%s\\*.*", NEmpresa ); done = findfirst(buffer,&ffblk,0); while (!done) { // Analizamos los a¤os de los que disponemos... if ( strstr( ffblk.ff_name, "CMP" ) != NULL || strstr( ffblk.ff_name, "VT" ) != NULL ) { // Obtenemos el a¤o k = (ffblk.ff_name[4]-'0') * 1000 + (ffblk.ff_name[5]-'0') * 100 + (ffblk.ff_name[6]-'0') * 10 + (ffblk.ff_name[7]-'0') * 1; // Lo buscamos entre los que ya tenemos y de no encontrarlo lo agregamos for ( j = 0; j < 50 && Anyos[j] != 0; j++ ) if ( Anyos[j] == k ) break; if ( j < 50 && Anyos[j] == 0 ) { N_Anyos++; Anyos[j] = k; } } i++; done = findnext(&ffblk); }; *Nodos = 1 + // Raiz (N0) con el nombre de la empresa 3 + // Datos que perduran en el tiempo ( 6 * N_Anyos)+ // Datos por a¤o * n£mero de a¤os disponibles i + // ( n§ total de ficheros ) 1 ; // Tope para el final de nuestras funciones... if ( ( InfoGBD = (ARBOL_EXPANSIBLE *)malloc( sizeof(ARBOL_EXPANSIBLE)*(*Nodos) ) ) == NULL ) return ERROR; // Nivel 0: Nombre de la empresa j = 0; IntroduceDatos( SEmpr.Empresa, "--------.---", 0, 1, 0, 1, j ); j++; // Nv Ex Es Vis // Datos que perduran con el tiempo // Nivel 1: sprintf( buffer, "datos\\%s\\info_ref.dbf", NEmpresa ); if ( access( buffer, 0 ) == 0 ) { IntroduceDatos( "Articulos", "info_ref.dbf", 1, 0, 0, 0, j ); j++; } sprintf( buffer, "datos\\%s\\info_emp.dbf", NEmpresa ); if ( access( buffer, 0 ) == 0 ) { IntroduceDatos( "Info Empleados", "info_emp.dbf", 1, 0, 0, 0, j ); j++; } sprintf( buffer, "datos\\%s\\mensajes.dbf", NEmpresa ); if ( access( buffer, 0 ) == 0 ) { IntroduceDatos( "Mensajes Prot.", "mensajes.dbf", 1, 0, 0, 0, j ); j++; } for ( i = 0; i < N_Anyos; i++ ) { sprintf( buffer, "%d", Anyos[i] ); IntroduceDatos( buffer, "--------.---", 1, 1, 0, 0, j/*Tamano bloque*/ ); j++; // Informacion variable con el tiempo // Nivel 2: sprintf( buffer, "datos\\%s\\inf_prv.%03d", NEmpresa, Anyos[i] - ( Anyos[i] / 1000 ) * 1000 ); if ( access( buffer, 0 ) == 0 ) { sprintf( buffer, "inf_prv.%03d", Anyos[i] - ( Anyos[i] / 1000 ) * 1000 ); IntroduceDatos( "Proveedores", buffer, 2, 0, 0, 0, j/*Tamano bloque*/ ); j++; } // Nivel 3clt: Clientes sprintf( buffer, "datos\\%s\\inf_clt1.dbf", NEmpresa ); sprintf( buffer1, "datos\\%s\\inf_clt2.%03d", NEmpresa, Anyos[i] - ( Anyos[i] / 1000 ) * 1000 ); if ( access( buffer, 0 ) == 0 || access( buffer1, 0 ) == 0) { // Nivel 2clt: Clientes IntroduceDatos( "Clientes", "--------.---", 2, 1, 0, 0, j/*Tamano bloque*/ ); j++; if ( access( buffer, 0 ) == 0 ) { IntroduceDatos( "Ficha Clt", "inf_clt1.dbf", 3, 0, 0, 0, j/*Tamano bloque*/ ); j++; } if ( access( buffer1, 0 ) == 0 ) { sprintf( buffer, "inf_clt2.%03d", Anyos[i] - ( Anyos[i] / 1000 ) * 1000 ); IntroduceDatos( "Datos Clt", buffer, 3, 0, 0, 0, j/*Tamano bloque*/ ); j++; } } IntroduceDatos( "Compras", "--------.---", 2, 1, 0, 0, j/*Tamano bloque*/ ); j++; // Nivel 3cmp: Archivos de compras existentes for ( k = 0; k < 12; k++ ) { sprintf( buffer, "datos\\%s\\cmp-%04d.m%02d", NEmpresa, Anyos[i], k+1 ); if ( access( buffer, 0 ) == 0 ) { sprintf( buffer, "cmp-%04d.m%02d", Anyos[i], k+1 ); IntroduceDatos( Mes[k], buffer, 3, 0, 0, 0, j/*Tamano bloque*/ ); j++; } } IntroduceDatos( "Gestion de Ventas", "--------.---", 2, 1, 0, 0, j/*Tamano bloque*/ ); j++; IntroduceDatos( "Datos generales", "--------.---", 3, 1, 0, 0, j/*Tamano bloque*/ ); j++; for ( k = 0; k < 12; k++ ) { sprintf( buffer, "datos\\%s\\VT1-%04d.m%02d", NEmpresa, Anyos[i], k+1 ); if ( access( buffer, 0 ) == 0 ) { sprintf( buffer, "VT1-%04d.m%02d", Anyos[i], k+1 ); IntroduceDatos( Mes[k], buffer, 4, 0, 0, 0, j/*Tamano bloque*/ ); j++; } } IntroduceDatos( "Productos Vendidos", "--------.---", 3, 1, 0, 0, j/*Tamano bloque*/ ); j++; for ( k = 0; k < 12; k++ ) { sprintf( buffer, "datos\\%s\\VT2-%04d.m%02d", NEmpresa, Anyos[i], k+1 ); if ( access( buffer, 0 ) == 0 ) { sprintf( buffer, "VT2-%04d.m%02d", Anyos[i], k+1 ); IntroduceDatos( Mes[k], buffer, 4, 0, 0, 0, j/*Tamano bloque*/ ); j++; } } sprintf( buffer, "datos\\%s\\VT3-%04d.M--", NEmpresa, Anyos[i] ); if ( access( buffer, 0 ) == 0 ) { sprintf( buffer, "VT3-%04d.M--", Anyos[i] ); IntroduceDatos( "Ventas por Empleado", buffer, 3, 0, 0, 0, j/*Tamano bloque*/ ); j++; } // Nv Ex Es Vis } IntroduceDatos( "TOPE_FINAL", "--------.---", 0, 0, 0, 0, j/*Tamano bloque*/ ); // j--; *Nodos = j; return OK; } /**************************************************************************\ |* *| |* IntroduceDatos *| |* *| |* Descripci¢n: *| |* Realmente esto no vale para nada, solo para tener que *| |* escribir menos... *| |* *| |* Entradas: Los datos de relleno para la estructura ARBOL_EXPANSIBLE *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void IntroduceDatos( char *titulo, char *file, unsigned char nivel, char ExpCont, char Estado, char Visible, int i ) { strcpy( InfoGBD[i].Titulo, titulo ); strcpy( InfoGBD[i].file, file ); InfoGBD[i].nivel = nivel; InfoGBD[i].ExpCont = ExpCont; InfoGBD[i].Estado = Estado; InfoGBD[i].Visible = Visible; } /**************************************************************************\ |* *| |* ContraeExpandeRama *| |* *| |* Descripci¢n: *| |* Contrae o expande la rama seg£n el par metro y apartir del *| |* punto indicado... *| |* *| |* Entradas: Puntero al inicio de la expanci¢n / contraccion *| |* Accion a ejecutar: CONTRAE / EXPANDE *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void ContraeExpandeRama( ARBOL_EXPANSIBLE *DesdeAqui, char ContraeExpande ) { int i; // Solo si desde el punto donde estamos es Expansible if ( DesdeAqui -> ExpCont == EXPANDE ) { DesdeAqui -> Estado = ContraeExpande; if ( ContraeExpande == CONTRAE ) { for ( i=0; ( DesdeAqui -> nivel ) < DesdeAqui[i+1].nivel ; i++) { DesdeAqui[i+1].Visible = ContraeExpande; DesdeAqui[i+1].Estado = ContraeExpande; } } else { for ( i=0; DesdeAqui[i+1].nivel > DesdeAqui -> nivel && DesdeAqui[i+1].nivel != 0; i++) { if ( ( DesdeAqui -> nivel + 1 ) == DesdeAqui[i+1].nivel ) DesdeAqui[i+1].Visible = ContraeExpande; } } } } /* typedef struct { // Datos de uso p£blico (->ú<-) char file[13]; // archivo vinculado a la rama // Datos privados char Titulo[80]; // Titulo de la rama unsigned char nivel; // Nivel de profundidad en el cual estamos char ExpCont; // La rama es: // Expansible 1 // Nada 0 char Estado; // La rama esta: // Expandida 1 // Contraida 0 } ARBOL_EXPANSIBLE; */