Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Tipo de datos de determinados valores enteros (https://www.clubdelphi.com/foros/showthread.php?t=27777)

[Gunman] 30-11-2005 15:54:07

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.

dec 30-11-2005 16:01:36

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

delphi.com.ar 30-11-2005 16:03:18

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!

Mick 30-11-2005 16:21:00

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

delphi.com.ar 30-11-2005 16:29:46

Tienes razón, me equivoqué al escribirlo, quise poner la última opción:
Código Delphi [-]
if (SearchRec.Attr and faDirectory) = faDirectory then

Saludos!

[Gunman] 30-11-2005 20:52:27

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.

[Gunman] 30-11-2005 21:09:06

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?

delphi.com.ar 30-11-2005 21:12:46

¿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 :confused:

[Gunman] 30-11-2005 22:56:33

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

[Gunman] 01-12-2005 08:57:37

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.


La franja horaria es GMT +2. Ahora son las 08:02:10.

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