Pantalla de Ejecución

Funcionamiento del Programa
Lo que hace este programa es que crea
una base de datos en un bloq de notas, es decir que lo que el usuario va introduciendo
en los textBox, lo va almacenando como registros de un archivo. El archivo se
creará en la unidad C del disco duro, de manera que la persona podrá ir a
buscar el archivo al disco duro dentro de la unidad C y con el nombre y la
extensión introducidos en el espacio respectivo (archivo.dat en la figura de
“Pantalla de Ejecución” mostrada anteriormente). Cada línea será un registro,
aunque en el bloq de notas podría verse todo en una sóla línea y con símbolos de
cuadros que representan los saltos de línea, y no hay ninguna diferencia. El
programa permite crear un archivo y luego introducirle datos (registros), los
cuales luego pueden ser mostrados, modificados y eliminados. Se presentan
igualmente botones de navegación para ir al primer registro de todos, ir al
registro anterior, ir al registro siguiente e ir al último registro de todos. A
continuación se presenta un diagrama con los nombres de los objetos utilizados,
de modo que los programadores puedan ubicar los objetos que se están invocando
y utilizando dentro del código que se mostrará más adelante. Los registros
pueden abrirse con el bloq de notas de Windows, Microsoft Word, o con cualquier
procesador de texto si se les pone extensión .dat. Si se les ponen extensiones
inválidas, habrán errores a la hora de querer abrir los archivos creados.
Objetos del Programa

Código del Programa
Los nombres de espacio utilizados son
los siguientes:
using namespace System;
using namespace
System::ComponentModel;
using namespace
System::Collections;
using namespace
System::Windows::Forms;
using namespace
System::Data;
using namespace
System::Drawing;
using namespace
System::IO;
using namespace
System::Text;
Botón Crear Archivo
private: System::Void
button10_Click(System::Object^ sender, System::EventArgs^ e) {//Botón Crear Archivo.
String^ path =
String::Concat("c:\\",
textBox9->Text);//Concatena "c:\\" con
lo que escriba el usuario en el textBox (nombre y extensión del archivo). Se le
pone "\\" y no solamente "\" por cuestiones del C++, que
con una sóla pleca no lograría direccionar bien...
// Delete the file if it exists.
if ( File::Exists( path ) ){
File::Delete(
path );
}
//
Create the file.
FileStream^ fs =
File::Create( path );
try{
array<Byte>^info = (gcnew
UTF8Encoding( true ))->GetBytes( "" );
// Add some information to the file.
fs->Write( info, 0,
info->Length );
}
finally{
if ( fs )
delete (IDisposable^)fs;
}
//
Open the stream and read it back.
StreamReader^ sr =
File::OpenText( path );
try{
String^ s = "";
while ( s = sr->ReadLine() ){
Console::WriteLine( s );
}
}
finally{
if ( sr )
delete (IDisposable^)sr;
}
}
Botón Ir al Primer Registro de Todos
private: System::Void button5_Click(System::Object^
sender, System::EventArgs^ e) {//Botón Ir al Primer
Registro de Todos.
//Para que se vaya
al primer registro del archivo.
textBox6->Text = "1";//Para con el proceso que se da después, se vaya al primer
registro de todo el archivo.
//Primeramente se
limpian todos los textBox de los campos para los registros para que no queden
valores de procesos o consultas anteriores.
textBox1->Focus();
textBox1->Text = "";
textBox2->Text = "";
textBox3->Text = "";
textBox4->Text = "";
textBox5->Text = "";
String^ path = String::Concat("c:\\", textBox9->Text);//Concatena "c:\\" con lo que escriba el usuario
en el textBox (nombre y extensión del archivo). Se le pone "\\" y no
solamente "\" por cuestiones del C++, que con una sóla pleca no
lograría direccionar bien...
// Open the file to read from.
StreamReader^ sr =
File::OpenText( path );
try{
String^ s = "";
for (int i = 0;
i<Convert::ToInt32(textBox6->Text); i++){
s = sr->ReadLine();
textBox8->Text = s;//Imprime la línea completa del Notepad, es decir un
registro completo.
}
}
finally{
if ( sr )
delete (IDisposable^)sr;
}
//El textBox8 (que
en tiempo de ejecución aparecerá invisible y el usuario no se percatará de su
presencia) contiene el registro completo extraído del archivo (que se puede
abrir y ver con el Notepad, con Microsoft Word o con cualquier programa que
pueda abrir y leer texto.
//El registro
completo está en una sola línea. Ahora descomponerlo para ir poniendo cada
campo del registro en su respectivo textBox.
char
registro[250];//Arreglo tipo Char donde cada elemento
del arreglo almacenará un caracter de la línea del registro.
for(int i=0;i<textBox8->Text->Length;i++)//For desde cero hasta el número de caracteres del registro
menos 1.
registro[i] = textBox8->Text[i];//Cada caracter del textBox8 (predeterminadamente es
String) lo va pasando a su respectiva posición en el arreglo Char.
int
asterisco[4];//4 asteriscos serán los que habrán en
cada línea de registro en el archivo Notepad. Será útil conocer sus posiciones
para que sirva al separar cada campo del registro.
int
contadorasteriscos = 0;//Irá de 0 a 3 según vaya encontrando cada uno de los 4 asteriscos.
for (int i=0; i<textBox8->Text->Length; i++){//For desde cero hasta el número de caracteres del registro
menos 1.
if
(registro[i]=='*'){//Debido
a que irá evaluando caracter por caracter, llegará a encontrar 4 asteriscos en
total por cada registro. Debe entrar a este If cuando encuentre un asterisco,
pues los asteriscos son los que dividen un campo de otro según se ha programado
para el archivo en el Notepad.
asterisco[contadorasteriscos]=i;//Guarda la posición en la que se encontró un asterisco.
contadorasteriscos += 1;//Equivale a escribir "contadorasteriscos =
contadorasteriscos + 1;".
}
}
//asterisco[0]
contiene la posición donde se encontró el primer asterisco. asterisco[1]
contiene la posición donde se encontró el segundo asterisco. asterisco[2]
contiene la posición donde se encontró el tercer asterisco. asterisco[3]
contiene la posición donde se encontró el cuarto asterisco.
for (int
i=0; i<asterisco[0]; i++)
textBox1->Text +=
Char::ToString(registro[i]);//Imprime el Carnet luego
de la extracción que se hizo del archivo .dat que se puede leer con el Notepad.
for (int i=asterisco[0]+1; i<asterisco[1]; i++)//Se le pone "asterisco[0]+1" porque si solamente
se le pusiera "asterisco[0]" entonces tomaría el asterisco, y se
pretende que comience desde el caracter posterior al asterisco.
textBox2->Text +=
Char::ToString(registro[i]);//Imprime los Nombre
luego de la extracción que se hizo del archivo .dat que se puede leer con el
Notepad.
for (int i=asterisco[1]+1; i<asterisco[2]; i++)//Se le pone "asterisco[1]+1" porque si se
solamente se le pusiera "asterisco[1]" entonces tomaría el asterisco,
y se pretende que comience desde el caracter posterior al asterisco.
textBox3->Text +=
Char::ToString(registro[i]);//Imprime los Apellidos
luego de la extracción que se hizo del archivo .dat que se puede leer con el
Notepad.
for (int i=asterisco[2]+1; i<asterisco[3]; i++)//Se le pone "asterisco[2]+1" porque si solamente
se le pusiera "asterisco[2]" entonces tomaría el asterisco, y se
pretende que comience desde el caracter posterior al asterisco.
textBox4->Text +=
Char::ToString(registro[i]);//Imprime el Código de la Carrera luego de la extracción que se hizo del archivo .dat que se puede leer con el Notepad.
for (int i=asterisco[3]+1;
i<textBox8->Text->Length; i++)//Se le pone
"asterisco[3]+1" porque si solamente se le pusiera
"asterisco[3]" entonces tomaría el asterisco, y se pretende que
comience desde el caracter posterior al asterisco.
textBox5->Text +=
Char::ToString(registro[i]);//Imprime el CUM luego de
la extracción que se hizo del archivo .dat que se puede leer con el Notepad.
//Para determinar el
número total de registros y que imprima se vea "Registro x de
NUMEROTOTALDERESITROS".
int contador = 0;
//Open the file to read from.
StreamReader^ variable
= File::OpenText( path );
try{
String^
otravariable = "";
while ( otravariable = variable->ReadLine() ){
contador += 1;
}
}
finally{
if (
variable )
delete
(IDisposable^)variable;
}
textBox7->Text =
Convert::ToString(contador);//Se imprime en el
textBox7 el número total de registros que hay.
}
Botón Ir al Registro Anterior
private: System::Void
button6_Click(System::Object^ sender, System::EventArgs^ e) {//Botón Ir al Registro Anterior.
//Para que se
vaya al registro anterior del archivo.
if
(textBox6->Text != "1"){//Si ya estuviera en el registro 1, no existe un registro
anterior, entonces no haría ningún cambio, pero cuando esté en un registro
diferente de 1, entra al If.
int valor =
Convert::ToInt32(textBox6->Text);//Convierte el
String que hay en el textBox6 a tipo entero.
int nuevovalor
= valor - 1;//Al número de registro actual se le
resta 1 (y se almacena en la variable "nuevovalor") para irse al
registro anterior.
textBox6->Text = String::Format("{0}",nuevovalor);//El número resultante almacenado en la variable "nuevovalor"
se convierte de su tipo entero (int) a String, para poder imprimirlo en el
textBox6 y así que con lo que se programa posteriormente, el usuario pueda
visualizar el registro anterior del archivo con el que se está trabajando.
}
//Primeramente se
limpian todos los textBox de los campos para los registros para que no queden
valores de procesos o consultas anteriores.
textBox1->Focus();
textBox1->Text = "";
textBox2->Text = "";
textBox3->Text = "";
textBox4->Text = "";
textBox5->Text = "";
String^ path = String::Concat("c:\\", textBox9->Text);//Concatena "c:\\" con lo que escriba el usuario
en el textBox (nombre y extensión del archivo). Se le pone "\\" y no
solamente "\" por cuestiones del C++, que con una sóla pleca no
lograría direccionar bien...
// Open the file to read from.
StreamReader^ sr =
File::OpenText( path );
try{
String^ s = "";
for (int i = 0;
i<Convert::ToInt32(textBox6->Text); i++){
s = sr->ReadLine();
textBox8->Text = s;//Imprime la línea completa del Notepad, es decir un
registro completo.
}
}
finally{
if ( sr )
delete (IDisposable^)sr;
}
//El textBox8 (que
en tiempo de ejecución aparecerá invisible y el usuario no se percatará de su
presencia) contiene el registro completo extraído del archivo (que se puede
abrir y ver con el Notepad, con Microsoft Word o con cualquier programa que
pueda abrir y leer texto.
//El registro
completo está en una sola línea. Ahora descomponerlo para ir poniendo cada
campo del registro en su respectivo textBox.
char
registro[250];//Arreglo tipo Char donde cada elemento
del arreglo almacenará un caracter de la línea del registro.
for(int i=0;i<textBox8->Text->Length;i++)//For desde cero hasta el número de caracteres del registro
menos 1.
registro[i] = textBox8->Text[i];//Cada caracter del textBox8 (predeterminadamente es
String) lo va pasando a su respectiva posición en el arreglo Char.
int
asterisco[4];//4 asteriscos serán los que habrán en
cada línea de registro en el archivo Notepad. Será útil conocer sus posiciones
para que sirva al separar cada campo del registro.
int
contadorasteriscos = 0;//Irá de 0 a 3 según vaya encontrando cada uno de los 4 asteriscos.
for (int i=0; i<textBox8->Text->Length; i++){//For desde cero hasta el número de caracteres del registro
menos 1.
if
(registro[i]=='*'){//Debido
a que irá evaluando caracter por caracter, llegará a encontrar 4 asteriscos en
total por cada registro. Debe entrar a este If cuando encuentre un asterisco,
pues los asteriscos son los que dividen un campo de otro según se ha programado
para el archivo en el Notepad.
asterisco[contadorasteriscos]=i;//Guarda la posición en la que se encontró un asterisco.
contadorasteriscos += 1;//Equivale a escribir "contadorasteriscos =
contadorasteriscos + 1;".
}
}
//asterisco[0]
contiene la posición donde se encontró el primer asterisco. asterisco[1]
contiene la posición donde se encontró el segundo asterisco. asterisco[2]
contiene la posición donde se encontró el tercer asterisco. asterisco[3]
contiene la posición donde se encontró el cuarto asterisco.
for (int
i=0; i<asterisco[0]; i++)
textBox1->Text +=
Char::ToString(registro[i]);//Imprime el Carnet luego
de la extracción que se hizo del archivo .dat que se puede leer con el Notepad.
for (int i=asterisco[0]+1; i<asterisco[1]; i++)//Se le pone "asterisco[0]+1" porque si solamente
se le pusiera "asterisco[0]" entonces tomaría el asterisco, y se
pretende que comience desde el caracter posterior al asterisco.
textBox2->Text +=
Char::ToString(registro[i]);//Imprime los Nombre
luego de la extracción que se hizo del archivo .dat que se puede leer con el
Notepad.
for (int i=asterisco[1]+1; i<asterisco[2]; i++)//Se le pone "asterisco[1]+1" porque si se
solamente se le pusiera "asterisco[1]" entonces tomaría el asterisco,
y se pretende que comience desde el caracter posterior al asterisco.
textBox3->Text +=
Char::ToString(registro[i]);//Imprime los Apellidos
luego de la extracción que se hizo del archivo .dat que se puede leer con el
Notepad.
for (int i=asterisco[2]+1; i<asterisco[3]; i++)//Se le pone "asterisco[2]+1" porque si solamente
se le pusiera "asterisco[2]" entonces tomaría el asterisco, y se
pretende que comience desde el caracter posterior al asterisco.
textBox4->Text +=
Char::ToString(registro[i]);//Imprime el Código de la Carrera luego de la extracción que se hizo del archivo .dat que se puede leer con el Notepad.
for (int i=asterisco[3]+1;
i<textBox8->Text->Length; i++)//Se le pone
"asterisco[3]+1" porque si solamente se le pusiera
"asterisco[3]" entonces tomaría el asterisco, y se pretende que
comience desde el caracter posterior al asterisco.
textBox5->Text +=
Char::ToString(registro[i]);//Imprime el CUM luego de
la extracción que se hizo del archivo .dat que se puede leer con el Notepad.
//Para determinar el
número total de registros y que imprima se vea "Registro x de
NUMEROTOTALDERESITROS".
int contador = 0;
//Open the file to read from.
StreamReader^ variable
= File::OpenText( path );
try{
String^
otravariable = "";
while ( otravariable = variable->ReadLine() ){
contador += 1;
}
}
finally{
if (
variable )
delete
(IDisposable^)variable;
}
textBox7->Text =
Convert::ToString(contador);//Se imprime en el
textBox7 el número total de registros que hay.
}
Botón Ir al Siguiente
Registro
private: System::Void
button7_Click(System::Object^ sender, System::EventArgs^ e) {//Botón Ir al Siguiente Registro.
//Para que se
vaya al siguiente registro del archivo.
//Para determinar el
número total de registros y que imprima se vea "Registro x de
NUMEROTOTALDERESITROS".
int contador =
0;
String^ path = String::Concat("c:\\", textBox9->Text);//Concatena "c:\\" con lo que escriba el usuario
en el textBox (nombre y extensión del archivo). Se le pone "\\" y no
solamente "\" por cuestiones del C++, que con una sóla pleca no
lograría direccionar bien...
//Open the file to read from.
StreamReader^ variable
= File::OpenText( path );
try{
String^
otravariable = "";
while ( otravariable = variable->ReadLine() ){
contador += 1;
}
}
finally{
if (
variable )
delete
(IDisposable^)variable;
}
textBox7->Text =
Convert::ToString(contador);//Se imprime en el
textBox7 el número total de registros que hay.
int textbox6 =
Convert::ToInt32(textBox6->Text);//Convierte el
String que hay en el textBox6 a tipo entero.
int textbox7 =
Convert::ToInt32(textBox7->Text);//Convierte el
String que hay en el textBox7 a tipo enterio.
if (textbox6
!= textbox7){//Si ya estuviera en el último registro,
no existe un siguiente registro, entonces no haría ningún cambio, pero cuando
esté en un registro diferente del último, entra al If.
//int valor =
Convert::ToInt32(textBox6->Text);//Convierte el String que hay en el
textBox6 a tipo entero.
int nuevovalor
= textbox6 + 1;//Al número de registro actual se le
suma 1 (y se almacena en la variable "nuevovalor") para irse al
siguiente registro.
textBox6->Text = String::Format("{0}",nuevovalor);//El número resultante almacenado en la variable "nuevovalor"
se convierte de su tipo entero (int) a String, para poder imprimirlo en el
textBox6 y así que con lo que se programa posteriormente, el usuario pueda
visualizar el siguiente registro del archivo con el que se está trabajando.
}
//Primeramente se
limpian todos los textBox de los campos para los registros para que no queden
valores de procesos o consultas anteriores.
textBox1->Focus();
textBox1->Text = "";
textBox2->Text = "";
textBox3->Text = "";
textBox4->Text = "";
textBox5->Text = "";
// Open the file to read from.
StreamReader^ sr =
File::OpenText( path );
try{
String^ s = "";
for (int i = 0;
i<Convert::ToInt32(textBox6->Text); i++){
s = sr->ReadLine();
textBox8->Text = s;//Imprime la línea completa del Notepad, es decir un
registro completo.
}
}
finally{
if ( sr )
delete (IDisposable^)sr;
}
//El textBox8 (que
en tiempo de ejecución aparecerá invisible y el usuario no se percatará de su
presencia) contiene el registro completo extraído del archivo (que se puede
abrir y ver con el Notepad, con Microsoft Word o con cualquier programa que
pueda abrir y leer texto.
//El registro completo
está en una sola línea. Ahora descomponerlo para ir poniendo cada campo del
registro en su respectivo textBox.
char
registro[250];//Arreglo tipo Char donde cada elemento
del arreglo almacenará un caracter de la línea del registro.
for(int i=0;i<textBox8->Text->Length;i++)//For desde cero hasta el número de caracteres del registro
menos 1.
registro[i] = textBox8->Text[i];//Cada caracter del textBox8 (predeterminadamente es
String) lo va pasando a su respectiva posición en el arreglo Char.
int asterisco[4];//4 asteriscos serán los que habrán en cada línea de
registro en el archivo Notepad. Será útil conocer sus posiciones para que sirva
al separar cada campo del registro.
int
contadorasteriscos = 0;//Irá de 0 a 3 según vaya encontrando cada uno de los 4 asteriscos.
for (int i=0; i<textBox8->Text->Length; i++){//For desde cero hasta el número de caracteres del registro
menos 1.
if
(registro[i]=='*'){//Debido
a que irá evaluando caracter por caracter, llegará a encontrar 4 asteriscos en
total por cada registro. Debe entrar a este If cuando encuentre un asterisco,
pues los asteriscos son los que dividen un campo de otro según se ha programado
para el archivo en el Notepad.
asterisco[contadorasteriscos]=i;//Guarda la posición en la que se encontró un asterisco.
contadorasteriscos += 1;//Equivale a escribir "contadorasteriscos =
contadorasteriscos + 1;".
}
}
//asterisco[0]
contiene la posición donde se encontró el primer asterisco. asterisco[1]
contiene la posición donde se encontró el segundo asterisco. asterisco[2]
contiene la posición donde se encontró el tercer asterisco. asterisco[3]
contiene la posición donde se encontró el cuarto asterisco.
for (int
i=0; i<asterisco[0]; i++)
textBox1->Text +=
Char::ToString(registro[i]);//Imprime el Carnet luego
de la extracción que se hizo del archivo .dat que se puede leer con el Notepad.
for (int i=asterisco[0]+1; i<asterisco[1]; i++)//Se le pone "asterisco[0]+1" porque si solamente
se le pusiera "asterisco[0]" entonces tomaría el asterisco, y se pretende
que comience desde el caracter posterior al asterisco.
textBox2->Text +=
Char::ToString(registro[i]);//Imprime los Nombre
luego de la extracción que se hizo del archivo .dat que se puede leer con el
Notepad.
for (int i=asterisco[1]+1; i<asterisco[2]; i++)//Se le pone "asterisco[1]+1" porque si se
solamente se le pusiera "asterisco[1]" entonces tomaría el asterisco,
y se pretende que comience desde el caracter posterior al asterisco.
textBox3->Text +=
Char::ToString(registro[i]);//Imprime los Apellidos
luego de la extracción que se hizo del archivo .dat que se puede leer con el
Notepad.
for (int i=asterisco[2]+1; i<asterisco[3]; i++)//Se le pone "asterisco[2]+1" porque si solamente
se le pusiera "asterisco[2]" entonces tomaría el asterisco, y se pretende
que comience desde el caracter posterior al asterisco.
textBox4->Text +=
Char::ToString(registro[i]);//Imprime el Código de la Carrera luego de la extracción que se hizo del archivo .dat que se puede leer con el Notepad.
for (int i=asterisco[3]+1;
i<textBox8->Text->Length; i++)//Se le pone
"asterisco[3]+1" porque si solamente se le pusiera
"asterisco[3]" entonces tomaría el asterisco, y se pretende que
comience desde el caracter posterior al asterisco.
textBox5->Text +=
Char::ToString(registro[i]);//Imprime el CUM luego de
la extracción que se hizo del archivo .dat que se puede leer con el Notepad.
}
Botón Ir al Último Registro de Todos
private: System::Void button8_Click(System::Object^
sender, System::EventArgs^ e) {//Botón Ir al Último Registro
de Todos.
//Para que se vaya
al último registro del archivo.
//Para determinar el
número total de registros y que imprima se vea "Registro x de
NUMEROTOTALDERESITROS".
int contador =
0;
String^ path = String::Concat("c:\\", textBox9->Text);//Concatena "c:\\" con lo que escriba el usuario
en el textBox (nombre y extensión del archivo). Se le pone "\\" y no
solamente "\" por cuestiones del C++, que con una sóla pleca no
lograría direccionar bien...
//Open the file to read from.
StreamReader^ variable
= File::OpenText( path );
try{
String^
otravariable = "";
while ( otravariable = variable->ReadLine() ){
contador += 1;
}
}
finally{
if (
variable )
delete
(IDisposable^)variable;
}
textBox7->Text =
Convert::ToString(contador);//Se imprime en el
textBox7 el número total de registros que hay.
textBox6->Text = textBox7->Text;//Se imprime en el textBox6 el mismo valor que tiene el
textBox7, de modo que se visualice el último registro del archivo.
//Primeramente se
limpian todos los textBox de los campos para los registros para que no queden
valores de procesos o consultas anteriores.
textBox1->Focus();
textBox1->Text = "";
textBox2->Text = "";
textBox3->Text = "";
textBox4->Text = "";
textBox5->Text = "";
// Open the file to read from.
StreamReader^ sr =
File::OpenText( path );
try{
String^ s = "";
for (int i = 0;
i<Convert::ToInt32(textBox6->Text); i++){
s = sr->ReadLine();
textBox8->Text = s;//Imprime la línea completa del Notepad, es decir un
registro completo.
}
}
finally{
if ( sr )
delete (IDisposable^)sr;
}
//El textBox8 (que
en tiempo de ejecución aparecerá invisible y el usuario no se percatará de su
presencia) contiene el registro completo extraído del archivo (que se puede
abrir y ver con el Notepad, con Microsoft Word o con cualquier programa que
pueda abrir y leer texto.
//El registro
completo está en una sola línea. Ahora descomponerlo para ir poniendo cada
campo del registro en su respectivo textBox.
char
registro[250];//Arreglo tipo Char donde cada elemento
del arreglo almacenará un caracter de la línea del registro.
for(int i=0;i<textBox8->Text->Length;i++)//For desde cero hasta el número de caracteres del registro
menos 1.
registro[i] = textBox8->Text[i];//Cada caracter del textBox8 (predeterminadamente es
String) lo va pasando a su respectiva posición en el arreglo Char.
int
asterisco[4];//4 asteriscos serán los que habrán en
cada línea de registro en el archivo Notepad. Será útil conocer sus posiciones
para que sirva al separar cada campo del registro.
int
contadorasteriscos = 0;//Irá de 0 a 3 según vaya encontrando cada uno de los 4 asteriscos.
for (int i=0; i<textBox8->Text->Length; i++){//For desde cero hasta el número de caracteres del registro
menos 1.
if
(registro[i]=='*'){//Debido
a que irá evaluando caracter por caracter, llegará a encontrar 4 asteriscos en
total por cada registro. Debe entrar a este If cuando encuentre un asterisco,
pues los asteriscos son los que dividen un campo de otro según se ha programado
para el archivo en el Notepad.
asterisco[contadorasteriscos]=i;//Guarda la posición en la que se encontró un asterisco.
contadorasteriscos += 1;//Equivale a escribir "contadorasteriscos =
contadorasteriscos + 1;".
}
}
//asterisco[0]
contiene la posición donde se encontró el primer asterisco. asterisco[1]
contiene la posición donde se encontró el segundo asterisco. asterisco[2]
contiene la posición donde se encontró el tercer asterisco. asterisco[3]
contiene la posición donde se encontró el cuarto asterisco.
for (int
i=0; i<asterisco[0]; i++)
textBox1->Text +=
Char::ToString(registro[i]);//Imprime el Carnet luego
de la extracción que se hizo del archivo .dat que se puede leer con el Notepad.
for (int i=asterisco[0]+1; i<asterisco[1]; i++)//Se le pone "asterisco[0]+1" porque si solamente
se le pusiera "asterisco[0]" entonces tomaría el asterisco, y se
pretende que comience desde el caracter posterior al asterisco.
textBox2->Text +=
Char::ToString(registro[i]);//Imprime los Nombre
luego de la extracción que se hizo del archivo .dat que se puede leer con el
Notepad.
for (int i=asterisco[1]+1; i<asterisco[2]; i++)//Se le pone "asterisco[1]+1" porque si se
solamente se le pusiera "asterisco[1]" entonces tomaría el asterisco,
y se pretende que comience desde el caracter posterior al asterisco.
textBox3->Text +=
Char::ToString(registro[i]);//Imprime los Apellidos
luego de la extracción que se hizo del archivo .dat que se puede leer con el
Notepad.
for (int i=asterisco[2]+1; i<asterisco[3]; i++)//Se le pone "asterisco[2]+1" porque si solamente
se le pusiera "asterisco[2]" entonces tomaría el asterisco, y se
pretende que comience desde el caracter posterior al asterisco.
textBox4->Text +=
Char::ToString(registro[i]);//Imprime el Código de la Carrera luego de la extracción que se hizo del archivo .dat que se puede leer con el Notepad.
for (int i=asterisco[3]+1;
i<textBox8->Text->Length; i++)//Se le pone
"asterisco[3]+1" porque si solamente se le pusiera
"asterisco[3]" entonces tomaría el asterisco, y se pretende que
comience desde el caracter posterior al asterisco.
textBox5->Text +=
Char::ToString(registro[i]);//Imprime el CUM luego de
la extracción que se hizo del archivo .dat que se puede leer con el Notepad.
}
Botón Agregar Registro
private: System::Void
button9_Click(System::Object^ sender, System::EventArgs^ e) {//Botón Agregar Registro.
String^ path =
String::Concat("c:\\",
textBox9->Text);//Concatena "c:\\" con
lo que escriba el usuario en el textBox (nombre y extensión del archivo). Se le
pone "\\" y no solamente "\" por cuestiones del C++, que
con una sóla pleca no lograría direccionar bien...
// This text is always added, making the
file longer over time
// if it is not deleted.
StreamWriter^ sw =
File::AppendText( path );
try{
sw->WriteLine(
String::Concat(textBox1->Text, "*",
textBox2->Text, "*",
textBox3->Text, "*",
textBox4->Text, "*",
textBox5->Text) );
}
finally
{
if ( sw )
delete (IDisposable^)sw;
}
}
Botón Mostrar Registros
private: System::Void
button1_Click(System::Object^ sender, System::EventArgs^ e) {//Botón Mostrar Registros.
//Primeramente
se limpian todos los textBox de los campos para los registros para que no
queden valores de procesos o consultas anteriores.
textBox1->Focus();
textBox1->Text = "";
textBox2->Text = "";
textBox3->Text = "";
textBox4->Text = "";
textBox5->Text = "";
String^ path = String::Concat("c:\\", textBox9->Text);//Concatena "c:\\" con lo que escriba el usuario
en el textBox (nombre y extensión del archivo). Se le pone "\\" y no
solamente "\" por cuestiones del C++, que con una sóla pleca no
lograría direccionar bien...
// Open the file to read from.
StreamReader^ sr =
File::OpenText( path );
try{
String^ s = "";
for (int i = 0;
i<Convert::ToInt32(textBox6->Text); i++){
s = sr->ReadLine();
textBox8->Text = s;//Imprime la línea completa del Notepad, es decir un
registro completo.
}
}
finally{
if ( sr )
delete (IDisposable^)sr;
}
//El textBox8 (que
en tiempo de ejecución aparecerá invisible y el usuario no se percatará de su
presencia) contiene el registro completo extraído del archivo (que se puede
abrir y ver con el Notepad, con Microsoft Word o con cualquier programa que
pueda abrir y leer texto.
//El registro
completo está en una sola línea. Ahora descomponerlo para ir poniendo cada
campo del registro en su respectivo textBox.
char
registro[250];//Arreglo tipo Char donde cada elemento
del arreglo almacenará un caracter de la línea del registro.
for(int i=0;i<textBox8->Text->Length;i++)//For desde cero hasta el número de caracteres del registro
menos 1.
registro[i] = textBox8->Text[i];//Cada caracter del textBox8 (predeterminadamente es
String) lo va pasando a su respectiva posición en el arreglo Char.
int
asterisco[4];//4 asteriscos serán los que habrán en
cada línea de registro en el archivo Notepad. Será útil conocer sus posiciones
para que sirva al separar cada campo del registro.
int
contadorasteriscos = 0;//Irá de 0 a 3 según vaya encontrando cada uno de los 4 asteriscos.
for (int i=0; i<textBox8->Text->Length; i++){//For desde cero hasta el número de caracteres del registro
menos 1.
if
(registro[i]=='*'){//Debido
a que irá evaluando caracter por caracter, llegará a encontrar 4 asteriscos en
total por cada registro. Debe entrar a este If cuando encuentre un asterisco,
pues los asteriscos son los que dividen un campo de otro según se ha programado
para el archivo en el Notepad.
asterisco[contadorasteriscos]=i;//Guarda la posición en la que se encontró un asterisco.
contadorasteriscos += 1;//Equivale a escribir "contadorasteriscos =
contadorasteriscos + 1;".
}
}
//asterisco[0]
contiene la posición donde se encontró el primer asterisco. asterisco[1]
contiene la posición donde se encontró el segundo asterisco. asterisco[2]
contiene la posición donde se encontró el tercer asterisco. asterisco[3]
contiene la posición donde se encontró el cuarto asterisco.
for (int
i=0; i<asterisco[0]; i++)
textBox1->Text +=
Char::ToString(registro[i]);//Imprime el Carnet luego
de la extracción que se hizo del archivo .dat que se puede leer con el Notepad.
for (int i=asterisco[0]+1; i<asterisco[1]; i++)//Se le pone "asterisco[0]+1" porque si solamente
se le pusiera "asterisco[0]" entonces tomaría el asterisco, y se
pretende que comience desde el caracter posterior al asterisco.
textBox2->Text +=
Char::ToString(registro[i]);//Imprime los Nombre
luego de la extracción que se hizo del archivo .dat que se puede leer con el
Notepad.
for (int i=asterisco[1]+1; i<asterisco[2]; i++)//Se le pone "asterisco[1]+1" porque si se
solamente se le pusiera "asterisco[1]" entonces tomaría el asterisco,
y se pretende que comience desde el caracter posterior al asterisco.
textBox3->Text +=
Char::ToString(registro[i]);//Imprime los Apellidos
luego de la extracción que se hizo del archivo .dat que se puede leer con el
Notepad.
for (int i=asterisco[2]+1; i<asterisco[3]; i++)//Se le pone "asterisco[2]+1" porque si solamente
se le pusiera "asterisco[2]" entonces tomaría el asterisco, y se
pretende que comience desde el caracter posterior al asterisco.
textBox4->Text +=
Char::ToString(registro[i]);//Imprime el Código de la Carrera luego de la extracción que se hizo del archivo .dat que se puede leer con el Notepad.
for (int i=asterisco[3]+1;
i<textBox8->Text->Length; i++)//Se le pone
"asterisco[3]+1" porque si solamente se le pusiera
"asterisco[3]" entonces tomaría el asterisco, y se pretende que
comience desde el caracter posterior al asterisco.
textBox5->Text +=
Char::ToString(registro[i]);//Imprime el CUM luego de
la extracción que se hizo del archivo .dat que se puede leer con el Notepad.
//Para determinar el
número total de registros y que imprima se vea "Registro x de
NUMEROTOTALDERESITROS".
int contador = 0;
//Open the file to read from.
StreamReader^ variable
= File::OpenText( path );
try{
String^
otravariable = "";
while ( otravariable = variable->ReadLine() ){
contador += 1;
}
}
finally{
if (
variable )
delete
(IDisposable^)variable;
}
textBox7->Text =
Convert::ToString(contador);//Se imprime en el textBox7
el número total de registros que hay.
}
Botón Guardar Modificación
private: System::Void
button2_Click(System::Object^ sender, System::EventArgs^ e) {//Botón Guardar Modificación.
//Primeramente
se limpian todos los textBox de los campos para los registros para que no
queden valores de procesos o consultas anteriores.
textBox1->Focus();
textBox10->Text=textBox1->Text;//textBox10 estará invisible en tiempo de ejecución y sirve
para guardar el String del textBox1 (porque se necesitará) debido a que se
limpiarán los valores de los textBox donde se introducen los campos (en los
textBox1, textBox2, textBox3, textBox4 y textBox5) para que no almacenen datos
de procesos anteriores.
textBox11->Text=textBox2->Text;//textBox11 estará invisible en tiempo de ejecución y sirve
para guardar el String del textBox2 (porque se necesitará) debido a que se
limpiarán los valores de los textBox donde se introducen los campos (en los
textBox1, textBox2, textBox3, textBox4 y textBox5) para que no almacenen datos de
procesos anteriores.
textBox12->Text=textBox3->Text;//textBox12 estará invisible en tiempo de ejecución y sirve
para guardar el String del textBox3 (porque se necesitará) debido a que se
limpiarán los valores de los textBox donde se introducen los campos (en los
textBox1, textBox2, textBox3, textBox4 y textBox5) para que no almacenen datos
de procesos anteriores.
textBox13->Text=textBox4->Text;//textBox13 estará invisible en tiempo de ejecución y sirve
para guardar el String del textBox4 (porque se necesitará) debido a que se
limpiarán los valores de los textBox donde se introducen los campos (en los
textBox1, textBox2, textBox3, textBox4 y textBox5) para que no almacenen datos
de procesos anteriores.
textBox14->Text=textBox5->Text;//textBox14 estará invisible en tiempo de ejecución y sirve
para guardar el String del textBox5 (porque se necesitará) debido a que se
limpiarán los valores de los textBox donde se introducen los campos (en los
textBox1, textBox2, textBox3, textBox4 y textBox5) para que no almacenen datos
de procesos anteriores.
textBox1->Text = "";
textBox2->Text = "";
textBox3->Text = "";
textBox4->Text = "";
textBox5->Text = "";
String^ path = String::Concat("c:\\", textBox9->Text);//Concatena "c:\\" con lo que escriba el usuario
en el textBox (nombre y extensión del archivo). Se le pone "\\" y no
solamente "\" por cuestiones del C++, que con una sóla pleca no
lograría direccionar bien...
int contador = 0;
//Open the file to read from.
StreamReader^ variable
= File::OpenText( path );
try{
String^ otravariable = "";
textBox8->Text = "";//Necesario
para que cuando se haga clic en el botón Eliminar Registro más de una vez, que
no queden en el textBox8 valores de procesos anteriores, lo cual generaría toda
una confusión de caracteres en el archivo y se trabaría el programa.
while (
otravariable = variable->ReadLine() ){
contador += 1;//Para almacenar el número total de registros que tiene el
archivo.
if
(contador != Convert::ToInt32(textBox6->Text))//Poniendo
esta condición uno se asegura que no concatene el registro actual mostrado en
pantalla (que es el que se quiere eliminar). Gracias a ello el registro será
eliminado, lo cual se podrá corroborar al ir al archivo y abrirlo con un
Notepad u otro procesador de texto.
textBox8->Text +=
otravariable + "\n";//Va leyendo cada registro y lo concatena con un salto de
línea ("\n") y el siguiente registro. NOTA: Para que esto funcione,
en las propiedades del textBox8 se le ha puesto en True la propiedad Multiline,
pues de lo contrario de nada serviría concatenar el "\n" porque de
todas formas lo mandaría todo de continuo al textBox8 sin poder hacer ningún
cambio de línea. Posteriormente se usará pondrá la línea
"File::WriteAllText(path,textBox8->Text);" para que todo lo que
haya en el textBox8 sea lo que se mande a imprimir al archivo.
else//Cuando la variable "contador" tenga el mismo
valor que el número que hay en el textBox6, entonces se tienen que ir a extraer
los valores de los textBox de los campos llenos del registro para que eso sea
lo que se mande a concatenar y que así se haga efectiva la modificación del
registro.
textBox8->Text +=
String::Concat(textBox10->Text, "*",
textBox11->Text, "*",
textBox12->Text, "*",
textBox13->Text, "*",
textBox14->Text) + "\n";//Para el registro que el usuario quiere modificar, toma
los valores de cada campo y los va concatenando con un asterisco
("*") y finalmente da un salto de línea ("\n").
}
}
finally{
if (
variable )
delete
(IDisposable^)variable;
}
textBox7->Text = Convert::ToString(contador);//Se imprime en el textBox7 el número total de registros
que hay.
File::WriteAllText(path,textBox8->Text);//Sobreescribe en el archivo, borrando todo y
sustituyéndolo por lo que se indique después de la coma dentro del paréntesis,
es decir en este caso por lo que haya escrito en el textBox8. El
"path" dentro del paréntesis hace referencia al direccionamiento del
archivo con el que se está trabajando, que es lo que anteriormente se programó
con el "String^ path = String::Concat("c:\\",
textBox9->Text);".
}
Botón Eliminar Registro
private: System::Void
button3_Click(System::Object^ sender, System::EventArgs^ e) {//Botón Eliminar Registro.
//Primeramente
se limpian todos los textBox de los campos para los registros para que no queden
valores de procesos o consultas anteriores.
textBox1->Focus();
textBox1->Text = "";
textBox2->Text = "";
textBox3->Text = "";
textBox4->Text = "";
textBox5->Text = "";
String^ path = String::Concat("c:\\", textBox9->Text);//Concatena "c:\\" con lo que escriba el usuario
en el textBox (nombre y extensión del archivo). Se le pone "\\" y no
solamente "\" por cuestiones del C++, que con una sóla pleca no
lograría direccionar bien...
int contador = 0;
//Open the file to read from.
StreamReader^ variable
= File::OpenText( path );
try{
String^ otravariable = "";
textBox8->Text = "";//Necesario
para que cuando se haga clic en el botón Eliminar Registro más de una vez, que
no queden en el textBox8 valores de procesos anteriores, lo cual generaría toda
una confusión de caracteres en el archivo y se trabaría el programa.
while (
otravariable = variable->ReadLine() ){
contador += 1;//Para almacenar el número total de registros que tiene el
archivo.
if
(contador != Convert::ToInt32(textBox6->Text))//Poniendo
esta condición uno se asegura que no concatene el registro actual mostrado en
pantalla (que es el que se quiere eliminar). Gracias a ello el registro será
eliminado, lo cual se podrá corroborar al ir al archivo y abrirlo con un
Notepad u otro procesador de texto.
textBox8->Text +=
otravariable + "\n";//Va leyendo cada registro y lo concatena con un salto de
línea ("\n") y el siguiente registro. NOTA: Para que esto funcione,
en las propiedades del textBox8 se le ha puesto en True la propiedad Multiline,
pues de lo contrario de nada serviría concatenar el "\n" porque de
todas formas lo mandaría todo de continuo al textBox8 sin poder hacer ningún
cambio de línea. Posteriormente se usará pondrá la línea
"File::WriteAllText(path,textBox8->Text);" para que todo lo que
haya en el textBox8 sea lo que se mande a imprimir al archivo.
}
}
finally{
if (
variable )
delete
(IDisposable^)variable;
}
textBox7->Text =
Convert::ToString(contador);//Se imprime en el
textBox7 el número total de registros que hay.
File::WriteAllText(path,textBox8->Text);//Sobreescribe en el archivo, borrando todo y
sustituyéndolo por lo que se indique después de la coma dentro del paréntesis,
es decir en este caso por lo que haya escrito en el textBox8. El
"path" dentro del paréntesis hace referencia al direccionamiento del
archivo con el que se está trabajando, que es lo que anteriormente se programó
con el "String^ path = String::Concat("c:\\",
textBox9->Text);".
}
Botón Limpiar
private: System::Void
button4_Click(System::Object^ sender, System::EventArgs^ e) {//Botón Limpiar.
textBox1->Focus();
textBox1->Text = "";
textBox2->Text = "";
textBox3->Text = "";
textBox4->Text = "";
textBox5->Text = "";
}
Ver Registros en el Disco Duro
Todos los archivos que se creen serán
enviados a la unidad C. Ahí podrán encontrarse con el nombre y extensión que se
decidió ponerles. Luego podrán abrirse, y se vería de cualquiera de las
siguientes formas:


Para la línea 1 del archivo
“jaimemontoya.dat” que se visualiza con el bloq de notas, significa que el
usuario introdujo 019 en Carnet, Michael Douglas en Nombres, Hall en Apellidos,
D343AR en Código de la Carrera y 6.99 en CUM. Los asteriscos no fueron
introducidos por el usuario, sino que en el código se han programado para que
sirvan de parámetros para hacer la separación de campos. Así sucesivamente, la
línea 2 que tiene los nombres Jennifer Ann es el segundo registro. El tercer
registro es la línea 3 que contiene los nombres Beth Chelsea. El último
registro es el que aparece con el nombre de Beth Chelsea, que por cierto está
repetido en más de una ocasión (se repite en los registros 3 y 14. En total se
tienen 16 registros según se aprecia, los cuales pueden ser modificados, vistos
y eliminados desde el programa. Igualmente podría visualizarse todo en una sola
línea en el bloq de notas, lo cual no tendría ninguna diferencia ni
inconveniente para el programa.
Comentarios Finales
Este programa fue desarrollado en la
materia de Estructura de Datos y resulta útil para que los datos introducidos
en el formulario no desaparezcan cuando se cierre el programa. En pocas
palabras, este programa hace uso de la memoria ROM y no solamente de la memoria
RAM. De esta forma se tiene un sistema muy útil en el cual se pueden ir guardando
registros en el disco duro, así como también se pueden modificar, eliminar y
navegar en ellos. A la vez este programa permite crear archivos personalizados,
que serán los contenedores de los registros que se irán introduciendo.
Es importante hacer ver que este
programa está enfocado a los programadores (por lo cual el código está lleno de
comentarios en color verde, como se puede apreciar), por lo cual se ha
presentado el código completo para que todos aquellos interesados en aprender
más de programación en C++ puedan adquirir importantes conocimientos para luego
expandir y personalizar el código de acuerdo a las necesidades que se tengan en
el desarrollo de futuros sistemas. El código presentado puede ser modificado y
utilizado con toda libertad. Si se desea el programa completo favor solicitarlo
a la dirección de contacto que aparece al final de este documento para que se
envíe como adjunto por correo electrónico.
NOTA:
Este programa ha sido desarrollado en Microsoft C++ 2005.