Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-12-2013
andres_89 andres_89 is offline
Miembro
 
Registrado: dic 2013
Posts: 46
Poder: 0
andres_89 Va por buen camino
mostrar archivos en Label

Hola amigos, tengo un problemita para mostrar los nombres de los archivos en Label1, me ayude con un codigo en está página para listar archivos, pero ahora quisiera mostrarlos en tiempo real en label1 con un timer1, un ejemplo que hice es este:


-------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(Contador <= 10)

{
Timer1->Enabled = true; // habilito el Timer1
Timer1->Interval = 500;

Label1->Caption = Contador; // intervalo de tiempo

ProgressBar1->Min = 0;
ProgressBar1->Max = 9;
ProgressBar1->Position = Contador; // muestro el contador en el label1
Contador++; // aumento el contador en 1
}
else

{
Timer1->Enabled = false; // Deshabilito el Timer1
Contador = 0; //Pongo el contador a 0
}

}
-----------------------------------------------------------------
lo que hace el programita en cuestión es ir mostrando los numeros del 1 al 10 en label1 en un intervalo de 500.

Lo que no puedo hacer que salga pero con nombres de archivos de un código que está en está misma página de c++, el código en cuestión es este:
-------------------------------------------------------------------
#include <io.h>
#include <dir.h>

void ListFiles(char *Dir, TListBox *LB)
{
struct _finddata_t fdt;
long hFile;
char tmp[MAX_PATH];

chdir(Dir);
fdt.attrib = _A_SUBDIR;
if( (hFile = _findfirst("*.*", &fdt) ) != -1) {
do {
if (fdt.attrib == _A_SUBDIR) {
if (strcmp(fdt.name,".")!= 0 && strcmp(fdt.name,"..") != 0) {
strcpy(tmp, Dir);
strcat(tmp, "\\");
strcat(tmp, fdt.name);
ListFiles(tmp, LB);
}
}
else
LB->Items->Add(String(fdt.name));
} while (_findnext(hFile, &fdt) == 0);
_findclose(hFile);
};
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ListFiles("C:\\UNA_CARPETA", ListBox1);
}

---------------------------------------------------------------------
He tratado de esta manera pero no funciona:

void ListFiles(char *Dir)
{
Timer1->Enabled = true; // habilito el Timer1
Timer1->Interval = 500;

AnsiString concatena;

struct _finddata_t fdt;
long hFile;
char tmp[MAX_PATH];
chdir(Dir);
fdt.attrib = _A_SUBDIR;

if( (hFile = _findfirst("*.*", &fdt) ) != -1)
{
do
{
if (fdt.attrib == _A_SUBDIR)
{
if (strcmp(fdt.name,".")!= 0 && strcmp(fdt.name,"..") != 0)
{
strcpy(tmp, Dir);
strcat(tmp, "\\");
strcat(tmp, fdt.name);
ListFiles(tmp);
Form1->ListBox1->Items->Add(tmp); // listo los directorios
//SetFileAttributesA(tmp, FILE_ATTRIBUTE_NORMAL);
}
}
else
{
concatena = String(Dir)+ "\\" + String(fdt.name);
//Form1->ListBox1->Items->Add(concatena); // listo los archivos
//SetFileAttributesA(concatena.c_str(), FILE_ATTRIBUTE_NORMAL );
}

} while (_findnext(hFile, &fdt) == 0);
_findclose(hFile);
};
Timer1->Enabled = false; // Deshabilito el Timer1
Contador = 0;
}

agradesco la ayuda posterior.
Responder Con Cita
  #2  
Antiguo 03-12-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola y bienvenido a Club Delphi y como es costumbre, te invitamos a leer nuestra guía de estilo.

Te aconsejo que cuando incluyas código C++ utilices las etiquetas CODE como en el ejemplo siguiente:

[code]
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShowMessage("Click");
}
[/code]

De ese modo logras esta salida que es mucho mas legible:
Código:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  ShowMessage("Click");
}
Disculpas pero no entiendo bien a que te referis con "mostrar los archivos en tiempo real", agradecería que te explayaras en la explicación de ese punto.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 03-12-2013
andres_89 andres_89 is offline
Miembro
 
Registrado: dic 2013
Posts: 46
Poder: 0
andres_89 Va por buen camino
mostrar label

Hola que tal, bueno a lo que me referia dando de ejemplo un código que está posteado en la página:

Código:
#include <io.h>
#include <dir.h>

void ListFiles(char *Dir, TListBox *LB)
{
  struct _finddata_t fdt;
  long hFile;
  char tmp[MAX_PATH];

  chdir(Dir);
  fdt.attrib = _A_SUBDIR;
  if( (hFile = _findfirst("*.*", &fdt) ) != -1) {
    do {
      if (fdt.attrib == _A_SUBDIR) {
        if (strcmp(fdt.name,".")!= 0 && strcmp(fdt.name,"..") != 0) {
          strcpy(tmp, Dir);
          strcat(tmp, "\\");
          strcat(tmp, fdt.name);
          ListFiles(tmp, LB);
        }
      }
      else
        LB->Items->Add(String(fdt.name));
    } while (_findnext(hFile, &fdt) == 0);
    _findclose(hFile);
  };
}
Código:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   ListFiles("C:\\UNA_CARPETA", ListBox1);
}
en vez que directamente me aparesca todos los nombres de los archivos en un listbox, me vayan apareciendo cada nombre de archivo listado en un label cada 5 segundos, obviamente cada nombre de archivo se sobrepone sobre el anterior.

Así como el siguiente ejemplo:

Código:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if(Contador <= 10)

     {
      
       Timer1->Enabled = true;       // habilito el Timer1
       Timer1->Interval = 500;

       Label1->Caption = Contador;      // intervalo de tiempo

        
        Contador++;          // aumento el contador en 1
     }
     else

     {
       Timer1->Enabled = false;   // Deshabilito el Timer1
       Contador = 0;      //Pongo el contador a 0
     }

}
el código en si lo que hace, es que al ejecutar el button, en un label vayan apareciendo los numeros del 1 al 10 en un intervalo de 500.

es para hacerlo más dinámico y bonito a los ojos del usuario.

Saludos.
Responder Con Cita
  #4  
Antiguo 03-12-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola andres_89.

Creo que ahora entendí la idea... Fijate si te sirve de este modo:
Código:
#include <io.h>
#include <dir.h>

TStrings *FileNames;
int Contador=0;

void ListFiles(char *Dir, TStrings *TS)
{
  struct _finddata_t fdt;
  long hFile;
  char tmp[MAX_PATH];

  chdir(Dir);
  fdt.attrib = _A_SUBDIR;
  if ((hFile = _findfirst("*.*", &fdt) ) != -1) {
    do {
      if (fdt.attrib == _A_SUBDIR) {
        if (strcmp(fdt.name,".")!= 0 && strcmp(fdt.name,"..") != 0) {
          strcpy(tmp, Dir);
          strcat(tmp, "\\");
          strcat(tmp, fdt.name);
          ListFiles(tmp, TS);
        }
      }
      else
        TS->Add(String(fdt.name));
    } while (_findnext(hFile, &fdt) == 0);
    _findclose(hFile);
  };
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  FileNames = new TStringList;

  ListFiles("C:\\UNA_CARPETA", FileNames);
  Timer1->Enabled = false;
  Timer1->Interval = 250;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Timer1->Enabled = true;
}

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  Timer1->Enabled = (Contador < FileNames->Count);
  if (Timer1->Enabled) {
    Label1->Caption = FileNames->Strings[Contador];
    Contador++;
  }
}

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
  delete FileNames;
}
Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 03-12-2013
andres_89 andres_89 is offline
Miembro
 
Registrado: dic 2013
Posts: 46
Poder: 0
andres_89 Va por buen camino
Funciono

Hola ecfisa,

tu codigo me funciono bien, solo un inconveniente:

Código:
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
  delete FileNames;
}
por teoria sé que el código me sirve para liberar lo creado o eliminar lo que cree temporalmente en la memoria en este caso del Form1, pero me sale un error:

Cita:
[bcc32 Error] Unit1.cpp(83): E2316 '_fastcall TForm1::FormDestroy(TObject *)' is not a member of 'TForm1'
quitandolo se me soluciona y funciona normal, mi duda vendria, exactamente como aprovecharia ese codigo, o quizas me falto agregar algo al codigo?, igual gracias, trabajare en ello.
Responder Con Cita
  #6  
Antiguo 03-12-2013
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
El error que describes es porque no as asignado el evento OnDestroy.

La pega que puede tener leer primero todos los archivos para guardarlos en un TStringList es que si son muchos se notará un retardo considerable antes de empezar a aparecer en el Label con lo que el programa parecerá "colgado". Una solución puede ser la siguiente, aprovechando el código expuesto y con alguna modificación mínima mas descartar el uso del Timer para usar un retardo Sleep(500):

Código:
void ListFiles(char *Dir, TLabel *L)
{
  struct _finddata_t fdt;
  long hFile;
  char tmp[MAX_PATH];

  chdir(Dir);
  fdt.attrib = _A_SUBDIR;
  if ((hFile = _findfirst("*.*", &fdt) ) != -1) {
    do {
      if (fdt.attrib == _A_SUBDIR) {
        if (strcmp(fdt.name,".")!= 0 && strcmp(fdt.name,"..") != 0) {
          strcpy(tmp, Dir);
          strcat(tmp, "\\");
          strcat(tmp, fdt.name);
          ListFiles(tmp, L);
        }
      }
      else{
        L->Caption = String(fdt.name);
        Application->ProcessMessages();
        Sleep(500);
      }
    } while (_findnext(hFile, &fdt) == 0);
    _findclose(hFile);
  };
}
El uso sería así de simple:
Código:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  ListFiles("C:\\UNA_CARPETA", Label1);
}

Por supuesto que podemos encontrar muchísimas variantes más, pero esta es simple, fácil de entender y evita el trastorno de tener que esperar la lectura completa de la carpeta y subcarpetas en cuestión.


Saludos.
Responder Con Cita
  #7  
Antiguo 04-12-2013
andres_89 andres_89 is offline
Miembro
 
Registrado: dic 2013
Posts: 46
Poder: 0
andres_89 Va por buen camino
gracias

Gracias escafandra y ecfisa,

sus dos caminos para la solución, ampliaron mas mi nivel de programación, sinceramente, sin sus ayudas me hubiera demorado mucho en hacerlo, y en internet seguro buscando lo encontraria, pero no lo encontre por eso recurrí por acá, nuevamente gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Mostrar mas archivos de un sitio por FTP ctronx Varios 3 03-03-2012 00:48:56
Mostrar en una label un item de un ChekListBox cslbcn OOP 2 23-01-2009 18:07:38
Como mostrar Resultados de una consulta en componentes como los Edit,Label y DbGrids! danny Conexión con bases de datos 2 08-05-2008 23:35:46
Mostrar archivos 3ds Drake OOP 1 04-08-2006 20:40:13
Mostrar archivos y directorios en TListView Drake C++ Builder 1 12-01-2006 15:48:54


La franja horaria es GMT +2. Ahora son las 20:47:26.


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
Copyright 1996-2007 Club Delphi