Estructura de Datos
Altas
Grilla
Consulta
Bajas
Varios
Buscar
Adjunto
Adjunto 2
Colega virtual, si eres del mundo algoritmico en estos links encontrarás toda la información necesaria para manejar con solvencia los conceptos de:
Todos los algoritmos que te propongo funcionan correctamente, pues ya los probé en mi PC y en el Laboratorio de la facultad, por lo tanto, solo te resta mejorarlos de acuerdo a tus propias necesidades.
Luego de editar la siguiente sintaxis, al compilar lograrás un sistema modelo, cuya pantallas tienen el aspecto de las imágenenes de esta page.
Buena suerte y que les saque utilidad a mi propuesta..!!
/////////////////////////////////////////////////// // C++ BUILDER Wilo Carpio // Fuente.cpp // Variables Dinámicas y Archivos /////////////////////////////////////////////////// #include#include #include #include #pragma hdrstop #include "Fuente.h" #pragma package(smart_init) #pragma resource "*.dfm" //////////////////////////////////////////// // DECLARACION DEL FORMULARIO PRINCIPAL //////////////////////////////////////////// TMiFormulario *MiFormulario;
Si quieres una mano que te ayude, la encontrarás al final de tu brazo...!!
Como ya estas deduciendo, en esta propuesta continuo con el trillado ejemplo de la agenda.
La idea es solo enseñarte la sintaxis y la semántica de la estructura algorítmica que utiliza C++ Builder, la cual, con pequeñas variantes puedes migrarla a Visual C++ de Microsoft.
Para simplificarte la comprensión te he llenado la codificación con ayudas no compilables, los cuales, si eres un colega experimentado, te ruego me perdones..!!
///////////////////////////////////////////////// // DECLARACIONES DE VARIABLES ///////////////////////////////////////////////// struct registro { char nombre[30],edad[10],domicilio[30]; bool elimina; }; struct registro MiRegistro; __fastcall TMiFormulario::TMiFormulario(TComponent* Owner): TForm(Owner) { archivo.open("MisDatos.DAT",ios::in|ios::out|ios::binary|ios::ate); if (!archivo) { ShowMessage("No hay archivo che..!!"); throw; } DatosPorMonitor(); } void __fastcall TMiFormulario::BotonAltasClick(TObject *Sender) { if(BotonAltas->Caption=="&Altas") { MiFormulario->Caption="Digita los datos, luego graba"; BotonAltas->Caption="&Cerrar"; MiGrilla->Visible=false; MisFolios->Visible=false; datos->Visible=true; Eliminar->Visible=false; nom->SetFocus(); nom->Text = ""; dom->Text = ""; ed->Text = ""; guardar->Visible=true; } else { MiFormulario->Caption="Agenda de Wilo"; datos->Visible=false; BotonAltas->Caption="&Altas"; } } void __fastcall TMiFormulario::guardarClick(TObject *Sender) { strcpy(MiRegistro.nombre,nom->Text.c_str()); strcpy(MiRegistro.domicilio,dom->Text.c_str()); strcpy(MiRegistro.edad,ed->Text.c_str()); MiRegistro.elimina=false; archivo.write((char *)&MiRegistro, sizeof(MiRegistro)); if (!archivo) ShowMessage("No existe el archivo..!!"); DatosPorMonitor(); nom->SetFocus(); } void __fastcall TMiFormulario::nomChange(TObject *Sender) { if (nom->Text=="") { guardar->Enabled=false; } else { guardar->Enabled=true; } }
No tomes la vida en serio, nunca saldremos vivos de ella..!!
La apariencia de los datos presentados en una grilla de entorno Windows, a mi criterio es inmejorable, por ello, en este link te ofrezco mi propuesta.
Te aconsejo que pongas atención en la rotulación de la grilla..!!
void __fastcall TMiFormulario::consultaClick(TObject *Sender) { MiFormulario->Caption="Registros del Archivo"; PortaBoton->Visible=false; MiGrilla->Visible=true; int j=1; archivo.seekg(0, ios::beg); archivo.read((char *)&MiRegistro, sizeof(MiRegistro)); MiGrilla->Cells[0][0] = "Nro"; MiGrilla->Cells[1][0] = "Nombre"; MiGrilla->Cells[2][0] = "Edad"; MiGrilla->Cells[3][0] = "Domicilio"; int i=1,k; for (i=1;i<=TotalRegistrosGrabados();i++) for (k=0;k<=3;k++) { MiGrilla->Cells[k][i]=""; } i=1; while (j<=TotalRegistrosGrabados()) { if (MiRegistro.elimina==false) { MiGrilla->Cells[0][i]= i; MiGrilla->Cells[1][i]=MiRegistro.nombre; MiGrilla->Cells[2][i]=MiRegistro.edad; MiGrilla->Cells[3][i]=MiRegistro.domicilio; i++; } j++; archivo.read((char *)&MiRegistro, sizeof(MiRegistro)); } } void TMiFormulario::DatosPorMonitor() { if (NumeroRegistro()<=TotalRegistrosGrabados()) { archivo.read((char *)&MiRegistro, sizeof(MiRegistro)); NumeroRegistro(NumeroRegistro()-1); nom->Text = MiRegistro.nombre; dom->Text = MiRegistro.domicilio; ed->Text = MiRegistro.edad; } else { nom->Text = ""; dom->Text = ""; ed->Text = ""; } } void __fastcall TMiFormulario::BotonAceptarClick(TObject *Sender) { int FichaActual=1; char bus[40]; AnsiString var; MiFormulario->MiCombo->Visible=false; MiFormulario->BotonAceptar->Visible=false; AnsiString DatoBuscado; bool SiEsta = false; archivo.seekg(0,ios::beg); archivo.read((char *)&MiRegistro, sizeof(MiRegistro)); var=MiCombo->Items->Strings[MiCombo->ItemIndex]; strcpy(bus,var.c_str()); while(FichaActual<=TotalRegistrosGrabados()) { if((strcmp(MiRegistro.nombre,bus)==0)&&(MiRegistro.elimina==false)) { SiEsta = true; nom->Text = MiRegistro.nombre; dom->Text = MiRegistro.domicilio; ed->Text = MiRegistro.edad; datos->Visible=true; guardar->Visible=false; Eliminar->Visible=false; BotonBuscar->Caption="&Cerrar"; datos->Caption="FICHA BUSCADA: Nº "+IntToStr(FichaActual); break; } FichaActual=FichaActual+1; archivo.read((char *)&MiRegistro, sizeof(MiRegistro)); } if(SiEsta==false) { Application->MessageBox("NO EXISTE","EL REGISTRO BUSCADO",MB_OK); MiFormulario->Caption="Agenda de Wilo"; } }
No tomes tu vida en serio, nadie lo hace..!!
En este link te ofrezco los algoritmos de carga de la grilla de datos a visualizar, con el contenido de los registros que almacenaste en tu archivo.
Como ya habrás detectado, en este ejemplo los datos se operan usando la estructura dinámica de una lista enlazada simple..!!
void __fastcall TMiFormulario::SpeedButton1Click(TObject *Sender) { if(BotonVerGrilla->Caption=="&VerGrilla") { BotonVerGrilla->Caption="&Cerrar"; MiFormulario->Caption="Fichas del Archivo"; MiGrilla->Visible=true; int j=1; archivo.seekg(0, ios::beg); archivo.read((char *)&MiRegistro, sizeof(MiRegistro)); MiGrilla->Cells [0][0]= "Ficha"; MiGrilla->Cells [1][0]= "Nombre"; MiGrilla->Cells [2][0]= "Edad"; MiGrilla->Cells [3][0]= "Domicilio"; int i=1,k; for (i=1;i<=TotalRegistrosGrabados();i++) for (k=0;k<=3;k++) { MiGrilla->Cells[k][i]=""; } i=1; while (j<=TotalRegistrosGrabados()) { if (MiRegistro.elimina==false) { MiGrilla->Cells[0][i]= i; MiGrilla->Cells[1][i]=MiRegistro.nombre; MiGrilla->Cells[2][i]=MiRegistro.edad; MiGrilla->Cells[3][i]=MiRegistro.domicilio; i++; } j++; archivo.read((char *)&MiRegistro, sizeof(MiRegistro)); } } else { MiFormulario->Caption="Agenda de Wilo"; BotonVerGrilla->Caption="&VerGrilla"; MiGrilla->Visible=false; } }
Ahorremos agua... bañemonos juntos..!!
En este procedimiento, para identificar el archivo a eliminar, utilizo para la busqueda un combo box, de acuerdo a la siguiente secuencia.
void __fastcall TMiFormulario::BotonBajasClick(TObject *Sender) { int FichaActual=1; MiGrilla->Visible=false; MisFolios->Visible=false; MiFormulario->MiCombo->Visible=true; MiFormulario->BotonAceptar2->Visible=true; datos->Caption="Ficha Buscada"; if(BotonBajas->Caption=="&Eliminar") { MiFormulario->BotonBajas->Caption="&Cerrar"; MiCombo->Clear(); archivo.seekg(0,ios::beg); archivo.read((char *)&MiRegistro, sizeof(MiRegistro)); while(FichaActual<=TotalRegistrosGrabados()) { MiCombo->Items->Add(MiRegistro.nombre); FichaActual=FichaActual+1; archivo.read((char *)&MiRegistro, sizeof(MiRegistro)); } } else { MiFormulario->MiCombo->Visible=false; MiFormulario->BotonAceptar2->Visible=false; datos->Visible=false; MiFormulario->Caption="Agenda de Wilo"; BotonBajas->Caption="&Eliminar"; } } void __fastcall TMiFormulario::EliminarClick(TObject *Sender) { int opcion; long a; char bus[40]; AnsiString var; int FichaActual=1; MiFormulario->Caption="BAJA de una FICHA"; BotonBajas->Caption="&Cerrar"; archivo.seekg(0,ios::beg); archivo.read((char *)&MiRegistro, sizeof(MiRegistro)); var=MiCombo->Items->Strings[MiCombo->ItemIndex]; strcpy(bus,var.c_str()); opcion=Application->MessageBox("Esta seguro","ELIMINAR",MB_OKCANCEL+MB_ICONQUESTION); if(opcion==IDOK) { while(FichaActual<=TotalRegistrosGrabados()) { if((strcmp(MiRegistro.nombre,bus)==0)) { if (MiRegistro.elimina==false) { MiRegistro.elimina=true; a=archivo.tellg(); archivo.seekg(a-sizeof(MiRegistro)); archivo.write((char *)&MiRegistro, sizeof(MiRegistro)); } } FichaActual=FichaActual+1; archivo.read((char *)&MiRegistro, sizeof(MiRegistro)); } datos->Visible=false; } else { datos->Visible=false; } MiFormulario->Caption="Agenda de Wilo"; BotonBajas->Caption="&Eliminar"; } void __fastcall TMiFormulario::BotonAceptar2Click(TObject *Sender) { int FichaActual=1; char bus[40]; AnsiString var; MiFormulario->MiCombo->Visible=false; MiFormulario->BotonAceptar2->Visible=false; AnsiString DatoBuscado; bool SiEsta = false; archivo.seekg(0,ios::beg); archivo.read((char *)&MiRegistro, sizeof(MiRegistro)); var=MiCombo->Items->Strings[MiCombo->ItemIndex]; strcpy(bus,var.c_str()); while(FichaActual<=TotalRegistrosGrabados()) { if((strcmp(MiRegistro.nombre,bus)==0)&&(MiRegistro.elimina==false)) { SiEsta = true; nom->Text = MiRegistro.nombre; dom->Text = MiRegistro.domicilio; ed->Text = MiRegistro.edad; datos->Visible=true; guardar->Visible=false; Eliminar->Visible=true; BotonBajas->Caption="&Cerrar"; datos->Caption="FICHA BUSCADA: Nº "+IntToStr(FichaActual); break; } FichaActual=FichaActual+1; archivo.read((char *)&MiRegistro, sizeof(MiRegistro)); } if(SiEsta==false) { Application->MessageBox("NO EXISTE","EL REGISTRO BUSCADO",MB_OK); MiFormulario->Caption="Agenda de Wilo"; } }
Sonríe, mañana será peor...!!
Sin estas funciones, todo lo anterior no funciona, por lo tanto debes codificarlos cuidadosamente, en primera instancia no te conviene cambiar ninguna estructura.
Buena suerte..!!
void __fastcall TMiFormulario::BotonSalirClick(TObject *Sender) { int Opcion; Opcion= Application->MessageBox("Deseas cerrar este Programa", "FINALIZACION DEL SISTEMA", MB_OKCANCEL+MB_DEFBUTTON1|MB_ICONQUESTION); if (Opcion== IDOK) { Close(); } } int TMiFormulario::NumeroRegistro() { return archivo.tellg()/sizeof(MiRegistro)+1; } void TMiFormulario::NumeroRegistro(int NuevoNumero) { archivo.seekg((NuevoNumero-1)*sizeof(MiRegistro)); } int TMiFormulario::TotalRegistrosGrabados() { int PosicionActual = archivo.tellg(); archivo.seekg(0, ios::end); int N = NumeroRegistro()-1; archivo.seekg(PosicionActual); return N; } void __fastcall TMiFormulario::BotonHelpClick(TObject *Sender) { if(BotonHelp->Caption=="&Help") { MiFormulario->Caption="Ayuda del Sistema"; MisFolios->Visible=true; MisFolios->Enabled=true; BotonHelp->Caption="&Cerrar"; } else { MiFormulario->Caption="Agenda de Wilo"; MisFolios->Visible=false; BotonHelp->Caption="&Help"; } } void __fastcall TMiFormulario::HojaSistemaShow(TObject *Sender) { VideoPlayer1->Play(); }
Tener la conciencia limpia es síntoma de mala memoria..!!
void __fastcall TMiFormulario::BotonBuscarClick(TObject *Sender) { int FichaActual=1; MiGrilla->Visible=false; MisFolios->Visible=false; MiFormulario->MiCombo->Visible=true; MiFormulario->BotonAceptar->Visible=true; MiFormulario->Caption="BUSQUEDA de una FICHA"; if(BotonBuscar->Caption=="&Buscar") { MiFormulario->BotonBuscar->Caption="&Cerrar"; MiCombo->Clear(); archivo.seekg(0,ios::beg); archivo.read((char *)&MiRegistro, sizeof(MiRegistro)); while(FichaActual<=TotalRegistrosGrabados()) { MiCombo->Items->Add(MiRegistro.nombre); FichaActual=FichaActual+1; archivo.read((char *)&MiRegistro, sizeof(MiRegistro)); } } else { MiFormulario->MiCombo->Visible=false; MiFormulario->BotonAceptar->Visible=false; MiFormulario->Caption="Agenda de Wilo"; BotonBuscar->Caption="&Buscar"; datos->Visible=false; } }
/////////////////////////////////////////////////// // C++ BUILDER Wilo Carpio // Fuente.h // Variables Dinámicas y Archivos /////////////////////////////////////////////////// #ifndef FuenteH #define FuenteH #include#include #include #include #include #include #include #include #include #include #include class TMiFormulario : public TForm { __published: // IDE-managed Components TGroupBox *datos; TLabel *Label1; TLabel *Label2; TLabel *Label3; TEdit *nom; TEdit *dom; TEdit *ed; TBitBtn *guardar; TPanel *PortaBoton; TBitBtn *BotonAltas; TBitBtn *BotonBuscar; TBitBtn *BotonBajas; TBitBtn *BotonHelp; TStringGrid *MiGrilla; TSpeedButton *BotonSalir; TPageControl *MisFolios; TTabSheet *HojaSistema; TTabSheet *HojaAutor; TTabSheet *HojaAyuda; TLabel *LabelSistema; TSpeedButton *BotonVerGrilla; TImage *MiFoto; TLabel *RotuloAutor; TMemo *MiMemo; TComboBox *MiCombo; TBitBtn *BotonAceptar; TBitBtn *Eliminar; TBitBtn *BotonAceptar2; TMediaPlayer *VideoPlayer1; TAnimate *Animate1; void __fastcall BotonAltasClick(TObject *Sender); void __fastcall consultaClick(TObject *Sender); void __fastcall BotonBuscarClick(TObject *Sender); void __fastcall BotonBajasClick(TObject *Sender); void __fastcall BotonSalirClick(TObject *Sender); void __fastcall guardarClick(TObject *Sender); void __fastcall nomChange(TObject *Sender); void __fastcall BotonHelpClick(TObject *Sender); void __fastcall SpeedButton1Click(TObject *Sender); void __fastcall BotonAceptarClick(TObject *Sender); void __fastcall EliminarClick(TObject *Sender); void __fastcall BotonAceptar2Click(TObject *Sender); void __fastcall HojaSistemaShow(TObject *Sender); private: // User declarations fstream archivo; void TMiFormulario::DatosPorMonitor(); int TMiFormulario::TotalRegistrosGrabados(); int TMiFormulario::NumeroRegistro(); void TMiFormulario::NumeroRegistro(int NuevoNumero); public: // User declarations __fastcall TMiFormulario(TComponent* Owner); }; extern PACKAGE TMiFormulario *MiFormulario; #endif
Si el estudio te hace grande, que estudien los enanos...!!
/////////////////////////////////////////////////// // C++ BUILDER Wilo Carpio // Modelo.cpp // Variables Dinámicas y Archivos /////////////////////////////////////////////////// #include#pragma hdrstop USERES("Modelo.res"); USEFORM("Fuente.cpp", MiFormulario); WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TMiFormulario), &MiFormulario); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } return 0; }
Vivir en las nubes no es malo, lo malo es bajar. ..!!