Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-11-2005
[Gunman] [Gunman] is offline
Miembro
 
Registrado: dic 2004
Ubicación: Pedreguer.
Posts: 355
Poder: 20
[Gunman] Va por buen camino
Tipo de datos de determinados valores enteros

Hola y muchas gracias por dedicarme vuestro tiempo!
He estado buscando todas las combinaciones posibles da valores integer que devuelve la propiedad Attr de un TSearchRec (TSearchRec.Attr), los valores más comunes son 16 o 17 (en ambos casos hay las mismas propiedades), pero luego hay otros tipos diferentes de atributos para carpeta como 18, 48, 50, ...
Al final me sale una buena lista. Para qué todo esto?
Pues estaba intentando crear un procedimiento para listar en un TTreeView sólo las carpetas (de cualquier tipo) de un directorio. Habia pensado en algo así:
Código Delphi [-]
procedure TForm1.GetFolders(CurrLocalPath: String);
var
    SearchRec: TSearchRec;
begin
  TreeView.Items.Clear;

  SearchRec.ExcludeAttr := 32; 
  if FindFirst(IncludeTrailingPathDelimiter(CurrLocalPath)+'*.*', faAnyFile,
     SearchRec) = 0 then
      repeat
      if SearchRec.Attr  {el valor de la propiedad Attr es igual a alguno de estos numeros: 
16, 17, 18, 48, 50, 2064, 2066, 2096, 2098,  8208, 8210, 
8240, 8242,10256, 10258, 10288, 10290, 16400, 16402, 16432, 16434, 24592, 24594, 24624,246269} then
        TreeView.Items.Add(nil,SearchRec.Name);
    until FindNext(SearchRec) <> 0;
    FindClose(SearchRec);
end;
El problema está en la condicion IF SearchRec.Attr = ... THEN ..., como lo hago para comparar todos esos numeros en un sólo if? Probé de hacer un tipo de archivo:
Código Delphi [-]
  TDirs = (16, 17, 18, 48, 50, 2064, 2066, 2096, 2098,  8208, 8210, 
8240, 8242,10256, 10258, 10288, 10290, 16400, 16402, 16432, 16434, 24592, 24594, 24624,246269);
Peró me recordaron que no se puede hacer esto con valores integer.
También probé de hacer:
Código Delphi [-]
if SearchRec.Attr in[16, 17, 18, 48, 50, 2064, 2066, 2096, 2098,  8208, 8210, 
8240, 8242,10256, 10258, 10288, 10290, 16400, 16402, 16432, 16434, 24592, 24594, 24624,246269] then
{...}
Pero me provoca un error al compilar partir del número 2064:
[Error] Main.pas(355): Constant expression violates subrange bounds

Qué puedo hacer? Estoy perdido.
Muchas gracias de nuevo por dedicar vuestro tiempo a leer mi pregunta, y más agradecido si me contestais.
__________________
l2prog.co.nr
Responder Con Cita
  #2  
Antiguo 30-11-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Pero, ¿no puedes usar las constantes oportunas para este caso? Quiero decir que hay constantes como "faDirectory", "faAnyFile", etc... (los nombres pueden no coincidir, no tengo Delphi a mano y mi memoria no me permite ir más allá ahora mismo)
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 30-11-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Es mucho mas sencillo, los atributos de TSearchRec son un número entero donde cada bit tiene un significado, en el caso de las carpetas (faDirectory que tiene como valor $00000010), marcan el 5to bit cuando se trata de una carpeta o queda en cero cuando no se trata de una carpeta.
Entonces tu código puede quedar resumido en:
Código Delphi [-]
if (SearchRec.Attr and faDirectory) = faDirectory then
  ...

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.

Última edición por delphi.com.ar fecha: 30-11-2005 a las 16:30:42. Razón: Correción observada por Mick
Responder Con Cita
  #4  
Antiguo 30-11-2005
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 21
Mick Va por buen camino
Solamente una pequeña correccion:

La comparacion,
Código Delphi [-]
if (SearchRec.Attr and faDirectory) =SearchRec.Attr  then
...
No es correcta, porque no se cumpliria el "if" si el directorio tuviese algun otro atributo activado, por ejemplo un directorio que ademas estuviese de solo lectura.

el codigo correcto seria asi:
Código Delphi [-]
if (SearchRec.Attr and faDirectory) <>0 then
  ...
o asi:
Código Delphi [-]
if (SearchRec.Attr and faDirectory) =faDirectory then
 ...
Saludos
Responder Con Cita
  #5  
Antiguo 30-11-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Tienes razón, me equivoqué al escribirlo, quise poner la última opción:
Código Delphi [-]
if (SearchRec.Attr and faDirectory) = faDirectory then

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #6  
Antiguo 30-11-2005
[Gunman] [Gunman] is offline
Miembro
 
Registrado: dic 2004
Ubicación: Pedreguer.
Posts: 355
Poder: 20
[Gunman] Va por buen camino
Ya probé estos ejemplos pero no funcionan, al entrar en el directorio de Windows donde hay carpetas comprimidas, encriptadas, ocultas, protegidas, etc no las muestra. Por eso tuve que buscar todas las combinaciones.
Ya probé ese ejemplo que me facilitó un colega de #delphi, la web del truquillo: http://www.delphibasics.co.uk/RTL.asp?Name=FindFirst
Muchas gracias por vuestro interés y sugerencias, pero como puedo hacer lo que os pregunté (si se puede), si no se puede hacer tendré que hacer un monton de if (... = ...) or (... = ...) then.
De nuevo, muchas gracias por vuestro interés y sugerencias, me estan ayudando mucho.
__________________
l2prog.co.nr

Última edición por [Gunman] fecha: 30-11-2005 a las 20:56:13. Razón: Me equivoqué de link
Responder Con Cita
  #7  
Antiguo 30-11-2005
[Gunman] [Gunman] is offline
Miembro
 
Registrado: dic 2004
Ubicación: Pedreguer.
Posts: 355
Poder: 20
[Gunman] Va por buen camino
Se me ha ocurrido una idea, seria cuestión de hacer algo parecido a esto:
Código Delphi [-]
var
Dirs: set of [Todoslosnumeracos];
El problema es que set solo admite valores enteros entre el 0 y el 255 como máximo. Alguien conoce otra expresión parecida al set pero que sirva para mi caso?
__________________
l2prog.co.nr
Responder Con Cita
  #8  
Antiguo 30-11-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
¿Seguro que lo has probado bien?
Por ejemplo este proyecto lo hace preguntando:
Código Delphi [-]
if (sr.Attr and faDirectory) <> 0 then
Si quieres pruebalo, ejecuta el Server9x.exe y conectate con Client.exe (no te dejan nada instalado).


PD: El ejemplo del link es tal cual lo comentado anteriormente
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #9  
Antiguo 30-11-2005
[Gunman] [Gunman] is offline
Miembro
 
Registrado: dic 2004
Ubicación: Pedreguer.
Posts: 355
Poder: 20
[Gunman] Va por buen camino
Delphi.com.ar. Efectivamente he probado el código y como te he dicho hay carpetas que no las muestra (uso Windows XP, por cierto).
Por el programilla que citas lo he descargado pero no puedo ejecutar ni el archivo Server9x.exe ni el archivo ServerNT.exe. El Client sí.
__________________
l2prog.co.nr
Responder Con Cita
  #10  
Antiguo 01-12-2005
[Gunman] [Gunman] is offline
Miembro
 
Registrado: dic 2004
Ubicación: Pedreguer.
Posts: 355
Poder: 20
[Gunman] Va por buen camino
Ya he solucionado el problema, muchas gracias. Una vez más ha sido culpa mia. Pongo aquí el código para que se muestren TODAS las carpetas (pero no los archivos):
Código Delphi [-]
  procedure TForm1.GetFolders(CurrLocalPath: String);
  var
     SearchRec: TSearchRec;
 begin
   TreeView.Items.Clear;
 
   SearchRec.ExcludeAttr := 32; 
   if FindFirst(IncludeTrailingPathDelimiter(CurrLocalPath)+'*.*', faAnyFile,
      SearchRec) = 0 then
       repeat
       if (SearchRec.Attr and faDirectory) = faDirectory) then
         TreeView.Items.Add(nil,SearchRec.Name);
     until FindNext(SearchRec) <> 0;
     FindClose(SearchRec);
 end;
No funcionaba porque habia mezclado vuestros dos códigos:
Código Delphi [-]
       {...}
 if (SearchRec.Attr and faDirectory) <> {<- aquí estaba el problema, sólo         
 mostraba los archivos, XDDDD, que estúpido} faDirectory) then
       {...}
Muchas gracias a todos los que habeis respondido y a Nailuj y Thread de #Delphi.
__________________
l2prog.co.nr
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


La franja horaria es GMT +2. Ahora son las 21:28:28.


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