luizf Postado Maio 31, 2009 Denunciar Share Postado Maio 31, 2009 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+ Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Lukas Ssaraiva Postado Maio 31, 2009 Denunciar Share Postado Maio 31, 2009 Exprimenta da seguinte maneira :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); Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 luizf Postado Maio 31, 2009 Autor Denunciar Share Postado Maio 31, 2009 Desculpa, esqueci de mencionar.Eu não esqueci de incluir MMSystem.Mas, mesmo assim o drive não fecha, apenas abre. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 luizf Postado Maio 31, 2009 Autor Denunciar Share Postado Maio 31, 2009 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Junho 1, 2009 Denunciar Share Postado Junho 1, 2009 OpaBrother tente esse exemplohttp://www.delphitricks.com/source-code/mu...in_cddrive.htmlRepara que tem o modo que voce está fazendo e outro mais complexo... tente o mais complexo é claro rsabrxx Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 luizf Postado Junho 1, 2009 Autor Denunciar Share Postado Junho 1, 2009 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' thenbegin comando a;end elseif Socket.ReceiveText='b' thenbegin comando b;end elseif Socket.ReceiveText='c' thenbegin comando c;end else...if Socket.ReceiveText='n' thenbegin 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+ Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Junho 2, 2009 Denunciar Share Postado Junho 2, 2009 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 facilif 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 luizf Postado Junho 2, 2009 Autor Denunciar Share Postado Junho 2, 2009 (editado) 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;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, Buttons, ScktComp, XPMan;typeTForm1 = 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;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.BitBtn1Click(Sender: TObject);beginClientSocket1.Address := Edit1.Text; // end IPClientSocket1.Active := True; end;procedure TForm1.BitBtn2Click(Sender: TObject);begin// envia comando para abrir o cdClientSocket1.Socket.Sendtext('abrecd');end;procedure TForm1.BitBtn3Click(Sender: TObject);begin// envia comando para fechar o cdClientSocket1.Socket.Sendtext('fecharcd');end;procedure TForm1.BitBtn5Click(Sender: TObject);begin// envia comando AClientSocket1.Socket.Sendtext('A');end;procedure TForm1.BitBtn6Click(Sender: TObject);begin// envia comando NClientSocket1.Socket.Sendtext('N');end;// ...// ...// ...end.//================================================Servidorunit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, ScktComp, MMSystem, MPlayer, StdCtrls, Shellapi;typeTForm1 = class(TForm)ServerSocket1: TServerSocket;procedure ServerSocket1ClientRead(Sender: TObject;Socket: TCustomWinSocket);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.ServerSocket1ClientRead(Sender: TObject;Socket: TCustomWinSocket);begin// Para abririf Socket.ReceiveText='abrecd' thenbeginmcisendstring('Set cdaudio door open wait', nil, 0, handle);// ...end;// Para fecharif Socket.ReceiveText='fecharcd' thenbeginmciSendString('Set cdaudio door closed wait', nil, 0, handle);// ...end;// teste com ShowMessage 1if Socket.ReceiveText='A' thenbeginShowMessage('Comando Recebido A');// ...end;// teste com ShowMessage Nif Socket.ReceiveText='N' thenbeginShowMessage('Comando Recebido N');// ...end;// ...// ... end;end.//================================================Fazendo da maneira acima, só funciona o 1° comando. Editado Junho 2, 2009 por luizf Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 luizf Postado Junho 4, 2009 Autor Denunciar Share Postado Junho 4, 2009 (editado) 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);vartexto: string;begintexto:= Socket.ReceiveText;// Para abririf texto='abrecd' thenbeginmcisendstring('Set cdaudio door open wait', nil, 0, handle);// ...end;// Para fecharif texto='fecharcd' thenbeginmciSendString('Set cdaudio door closed wait', nil, 0, handle);// ...end;if texto='N' thenbegin// comando N// ...end;// ...// ...end;alguém pode me dizer o que aconteceu.Obrigado e T+ Editado Junho 4, 2009 por luizf Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Daniel Sanches Postado Junho 4, 2009 Denunciar Share Postado Junho 4, 2009 do jeito que estão seus posts, dá a impressão que quando você fazia a checagem do valor com if Socket.ReceiveText='abrecd' thenele 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!! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 luizf Postado Junho 5, 2009 Autor Denunciar Share Postado Junho 5, 2009 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' thenE agora:vartexto: string;begintexto:= Socket.ReceiveText;// Para abririf texto='abrecd' thenNo 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+ Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 s2pid Postado Junho 5, 2009 Denunciar Share Postado Junho 5, 2009 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' thenE agora:vartexto: string;begintexto:= Socket.ReceiveText;// Para abririf texto='abrecd' thenNo 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 ! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 luizf Postado Junho 6, 2009 Autor Denunciar Share Postado Junho 6, 2009 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Junho 7, 2009 Denunciar Share Postado Junho 7, 2009 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;DescriptionUse 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' thentexto: string;begintexto:= Socket.ReceiveText;// Para abririf texto='abrecd' thenOBS: 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 tiposabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 luizf Postado Junho 8, 2009 Autor Denunciar Share Postado Junho 8, 2009 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+ Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
luizf
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
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.