Club Delphi  
    Paypal   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

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-03-2012
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
¿Cómo obtener información de un "bit set"?

Hola a todos,

Tengo una pregunta para vosotros, a ver si podéis ayudarme, puesto que tengo ninguna o muy poca idea sobre cómo hacerlo en este caso. Se trata de que, siguiendo la ayuda de Turbo Power ShellShock, podemos leer lo siguiente

Cita:
Defines an event handler that is called when the amount of free space on a drive changes. The OnDriveSpaceChange event is fired when the amount of free space on a drive changes. Drives is a bit set that indicates which drives have changed. Bits 0 through 25 represent drives A: through Z:. If, for example, the free space on drive C: changes, Drive will be equal to 4. If the free space on both the C: and D: drives changed, Drive will be equal to 12. An OnFolderChange event also occurs when the drive space changes.
En efecto, el evento "OnDriveSpaceChange" existe y es utilizado en determinado componente, ahora bien, no tengo ni idea de cómo hacer para extraer la información de su argumento "Drive".

Dicho argumento es un "Cardinal", me parece recordar ahora mismo, y, en todo caso, no resulta complicado cuando contiene sólo una unidad: "If, for example, the free space on drive C: changes, Drive will be equal to 4.".

El problema me surge para el caso de que dicho argumento contenga más de una unidad. Por ejemplo, dice la ayuda: "If the free space on both the C: and D: drives changed, Drive will be equal to 12.".

De acuerdo, pero, ¿qué pasa si las unidades son distintas? Y, en cualquier caso, ¿cómo demonios hago para obtener del "Cardinal" las unidades? A ver si, por favor, puede alguien echarme una mano.

Si necesitáis más información, cualquiera que sea, no dudéis en decírmelo y yo trataré de proporcionárosla lo antes posible.

¡Muchísimas gracias de antemano a todos!

P.D. Dedico este tema a Casimiro.
Responder Con Cita
  #2  
Antiguo 09-03-2012
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
Cada bit corresponde a una potencia de dos: bit 0 a 2^0 = 1, bit 1 a 2^1 = 2, bit 2 a 2^2 = 4, bit 3 a 2^3 = 8, etc. Si quieres saber que pasa en específico con un bit (un drive) tienes que aislarlo operando el cardinal con AND y la potencia de 2 que corresponda:

Si C and 4 <> 0 quiere decir que el bit 2 está "prendido".

Me parece que en Delphi hay una clase TBits que facilita el uso de bits.

// Saludos
Responder Con Cita
  #3  
Antiguo 09-03-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Dec.

Y si quisieras saber el valor de un bit en particular, o reccorrer el número para ver los valores de los diferentes bits:
Código Delphi [-]
function BitOn(const N:Cardinal; const bitN: Byte): Boolean;
begin
  Result:= N shr bitN and 1 = 1;
end;

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 09-03-2012
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Gracias por vuestras respuestas, aunque, no sé si podré yo sacar algo en limpio. En cuanto pueda haré pruebas y pondré aquí qué he hecho y preguntaré porqué no funciona.

¡Gracias a ambos!
Responder Con Cita
  #5  
Antiguo 09-03-2012
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Como funcionar... parece que funciona. Sin embargo, me queda la espinita de no saberme quitar de encima el "mapa de unidades" que conformo "directamente" y que creo que puede hacerse de otra forma más elegante. Por lo demás, lo mío, lamentablemente, no son las matemáticas, así que sigo son comprender muy bien qué ocurre a nivel de "bits", quizá algún día... sea como sea, el código podría quedar más o menos así, a modo de ejemplo:

Código Delphi [-]
procedure TForm2.StShellNotification1DriveSpaceChange(
 Sender: TObject; Drive: Cardinal);

const
  DRIVES : array[ 0..25 ] of char =
  (
    'A', 'B', 'C', 'D', 'E', 'F',
    'G', 'H', 'I', 'J', 'K', 'L',
    'M', 'N', 'O', 'P', 'Q', 'R',
    'S', 'T', 'U', 'V', 'W', 'X',
    'Y', 'Z'
  );

var
  i : byte;
  s : string;

begin
  s := '';

  for i := Low( DRIVES ) to High( DRIVES ) do
  begin
    if Drive shr i and 1 = 1 then
    begin
      if s = '' then
        s := DRIVES[ i ]
      else
        s := s +' # '+ DRIVES[ i ];
    end;
  end;

  ShowMessage( 'Drive Space Change in : ' + s );
end;

Por supuesto, cualquier sugerencia será bienvenida.
Responder Con Cita
  #6  
Antiguo 09-03-2012
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
En realidad, el arreglo DRIVES te lo puedes ahorrar. A partir de I en la iteración puedes obtener la letra así:

Código Delphi [-]
Chr(I + Ord('A'))

// 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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Obtener información de "Opciones de carpeta..." aeff API de Windows 1 08-10-2007 06:37:14
error de sql server "Informacion de columna clave insuficiente" jhcaboverde Conexión con bases de datos 1 17-08-2007 19:40:31
Como hacer que se vea "Si" en vez de "TRUE" en un DBGrid lu9eui C++ Builder 2 07-08-2007 04:03:13
Mas "pedazos" de informacion de Delphi! Epachsoft Noticias 0 16-02-2007 08:23:14


La franja horaria es GMT +2. Ahora son las 01:41:10.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi