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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-06-2005
Novás Novás is offline
Miembro
NULL
 
Registrado: oct 2003
Ubicación: Galicia
Posts: 146
Poder: 16
Novás Va por buen camino
Contabilizar grabaciones hechas

Buenos días a todos:

Tras haber hecho una búsqueda por el foro no he podido encontrar nada que resuelva mi pequeña duda.

Lo que yo quiero hacer es una pequeña aplicación, a poder ser que trabaje como servicio en windows, que contabilice el número de veces que se usa la grabadora.

He pensado en comprobar el número de veces que se abre el nero, por poner un ejemplo, pero este método sería del todo inexacto y no me contabilizaría la grabación si se usara otro programa y si me la contabilizaría aunque no se hubiese grabado nada.

Alguien tiene idea de como hacer esto. Como puedo contabilizarlo.

También me gustaría saber como hacer que mi programa trabaje como un servicio.

Muchas gracias
__________________
Hay dos cosas infinitas: el Universo y la estupidez humana. http://www.cybertarjetas.net
Responder Con Cita
  #2  
Antiguo 08-06-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
NULL
 
Registrado: may 2003
Posts: 7.424
Poder: 23
Lepe Va por buen camino
Pues creo que está chunga la cosa.

Lo lógico sería interceptar cuando algún programa bloquea en escritura la grabadora, de hecho, ni te deja expulsar la bandeja en esos momentos, así que pueden ir por ahí los tiros.

En lo único que te puedo ayudar es en 2 unidades (CDEvents y CDUtils) que te informan de cuando se introduce un CD o se expulsa de la unidad de CD.

Lamento no poder darte un enlace, ya que lo bajé de internet y no tiene información de contacto sobre el autor.

Si estas interesado, dilo y lo pego en un par de mensajes.

Un saludo
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 08-06-2005
Novás Novás is offline
Miembro
NULL
 
Registrado: oct 2003
Ubicación: Galicia
Posts: 146
Poder: 16
Novás Va por buen camino
Muchas gracias lepe:

Te agradecería pusieses esas dos unidades en un post y les hecho un vistacillo.
__________________
Hay dos cosas infinitas: el Universo y la estupidez humana. http://www.cybertarjetas.net
Responder Con Cita
  #4  
Antiguo 09-06-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
NULL
 
Registrado: may 2003
Posts: 7.424
Poder: 23
Lepe Va por buen camino
Código Delphi [-]
unit CdUtils;

interface

const
  DBT_DEVICEARRIVAL = $8000;
  DBT_DEVICEREMOVECOMPLETE = $8004;

  DBT_DEVTYP_VOLUME = $00000002;
  DBTF_MEDIA = $0001;

type
  PDevBroadcastHeader = ^TDevBroadcastHeader;
  TDevBroadcastHeader = record
    Size: Cardinal;
    DeviceType: Cardinal;
    Reserved: Cardinal;
  end;

  PDevBroadcastVolume = ^TDevBroadcastVolume;
  TDevBroadcastVolume = record
    Size: Cardinal;
    DeviceType: Cardinal;
    Reserved: Cardinal;
    UnitMask: Cardinal;
    Flags: Word;
  end;

  TWMDeviceChange = packed record
    Msg: Cardinal;
    Event: LongInt;
    Header: PDevBroadcastVolume;
    Result: LongInt;
  end;

function GetDriveFromMask(Mask: Cardinal): Char;

implementation

const
  MAX_DRIVES = 26;

function GetDriveFromMask(Mask: Cardinal): Char;
var
  I: Byte;

begin
  for I := 1 to MAX_DRIVES do
  begin
    if (Mask and $01 <> 0) then break;
    Mask := Mask shr 1;
  end;

  Result := Chr(Ord('A') + I);
end;

end.

Código Delphi [-]
unit CdChange;

interface

uses
  Windows, Messages, Classes, CdUtils;

type
  TCdChangeEvent = procedure(Sender: TObject; Drive: Char) of object;

  TCdChange = class(TComponent)
  private
    InternalWindow: HWnd;
    procedure WndProc(var Msg: TMessage); virtual;

  private
    FActive: Boolean;
    FOnCdInserted: TCdChangeEvent;
    FOnCdRemoved: TCdChangeEvent;

    procedure SetActive(Value: Boolean);

  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

  published
    property Active: Boolean read FActive write SetActive default false;
    property OnCdInserted: TCdChangeEvent read FOnCdInserted write FOnCdInserted;
    property OnCdRemoved: TCdChangeEvent read FOnCdRemoved write FOnCdRemoved;
  end;

procedure Register;

implementation

constructor TCdChange.Create(AOwner: TComponent);
begin
  inherited;
  FActive := false;
end;

destructor TCdChange.Destroy;
begin
  Active := false;
  inherited;
end;

procedure TCdChange.SetActive(Value: Boolean);
begin
  if FActive <> Value then
  begin
    FActive := Value;

    if not (csDesigning in ComponentState) then
      if Active
        then InternalWindow := AllocateHWnd(WndProc)
        else DeallocateHWnd(InternalWindow);
  end;
end;

procedure TCdChange.WndProc(var Msg: TMessage);
var
  Drive: Char;

begin
  if Msg.Msg = WM_DEVICECHANGE then
    with TWMDeviceChange(Msg) do
      if
        ((Event = DBT_DEVICEARRIVAL) or (Event = DBT_DEVICEREMOVECOMPLETE)) and
        (Header.DeviceType = DBT_DEVTYP_VOLUME) and
        (PDevBroadcastVolume(Header).Flags and DBTF_MEDIA <> 0)
      then
      begin
        Drive := GetDriveFromMask(PDevBroadcastVolume(Header).UnitMask);

        case Event of
          DBT_DEVICEARRIVAL:
            if Assigned(FOnCdInserted) then FOnCdInserted(Self, Drive);

          DBT_DEVICEREMOVECOMPLETE:
            if Assigned(FOnCdRemoved) then FOnCdRemoved(Self, Drive);
        end;
      end;
end;

procedure Register;
begin
  RegisterComponents('Samples', [TCdChange]);
end;

end.

Un saludo
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 09-06-2005
Novás Novás is offline
Miembro
NULL
 
Registrado: oct 2003
Ubicación: Galicia
Posts: 146
Poder: 16
Novás Va por buen camino
PUFFFFF!!!
Mis conocimientos en esto son un poco escasos, alguien podría comertar esto un poquito haber si me aclaro, me basta con un ejemplito.

Muchas gracias
__________________
Hay dos cosas infinitas: el Universo y la estupidez humana. http://www.cybertarjetas.net
Responder Con Cita
  #6  
Antiguo 13-06-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
NULL
 
Registrado: may 2003
Posts: 7.424
Poder: 23
Lepe Va por buen camino
En principio, tienes que guardar cada bloque de código en un archivo distinto, el primero, como puedes comprobar se debe llamar CdUtils.pas, el segundo bloque lo guardas como cdChange.pas obviamente.

Ahora esos 2 archivos tienes que ponerlos en una carpeta que delphi pueda encontrarlos. Yo suelo crear una carpeta llamada "MisCompo" dentro de

c:\archivos de programa\borland\delphi6\

paso 1
--------
los meto dentro, y le digo a delphi que busque en esa carpeta:
menú Tools --> Enviroment Options -->Library y en el apartado "Library Path" añado la carpeta MisCompo

Acepta todas las ventanas, y ahora procedemos a instalar el componente cdChange:

paso 2
menú Components--> install Components--> boton browse y elejimos el archivo cdchange.pas

paso 3
Aceptamos la pantalla.
En la ventana que se abre, pulsamos el boton compile y nos responde delphi que se ha instalado el componente TcdChange. Vale, pues que alegria

File --> close all, para cerrar los archivos que tenemos abiertos, en este momento, delphi nos pregunta si queremos guardar los cambios en el archivo "dclusr" respondemos que

Ahora ya podemos usarlo. Creamos un nuevo proyecto en delphi, nos vamos a la paleta de componentes y elejimos la pestaña Samples dentro de ella aparece a la derecha del todo nuestro deseado TCdChante. hacemos clic y lo ponemos en nuestra ventana. Si ahora nos vamos corriendo para el inspector de objetos, vemos que es un componente parecido a un TTimer, tiene su propiedad Active (true/false) y solo 2 eventos
- On cd Inserted
- On cd Removed

Creo que es bastante descriptivo no??

Pues despues de todo este rollo, a mí no me funciona el tema. Tengo que decir que no tengo activada la inserción automática de windows.

Ya me contareis.

Un saludo
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 13-06-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
NULL
 
Registrado: may 2003
Posts: 7.424
Poder: 23
Lepe Va por buen camino
Acabo de mirarlo a fondo y solo funciona en windows 9x

Según dice la api de windows sobre el mensaje DEVICEARRIVAL y DEVICEREMOVECOMPLETED es que no son soportados en windows NT (al menos en delphi 6)

En windows 98 SE si funciona correctamente ese código.

Si te he hecho perder el tiempo, lo lamento

Un saludo
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #8  
Antiguo 15-06-2005
Novás Novás is offline
Miembro
NULL
 
Registrado: oct 2003
Ubicación: Galicia
Posts: 146
Poder: 16
Novás Va por buen camino
Muchas gracias Lepe, te diré que este código funciona a las mil maravillas en windows xp proffesional y con delphi 7 que es lo que yo uso
__________________
Hay dos cosas infinitas: el Universo y la estupidez humana. http://www.cybertarjetas.net
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


La franja horaria es GMT +2. Ahora son las 06:53:31.


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