
s3c
Membros-
Total de itens
817 -
Registro em
-
Última visita
Tudo que s3c postou
-
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.
-
Existe a função SHBrowseForFolder da api shell32.dll
-
Form Secundário Minimizando Na Barra De Tarefas
pergunta respondeu ao Paulo Nobre de s3c em Delphi, Kylix
Como estão as propriedades: BorderIcons e BorderStyle ? -
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.
-
Não seria: Trunc(SQRT(N)) + 1; ?
-
É, se ele abre mas não fecha, também pode ser algum outro código IOCTL para DVD.
-
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.
-
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.
-
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.
-
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;
-
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.
-
Você consegue abrir pelo Shell.Application ou pelo DeviceIoControl ?
-
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.
-
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.
-
Olá Paulo, após o CreateFile coloque: ShowMessage(IntToStr(hDevice)); E poste o número que aparece.
-
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.
-
Só uma ressalva: FindWidow('Nome_da_Classe', 'Nome_da_Janela');
-
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.
-
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:
-
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á.
-
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.
-
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.
-
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; . . .
-
Deve estar faltando CommCtrl no uses. Mas não seria mais simples testar se chave e valor existem pelo TRegistry ?
-
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.