Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. Amanda, voce instalou a versão que está disponível no desenvolvedor (OverByte)? baixando "ICS V6 for Delphi 7 and 2006 Beta (Nov 11, 2006)", após descompactar, a pasta Delphi\Vc32 tem o pacote OverbyteIcsDel70.dpk, que deve ser aberto no Delphi para proceder à compilação e instalação dos componentes.
  2. Yugi Moto, primeiramente, corrija o código pois você esqueceu do Ini.Free e colocou o create do Ini dentro do try - deve ser antes. Fica assim procedure TForm1.ImageButton1Click(Sender: TObject); var Ini: tinifile; CommandLine :string; begin Ini := TiniFile.create('config.ini'); try CommandLine := Format('demo.exe @MY_ASS@ _server%s', [Ini.readstring('site', 'patch', 'about:Erro')]); WinExec(Pchar(CommandLine), sw_ShowNormal); finally Ini.Free; end; end; me explique o seguinte:1) você debugou o programa como lhe sugeri para que você consiga visualizar o conteúdo da string CommandLine e avaliar se realmente ela não está carregando os dados do arquivo ini? 2) O program demo.exe é um programa seu ou de terceiro? 3) quantos e quais os parâmetros esperados pelo programa demo?
  3. Alessandro, você adicionou este campo de que forma? Adicionou na sua tabela utilizando uma query ou um programa como o Database Desktop ou Database Explorer? Ou teria adicionado apenas em design-time no seu componente TTable? Se for este último, provavelmente você criou um campo calculado (default) e, neste caso, ele não acusaria qualquer erro e também não manteria o valor, já que a atribuição de um valor deve lhe ser feita no evento OnCalcFields. Abraços
  4. Micheus

    Quickreport

    Qual o tipo de banda que você está utilizando?Quando você coloca um TQRBand deve definir seu tipo (propriedade BandType) para rbDetail e é nesta banda que você vai colocar os componentes TQRDB... para mostrar os dados proveniente do dataset.
  5. roberto_br, dá uma olhada neste post (Doom9's Forum); Veja o exemplo (bem completo) no 5º post (Sirber - 17th April 2006, 04:23); Não é o código do programa completo, mas de um procedimento que extrai todas as informações de um arquivo. Aparentemente o cara criou uma estrutura (record ou classe) com o nome setting, o qual você verá referência a seus campos, mas dará para entender como utilizar/buscar as informações. Abraços
  6. Micheus

    Problemas Com Edit

    Eduardo, vamos exclarecer melhor esses termos? Quando você fala "puxando um valor de um grid" está se referindo a um TDBGrid ou TStringGrid? Quando fala "para um edit" está falando de um TEdit ou TDBEdit? São coisas diferentes e que podem influenciar numa resposta. Eu sei que é possível colocar um DBLookupComboBox dentro de um DBGrid, mas nunca utilizei. Então, se você tem como acessar este lookup, ele deve ter, assim como o componente DBLookup, uma propriedade ListSource de onde os dados vem. Se tiver e você consguir acesso ao componente no grid, talvez você possa fazer algo assim: Edit1.Text := DBLookupComboBox1.ListSource.DataSet.FieldByName(NOME_DO_CAMPO).AsString; Abraços
  7. Ivano, essa cor do fonte, você muda em que momento? Na criação do form ou em outro ponto? A cor alterada deve ser utilizada para todos os itens ou você pretende mudar apenas alguns? Normalmente alterar a cor da font não deveria influienciar na cor do fundo, já que para isso você deveria alterar tabmém a propriedade tvp.Canvas.Brush.Color, e você não mexe nela certo?! Abraços
  8. Eduardo, veja se seria algo assim. Observe que o GroupBox não possui opção de Scroll, logo adicionar mais edit's do que o tamanho do group suporta, resultará em edit's escondidos. Assim, para resolver este problema e garantir que você possa adicionar edit's infinitamente, você sugiro adicionar ao GroupBox um ScrollBox, com as propriedades Align = alClient e BorderStyle = bsNone. O que estamos fazendo é criar os Edit's tendo como Owner o GroupBox (isso facilita a nomeação dos edit's, mas poderia ser seu form - Self), e para que eles sejam mostrados dentro do GroupBox, definimos este como Parent: procedure TForm1.Button1Click(Sender: TObject); begin with TEdit.Create(GroupBox1) do begin Parent := ScrollBox1; Name := Format('GBEdit%d', [GroupBox1.ComponentCount +1]); Text := 'Edit ' +Name; Left := 8; Top := (Height +4) *GroupBox1.ComponentCount; end; end; Abraços
  9. - Instale o componente SyTray (muito simples e fácil de utilizar); - Adicione ele ao seu form principal; - Coloque no seu form principal um TPopUpMenu com opções para mostrar o form, encerrar o programa, ...; - Associe este popup menu a respectiva propriedade no componente SysTray; Para evitar que ao clicar no X da sua janela, o seu programa seja encerrado, sugiro a você que utilizar uma variável (p.e. definida na cláusula private do seu form) para controlar quando você quer realmente encerrar o programa. Seria mais ou menos algo assim: // inicializa variável de controle no OnCreate do form procedure TForm1.Form1Create(Sender :TObject); begin IndFechaApp := False; ... end; // no evento OnClose, só fecha se a variável permitir procedure TForm1.Form1Close(Sender :TObject; CanClose :Boolean); begin CanClose := IndFechaApp; // se não for permitido fechar, minimizamos na tray if not CanClose then Application.Minimize; end; // no evento OnClick do popup menu, da opção Sair, inicializa a variável com true viabilizando a sua saída procedure TForm1.Popupmenuitem1Click(Sender :TObject); begin ... IndFechaApp := True; Close; end; Com isto, ao clicar no X ou no minimizar, seu programa irá pra a Tray. Abraços
  10. Acho que poderia ser assim mesmo. Isso implica em mudanças mais "drástricas". O componente TMessenger faz uso de MailSlot (msdn). Para implementar isto, teríamos que partir para outras abordagens, devido a restrição no tamanho da mensagem que pode ser trocada entre os computadores:"To send messages that are larger than 424 bytes between computers, use named pipes or Windows Sockets instead." (veja no link do msdn acima) Enviei para o do GMail Abraços
  11. É que não acabei o demo e faltou alterar isso. :D estou passando amanhã demanhã, o código tá lá no meu trabalho. beleza. você quer que apareça mais alguma coisa? Eu chequei a pensar em por o nome da máquina entre parenteses. Como me empouguei com o negócio, estou pensando em mais um monte de coisa. :D Abraços
  12. fajo, faz um teste com este demo que fiz hoje. Aparentemente, não há qualquer problema relacionado ao fato de o programa não estar com o foco. Quando minimizado: - toca o Notify.wav ao entrar um usuário na rede; - abre a tela de mensagem, para resposta, ao receber uma mensagem de outro usuário; Para colocar o programa na Tray eu utilizei o componente SysTray. Fiz uma alteração no código do TMessenger 2.0, de modo a receber na lista, além do computador (necessário para a comunicação), o nome do usuário que encontra-se logado nesta máquina. Se o demo estiver fazendo o que você estava precisando, provavelmente você não terá que esquentar a cabeça com aquele outro post sobre usuários logados na rede. Então, teste ele e, se estiver Ok, manda seu mail por PM que lhe envio os fontes. Abraços
  13. Que pena, mas o que não funcionou? Como você continua utilizando a função NetWkstaUserEnum (também no exemplo do Torry's), vale o que está lá no remarks do msdn (dá uma olhada naquele link que postei):Windows 2000: If you call this function on a domain controller that is running Active Directory, access is allowed or denied based on the access control list (ACL) for the securable object. Windows NT: Only members of the Administrators local group can successfully execute NetWkstaUserEnum function both locally and on a remote server. só por esses dois comentários, é possível ver que há a possibilidade de você não obter o resultado da função. Abraços
  14. Yugi Moto, sobre o uso de try..finally..end: você só pode usar o finally para liberar a classe com segurança se você antes alocou uma instância para ela. Imagine que se colocando o create da classe dentro do try e ocorrer um erro justamente neste método, não haverá uma instância alocada para o mesmo e, portando, você estará sugeito a erros ao tentar liberá-la no finally. A regra é: aloque uma instância para a classe e, daí sim, se ocorrer algum erro ou não, ao acessar ele, você libera ao final Ini := TiniFile.create('config/config.ini'); try // faz alguma coisa com o arquivo ini finally Ini.Free; end; O que é que você pretende com isto? Name := 'Dummy Text'; TempName := PChar(Name); GetWindowText(Handle, TempName, Length(Name)); Name := PChar(TempName); Quanto a parte do WinExec, sugiro que você faça da seguinte forma:var CommandLine :string; ... begin ... CommandLine := Format('demo.exe @MY_ASS@ _server%s', [Ini.readstring('site', 'patch', 'about:Erro')]); WinExec(PChar(CommandLine), sw_ShowNormal); ... end;usando a função format, você substituirá o %s (variável string) pelo valor passado no array. Assim, você poderá colocar um break-point na montagem do texto CommandLine e executando passo-a-passo (F8), visualizar seu conteúdo (CTLR+F7) sobre o nome da variável. Abraços
  15. Pirambu!, como mensionei antes, funcionaria bem com o FindKey caso você tivesse a ordem dos campos alterada no seu índice primário. Mas há outras opções sim, você pode: - criar um índice secundário, onde o primeiro campo do índice seja seu CodPed e seleciná-lo ele via propriedade IndexFieldNames ou IndexName; - o mais fácil para a situação atual, seria utilizar a função Locate deste modo: Locate('CodPed', StrToInt(Dbedit1.text), []); - assim você faz uma busca pelo campo exato. Não utilizando a query, o ideal seria mesmo utilizar índices. Quanto a "uma maneira mais simples", acredito que você pudesse manter um componente TQuery exclusivo para esta função. Então, você adiciona o SQL na respectiva propriedade do componente e no seu código teria apenas: With Query1 do begin Close; Params.ParamByName('ID').Values := StrToInt(Dbedit1.text); Open; end; if query1.IsEmpty then nâo é nada complicado e é a melhor forma de verificar a existência de dados no banco (utilizar Query) Abraços
  16. fajo, copiei seu código e realmente não lista nada, nem ocorre erro como eu sugerí no post anterior.Entretanto, conferindo no msdn os parâmetros da função, observei que o primeiro parâmetro só pode ter os seguintes valores: RESOURCE_CONNECTED - All currently connected resources (the dwUsage parameter is ignored). RESOURCE_GLOBALNET - All resources on the network. RESOURCE_REMEMBERED - All remembered (persistent) connections (the dwUsage parameter is ignored). These connections may or may not currently be connected. Logo, pelo comentário no código, o 1º parâmetro dever ser RESOURCE_CONNECTED e não RESOURCE_CONTEXT. Fazendo a alteração, o que obtive foi a relação dos path's dos discos mapeados na minha máquina, ou seja, pastas compartilhadas em outros micros da rede as quais eu mapei. Acho que não é isto que você está procurando. Fuçando aqui e ali, lá no msdn, cheguei na função NetWkstaUserEnum (link), até pensei em implementar algo, mas o Google tá ai para que, né? :D Tem um exemplo prontinho na página do Torry's. Acho que com ele você consegue ajustar o seu programa. Abraços
  17. Micheus

    Me Ajudem Amigos

    Esse "erro mudo" seria um "Erro de compilação". Ocorre quando você declara o procedimento na definição da classe (lá no type ...), mas não coloca o código no corpo do programa, tipo:implementation ... procedure TTForm.Favoritos(str : TStrings; const caminho: string); var searchrec : TSearchrec; path, dir, arquivo : string; Buffer : array[0..2047] of Char; found : Integer; begin ... end;
  18. Utilizando componentes dataware, você não irá ter os campos vazios - eles só ficam neste estado quando você utiliza Insert ou Append (isso sem atribuição de valores padrão). Mesmo que você utilize uma função para limpar os DBEdit's, tipo DBEdit1.Text := '', quando você mover o foco para dentro do componente o texto correspondente ao campo ao qual ele está vinculado será apresentado.A mensagem você consegue acrescentando no evento AfterPost da sua ZTable um: ShowMessage('Cadastro OK'); A princípio (vai que alguém já conseguiu - eu não), não daria para implementar isto num DBEdit. Ainda que utilizando Edit's, o que você quer não é impossível, mas é meio chato de gerenciar, já que:- digitanto "para a frente", ao digitar "carl" você quer posicionar no primeiro nome similar (p.e. "carlos") e auto-completar os outros dados, mas; - digitanto "para trás" (back-space), ao apagar "os" e ficando novamente com "carl", você quer que ele apague os dados auto-completados (o oposto da primeira situação). Para fazer o que você quer, eu acredito que a melhor opção seria utilizar TEdit's. Abraços
  19. Robson, caso ainda não tenha uma solução, vamos tentar encontrar uma...Se o que você deseja fazer é movê-los em run-time, você deverá criar métodos para manipular mensagens como OnMouseDown e OnMouseMove. Uma opção seria na criação do componente você atribuí-los ao mesmo. Com esses métodos você conseguirá calcular a nova posição do componente. É o mesmo princípio que o colega Erso já postou aqui antes. Abraços
  20. Pirambu!, nestes casos, a melhor opção seria você ter seu índice com esta sequência: CodPed, Codigo1; pois facilita muitos processos, principalmente se você liga a tabela de itens à de pedidos, via MasterSource - aonde você lança o pedido, e a partir dele, lança os itens. Não teria como você estar lançando um item para um pedido que não existe. De qualquer modo, partindo da estrutura que você mostrou aqui, na minha opnião, você teria que utilizar uma query para veficar a existencia do pedido. Porque via FindKey, você terá que utilizar os campos existentes na chave, tipo: FindKey(VarArrayOf([Codigo1, CodPed])), ou seja, você tem que informar um código do item, que eventualmente pode nem existir (por ter sido excluído) - o que não garante uma resposta correta. Com a chave no formato "correto", você poderia utilizar FindKey apenas no primeiro campo CodPed: FindKey(CodPed); que, se não estou enganado, já funcionaria. Abraços
  21. Isso é que é explicação Churc... :D Uma opção que utilizo, quando o processo é automatizado utilizando uma função para extrair cada campo levando em conta apenas o delimitador, é concatenar um delimitador ao final da string: ... Readln(Txt, Entrada); Entrada := Entrada +';'; TabNOMECampo1.AsString := GetParam(Entrada, 1); TabNOMECampo2.AsString := GetParam(Entrada, 2); ... Abraços
  22. Para ajudar com o exemplo, informe o nome das duas Keys e para cada uma, os campos que fazem parte dela na ordem em que estão definidos na chave.
  23. Já verificou se dwResult não está retornando algo diferente de NO_ERROR? Pões um break-point na linha: if (dwResult <> NO_ERROR) then e, quando ele parar nela, executa passo-a-passo (F8) para verificar se ele não está saindo da procedure pelo Exit. Como disse antes, só vai obter sucesso se você estiver logado com uma conta de administrador.
  24. Acho que agora entendi, veja se é isso: Chegando as mensagens, pelos eventos OnNewLine e OnNewMemo, a janela do seu programa (frmReceive) é apresentada sem problemas - certo? e olhando novamente seu 2º post, acho que a questão é o fato de quando o programa está minimizado (na tray) a atualização da lista de usuários com o programa rodando não é atualizada. Seria isto?Se for, repetindo a sugestão anterior, você tem algum processamento para o evento OnUserListChange? Já confirmou que ele não ocorre? É que não tem como você manter o foco na sua aplicação minimizada. Ela está lá digamos que "em stand-by" esperando algum evento para executar alguma função. Se o evento não ocorre, ela não vai executar nada. E então talvez tenhamos que verificar em quem é responsável pela geração deste evento para, quem sabe, resolver o problema. Abraços
  25. Apenas o administrador pode obter esta lista.Utilize a funcão NetUserEnum - link Torry's
×
×
  • Criar Novo...