![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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á :) |
#2
|
||||
|
||||
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?
y te queda en temp el código del usuario correctamente formateado Un saludo Edu |
#3
|
||||
|
||||
Cita:
![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#4
|
|||
|
|||
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? 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. 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á :) |
#5
|
||||
|
||||
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 |
#6
|
|||
|
|||
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á :) |
#7
|
||||
|
||||
Vale, prueba esto:
Este procedimiento te devuelve una lista de todos los subdirectorios que contiene uno dado; por ejemplo, se puede llamar de la siguiente forma:
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 |
#8
|
|||
|
|||
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á :) |
#9
|
||||
|
||||
Déjame ver si entiendo.
Por un lado tienes carpetas nombradas así: Código:
0004896 . PEREZ 0023548 . GARZA 0000563 . ALVAREZ etc. Código:
+---------+----------------+ | 0004896 | PEREZ MEJIA | +---------+----------------+ | 0023548 | GARZA ESTRADA | +---------+----------------+ | 0000563 | ALVAREZ SIERRA | +---------+----------------+ Si formas el nombre de la carpeta con todo el campo de los apellidos te quedaría así: Código:
0023548 . GARZA ESTRADA Código:
0023548 . GARZA
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 |
#10
|
||||
|
||||
Jamás había oido/leido nada sobre el punto catalán, es la primera vez que veo esa expresión
![]() ¿Para qué y cómo se usa en la "vida real"?, ¿tiene algún significado especial?
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#11
|
||||
|
||||
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 |
#13
|
||||
|
||||
Cita:
Muchas gracias.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#14
|
|||
|
|||
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; Código:
FindClose(SR); Muchas gracias por la ayuda. virginia Romero
__________________
Sonrie al mundo, y el mundo te sonreirá :) |
#15
|
|||
|
|||
Hola a todos,
El código que tengo ahora mismo al respecto es el siguiente:
Si pongo "FindClose(SR);" como comentado, me encuentro que el error me salta en:
y me dice que: Código:
[Error] Fxmain.pas(467): Unsatisfied forward or external declaration: 'TFrmFxMain.ListFileDir' 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á :) |
#16
|
||||
|
||||
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:
2) La segunda opción es declarar el procedure dentro de donde lo llamas.:
Luego te digo algo de lo otro Edu |
#17
|
||||
|
||||
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
por Y solucionado! Edu |
#18
|
|||
|
|||
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:
Un saludo, GRacias de nuevo, virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :) |
#19
|
|||
|
|||
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, ![]() Virginia Romero
__________________
Sonrie al mundo, y el mundo te sonreirá :) Última edición por Giniromero fecha: 20-10-2005 a las 14:09:56. |
#20
|
||||
|
||||
Cita:
![]() 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 |
![]() |
|
|
![]() |
|