Ir para conteúdo
Fórum Script Brasil

s3c

Membros
  • Total de itens

    817
  • Registro em

  • Última visita

Tudo que s3c postou

  1. Colegas, a função SHBrowseForFolder permite selecionar somente pastas ou pastas e arquivos. Churc, como seria a seleção de pastas e arquivos pelo TOpenDialog ? Isso pouparia código.
  2. Existe a função SHBrowseForFolder da api shell32.dll
  3. Como estão as propriedades: BorderIcons e BorderStyle ?
  4. Acho que esse While tem um pequeno furo. Se você tiver dois níveis 3 seguidos, o segundo não será excluído; sem contar que se você tiver níveis 4 em diante, sua variável i estará totalmente incompatível com o tvp.Items.Count. Acho que seria melhor você excluir através de um for na ordem inversa.
  5. s3c

    Números Primos

    Não seria: Trunc(SQRT(N)) + 1; ?
  6. s3c

    Abrir A Bandeja Do Dvd

    É, se ele abre mas não fecha, também pode ser algum outro código IOCTL para DVD.
  7. Você pode utilizar uma query para acessar esse nome na tabela, ou dar o Post dentro de um try/except. Table.Eof = final do cursor ou final da tabela ou um Table.Next após o último registro lido.
  8. s3c

    Record / Socket

    Acho que tanto faz, no meu caso utilizo SendBuf, colocando os dados num buffer linear e contínuo de memória. No recebimento você não possui o ReceiveStream, logo terá que receber pelo ReceiveBuf e esta função lhe retorna quantos bytes foram lidos. portanto é sempre bom fazer um loop de leitura até que todo o buffer seja lido. Uma dica é você enviar na frente o tamanho do buffer que virá a seguir num campo Integer(4 Bytes). Quando lê, você executa um ReceiveBuf com 4 e carrega o campo Inteiro. Depois você entra no loop de leitura comparando a soma lida com esse campo.
  9. s3c

    Record / Socket

    O SizeOf(MyRecord) retorna 8 bytes não importando o que tiver na String. Na verdade você está movendo o ponteiro da string(4 bytes) + o campo Integer(4 bytes). O SizeOf(MyStream) retorna 4 bytes por ser um ponteiro. O SendBuf de MyStream deveria ser MyStream.Memory^ porque não é o objeto que você vai mandar e sim o conteúdo armazenado na propriedade Memory dele.
  10. s3c

    Abrir A Bandeja Do Dvd

    Pode ser que ele não esteja liberando o Handle alocado; se não for isso, realmente não sei o que possa ser. Tente assim: Abrir: const IOCTL_Storage_Eject_Media = $002D4808; var hDevice:THandle; dRet:DWord; begin HDevice := CreateFile(PChar('\\.\G:'), Generic_Read, File_Share_Read, nil, Open_Existing, 0, 0); DeviceIoControl(hDevice, IOCTL_Storage_Eject_Media, nil, 0, nil, 0, dRet, nil); CloseHandle(hDevice); end; Fechar:const IOCTL_Storage_Load_Media = $002D480C; var hDevice:THandle; dRet:DWord; begin HDevice := CreateFile(PChar('\\.\G:'), Generic_Read, File_Share_Read, nil, Open_Existing, 0, 0); DeviceIoControl(hDevice, IOCTL_Storage_Load_Media, nil, 0, nil, 0, dRet, nil); CloseHandle(hDevice); end;
  11. s3c

    Abrir A Bandeja Do Dvd

    Paulo, retire Generic_Write, deixe somente Generic_Read; após CreateFile coloque: ShowMessage(SysErrorMessage(GetLastError));Com a bandeja aberta, chame o programa e execute somente o botão para fechar, veja qual a mensagem e clique em Ok.
  12. s3c

    Abrir A Bandeja Do Dvd

    Você consegue abrir pelo Shell.Application ou pelo DeviceIoControl ?
  13. Não tenho muita experiência com ADO, pois só trabalhei uns 3 meses, mas pelo que pude notar essa tecnologia utiliza OLE Variant e tem que ficar sempre convertendo um Variant para seu tipo de dado original, caindo assim sua performance(motivo da minha desistência pelo ADO). Nele você possui Parameters.ParamValues que retorna um Variant, e Parameters.ParamByName que retorna um TParameter que possui a propriedade Value(Variant). Ambos os casos retornam Variant e a conversão deve ser feita.
  14. s3c

    Abrir A Bandeja Do Dvd

    Olá,s3c, O número que aparece é o 4294967295 Isto indica um Handle inválido e ao que parece CreateFile não está entendendo sua unidade g:, logo DeviceIoControl não funcionará nem para abrir, nem para fechar; assim como Shell.Application não entende ParseName('g:\').Outra sugestão seria retornar a letra do Drive(se é que existe neste caso) utilizando WMI.
  15. s3c

    Abrir A Bandeja Do Dvd

    Olá Paulo, após o CreateFile coloque: ShowMessage(IntToStr(hDevice)); E poste o número que aparece.
  16. s3c

    Abrir A Bandeja Do Dvd

    Pelo DeviceIOControl acho que sim, por outro lado, pelo Shell.Application, você consegue pesquisar o nome do FolderItem e aplicar o InvokeVerb sem saber a letra:var i:Integer; SA:Variant; begin SA := CreateOleObject('Shell.Application'); for i := 0 to SA.NameSpace(17).Items.Count-1 do begin if Pos('DVD-RAM', SA.NameSpace(17).Items.Item(i).Name) > 0 then SA.NameSpace(17).Items.Item(i).InvokeVerb('E&jetar'); end; SA := Unassigned; end;É claro que para um código que funcione em qualquer máquina, devem ser checados os possíveis nomes que possam vir de CD e DVD; o que tornaria uma rotina bastante trabalhosa, além do que você só consegue ejetar a unidade. Talvez pelo IOCTL e CreateFile retornando um Handle válido, o DeviceIOControl seria a forma mais direta e eficaz de abrir e fechar as bandejas.
  17. Só uma ressalva: FindWidow('Nome_da_Classe', 'Nome_da_Janela');
  18. s3c

    Abrir A Bandeja Do Dvd

    Mesmo trocando a unidade por G:\ não funciona?Se não funcionar, tente acessar o ítem pelo nome que aparece: var i:Integer; SA:Variant; begin SA := CreateOleObject('Shell.Application'); for i := 0 to SA.NameSpace(17).Items.Count-1 do begin if Pos('DVD-RAM', SA.NameSpace(17).Items.Item(i).Name) > 0 then SA.NameSpace(17).Items.Item(i).InvokeVerb('E&jetar'); end; SA := Unassigned; end; Esses dois Hints acho que estão dizendo que ele está executando CreateFile mas não está executando DeviceIoControl. Poste o código do Button4Click.
  19. s3c

    Abrir A Bandeja Do Dvd

    Bom, você pode saber os ítens do menu popup que o Explorer apresenta:var i:Integer; SA:Variant; begin SA := CreateOleObject('Shell.Application'); for i := 0 to SA.NameSpace(17).ParseName('D:\').Verbs.Count-1 do Memo1.Lines.Add(SA.NameSpace(17).ParseName('D:\').Verbs.Item(i).Name); SA := Unassigned; end; Utilizei um TMemo para visualizar, mas a cada iteração do for você pode checar o E&ject pertinente para aquele computador e depois executar o InvokeVerb. Existe outra opção, sabendo-se a letra do drive, mandando diretamente o código de controle para o dispositivo(abrir ou fechar):const IOCTL_Storage_Eject_Media = $002D4808; IOCTL_Storage_Load_Media = $002D480C; var hDevice:THandle; dRet:DWord; begin HDevice := CreateFile(PChar('\\.\E:'), Generic_Read or Generic_Write, 0, nil, Open_Existing, 0, 0); DeviceIoControl(hDevice, IOCTL_Storage_Eject_Media, nil, 0, nil, 0, dRet, nil); // Ejeta DeviceIoControl(hDevice, IOCTL_Storage_Load_Media, nil, 0, nil, 0, dRet, nil); // Fecha CloseHandle(hDevice); end;No caso foi utilizado E:
  20. s3c

    Abrir A Bandeja Do Dvd

    Olá Paulo, 1-O seu DVD, pelo Explorer você tem a opção no botão direito do mouse de ejetar ? 2-Aonde ele aparece ? abaixo do My Computer no mesmo nível do CDROM ? 3-Com que nome ele aparece ? ps: se não tiver a opção de ejetá-lo pelo mouse, acho que Shell Application não servirá.
  21. s3c

    Abrir A Bandeja Do Dvd

    Pessoal, não sei se é o caso mas este código: var SA:Variant; begin SA := CreateOleObject('Shell.Application'); SA.NameSpace(17).ParseName('E:\').InvokeVerb('E&ject'); SA := Unassigned; end;Simula o clique do botão direito do mouse no Explorer em cima do drive E, depois procura por Eject(com o 'j' sublinhado e invoca o comando. Como o meu é o XP em inglês, "Eject" é o comando que aparece no menu popup do Explorer. Vejam se o de vocês é diferente como Ejetar, ou outra coisa qualquer e troquem pelo que aparece. Talvez seja isso.
  22. s3c

    Abrir A Bandeja Do Dvd

    Tente ejetar pelo Shell Application: uses Variants, ComObj; var SA:Variant; begin SA := CreateOleObject('Shell.Application'); SA.NameSpace(17).ParseName('E:\').InvokeVerb('E&ject'); SA := Unassigned; end;Troque 'E:\' pela sua unidade de DVD.
  23. s3c

    Regedit

    var Reg:TRegistry; begin Reg := TRegistry.Create; Reg.RootKey := Hkey_Local_Machine; if not Reg.OpenKey('\SOFTWARE\Borland\BLW32', false) or not Reg.ValueExists('BLAPIPATH') then begin Reg.Free; ShowMessage('Chave ou Valor Inexistente !'); Exit; end; Reg.Free; . . .
  24. s3c

    Regedit

    Deve estar faltando CommCtrl no uses. Mas não seria mais simples testar se chave e valor existem pelo TRegistry ?
  25. s3c

    Regedit

    Bom, FindWindow está procurando pela classe 'RegEdit_RegEdit' que é a janela principal do Regedit. FindWindowEx procura pelas classes filhas 'SysTreeView32' e 'SysListView32' que são as janelas esquerda e direita. Todas elas possuem um Handle e é por isso que aplica-se os SendMessage(s). O SendMessage WM_KeyDown recebe em WParam o código da VK(Virtual Key) do teclado; ou seja; a janela recebe a informação que foi enviada aquela tecla, VK_Left(<-) volta um nível, VK_Right(->) avança um nível. O SendMessage WM_Char recebe em WParam o código ascii do caracter; por isso o Ord e a janela recebe aquele caracter e como está em foco ela vai selecionando os valores que casam com o que é enviado.
×
×
  • Criar Novo...