PDA

Ver la Versión Completa : mostrar archivos en Label


andres_89
03-12-2013, 02:18:38
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.

ecfisa
03-12-2013, 10:03:19
Hola y bienvenido a Club Delphi :) y como es costumbre, te invitamos a leer nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php).

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


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


De ese modo logras esta salida que es mucho mas legible:

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 :)

andres_89
03-12-2013, 17:09:15
Hola que tal, bueno a lo que me referia dando de ejemplo un código que está posteado en la página:


#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);
}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:

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.

ecfisa
03-12-2013, 21:23:12
Hola andres_89.

Creo que ahora entendí la idea... Fijate si te sirve de este modo:

#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 :)

andres_89
03-12-2013, 22:15:51
Hola ecfisa,

tu codigo me funciono bien, solo un inconveniente:

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:

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

escafandra
03-12-2013, 23:26:57
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):


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:

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.

andres_89
04-12-2013, 08:26:48
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.