Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cerrar bandeja CDs (https://www.clubdelphi.com/foros/showthread.php?t=2492)

JMGR 25-07-2003 12:37:18

Cerrar bandeja CDs
 
Buenas...

Estoy haciendo una aplicacion que necesita extraer datos de dos CDs por lo que cuando le hacen falta dichos datos abre las bandejas de las dos unidades de CD y se pone a la espera...

El problema es que si el usuario cancela la espera no consigo cerrar las dos unidades, solo puedo cerrar una...

He probado los metodos de Trucomania y para abrirlas sin problema, pero pa cerrar...nada :(

Uno de los metodos de Trucomania lo que hace es mandarle un comando a la unidad de CD que este configurada en Windows como unidad para los Cds de Audio, y es este el metodo que me permite cerrar una sola de las unidades.

Una posible solucion seria cerrar la unidad predeterminada y luego cambiar la configuracion de Windows para cerrar la otra, y volver a dejarla como estaba, pero no se como cambiar la configuracion desde mi programa...:confused:

¿Alguna idea...?

Un saludo.

JMGR 25-07-2003 14:13:45

Acabo de encontrar la clave del registro donde se especifica la unidad de CD predeterminada, es:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\MediaResources\mci\cdaudio\

en la seccion DefaultDrive...

Y en las subclaves Unit0, Unit1, etc... guarda las unidades como valores binarios...

Aqui es donde estoy algo perdido, en la seccion Default Drive aparece un valor binario en plan 00 00 00 00, mientras que en Unit0, etc...los valores son en plan:

Unit0 00 00 00 00 ff 00 00 00
Unit1 01 00 00 00 ff 00 00 00

Lo que quiero hacer es guardar el valor de Default Drive y luego ir cambiandolo por los de las units disponibles, para ir cerrandolas, y al final volver a restaurar el Default Drive original, pero no se como manejar los valores binarios....:confused:

Agradeceria que alguien me orientara un poco....

Gracias y un saludo.

danytorres 25-07-2003 15:07:56

Como estas JMGR, me parece interesante poder controlar la bandeja de CD no sera mucho abuso si me enseñara a controlar la bandeja. gracias de antemano.

___________________________
Un saludo a todos......

JMGR 26-07-2003 13:28:10

Buenas...

Danytorres aqui te pongo el codigo que uso para abrir la bandeja del CD, esta sacado de Trucomania :


Añade 'MMSystem' en el uses de tu form

procedure OpenCd(AOpen:Boolean);
const
DoPlay : array[Boolean] of string =
('Set cdaudio door closed wait',
'Set cdaudio door open wait');
var
MyError : LongInt;
MyErrorString : array[0..MAXERRORLENGTH - 1] of char;
begin
MyError := mciSendString(pChar(DoPlay[AOpen]), nil, 0, 0);
if MyError <> 0 then
begin
MciGetErrorString(MyError,MyErrorString,MAXERRORLENGTH - 1);
Showmessage(MyErrorString);
Exit;
end;
end;


Para abrir el CD:
OpenCd(TRUE);

Para cerrar el CD:
OpenCd(FALSE);


El anterior truco esta muy bien, pero si tenemos más de una unidad de CD no deja seleccionar cual abrir.
Para eso usaremos este otro código:

-Añade 'MPlayer' en el uses de tu form

procedure TForm1.Button1Click(Sender: TObject);

procedure AbreCD(Disco : char);
var
Tokata : TMediaPlayer;
begin
Tokata := TMediaPlayer.Create(nil);
with Tokata do
begin
Parent := Self;
Visible := FALSE;
Shareable := TRUE;
DeviceType := dtCDAudio;
FileName := Disco + ':';
Wait:=FALSE;
Open;
Eject;
Close;
Free;
end;
end;

begin
AbreCD('F');
end;


Lo de cerrar todas las unidades todavia no lo he conseguido pero sigo en ello. Cuando descubra como lo pondre por aqui...
Un saludo.

danytorres 27-07-2003 05:01:32

Gracias por el codigo funciona muy bien.

______________________
Un saludo a todos...

frankmch 27-07-2003 05:07:44

Esta Solucion esta garantizada ya que la he probado, espero que te funcione.
agrega a el uses de tu form MMSystem
en el ejemplo el evento de abrir y cerrar la bandeja lo ejecuto con un boton, mejor dicho 2 botones uno para abrir y otro para cerrar.

el codigo es el siguiente
para abrir:

procedure TForm1.btnOpenClick(Sender: TObject);
begin
mciSendString('Set cdaudio door open wait', nil, 0, 0);
end;

para cerrarla:

procedure TForm1.btnCloseClick(Sender: TObject);
begin
mciSendString('Set cdaudio door closed wait', nil, 0, 0);
end;

este codigo te abrira y cerrara la unidad maestra en tus cd-roms.

ahora bien, si tienes mas de una unidad este seria el codigo:

para abrir:

procedure TForm1.btnOpenClick(Sender: TObject);
begin
// Open drive X: (X being the letter of the drive you wish to open)
mciSendString('open cdaudio!X: alias driveX', nil, 0, 0);
mciSendString('set driveX door open wait', nil, 0, 0);
end;

para cerrarla:

procedure TForm1.btnCloseClick(Sender: TObject);
begin
// Close drive X:
mciSendString('set driveX door closed wait', nil, 0, 0);
end;


espero te sirva...

JMGR 27-07-2003 14:52:12

OK!
Funciona perfectamente....:D

Y yo volviendome loco con el registro....:rolleyes:

Muchas gracias y un saludo.


La franja horaria es GMT +2. Ahora son las 13:49:11.

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