Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Drive de cd não fecha


luizf

Pergunta

Boa noite pessoal.

Estou com um probleminha para fechar o drive de cd.

Usei os seguintes códigos:

//Abrir e Fechar a Bandeja do CD-Rom/DVD-Rom

Inclua na seção uses: MMSystem

{ Para abrir }

mciSendString('Set cdaudio door open wait', nil, 0, handle);

{ Para fechar }

mciSendString('Set cdaudio door closed wait', nil, 0, handle);

Para abrir não há problema algum, mas para fechar, não fecha.

Achei que o problema podia ser no drive do meu pc, então testei em outro pc, mesmo assim, não funcionou.

Tentei encontrar outro código com a mesma finalidade, mas em minhas buscas só encontro sempre o mesmo código.

Se puderem me ajudar, agradeço muito.

T+

Link para o comentário
Compartilhar em outros sites

14 respostass a esta questão

Posts Recomendados

  • 0

No que diz respeito aos códigos:

{ Para abrir }

mciSendString('Set cdaudio door open wait', nil, 0, handle);

{ Para fechar }

mciSendString('Set cdaudio door closed wait', nil, 0, handle);

Eles estão funcionando. O que esta acontecendo realmente, acho que é no aninhamento do ifs.

Testei os codigos para abrir e fechar, indendente um do outro e funcionou.

Fiz o seguinte codigo (cliente/servidor):

if Socket.ReceiveText='abrecd' then

begin

AbrirCD;

end

else

if Socket.ReceiveText='fecharcd' then

begin

FecharCD;

end;

Agora, só abre e não fecha, se colocar o código de fechar primeiro, então só fecha e não abre.

O que estou fazendo de errado?

Link para o comentário
Compartilhar em outros sites

  • 0

Valeu pela dica Churc.

Mas, percebi que na verdade o problema não esta em abrir e/ou fechar.

O problema esta no aninhamento do ifs.

É que tenho uma rede domestica, que tem o meu pc e do me cunhado.

E estou fazendo um programa cliente/servidor para usar, então fiz o seguinte no servidor.

if Socket.ReceiveText='a' then

begin

comando a;

end else

if Socket.ReceiveText='b' then

begin

comando b;

end else

if Socket.ReceiveText='c' then

begin

comando c;

end else

...

if Socket.ReceiveText='n' then

begin

comando n;

end;

Mas o que esta acontecendo, é que quando mando um comando do cliente para o serv, o unico comando que é executado é o comando que esta por primeiro, no caso o comando a, e quanto aos outros comandos, não acontece nada.

Se eu trocar, por exemplo, o comando c pelo comando a, o comando c funcionará normalmente, ou seja, o problema não esta nos comandos, de ser mais facil ou mais complexo. Meu problema é o aninhamento dos ifs, não sei o que estou fazendo de errado, se voce ou mais alguém puder me ajudar, fico grato.

T+

Link para o comentário
Compartilhar em outros sites

  • 0
Meu problema é o aninhamento dos ifs, não sei o que estou fazendo de errado, se voce ou mais alguém puder me ajudar, fico grato.

Assim fica mais facil

if Socket.ReceiveText='a' then
   comando a;

if Socket.ReceiveText='b' then
   comando b;

if Socket.ReceiveText='c' then
   comando c;

...

if Socket.ReceiveText='n' then
   comando n;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Não funcionou, ainda continua funcionando somente o primeiro comando, ou seja, abrir o cd.

Vou colocar a unit do cliente e do servidor para voce ver o que estou fazendo, as vezes o problema pode ate ser outro.

//================================================

Cliente:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Buttons, ScktComp, XPMan;

type

TForm1 = class(TForm)

Edit1: TEdit;

BitBtn1: TBitBtn;

BitBtn2: TBitBtn;

BitBtn3: TBitBtn;

ClientSocket1: TClientSocket;

XPManifest1: TXPManifest;

BitBtn5: TBitBtn;

BitBtn6: TBitBtn;

procedure ClientSocket1Connect(Sender: TObject;

Socket: TCustomWinSocket);

procedure ClientSocket1Connecting(Sender: TObject;

Socket: TCustomWinSocket);

procedure ClientSocket1Disconnect(Sender: TObject;

Socket: TCustomWinSocket);

procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;

ErrorEvent: TErrorEvent; var ErrorCode: Integer);

procedure BitBtn4Click(Sender: TObject);

procedure BitBtn1Click(Sender: TObject);

procedure BitBtn2Click(Sender: TObject);

procedure BitBtn3Click(Sender: TObject);

procedure BitBtn5Click(Sender: TObject);

procedure BitBtn6Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);

begin

ClientSocket1.Address := Edit1.Text; // end IP

ClientSocket1.Active := True;

end;

procedure TForm1.BitBtn2Click(Sender: TObject);

begin

// envia comando para abrir o cd

ClientSocket1.Socket.Sendtext('abrecd');

end;

procedure TForm1.BitBtn3Click(Sender: TObject);

begin

// envia comando para fechar o cd

ClientSocket1.Socket.Sendtext('fecharcd');

end;

procedure TForm1.BitBtn5Click(Sender: TObject);

begin

// envia comando A

ClientSocket1.Socket.Sendtext('A');

end;

procedure TForm1.BitBtn6Click(Sender: TObject);

begin

// envia comando N

ClientSocket1.Socket.Sendtext('N');

end;

// ...

// ...

// ...

end.

//================================================

Servidor

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ScktComp, MMSystem, MPlayer, StdCtrls, Shellapi;

type

TForm1 = class(TForm)

ServerSocket1: TServerSocket;

procedure ServerSocket1ClientRead(Sender: TObject;

Socket: TCustomWinSocket);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;

Socket: TCustomWinSocket);

begin

// Para abrir

if Socket.ReceiveText='abrecd' then

begin

mcisendstring('Set cdaudio door open wait', nil, 0, handle);

// ...

end;

// Para fechar

if Socket.ReceiveText='fecharcd' then

begin

mciSendString('Set cdaudio door closed wait', nil, 0, handle);

// ...

end;

// teste com ShowMessage 1

if Socket.ReceiveText='A' then

begin

ShowMessage('Comando Recebido A');

// ...

end;

// teste com ShowMessage N

if Socket.ReceiveText='N' then

begin

ShowMessage('Comando Recebido N');

// ...

end;

// ...

// ...

end;

end.

//================================================

Fazendo da maneira acima, só funciona o 1° comando.

Editado por luizf
Link para o comentário
Compartilhar em outros sites

  • 0

Consegui fazer funcionar.

No meu modo de ver, fiz a mesma coisa de uma maneira diferente, não sei porque, mas deste modo funcionou.

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;

Socket: TCustomWinSocket);

var

texto: string;

begin

texto:= Socket.ReceiveText;

// Para abrir

if texto='abrecd' then

begin

mcisendstring('Set cdaudio door open wait', nil, 0, handle);

// ...

end;

// Para fechar

if texto='fecharcd' then

begin

mciSendString('Set cdaudio door closed wait', nil, 0, handle);

// ...

end;

if texto='N' then

begin

// comando N

// ...

end;

// ...

// ...

end;

alguém pode me dizer o que aconteceu.

Obrigado e T+

Editado por luizf
Link para o comentário
Compartilhar em outros sites

  • 0

do jeito que estão seus posts, dá a impressão que quando você fazia a checagem do valor com

if Socket.ReceiveText='abrecd' then

ele limpava o valor de ReceiveText ...

tente fazer o seguinte ... da mesma forma que você estava fazendo, faça a checagem e logo após a primeira checagem tente exibir o valor de ReceiveText com showmessage ou outra forma qualquer ...

é uma forma de você testar o que poderia estar ocorrendo ...

abraço!!

Link para o comentário
Compartilhar em outros sites

  • 0

Em casos como este, sempre faço o teste com ShowMessage.

E aconteceu a mesma coisa, só era exibido na primeira chamada, as demais eram ignoradas.

Já resolvi o problema, como mencionei acima. Só queria saber, se alguém souber, qual diferença nos dois modos.

Antes eu estava fazendo:

if Socket.ReceiveText='abrecd' then

E agora:

var

texto: string;

begin

texto:= Socket.ReceiveText;

// Para abrir

if texto='abrecd' then

No meu modo de ver, não mudou praticamente nada, apenas a verificação direta no Socket passou para um variavel.

Se alguém puder me esclarecer o que houve, fico grato, pois futuramente se acontecer algo parecido vou saber o que poder ser, não neste caso que já esta resolvido, mas em algo futuro.

Obrigado, T+

Link para o comentário
Compartilhar em outros sites

  • 0
Em casos como este, sempre faço o teste com ShowMessage.

E aconteceu a mesma coisa, só era exibido na primeira chamada, as demais eram ignoradas.

Já resolvi o problema, como mencionei acima. Só queria saber, se alguém souber, qual diferença nos dois modos.

Antes eu estava fazendo:

if Socket.ReceiveText='abrecd' then

E agora:

var

texto: string;

begin

texto:= Socket.ReceiveText;

// Para abrir

if texto='abrecd' then

No meu modo de ver, não mudou praticamente nada, apenas a verificação direta no Socket passou para um variavel.

Se alguém puder me esclarecer o que houve, fico grato, pois futuramente se acontecer algo parecido vou saber o que poder ser, não neste caso que já esta resolvido, mas em algo futuro.

Obrigado, T+

vou tentar explicar o que eu acho:

quando você recebe uma string diretamente pelo socket do jeito que voce estava fazendo, ele soma a ultima mensagem do socket com a próxima recebida..

por exemplo , se você recebe abrecd, ok, logo em seguida fechacd, você vai ter abrecffechacd no buffer do socket.. então se você faz uma condição , if socket.receivetext = 'abrecd' then MAS você recebeu abrecd ele ignora porque não esta na condição..

acho que é isto !

Link para o comentário
Compartilhar em outros sites

  • 0

Olha s2pid, tambem pensei que fosse isso.

Mas acredito não ser, pois se fosse, a chamada 'abrecd' só iria funcionar na primeira vez, sendo que na segunda vez, então seria 'abrecdabrecd'.

Mas o que acontecia, era que sempre funcionava o que estava por primeiro, no caso, 'abrecd', mas se colocasse 'fecharcd' por primeiro iria funcionar, sempre.

Sempre funcionava somente o primeiro comando, indenpendente de qual fosse.

Então, acredito não ser esse o caso, mas de qualquer forma, valeu a intenção.

Link para o comentário
Compartilhar em outros sites

  • 0

Se alguém puder me esclarecer o que houve, fico grato, pois futuramente se acontecer algo parecido vou saber o que poder ser, não neste caso que já esta resolvido, mas em algo futuro.

A sua explicação:

Reads a string from the socket connection.

function ReceiveText: string;

Description

Use ReceiveText to read a string from the socket connection in the OnSocketEvent event handler of a Windows socket object or in the OnRead or OnClientRead event handler of a socket component. ReceiveText returns the number of bytes in the string.

ReceiveText only works in response to a read notification to a non-blocking windows socket. Blocking sockets must use a TWinSocketStream for reading. The TWinSocketStream object waits for the remote socket to be ready before transferring information.

No meu modo de ver, não mudou praticamente nada, apenas a verificação direta no Socket passou para um variavel.

if Socket.ReceiveText='abrecd' then

texto: string;

begin

texto:= Socket.ReceiveText;

// Para abrir

if texto='abrecd' then

OBS: Se voce perceber mudou sim ....

ReceiveText retorna o numero de bytes em uma string .. ao jogar para uma variavel tipo string, voce acabou fazendo uma conversão de tipos

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Ok então.

Agradeço a colaboração de todos.

Deixo a disposição se quiserem fechar o tópico, que pra mim esta resolvido.

Tenho mais algumas outras duvidas, mas isso é uma outra conversa e um outro tópico.

T+

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...