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. olá, s3c, faz sentido isto que você falou. Vou tentar. Esta característica não existia no Win98. Ao fechar e abri-lo ele "zerava". No xp ao fechar numa chave se você abrir ele abre nesta última fechada, por conta deste valor LastKey, que não existe no Win98 e nem adianta criar, pois o regedit não foi programada para verificar esta chave ao abrir. Penso eu. Olá, Franz, obrigado pela dica, mas este tópico apenas está falando de como usar o registro e isso eu já tenho idéia. Obrigado mesmo assim.
  2. Sei trabalhar um pouco com o registro do windows via delphi, ou seja, abrir, fechar. ler e gravar. Para abrir o regedit de um executável, acredito que basta usar ShellExecute. A pergunta é: Como abrir o regedit já numa sub-Chave de uma chave pré-determinada? Teria que usar ShellExecute também, colocando o complemento do caminho? Alguém já fez isso?
  3. Olá,s3c,acho que é isso mesmo. Vou tentar investir na minha rotina. No meu caso ela vai fornecer em três labels, númerode anos,meses e dias entre as duas datas.
  4. Tá legal s3c, Vou tentar mecher na minha rotina no final de semana com mais calma. Qualquer coisa falo com você. A propósito, quando estava escrevendo um colega(Escobar) passou uma rotina. Não li ainda. Você já leu?
  5. Prezado,s3c, Usando a sua deixa Estou tentando fazer a rotina. É trabalhosa e grande como estou achando ou estou escrevendo demais? Digo isso pois depois de usar decodeDate em DataInicial e Data Final, tenho que dividir em vários casos(ifs), pois, por exemplo, se Ano Final > Ano Inicial temos uma situação,caso MesFinal > MesInicial, se Ano Final =Ano Inicial, outra, além de ter que dividir em vários casos se MesFinal for março, maio etc..(por causa dos 31 dias), MesFinal for fevereiro(bissexto ou não), claro também analisando os casos do MesInicial. É isso tudo mesmo? Está ficando bem grande. É claro que com a minha não muita experiência, devo estar escrevendo muito(deveria estar fazendo mais subrotinas) e não devo estar usando alguma função adequada dentro da rotina. Quando você respondeu e não colocou nenhum código imaginei que não fosse uma coisa tão elementar (elementar não no sentido de fácil e sim de não trabalhoso). Aí tentei fazê-la. Fiquei ontem umas 4 horas em cima dela e ainda está com problemas? Existe alguma dica a mais que poderia me ajudar a fazer a rotina ou é trabalhosa mesmo? PS para a comunidade delphi: Quem está acompanhando este tópico (60 leituras até agora) deve ter observado como tudo começou: Uma dica tirada destes programas de 850 dicas (no meu caso é o Lyode, acho que é assim que se escreve). Não funciona, na sua totalidade. Por um acaso meu programa é um inofensivo programa para mecher com datas de diversas maneiras. Eu não sou programador. Imagine quem usa estas dicas para fazer programas para vender? Você diria: mas tem que testar! Tudo bem, mas testar como um betatester? Fiz uma pesquisa longa na Internet e não encontrei uma função(correta) para fazer isto em lugar nenhum. E vejam que isto não é tão incomum assim! Fazer o que né?
  6. É, realmente você tem toda razão. Não tem o mínimo sentido usar daysbetween.
  7. OLá, s3c, Obrigado pela sua análise, realmente como não entendi bem a função e acho que será difícil para mim adaptá-la, vou tentar usar a função do delphi daysBetween(datainicial,datafinal) e fazer aquelas contas do ensino fundamental: tipo divide por 30 (o resto vai ser o número de dias), pega o quociente divide por 12 (o resto é o número de meses) e o quociente será o número de anos. Você acha que dará certo assim?
  8. Prezado Mauro Acho que você poderia proceder assim: 1) Forneça a fonte junto com o seu executável, ou seja coloque dentro da pasta onde estará o seu executãvel na instatalção. 2) Use a função abaixo para verificar se a fonte já está instalada no seu computador Function FonteExiste(Fonte:STring):Boolean; begin with Screen.Fonts do Result := IndexOf(Trim(Fonte)) > 0; end; 3) Use a função copy para copiar oarquivo de sua fonte do diretório onde ela está instalada para o C:\Windows\Fonts, caso a fonte não esteja instalada. Exemplo: Se sua fonte se chama Mauro.ttf Procedure TForm1.Button1Click(Sender:Tobject); begin If FonteExiste('Mauro.ttf') then //Nãofaz nada Else Copy("c:\(local onde está sua fonte"),"c:\Windows\Fonts\Mauro.ttf"); end; observações: 1) o evento está escrito no click do botão,mas seria apenas para você testar, porém normalmente se colocaria no oncreat, você não acha? 2) Estou escrevendo isto do trabalho sem o delphi,sem testar e faz muito tempo que usei isto. Pode ser que exista algum detalhe aí em cima que esteja faltando em relação a funçãocopy, talvez. 3) Com certeza no lugar de C:\(locao onde está sua fonte), vocêdeverá usar algo que identifique onde sua aplicação foi instalada já que na hora de instalar pode ser até que você permita que ele insatale em qualquer diretório. Traduzindo: talvez você deva usar algodo tipo application.exename. Se nãoestiver 100% a galera maravilhosa deste forum certamente vai consertar e ajudar.Pelo meno serve como vzero(ponto de partida) Espero que quebre um galho. Abraços
  9. Prezado Colaboradores peguei uma Procedure(função) dentro desses programas de dicas , que achei muito interessante para calcular o número de anos meses e dias entre duas datas. //A função: --------------------------------------------------------------- Procedure EntreDatas(DataFinal,DataInicial : TDate ; var Anos,Meses,Dias : Integer) ; // // Retorna a diferença em Dias,Meses e Anos entre 2 datas // Function Calcula(Periodo : Integer) : Integer ; var intCont : Integer ; begin intCont := 0 ; Repeat Inc(intCont) ; DataFinal := IncMonth(DataFinal,Periodo * -1) ; Until DataFinal < DataInicial ; DataFinal := IncMonth(DataFinal,Periodo) ; Inc(intCont,-1) ; Result := intCont ; End ; begin if DataFinal <= DataInicial then begin Anos := 0 ; Meses := 0 ; Dias := 0 ; exit ; end; Anos := Calcula(12) ; Meses := Calcula(1) ; Dias := Round(DataFinal - DataInicial) ; end; ---------------------------------------------------------------- Usei num programa e vinha funcionando normalmente. Porém, ao chegar no dia 29/3/2005 e calcular a diferença entre está data e por exemplo 30/03/2005( e também 31/3/2005) a função fornece -1 como diferença entre número de dias entre as datas. Percebi que existe algo falhando quando fazemos diferença entre está data 29 e datas perto delas 30 e 31. Outro exemplo de erro,seria 29/05/2005 e 31/05/2005, neste caso o programa está apresentando 1 dia de diferença. Outro exemplo seria 29/10/2005 e 31/05/2005, que apresenta 1 dia como diferença. Existem outros. Estou usando no clique de um panel da seguinte forma: --------------------------------------------------------------- procedure TfrmDiferenca.PanelCalcularClick(Sender: TObject); Var DataFinal: TDate; DataInicial: TDate; Anos1,Meses1,Dias1: Integer; begin Try If txtDataInicial.Text = '' Then begin MessageBox(handle,'É necessário ter a data inicial validada !','FALTA A DATA INICIAL',MB_IconExclamation); txtDataInicial.SetFocus; abort; end; If txtDataFinal.Text = '' Then begin MessageBox(handle,'É necessário ter a data final validada !','FALTA A DATA FINAL',MB_IconExclamation); txtDataFinal.SetFocus; abort; end; DataFinal:= StrToDate(txtDataFinal.Text); DataInicial:= StrToDate(txtDataInicial.Text); EntreDatas( DataFinal,DataInicial,Anos1,Meses1,Dias1); txtAnos1.Text := IntToStr(anos1); txtMeses1.Text := IntToStr(meses1); txtDias1.Text := IntToStr(dias1); Except If txtDataInicial.Text = '' Then //Não faz nada. Else If txtDataFinal.Text = '' Then //Não faz nada. Else Messagebox(handle,'Um erro inesperado ocorreu.'+#13+ 'Por favor, contate o desenvolvedor do programa informando o erro.','ERRO',MB_IconStop); end; end; --------------------------------------------------------------- Alguém que tenha conhecimanto de funções com datas poderia dizer se há algum erro com a função? Será que a minha chamada a ela está errada? Alguém têm uma outra função que eu poderia usar na minha procedure? Agradeço desde já a atenção. A função foi feita, segundo o programa por Fábio Macedo Garcia Analista Programador - Delphi fabio@copaninfo.com.br Mandei um email para ele mas, não obtive resposta até agora.
  10. Olá,Progr'amador Muito obrigado pela sua ajuda. Ficou tudo bem claro e explicado. Em relação a animação de arquivos copiados tipo a do windows, descobri que devo usar o componete animation. abraços
  11. Tenho um programa que oferece a possibilidade de fazer uma cópia para um disquete. O código do botão que faz a cópia é o seguinte: procedure TfrmCopiasDeSeguranca.cmdCopiarParaDisqueteClick( Sender: TObject); begin Try CopyFile('Aniversariantes1.txt','A:\Aniversariantes1.txt',False); CopyFile('Aniversariantes2.txt','A:\Aniversariantes2.txt',False); CopyFile('Aniversariantes3.txt','A:\Aniversariantes3.txt',False); MessageBox(handle,'As cópias para o disquete foram executadas com sucesso! ','BACKUP',MB_IconInformation); Except MessageBox(handle,'Não foi possível efetuar a cópia.'+#13+#10+'Entre em contato pelo email pcnobre@ig.com.br.','ERRO NO BACKUP',MB_IconStop); end; end; Acontece o seguinte: 1)Se tem disquete no drive ele copia normalmente.(BOM!!!) 2)Se não tem disquete, é claro que ele não copia, porém ele não entra no except, ou seja, ele termina dizendo que houve sucesso na cópia,isto é, ele funciona como se tivesse o disquete. (RUIM!!) As dúvidas: 1) Como poderia sanar isto. Seria com alguma função para verificar se existe disquete no drive A. Qual seria esta função. Se não existe esta função, como faria , no código acima, para fazer caso não exista disquete no drive A,qe a mensagem do except seja dada para o usuário 2)Em quanto é feita a cópia o botão fica como se estivesse pressionado, ou seja, como se o programa não estivesse respondendo. Como é que se coloca aquela animação, do windows, de arquivos sendo copiados. Alguém poderia me ensinar a colocar isto no código acima Agradeço antecipadamente qualquer ajuda.
  12. Olá s3c, fazendo o teste que você sugeriu... Colocando o código após ShowWindows nos dois "eventos", mostrar e não mostrar, funciona perfeitamente. Confirma para mim se numa linguagem não técnica o que aconteceu foi o seguinte: "Quando você usou Shell_Notify(NIM_Add,@NI), colocando o ícone no tray acabou dando uma "cutucada" grande, que era o que precisava. Como o ícone não pode aparecer aí entra o Shell_NotifyIcon(NIM_Delete, @NI); para retirá-lo de lá." Seria mais ou menos isso, na linguagem da cutucada? Brigadão por mais essa s3c.
  13. Olá, s3c Os códigos são os seguinte: Ocultar o relógio: procedure TfrmRelogio.mnuNaoMostrarWindowsClick(Sender: TObject); begin reg.rootkey:=HKEY_LOCAL_MACHINE; reg.OpenKey('\SOFTWARE\NOBRE INFORMÁTICA\RELÓGIO',True); reg.WriteString('Mostrar Relógio do Windows','Não'); frmRelogio.mnuMostrarWindows.Visible:= True; frmRelogio.mnuNaoMostrarWindows.Visible:= False; //O código abaixo é o principal para ocultar o relógio do windows. ShowWindow( FindWindowEx(FindWindowEx( FindWindow('Shell_TrayWnd', nil), HWND(0), 'TrayNotifyWnd', nil), HWND(0), 'TrayClockWClass', nil), Sw_Hide); FillChar(NI,Sizeof(NI),0); NI.cbsize:= SizeOf(NI); Shell_NotifyIcon(NIM_Delete,@NI); end; Mostrar o relógio: procedure TfrmRelogio.mnuMostrarWindowsClick(Sender: TObject); begin reg.rootkey:=HKEY_LOCAL_MACHINE; reg.OpenKey('\SOFTWARE\NOBRE INFORMÁTICA\RELÓGIO',True); reg.WriteString('Mostrar Relógio do Windows','Sim'); frmRelogio.mnuMostrarWindows.Visible:= False; frmRelogio.mnuNaoMostrarWindows.Visible:= True; //O código abaixo é o principal para mostrar o relógio do windows. ShowWindow( FindWindowEx(FindWindowEx( FindWindow('Shell_TrayWnd', nil), HWND(0), 'TrayNotifyWnd', nil), HWND(0), 'TrayClockWClass', nil), Sw_Show); FillChar(NI,Sizeof(NI),0); NI.cbsize:= SizeOf(NI); Shell_NotifyIcon(NIM_Delete,@NI); end; NI: TNotifyIconData; se encontra no Var antes de implementation
  14. s3c, Testei, mas não funcionou. As vezes o mostrar o relógio fuciona, ou seja a "catucada" funciona, mas o esconder nunca funcionou. Mesmo assim muito obrigado.
  15. Olá, s3c, estava na esperança de você ler o tópico. Isto eu nunca saberia fazer. Como sempre, você é dos que sempre resolvem os meus grandes "abacaxis". Muito obrigado,vou testar. A propósito para mostrar também usarei: NI.cbSize := SizeOf(NI); Shell_NotifyIcon(NIM_Delete, @NI); É SizeOf e NIM_DELETE mesmo ou tem outro equivalente. Estou perguntando aqui no trabalho sem testar.
  16. Olá Graymalkin, Quando disse que ele não volta imediatamente não é quando você clica para sumir e imediatamente clica para aparecer e sim quando você clica para sumir, clica na seta(creio que é necessário ter muitos ícones no try para isso) ajeita os ícones e aí sim faz o relógio aparecer. Neste caso ele não aparece de imediato. Fazer o quê né? Vamos ver se alguém já mexeu com isso e me dá uma dica! Mesmo assim obrigado por analisar o problema. Abraços
  17. Prezados Colegas, Tenho um programinha,um relógio deste imitando digital,para ficar no desktop, que tem como uma das opções, esconder ou fazer aparecer o relógio do windows. Para quem não conhece é quer testar é o seguinte(este código não atua no registro diretamente): Para ocultar o relógio... ShowWindow( FindWindowEx(FindWindowEx( FindWindow('Shell_TrayWnd', nil), HWND(0), 'TrayNotifyWnd', nil), HWND(0), 'TrayClockWClass', nil), Sw_Hide); Para mostrar o relógio... ShowWindow( FindWindowEx(FindWindowEx( FindWindow('Shell_TrayWnd', nil), HWND(0), 'TrayNotifyWnd', nil), HWND(0), 'TrayClockWClass', nil), Sw_Show); Tenho o seguinte problema: Quando escondo o relógio ele desaparece(tudo bem) só que ao invés dos ícones do tray se ajustarem e ocuparem logo o espaço que o relógio ocupava fica um buraco. É preciso clicar na setinha(XP) de mostrar ícones escondidos do tray para que o espaço em branco fique ocupado. A mesma coisa quando faço o relógio aparecer(aí é pior). Ele aparece,mas apenas depois de clicar na seta do tray. Na realidade o que preciso(acho e talvez) é de algum código tipo setfocus para está seta. Alguma código que rearume os ícones no tray. É bem provável que este código use alguma API do windows. Não tenho a mínima idéia de qual. Alguém pode me ajudar. Se alguém quiser me ajudar e ver na prática, coloque dois botões num form e cole cada código acima num botão e veja o efeito.
  18. Prezado Grymalkin, É isso mesmo que eu queria. Funcionou redondinho. Adaptei para centralizar também na vertical e ficou ótimo. Muito obrigado a você e de tabela ao s3c, pela sugestão.
  19. A algum tempo atrás, postei algumas dúvidas(3) sobre o componente StringGrid, para um projeto de horário, que estava desenvolvendo. Uma delas dizia respeito a centralização na célula, que não é possível. A pergunta que fiz na ocasião foi a seguinte: As strings que são usadas nas células não têm aparentemente nenhuma propriedade para serem alinhadas dentro delas. A pergunta: Existe como centralizar dentro das células? Alguém sabe o código? Ou este é mais um componente que não centraliza, já que o simples edit não centraliza. Um colega colaborador, s3c, me respondeu: Diretamente creio que não porque Cells[i,j] simplesmente retorna uma string, mas no evento onDrawCell você tem o Rect que é o TRect do Canvas daquela célula mais o ACol e ARow que identificam qual célula está sendo pintada e com isto creio que dê p/ centralizá-la. Não sei como fazer isto. Alguém poderia me ajudar com o código? O grid possui 21 linhas e 8 colunas. Ficaria muito grato.
  20. XdogX, fiz mas não deu certo. Acho que dei sorte: mudei a propriedade anssidraing do componente(para false), que vem como true como padrão e parece que deu certo.Nem sei o que está propriedade faz com precisão, mas parece que deu certo. Obrigado pela dica Xdogx
  21. SecretPanel é um componente da biblioteca RXLib (RXTools). Ele serve para você ter um texto rolando do tipo desses que mostram equipe de desenvolvimento, agradecimentos etc... Tenho um programa que possui um form(frmAgradecimentos) que possui um componente desse (sp). Acontece que em um computador que fiz o teste aleatoriamente(sem fechar o programa e chamando o form, fechando e chamando o form) o texto para de rolar, ele trava. As vezes logo que aparece o form o texto trava(as vezes quando o mouse passa em cima do form) e o programa trava. As vezes o texto não trava mas as letras aparecem com se fossem com a fonte diferente da original. O curioso é que no computador onde fiz o programa(512mb ram) isto não acontece(so aconteceu quando tirei o sp.active:= False do evento onclose e o coloquei antes da chamada ao panel). Será que tem a ver com memória? No do teste tem 196mb de ram. É UMA LOUCURA. Alguém que já trabalhou com este componente poderia me dar uma ajuda? O código é o seguinte: procedure TfrmAgradecimentos.FormShow(Sender: TObject); begin frmAgradecimentos.BringToFront; frmAgradecimentos.Left:= Screen.Width div 2 - frmAgradecimentos.Width div 2; frmAgradecimentos.Top:= Screen.Height div 2 - frmAgradecimentos.Height div 2; AnimateWindow(Handle,2000,AW_CENTER); sp.Active:= True;// rola o texto end procedure TfrmAgradecimentos.FormClose(Sender: TObject; var Action: TCloseAction); begin sp.Active:= False;// para de rolar o texto end; Por via das dúvidas coloquei também... procedure TfrmAgradecimentos.FormCreate(Sender: TObject); begin //******************************************************** DoubleBuffered:=True; sp.DoubleBuffered:=True; //***************************************************** end; Já tentei de tudo, não tenho mais idéia do que fazer.
  22. Muito obrigado pela explicação, s3c. Ficou claro!
  23. Olá, s3c Entendi o código, mas o que é na realidade um MUTEX?
  24. O código abaixo (colocado no OnCreat) resolveu o problema: DoubleBuffered:=True; // Caso o objeto esteje no Form. Obrigado a quem se dispôs a ler.
×
×
  • Criar Novo...