Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Borrar lineas de txt (https://www.clubdelphi.com/foros/showthread.php?t=85474)

eennzzoo 21-03-2014 20:43:52

Borrar lineas de txt
 
Hola tengo un archivo txt el cual contiene varios datos de distintos usuarios por ejemplo.
dni1
nombre1
apellido1
dni2
nombre2
apellido2

Tengo lo que se encargar de buscar y mostrar en los labels, me falta que una vez que busco a cierta persona la elimine del txt. Sin que me queden espacios en blancos, si quisiera eliminar al dni1, tendria que quedarme asi el txt:
dni2
nombre2
apellido2

Código:

TStrings *TS = new TStringList;
TS->LoadFromFile("datos.txt");


void __fastcall TfCliente::MostrarRegistro(const int pp,const int c) {
        lblCliente->Caption = "Datos de "+TS->Strings[pp+1]+" "+TS->Strings[pp+2];
        lblDni->Caption = TS->Strings[pp];
        lblNombre->Caption = TS->Strings[pp+1];
        lblApellido->Caption = TS->Strings[pp+2];
        lblDireccion->Caption = TS->Strings[pp+3];
        lblMail->Caption = TS->Strings[pp+4];
        lblTelefono->Caption = TS->Strings[pp+5];
        lblCelular->Caption = TS->Strings[pp+6];
        lblEdad->Caption = TS->Strings[pp+7];
        lblNacimiento->Caption = TS->Strings[pp+8];
        lblNumeroCliente->Caption = c;
}
void __fastcall TfCliente::btnBuscarClick(TObject *Sender)
{
        if (editBuscar->Text != ""){
                int docu=0;
                int c;
                for(int i=0; i< TS->Count; i+=9) {
                        if (Trim(editBuscar->Text) == Trim(TS->Strings[i])) {
                                c=TS->Count/9;
                                MostrarRegistro(i,c);
                                editBuscar->Text = "";
                                break;}
                        else {
                        docu+=9;
                                if (docu == TS->Count) {
                                Application->MessageBox("El cliente no existe.","AVISO", MB_OK | MB_ICONEXCLAMATION);
                                editBuscar->Text = "";
                                lblCliente->Caption = "";
                                lblDni->Caption = "";
                                lblNombre->Caption = "";
                                lblApellido->Caption = "";
                                lblDireccion->Caption = "";
                                lblMail->Caption = "";
                                lblTelefono->Caption = "";
                                lblCelular->Caption = "";
                                lblEdad->Caption = "";
                                lblNacimiento->Caption = "";
                                lblNumeroCliente->Caption = "";
                                }
                        }
                }
                if (TS->Count == 0){
                        Application->MessageBox("El cliente no existe.","AVISO", MB_OK | MB_ICONEXCLAMATION);
                }
        }
        else {
                        Application->MessageBox("Ingrese un numero de documento.","AVISO", MB_OK | MB_ICONEXCLAMATION);
        }
}
void __fastcall TfCliente::btnEliminarClick(TObject *Sender)
{
      if (lblApellido->Captiont != ""){

                const int result = Application->MessageBox(("Desea eliminar al cliente " + lblApellido->Caption+" "+lblNombre->Caption+" ?").c_str() ,"AVISO", MB_YESNO | MB_ICONQUESTION);
                switch (result)
                {
                case IDYES:
                        Application->MessageBox("El cliente fue eliminado correctamente.","Cliente eliminado", MB_OK);
                        break;
                case IDNO:
                        break;
                }
        }
}


Casimiro Notevi 21-03-2014 21:10:46

Muy bien, y ¿el problema?

eennzzoo 21-03-2014 21:12:09

Cita:

Empezado por Casimiro Notevi (Mensaje 474168)
Muy bien, y ¿el problema?

Eliminar los datos del txt, de la persona que busco.

ecfisa 22-03-2014 00:45:41

Hola eennzzoo

Código:

void DeleteData(TStrings *TS, String dni)
{
  int ix = TS->IndexOf(dni);

  if (ix != -1) {
    if (MessageBox(0,"¿ Desea borrar los datos ?","",MB_YESNO)==IDYES) {
      TS->Delete(ix+2);
      TS->Delete(ix+1);
      TS->Delete(ix);
    }
  } else
    MessageBox(0,"No se encontró una persona con ese DNI","", MB_OK);
}

Ejemplo de uso:
Código:

void __fastcall TForm1::btnDeleteClick(TObject *Sender)
{
  DeleteData(Lista, EditDNI->Text);
}

Saludos :)

eennzzoo 22-03-2014 13:38:51

Cita:

Empezado por ecfisa (Mensaje 474176)
Hola eennzzoo

Código:

void DeleteData(TStrings *TS, String dni)
{
  int ix = TS->IndexOf(dni);

  if (ix != -1) {
    if (MessageBox(0,"¿ Desea borrar los datos ?","",MB_YESNO)==IDYES) {
      TS->Delete(ix+2);
      TS->Delete(ix+1);
      TS->Delete(ix);
    }
  } else
    MessageBox(0,"No se encontró una persona con ese DNI","", MB_OK);
}

Ejemplo de uso:
Código:

void __fastcall TForm1::btnDeleteClick(TObject *Sender)
{
  DeleteData(Lista, EditDNI->Text);
}

Saludos :)

Hola, lo probe, pero no borra nada del archivo. Por ejemplo puse TS->Delete(0); en el boton eliminar, y eso tendria que eliminar la primer linea del txt, pero el txt sigue estando igual.

ecfisa 22-03-2014 19:28:51

Hola ennzzoo.
Cita:

Empezado por eennzzoo (Mensaje 474188)
Hola, lo probe, pero no borra nada del archivo. Por ejemplo puse TS->Delete(0); en el boton eliminar, y eso tendria que eliminar la primer linea del txt, pero el txt sigue estando igual.

Si usaste el método Delete con el valor cero como argumento y no borró nada se me ocurren dos posibles causas:
  • El TStringList está vacío.
  • Tu C++ Builder funciona mal.
Mas probable es que el elemento haya sido efectívamente eliminado de la lista, pero el control que se encarga de visualizarla no se hubiera actualizado luego del borrado.

Para evitar confusiones te adjunto el código fuente de un ejemplo operativo, así podrás revisarlo con tranquildad. Solo descomprimilo en una carpeta, contiene el archivo de texto (file.txt).

Casimiro Notevi 22-03-2014 19:33:28

Cita:

Empezado por ecfisa (Mensaje 474208)
  • El TStringList está vacío.
  • Tu C++ Builder funciona mal.

Seguramente es lo primero :)

escafandra 23-03-2014 00:12:46

Cita:

Empezado por eennzzoo (Mensaje 474188)
Hola, lo probe, pero no borra nada del archivo. Por ejemplo puse TS->Delete(0); en el boton eliminar, y eso tendria que eliminar la primer linea del txt, pero el txt sigue estando igual.

Creo que no habéis entendido a eennzzoo, tiene razón, no se borra del archivo.

Quizas eennzzoo está buscando un ajuste como este:
Código:

void DeleteData(TStrings *TS, String dni)
{
  int ix = TS->IndexOf(dni);

  if (ix != -1) {
    if (MessageBox(0,"¿ Desea borrar los datos ?","",MB_YESNO)==IDYES) {
      TS->Delete(ix+2);
      TS->Delete(ix+1);
      TS->Delete(ix);
      Lista->SaveToFile(ExtractFilePath(Application->Name)+"file.txt");
    }
  } else
    MessageBox(0,"No se encontró una persona con ese DNI","", MB_OK);
}

Saludos.

Casimiro Notevi 23-03-2014 00:22:53

Pues sí, releyéndolo, parece que quiere borrarlo del fichero.

ecfisa 23-03-2014 01:09:20

Cita:

Empezado por escafandra (Mensaje 474215)
Creo que no habéis entendido a eennzzoo, tiene razón, no se borra del archivo.

Hola escafandra.

Si, realmente no lo interpreté de ese modo. No pensé que intentara borrar un dato del archivo de texto con el método Delete... seguramente por eso desestimé el resto del párrafo.

Creo entonces que vale aclararle a eennzzoo que una vez usado el método LoadFromFile, los datos del archivo de texto cargados en Lista residen en la memoria y cualquier acción que se realice sobre Lista se perderá finalizar si previamente no se salvan con el método SaveFromFile.

Se pueden tomar dos caminos:
  • Guardar la Lista luego de cada acción (agregado, modificado o borrado)
  • Guardar la Lista al finalizar previo a la liberación de Lista. (*)
(*) ejemplo:
Código:

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
  Lista->SaveToFile('tu_archivo.txt');
  delete Lista;
}

Saludos :)

eennzzoo 23-03-2014 01:09:51

Cita:

Empezado por Casimiro Notevi (Mensaje 474216)
Pues sí, releyéndolo, parece que quiere borrarlo del fichero.

Si eso quiero, borrarlo del archivo. Mañana lo pruebo y les digo. Gracias.

eennzzoo 23-03-2014 14:01:45

Cita:

Empezado por escafandra (Mensaje 474215)
Creo que no habéis entendido a eennzzoo, tiene razón, no se borra del archivo.

Quizas eennzzoo está buscando un ajuste como este:
Código:

void DeleteData(TStrings *TS, String dni)
{
  int ix = TS->IndexOf(dni);

  if (ix != -1) {
    if (MessageBox(0,"¿ Desea borrar los datos ?","",MB_YESNO)==IDYES) {
      TS->Delete(ix+2);
      TS->Delete(ix+1);
      TS->Delete(ix);
      Lista->SaveToFile(ExtractFilePath(Application->Name)+"file.txt");
    }
  } else
    MessageBox(0,"No se encontró una persona con ese DNI","", MB_OK);
}

Saludos.

Ahora si funciona. Pero en vez de ser Lista->SaveToFile es TS->SaveToFile. Gracias.

ecfisa 23-03-2014 20:38:20

Hola eennzzoo.

También recuerda que usando la línea
Código:

  TS->SaveToFile(ExtractFilePath(Application->Name)+"file.txt");
al salir del form, guardarás todas las acciones previas realizadas en la lista, de otro modo tendrás que incluirla al finalizar cada accion (insertar, modificar o borrar).

Saludos :)

eennzzoo 24-03-2014 02:05:23

Cita:

Empezado por ecfisa (Mensaje 474241)
Hola eennzzoo.

También recuerda que usando la línea
Código:

  TS->SaveToFile(ExtractFilePath(Application->Name)+"file.txt");
al salir del form, guardarás todas las acciones previas realizadas en la lista, de otro modo tendrás que incluirla al finalizar cada accion (insertar, modificar o borrar).

Saludos :)

Ok gracias. Ahi lo probe y funciona bien.


La franja horaria es GMT +2. Ahora son las 11:36:31.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi