Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Contabilizar grabaciones hechas (https://www.clubdelphi.com/foros/showthread.php?t=22166)

Novás 08-06-2005 12:38:28

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

Lepe 08-06-2005 13:58:45

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

Novás 08-06-2005 15:50:23

Muchas gracias lepe:

Te agradecería pusieses esas dos unidades en un post y les hecho un vistacillo.

Lepe 09-06-2005 15:29:29

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

Novás 09-06-2005 15:54:24

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

Lepe 13-06-2005 17:26:02

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 :D

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. :D

Ya me contareis.

Un saludo

Lepe 13-06-2005 18:29:47

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 :o

Un saludo

Novás 15-06-2005 10:32:23

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


La franja horaria es GMT +2. Ahora son las 22:20:05.

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