Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-10-2005
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
ubicar archivo, con datos sacados de base de datos

Hola,

Tengo una aplicación en delphi 6 con IB7.
Le he añadido un procedimiento que me abre la carpeta en la que tengo, a su vez, una carpeta por usuario.

Cada usuario de la aplicación tiene una ficha, y un número asociado único.

Las carpetas personales de cada usuario tienen la siguiente forma de nombrarse.

si el usuario es el 10368 y su apellido es GARCÍA PÉREZ, sería:

0010368 · GARCIA

ESto es, 7 valores para el nº de usuario, (con ceros a la izq si es necesario), espacio, el puto catalán, espacio, el primer apellido.

Mi problema es el siguiente:

Necesito abrir, en cada ficha, la carpeta concreta de cada usuario, sería coger el nº de usuario, que en la base de datos lo tengo en integer, el problema es que si no pongo el nombre exacto de la carpeta no soy capaz de que me la abra.

¿Habría alguna manera de que se buscase el nº de usuario, esto es, que yo pusiese '*' + numerodeusuario.asstring + '*', como pasa en el "buscar archivos o carpetas" del windows.

EStoy usando el siguiente ShellExecute:

Código:
PathAlumni := xpath+ '*' + FrmDModule.TablaNUMUSUARIO.AsString + '*';


shellexecute(self.Handle, PChar('open'), PChar('explorer.exe'), PChar(PathAlumni), nil, SW_SHOWNORMAL);

Muchas Gracias,

Virginia Romero
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #2  
Antiguo 18-10-2005
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
Buenas!


Puedes pasar a String el número de usuario y añadir los ceros por la izquierda hasta que la cadena tenga 7 dígitos?

Código Delphi [-]
  var temp : String
 
 
 
  temp := IntToStr(codigo);
  while length(temp) < 7 do temp = '0'+temp;

y te queda en temp el código del usuario correctamente formateado

Un saludo

Edu
Responder Con Cita
  #3  
Antiguo 18-10-2005
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Giniromero
0010368 · GARCIA
ESto es, 7 valores para el nº de usuario, (con ceros a la izq si es necesario), espacio, el puto catalán, espacio, el primer apellido.
Virginia Romero
Qué quiéres decir con eso?
Responder Con Cita
  #4  
Antiguo 18-10-2005
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Hola,

Código:
Puedes pasar a String el número de usuario y añadir los ceros por la izquierda hasta que la cadena tenga 7 dígitos?
Si, lo he pensado, pero que pasa con la parte del apellido, es el primer apellido, nada más, y el campo en el que tengo los apellidos, tengo los dos apellidos guardados, por lo que no tengo manera de identificar ese primer apellido, y como tengo que poner el nombre exacto de la carpeta para que me la abra...

Código:
ESto es, 7 valores para el nº de usuario, (con ceros a la izq si es necesario), espacio, el punto catalán, espacio, el primer apellido.
esto es: si por ejemplo el nº de usuario es el 3, y el primer apellido es DE LAS HERAS, sería,
0000003 · HERAS.

Por cierto, no era el puto catalán, sino el punto catalán, esto es el punto del 3, ha sido un error tipográfico , glup, lo siento.


Virginia Romero
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #5  
Antiguo 18-10-2005
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
Buenas!


Pues como no añadas un campo en la tabla de usuarios en el que dejes el primer apellido separado del resto y lo pilles de ahí...

No sé, no sé...

Edu
Responder Con Cita
  #6  
Antiguo 18-10-2005
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Buenas,

¿se te ocurre alguna otra forma de abrir una carpeta?¿algún otro objeto que no sea el shellexecute y que me pueda servir para hacer esto?

¿Algún sitio donde poder documentarme mejor del ShellExecute?

Muchas Gracias

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #7  
Antiguo 18-10-2005
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
Vale, prueba esto:


Código Delphi [-]
procedure ListFileDir(Path: string; FileList: TStrings);
var
SR: TSearchRec;
begin
if FindFirst(Path + '*.*', faAnyFile, SR) = 0 then
begin
repeat
if (SR.Attr = faDirectory) then
begin
FileList.Add(SR.Name);
end;
until FindNext(SR) <> 0;
FindClose(SR);
end;
end;

Este procedimiento te devuelve una lista de todos los subdirectorios que contiene uno dado; por ejemplo, se puede llamar de la siguiente forma:

Código Delphi [-]
 
var datos : TStringList;
begin
datos := TStringList.create;
ListFileDir('c:\windows\', datos);
 
...
 
end;

y en datos tendrás una lista de todos los subdirectorios de c:\windows.

A partir de ahí, si tienes en código del usuario ya formateado a 7 caracteres (y es único) puedes encontrar el nombre completo si buscar el elemento de la lista 'datos' que empieza por éste código.

Te sirve?

Edu
Responder Con Cita
  #8  
Antiguo 18-10-2005
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Buenas,

si, en principio esto sería perfecto, lo único, es que no sé como se busca en un tipo de dato tStringList.

Gracias,

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #9  
Antiguo 18-10-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Déjame ver si entiendo.

Por un lado tienes carpetas nombradas así:

Código:
0004896 . PEREZ
0023548 . GARZA
0000563 . ALVAREZ

etc.
pero en tu base de datos tienes

Código:
+---------+----------------+
| 0004896 | PEREZ MEJIA    |
+---------+----------------+
| 0023548 | GARZA ESTRADA  |
+---------+----------------+
| 0000563 | ALVAREZ SIERRA |
+---------+----------------+
En un momento dado tú tienes seleccionado un usuario, digamos GARZA ESTRADA y quieres abrir su carpeta.

Si formas el nombre de la carpeta con todo el campo de los apellidos te quedaría así:

Código:
0023548 . GARZA ESTRADA
Si repasas los folders de la carpeta inicial- por ejemplo usando un ciclo similar al de epuigdef - encontrarás uno de nombre

Código:
0023548 . GARZA
Nunca coincidirá pero sí puede suponerse que el nombre del folder es el comienzo del nombre que formas con el número y los apellidos, y esto es algo que puedes probar fácilmente:

Código Delphi [-]
if Pos(Folder, Format('%0.7d . %s', [NoUsuario, Apellidos])) <> 0 then
  ShowMessage('Folder encontrado');

El Format de arriba te forma el nombre a probar: '0023548 . GARZA ESTRADA' y Folder sería el nombre del folder contra el que pruebas.

En resumen, podrías proceder asi:

Caundo requieres abrir el folder de un usuario dado, primero formas el nombre de la carpeta con ambos apellidos:

Mask := Format('%0.7d . %s', [NoUsuario, Apellidos]);

Recorres los folders de la carpeta inicial y en cada paso comparas el nombre del folder con el de Mask usando Pos. Si para alguno se cumple la condición, sales del ciclo y devuelves el nombre del folder encontrado.

// Saludos
Responder Con Cita
  #10  
Antiguo 18-10-2005
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Jamás había oido/leido nada sobre el punto catalán, es la primera vez que veo esa expresión . Algunos editores de textos usan ese punto para indicar que hay un espacio, pero es lo único que he visto sobre eso.

¿Para qué y cómo se usa en la "vida real"?, ¿tiene algún significado especial?
Responder Con Cita
  #11  
Antiguo 19-10-2005
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
El punto catalán se utiliza en una construcción catalana que se llama "l germinada". Palabras como col·legi (colegio) la llevan. Suena com una l más larga, pero sin sonar a ll.


Un saludo

Edu
Responder Con Cita
  #12  
Antiguo 19-10-2005
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
Buenas!


Para recorrer los elementos de un TStringList puedes utilizarel siguiente código:

Código Delphi [-]
var datos : TStringList;
     i : Integer;
     elemento : String;
begin
   for i := 0 to datos.count-1 do
   begin
      elemento := datos[i];
       ......
   end;
Edu
Responder Con Cita
  #13  
Antiguo 19-10-2005
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por epuigdef
El punto catalán se utiliza en una construcción catalana que se llama "l germinada". Palabras como col·legi (colegio) la llevan. Suena com una l más larga, pero sin sonar a ll.
Un saludo
Edu
Todos los días se aprende algo.

Muchas gracias.
Responder Con Cita
  #14  
Antiguo 19-10-2005
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Hola a todos,

con todo lo que me habeis mandado estoy montando lo que necesito, muchas gracias lo primero pues me está siendo de mucha ayuda, el problema es que tengo problemas al compilar el programa, pues me dice que:

Código:
[Error] Fxmain.pas(3404): Incompatible types: 'Cardinal' and 'TSearchRec'

En el código:
Código:
procedure ListFileDir(Path: string; FileList: TStrings);
var
SR: TSearchRec;
begin
   if FindFirst(Path + '*.*', faAnyFile, SR) = 0 then begin
      repeat
       if (SR.Attr = faDirectory) then begin
           FileList.Add(SR.Name);
       end;
      until FindNext(SR) <> 0;
      FindClose(SR);
   end;
end;
y se para marcando:

Código:
FindClose(SR);
Sin embargo en el "Topic Search" de delphi, hay un ejemplo que tambien pone aquí este tipo de dato, y no un cardinal.
Muchas gracias por la ayuda.

virginia Romero
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #15  
Antiguo 19-10-2005
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Hola a todos,

El código que tengo ahora mismo al respecto es el siguiente:


Código Delphi [-]
procedure TFrmFxMain.SpeedButton20Click(Sender: TObject);
var xpath: tStringList;
    subcarpetas : TStringList;
    cFile : String;
    str : string;
    i: integer;

begin

  TRY

    xpath := TStringList.create;
    cFile := 'c:\_Fx\FileLocation.ini';


    If Fileexists( cFile ) Then Begin

      xpath.LoadFromFile(cFile);

      TrY

         IF (xpath[1] <> '') THEN BEGIN

           try

             subcarpetas:= TStringList.Create;
             ListFileDir(xpath[1], subcarpetas);

             iF Pos(FrmDModule.TbAlumnosNUMALU.AsString, subcarpetas[i])<>0 tHEN bEGIN

                shellexecute(self.Handle, PChar('open'), PChar('explorer.exe'), PChar(subcarpetas[i]), nil, SW_SHOWNORMAL);

             eND
             eLSE bEGIN

                 Showmessage('No hay carpeta para este alumno');

             eND;

           finally
             subcarpetas.Free;
           end;

        END;

      ExcepT
        on E: Exception do begin
         str := 'Error al leer Archivo "FileLocation.ini" para caja. Faltan datos o vacio. Mensaje de error : ' + E.Message;
         Application.MessageBox(PChar(str), 'Atención', MB_OK);
         Application.Terminate;
        end;
      EnD;

    End
    Else Begin

      showmessage ('No se encuentra el archivo "FileLocation.ini" en la ruta especificada');

    End;


  FINALLY

    xpath.Free;

  END;


end;

procedure ListFileDir(Path: string; FileList: TStrings);
var SR: TSearchRec;
begin

    if (FindFirst(Path + '*.*', faAnyFile, SR) = 0) then begin
      repeat
       if (SR.Attr = faDirectory) then begin
           FileList.Add(SR.Name);
       end;
     until (FindNext(SR) <> 0);
      FindClose(SR);
   end;

end;


Si pongo "FindClose(SR);" como comentado, me encuentro que el error me salta en:
Código Delphi [-]
 procedure ListFileDir(Path: string; FileList: TStrings);

y me dice que:
Código:
[Error] Fxmain.pas(467): Unsatisfied forward or external declaration: 'TFrmFxMain.ListFileDir'
si no pongo el comentario, el error salta directamente en la línea en la que está el findClose, y me dice al compilar que:

Código:
[Error] Fxmain.pas(3414): Incompatible types: 'Cardinal' and 'TSearchRec'


Alguien puede echarle un vistazo al código, por que yo no veo donde puede estar el problema.

Gracias,

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #16  
Antiguo 19-10-2005
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
Buenas!


Por lo del primer problema (con la línea comentada) lo que pasa es que tienes el procedimiento en la misma unit del form, pero fuera del form.

Tienes 2 opciones:
1) En la definición del form, en la parte private, declaras el procedure, y en la implementación del procedure le pones por delante el nombre del form. Alfo así como:

[delphi]
type
TFrmPrincipal = class(TForm)
.....
private

procedure ListFileDir(Path: string; FileList: TStrings);
[delphi]

y en la implementación:

Código Delphi [-]
procedure TFrmPrincipal.ListFileDir(Path: string; FileList: TStrings);



2) La segunda opción es declarar el procedure dentro de donde lo llamas.:

Código Delphi [-]
procedure TFrmFxMain.SpeedButton20Click(Sender: TObject);

var xpath: tStringList;

subcarpetas : TStringList;

cFile : String;

str : string;

i: integer;
 
procedure ListFileDir(Path: string; FileList: TStrings);

var SR: TSearchRec;

begin

if (FindFirst(Path + '*.*', faAnyFile, SR) = 0) then begin

repeat

if (SR.Attr = faDirectory) then begin

FileList.Add(SR.Name);

end;

until (FindNext(SR) <> 0);

FindClose(SR);

end;

end;

begin

TRY

xpath := TStringList.create;

cFile := 'c:\_Fx\FileLocation.ini';


Luego te digo algo de lo otro

Edu
Responder Con Cita
  #17  
Antiguo 19-10-2005
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
Respecto al problema con el findclose, he visto que éste procedimiento está declarado en las unidades Windows y sysutils.


Tu problema es que estás llamando al findclose de la unidad windows, que recibe un cardinal como parámetro. Si te fijas en la lista de uses seguro que tienes las dos unidades.

En este caso, simplemente cambia

Código Delphi [-]
   findClose(SR);

por

Código Delphi [-]
   sysutils.findClose(SR);
Y solucionado!

Edu
Responder Con Cita
  #18  
Antiguo 19-10-2005
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Hola,


Definitivamente necesito que me graduen la vista, no me había dado cuenta que me faltaba TFrmPrincipal en el procedure. Gracias.

En cuanto a lo de:

Cita:
Empezado por epuigdef
Tu problema es que estás llamando al findclose de la unidad windows, que recibe un cardinal como parámetro. Si te fijas en la lista de uses seguro que tienes las dos unidades.
Efectivamente tengo las dos unidades.Ahora si me compila, a ver si tambien me funciona.

Un saludo,

GRacias de nuevo,

virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #19  
Antiguo 20-10-2005
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Buenas,

'Eto yata'.
He reforzado el código usando el POS que me dijisteis, dentro del procedure ListFileDir, de modo que en la lista SÓLO se escriben los nombres de las subcarpetas que cumplen mi búsqueda, con lo que NO tengo que hacer un FOR con las mismas pasadas que subcarpetas haya, sólo se hace una vez si encuentra la carpeta, sino nada.

Tuve problemillas con el punto que había en el format... por que en el ejemplo no es el punto catalan, sino el normal, y aunque me guardaba OK en la lista las carpetas, luego al compararla con los datos que tenía yo, como una era con pto normal y la otra con el catalan, me decia que no encontraba esa carpeta en la lista.

Bueno, POS lo dicho, Muchas gracias por la ayuda.

Virginia Romero
__________________
Sonrie al mundo, y el mundo te sonreirá :)

Última edición por Giniromero fecha: 20-10-2005 a las 15:09:56.
Responder Con Cita
  #20  
Antiguo 20-10-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Giniromero
Tuve problemillas con el punto que había en el format... por que en el ejemplo no es el punto catalan, sino el normal
Sí, bueno, es que mi vista ya no es lo que era

Lo que no me queda muy claro es para qué necesitas el ListBox. Si sólo va a haber una carpeta que satisfaga la búsqueda creo que está de más.

// Saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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


La franja horaria es GMT +2. Ahora son las 15:58:15.


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