Ir para conteúdo
Fórum Script Brasil

Paulo Nobre

Membros
  • Total de itens

    717
  • Registro em

  • Última visita

Tudo que Paulo Nobre postou

  1. Obrigado Renato e desculpe a falha.
  2. Tenho um banco de dados (access é claro) onde numa caixa de texto ficam armazenados nomes. Quando seleciono um nome(paulo por exemplo) e mando filtrar por seleção só são fornecidos resultados onde Paulo aparece na mesma posição da caixa de texto original. Não sei se me fiz claro; Se tenho Paulo(primeiro), carlos, João, na filtragem só apereceriam; Paulo, José, Marcos; Paulo, pedro, Mário. Mas, não apareceriam: Maria, Paulo, Carlos; Jonas,Pedro,Paulo. Isto é um padrão do access ou eu que não estou sabendo filtrar. Se não dá para ser por seleção, mas existe alguma outra possibilidade alguém poderia me dar uma dica de como fazer? Gostaria de poder ter todos os registros onde Paulo aparece!! Uso access2003.
  3. Acho que acrescentando... if n = 1 then begin result:= False; exit; end; if n = 2 then begin result:= False; Exit; end; if ((n mod 2) = 0) then begin result:=false; exit; end; ...Resolve definitivamente,não podemos esquecer que 1 não é primo. :D :D :D :D
  4. É, realmente todos os números que havia testado eram ímpares, afinal o único número primo par (natural) é o dois.
  5. Tinha reparado que estava sem o end; final Testei ela com vários valores e funcionou. Onde está o erro?
  6. Não seria: Trunc(SQRT(N)) + 1; ? Naõ funcionou. Dá a seguinte mensagem de erro:[Error] Unit1.pas(69): Incompatible types apontando para: While Testando <= Trunc(SQRT(N))+1 do Não entendo, não deveria dar erro, pois Testando é do tipo int64, sqrt pega um extended e transforma em extende e trunc pega um extended e transforma num int64
  7. Paulo Nobre

    Matriz 2x2

    Diego, um código alternativo ao meu, muito mais otimizado e enxuto, que foi sugerido a mim por M.P. pelo colega Micheus é o seguinte: procedure TForm1.Button1Click(Sender: TObject); function ValidaNum(txtValue :TEdit) :Extended; begin if txtValue.Text = '' Then begin Messagebox(handle,'Nenhum valor deve ser deixado em branco.','FALTA UM VALOR',MB_IconExclamation); txtValue.SetFocus; abort; end else Result := StrToFloat(txtValue.Text); end; var a11, a12,a21,a22: Extended; RD2: Extended; begin try a11:= ValidaNum(txta11); a12:= ValidaNum(txta12); a21:= ValidaNum(txta21); a22:= ValidaNum(txta22); RD2:= a11*a22 - a12*a21; txtRD2.Text:= FloatToStr(RD2); except On E:EConvertError do Messagebox(handle,'Expressões como valor não serão aceitas.'+#13+'Por exemplo, 3-4 ou -1-5, não são valores válidos !'+#13+'O sinal de menos só pode aparecer uma vez e antes do número.','ERRO',MB_IconStop); end; end;
  8. É realmente, s3c, pode ser que seja outro código. Quem deve ter preocupação com este tipo de código são desenvolvedores de programas de players. Na realidade este tópico acabou virando uma fixação para muitos de nós, mas como o Churc, mencionou em um dos post, o principal seria saber abrir, pois como você vai tirar a mão do teclado ou mouse para colocar o DVD, então é só empurrar a gaveta. E mais um detalhe, em NOTEBOOK, este código nem teria sentido. O que achei muito interessante e que será aproveitado em códigos futuros é o uso do object Shell.Application.
  9. Alguém sabe como poderia usar a função acima usando int64 e Ceil(SQRT(N)) ?
  10. Não funcionou. Deixa prá lá! Obrigado , s3c.
  11. s3c, a mensagem é a seguinte: O arquivo já está sendo usado por outro processo. s3c, só para resumir tudo. Estou conseguindo abrir a gaveta do DVD por três códigos: PRIMEIRO(Fornecido por você) procedure TForm1.Button1Click(Sender: TObject); //uses Variants, ComObj; var SA:Variant; begin SA := CreateOleObject('Shell.Application'); //SA.NameSpace(17).ParseName('G:\').InvokeVerb('E&ject'); SA.NameSpace(17).ParseName('G:\').InvokeVerb('E&jetar'); SA := Unassigned; end; SEGUNDO(Fornecido por você) procedure TForm1.Button3Click(Sender: TObject); const IOCTL_Storage_Eject_Media = $002D4808; IOCTL_Storage_Load_Media = $002D480C; var hDevice:THandle; dRet:DWord; begin HDevice := CreateFile(PChar('\\.\g:'), 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; TERCEIRO(Fornecido pelo Churc) procedure TForm1.Button2Click(Sender: TObject); begin AbreSafado('G', 'open'); end; procedure AbreSafado(const Drive: Char; szAcao: String); var szBuff: String; begin szBuff := 'open ' + Drive + ':\ type cdaudio alias DRIVE'; mciSendString(PChar(szBuff), nil, 0, 0); mciSendString(PChar('set DRIVE door ' + szAcao), nil, 0, 0); mciSendString(PChar('close all'), nil, 0, 0); end; Problemas até agora para mim 1) Não consigo fechar com nenhum código. 2) Não consigo pegar a letra do DVD. Fiz esse resumo para facilitar até pra mim mesmo quando ficar consultando os códigos e também para facilitar aos que, como eu, tem menos experiência na procura. Agora observe que coisa curiosa: SE abrir pelo código 1 e mandar fechar depois pelo código que estamos analisando ele não fecha mais a mensagem agora é A operação foi concluida com êxito Outra coisa se usar o código 1 para abrir, fechar manualmente é claro e depois tentar abrir pelo código 2 ele não abre. Tenho que fechar o programa abrir novamente e mandar abrir o dvd pelo código 2, aí sim ele abre.
  12. pelo DeviceIoControl ... Consigo abrir usando o código abaixo, que você forneceu: const IOCTL_Storage_Eject_Media = $002D4808; IOCTL_Storage_Load_Media = $002D480C; var hDevice:THandle; dRet:DWord; begin HDevice := CreateFile(PChar('\\.\G:'), 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; Quando uso para fechar const IOCTL_Storage_Eject_Media = $002D4808; IOCTL_Storage_Load_Media = $002D480C; var hDevice:THandle; dRet:DWord; begin HDevice := CreateFile(PChar('\\.\G:'), 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; Nada acontece. PS: Desculpem não estar colocando os cotes, mas neste computador que estou eles não estão funcionando!!
  13. s3c, algo muito estranho então deve estar acontecendo, pois estou conseguindo abrir o DVD. Só fechar é que não.
  14. Então se alguém souber o código, mesmo para XP apenas, poderia postar. Mesmo que só para uso particular para quem tem XP, já serviria. Em último caso, mesmo muito deselegantemente apelaria para a sugestão que dei num post anterior, embora não seja uma alternativa típica de um programador
  15. Micheus, funcionou no teste que fiz aqui! Na fronteira do limite superior encontrei algo estranho 9 seguido de 18 zeros ele aceita. Nove seguido de 19 zeros não deveria aceitar, mas aceita dizendo que é um número primo, o que não é verdade. Tentei colocar While Testando <= Ceil(SQRT(N)) do no lugar de While Testando <= N - 1 do para otimizar o código, mas dá erro de invalid floating pointer operation. Deve ser por conta do retorno da função Ceil, que é int e não int64, não é isso? Se existisse uma IntToInt64 daria para contornar!!
  16. Obrigado Felipe :) Mais alguém tem alguma dica ou tem outra opinião?
  17. Colocando Int64 dá erro dizendo que: For Loop control must have ordinal type De fato quando coloco um número acima de um milhão aqui começa, a demorar bastante. Imagino que se colocar para rodar num pentium 100 vá demorar um século. Se não se colocar um Application.ProcessMesages, alguém pode ficar muito nervoso e fazer grandes elogios a progenitora do cara que fez o programa. Não entendi!! Quando escrevi um programinha, a algum tempo atrás e postei uma dúvida alguém me disse que a função acima era mais lenta e sugeriu fazer o teste da seguinte maneira: For i:= 2 to Ceil(SQRT(n))do Na realidade verificando de 2 até n-2 estava perdendo mais tempo. Eu idiotamente nunca tinha parado para pensar nisto, afinal se p for divisor de n e n = a.p, sendo p e a inteiros com p < a então p^2 < a.p = n. Assim , para verificar se n é primo ou não , bastava examinar a divisibilidade de n pelos primos menores do que ou iguais a raiz quadrada de n. Na época nunca tinha ouvido falar desta função Ceil da unit MATH. Na matemática a gente chama de função máximo inteiro (máximo inteiro de x --->[x]). Nunca tinha parado para pensar sobre o cálculo de PI, também nunca vi nenhum algoritmo. Será que você reviveu Arquimedes, que imaginou uma circunferência como o caso limite de um polígono, ou seja com um número de lados n, tendendo ao infinito. A alguns anos atrás, li numa revista que o recorde de obtenção de casas decimais para o PI tinha sido alcançado por um japonês com a ajuda de vários supercomputadores. O cara chegou a obter PI com BILHÕES DE CASAS DECIMAIS. :o Para brincar com meus alunos decorei o PI como 3,1415926535897932... e digo para eles, só para eles ficarem impressionados, que a cada ano decoro mais duas decimais(maior mentira!! - não passo disto). :P
  18. Realmente, Churc, interessante mesmo. E acredito que a idéia por trás deva ser essa mesmo que você mencionou, pegar mensagens sem "precisar ter janelas".
  19. Realmente luizf não está fácil não, mas mesmo que não se consiga a resposta total, este tópico foi muito enriquecedor na minha opinião, principalmente aquela parte postada pelo s3c, para obter a lista das opções obtidas com o botão direiot do mouse(simulação). Repare que já se tem como abrir a gaveta do DVD, tá faltando obter como se fecha.
  20. Os códigos para verificação de que se um número é primo, normalmente usam laços "for" e por isso trabalham com números inteiros na variação. Acontece que existe uma limitação para a variável inteira. Como contorno isto se desejo verificar se um número maior do que três bilhões é primo? Por exemplo a função abaixo verifica se um número n é primo ou não. function SeraQueSouPrimo(N: Integer): Boolean; var Testando: Integer; begin SeraQueSouPrimo := True; for Testando := 2 to N - 1 do if (N mod Testando) = 0 then begin SeraQueSouPrimo := False; break; {jump out of the for loop} end; end; Não é necessário que alguém diga que esta não é a função mais rápida.(Uso outra na prática) Sei disso!!,apenas coloquei esta como exemplo para fixar a imagem do for variando de 2 até n-1 Como resolveria este problema? Os matemáticos que trabalham com teoria dos números devem usar algum código para trabalhar com números extremamante grandes, mas não tenho idéia de qual seria.
  21. No superdownloads também tem!! Acabei de baixar, mas gostaria de saber de vocês, que instalaram, o seguinte: 1) Existe algum cuidado que devo ter antes de instalar? 2) Ele vai manter as configurações do anterior? 3) Sei que uma versão mais moderna é sempre melhor, mas, já tendo o 6.0 funcionado redondinho, vale a pena mudar? Gostaria muito de ouvir(ler) vocês!!!
  22. Pesquisando acabei de descobrir algo que jamais imaginava.. Na realidade quando você cria um projeto, junto você está criando um objeto Application, descendente da classe TApplication. Este objeto é um form com dimensões 0x0, ou seja, invisível, mas não hide. O que você vê na barra de tarefas é o título deste form invisível que tem com caption o mesmo nome do projeto. Ele é que controla todos os outros forms do projeto. Assim ao clicar nele o principal é mostrado. Desejando que os dois tenham o mesmo nome(caption) temos o código acima. Application.Title:=Form1.caption Porisso é que os nomes são diferentes, pois na realidade existem dois forms logo de inicio. Foi isso que eu entendi na leitura que fiz. Querendo comprovar a existência deste form coloque num form qualquer um botão e nele o código abaixo: (Antes diminua bastante o tamanho do form principal) var OldStyle:Integer; begin OldStyle:=GetWindowLong(Application.Handle,gwl_Style); SetWindowLong(Application.Handle,gwl_Style,OldStyle or WS_THICKFRAME or WS_CAPTION); SetWindowPos(Application.Handle,0,0,0,200,100,SWP_NOMOVE or SWP_NOZORDER); end;
  23. Paulo Nobre

    Matriz 2x2

    Quando você diz fazer uma matriz 2x2, imagino que seja a idéia visual para montar a matriz, não é isso? Uma idéia seria colocar 4 Edits no formato de duas linhas e duas colunas, afinal este é o formato de uma matriz 2x2, não é? Temos que usar 5 variáveis do tipo extended, 4 para armazenar os valores dos edits e uma para o resultado. Bom faça o seguinte: coloque quatro edits e renomei eles para txta11, txta12,txta21 e txta22. Coloque um componente button e renomei-o para cmdCalcularD2. Coloque om outro Edit, para receber o resultado, renomeando-o para txtRD2. Um código(para o button) poderia ser o seguinte: procedure TfrmPrincipal.cmdCalcularD3Click(Sender: TObject); Var a11, a12,a21,a22: Extended; RD2: Extended; begin try If txta11.Text = '' Then begin Messagebox(handle,'Nenhum valor deve ser deixado em branco.','FALTA UM VALOR',MB_IconExclamation); txta11.SetFocus; abort; end; If txta12.Text = '' Then begin Messagebox(handle,'Nenhum valor deve ser deixado em branco.','FALTA UM VALOR',MB_IconExclamation); txta12.SetFocus; abort; end; If txta21.Text = '' Then begin Messagebox(handle,'Nenhum valor deve ser deixado em branco.','FALTA UM VALOR',MB_IconExclamation); txta21.SetFocus; abort; end; If txta22.Text = '' Then begin Messagebox(handle,'Nenhum valor deve ser deixado em branco.','FALTA UM VALOR',MB_IconExclamation); txta22.SetFocus; abort; end; a11:= StrToFloat(txta11.Text); a12:= StrToFloat(txta12.Text); a21:= StrToFloat(txta21.Text); a22:= StrToFloat(txta22.Text); RD2:= a11*a22 - a12*a21; txtRD2.Text:= FloatToStr(RD2); except On E:EConvertError do Messagebox(handle,'Expressões como valor não serão aceitas.'+#13+'Por exemplo, 3-4 ou -1-5, não são valores válidos !'+#13+'O sinal de menos só pode aparecer uma vez e antes do número.','ERRO',MB_IconStop); end; end; É claro que muitos outros detalhes podem ser implementados, como colocar um botao para limpar todos os valores dos edits etc... Com a idéia acima você pode passar para o cálculo de um determinanre 3x3(usando a regra de Sarrus) e depois para um 4x4, usando o teorema de Laplace. Diversos outros detalhes deverão ser cuidados, por exemplo, para que o programa não tenha erros. Por exemplo: para o usuário digitar apenas números nos edits. neste caso no evento OnKeyPress de cada edit coloque o código abaixo: If Not(Key In ['0'..'9',',','-',#8]) Then begin beep; Abort; end; E outra coisas mais, como por exemplo digitar apenas uma vírgula em edit etc.. O básico está aí em cima.
×
×
  • Criar Novo...