Archivo II
Ing Wilo Carpio Cáceres Volver a Page Inicial BIENVENIDO AL MUNDO PARADIGMATICO..!!
La enema no cura pero entretiene....!!!

Estructura de Datos

QUE ES.? Altas
ALTA Grilla
VER Consulta
BAJAS Bajas
MODIFICAR Varios
OTRO Buscar
OTRO Adjunto
OTRO 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...!!

Volver al principio


Altas
de registros

Bienvenido a mi website..!!

Volver al principio

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..!!


Volver al principio


GRILLAS DE DATOS
DE REGISTROS

Bienvenido a mi website..!!

Volver al principio

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..!!


Volver al principio


CONSULTA
Visualización de datos

Bienvenido a mi website..!!

Volver al principio

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..!!


Volver al principio


BAJAS
Eliminar datos

Bienvenido a mi website..!!

Volver al principio

En este procedimiento, para identificar el archivo a eliminar, utilizo para la busqueda un combo box, de acuerdo a la siguiente secuencia.

  • Elección de la ficha mediante combo box
  • Visualización de la ficha elegida para ser dada de baja.
  • Confirmación o cancelación de la eliminación
  • Baja lógica del Registro

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...!!


Volver al principio


VARIOS
Accesorios

Volver al principio

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..!!


Volver al principio


BUSQUEDA
de un registro

Volver al principio


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;
 }
}


Volver al principio


ADJUNTO
Fuente.h

Volver al principio

  
///////////////////////////////////////////////////
//   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...!!


Volver al principio


ADJUNTO 2
Modelo.cpp

Volver al principio

  
///////////////////////////////////////////////////
//   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. ..!!


Volver al principio