Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

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
  #7  
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,

No entiendo, Román. ¿De dónde saco yo esa "A"?
Responder Con Cita
  #8  
Antiguo 09-03-2012
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Se trata del viejo truco de sumarle 65 al 0 que es la unidad A (ASCII), 1 + 65 = 66 =B etc.

Recuerdo que yo lo usaba en ensamblador.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #9  
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,

Ese truco no me le sabía yo, Marcos, se agradece.

Aunque me parece a mí que Román no va por ahí...

Entonces el código ya podría quedar, como poco, de esta manera:

Código Delphi [-]
for i := 0 to 25 do // From A to Z
begin
  if Drive shr i and 1 = 1 then
  begin
    if s = '' then
      s := Chr( Ord( i + TRICK_ASCII_NUMBER ) )
    else
      s := s +'#'+ Chr( Ord( i + TRICK_ASCII_NUMBER ) );
  end;
end;

Siendo "TRICK_ASCII_NUMBER" igual a 65. Prescindiendo ya del arreglo "DRIVES".
Responder Con Cita
  #10  
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.

Creo que se puede reducir un poco mas:
Código Delphi [-]
begin
  for i:= 0 to 25 do
    if Drive shr i and 1 = 1 then
      s:= s + Chr(TRICK_ASCII_NUMBER + i) + '#';
  SetLength(s, Length(s)-1);
end;

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #11  
Antiguo 10-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,

Muy chula esa ecfisa. Bueno, y la otra. Muchas gracias.
Responder Con Cita
  #12  
Antiguo 10-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
Cita:
Empezado por dec Ver Mensaje
Siendo "TRICK_ASCII_NUMBER" igual a 65. Prescindiendo ya del arreglo "DRIVES".
En un sentido excesivamente purista, no debes usar una constante para ese 65, sino, como puse, Ord('A'). No vaya a ser que algún día cambie el número asignado a la A .

// Saludos
Responder Con Cita
  #13  
Antiguo 10-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,

Hombre, Román, pero, como no me digas de dónde saco yo esa "A"... es que no me aclaro.

Acaso esa constante no está del todo bien y llevas razón. Al fin y al cabo se trata de prescindir del arreglo, pero, ¿por qué, exactamente?... A mí es que se me ha metido en la cabeza porque intuyo (¡Cuidado!) otra forma de hacerlo (tal vez la que tú no dices... ), pero, lo cierto es que el arreglo tampoco pide pan, como se suele decir. ¿No? Por lo demás, el viejo truco del joven Marcos sigue siendo un buen truco.

Última edición por dec fecha: 10-03-2012 a las 02:06:29.
Responder Con Cita
  #14  
Antiguo 10-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
Cita:
Empezado por dec Ver Mensaje
(tal vez la que tú no dices... )
Hey! No hay nada escondido. Ya no había puesto nada porque tanto Marcos como ecfisa contestaron lo que yo pensaba

// Saludos
Responder Con Cita
  #15  
Antiguo 10-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
Cita:
Empezado por roman Ver Mensaje
Hey! No hay nada escondido. Ya no había puesto nada porque tanto Marcos como ecfisa contestaron lo que yo pensaba

// Saludos
Este Román es una esfinge para mí. ¡¿Serán así todos los matemáticos?!
Responder Con Cita
  #16  
Antiguo 10-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
¿ Un código salomónico ?

Código Delphi [-]
const
   TRICK_ASCII_NUMBER = Ord('A');

__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #17  
Antiguo 10-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
¡Buenas!

Hombre, ecfisa, ¡así es como se explican las cosas!

Nota mental: ir el alergólogo, que, algo sabrá de lo que me pase.
Responder Con Cita
  #18  
Antiguo 10-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,

Bueno. De nuevo muchas gracias a todos, puesto que el problema está resuelto, es decir, "funcionando".
Responder Con Cita
  #19  
Antiguo 10-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
Cita:
Empezado por Román
¡Qué paciencia, señor!
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

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 00:12:53.


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