Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. A menos que você esteja utilizando impressão direta para a impressora, sempre que a impressão do documento for concluída haverá o "eject" da página. O que resulta que uma nova impressão sempre começará em uma nova página. Se o que você fala é que após concluída a impressão, a impressora avança, mais ou menos, meia página, pode ser porque esteja habilitada a função Auto Tear-Off. Se for o caso, quando é enviada uma nova impressão, a impressora puxa o papel devolta para o início da página e imprime. Dê uma olhada no manual como desabilitar esta função. (se não tiver o manual, baixe com este link = http://www.suporte-epson.com.br/drivers/ar...USER_MANUAL.EXE, e veja páginas 2-19 a 2-23) A parte do começar no meio da página, se não for pelo motivo acima, talvez possa ser por problemas na configuração da sua página de impressao. Baseado no que coloquei anteriormente, qualquer "gerador" similar ao QuickReport resultará neste efeito. []s
  2. Complementando... Por que testar se o valor decimal é maior que 0.5? Porque o TDateTime é um Double, onde a parte inteira armazena a data e a parte fracionária armazena as horas. Então, 0.5 equivale à metade de 24:00h. Deste modo se for maior que 0.5, significa que a hora já passou do meio dia. []s
  3. Micheus

    Qreport Expression

    Eninho, ou você pode simplesmente utilizar apenas o QRExpr e definir a propriedade Mask para "R$ ##0.00" (sem as áspas é claro). []s
  4. Ivano, apenas umas dicas... no objeto TreeNode há a propriedade Level que determina o nível na hierarquia aonde o nó se encontra - veja se era a isso que você se referia. aparentemente rg é um ponteiro para inteiro, certo? Observe que a propriedade Data é do tipo pointer. Se você deseja armazenar uma estrutura simples, como um integer nesta propriedade. Não se dê a o trabalho de alocar memória para isto, desde que a informação caiba no SizeOf(Pointer) -> 4 bytes. As coisas podem, então, serem mais simples: - Para escrever o conteúdo faça apenas: Arvore.Selected.Parent.Data := Pointer(NodePaiOri); - Para ler: NodePaiOri := LongInt(Arvore.Selected.Parent.Data);
  5. Progr'amador, vou continuar "vendendo o meu peixe"...Em muitos casos vê-se códigos confusos só pelo uso da concatenação. Quando há parametrização a leitura também fica mais agradável e compreensível. É o que, também, vejo de vantagem no uso de parâmetros. No caso do ADO, eu diria, apenas, que o caminho é apenas mais "comprido", mas também existe: ADOQuery1.Parameters.ParamByName('NOME_CAMPO').Value Com a exceção de que não há o AsString, AsInteger, ..., apenas Value (variant) Já o Access é mesmo um caso aparte. Só nele vi o delimitador de datas ser um #. Valeu.
  6. É por essas e outras que sempre inssisto no uso de parâmetros e não concatenação (de qualque tipo). Se fosse escrito deste modo, não seria necessário preocupar-se com que tipo de aspas o banco utiliza (simples ou dupla), o mesmo vale para datas (uns utilizam aspas, outros sustenidos...): with DMRelatos.QGeral_01 do begin Close; SQL.Clear; SQL.Add('SELECT * FROM PROTOCOLO WHERE TITULONATUREZAABR = :NATUREZA'); ParamByName('NATUREZA').AsString := 'DMI'; Open; end; []s
  7. Amarildo, já que você utiliza paradox e um select, outra alternativa é obter o substring direto na instrução SQL. Ex.: Obter uma fração de 10 caracteres (no máximo) do campo NOM_CLIENTE, sendo que o nome da coluna retornada será chamada NOM_CLIENTE10 (este fica a seu critério, só não deve ser duplicado) SELECT SUBSTRING(NOM_CLIENTE from 1 for 10) AS NOM_CLIENTE10 FROM CLIENTE.db []s
  8. siam, já que não tem evento, você poderia dizer como está obtendo tal informação? Seria através de um gancho (Hook) de teclado? Talvez isso ajude no seu auxílio. []s
  9. Micheus

    Loop Infinito :(

    hencker, passe o Next para dentro do begin...end do while DMMigrator.TNovaDISTRIBUIDOR_ANOTACAO.Value := DMMigrator.TAntigaDISTRIBUIDOR_ANOTACAO.Value; DMMigrator.TNova.ApplyUpdates; DMMigrator.TAntiga.Next; // **** <=== AQUI end; end; Uma dica: Se os campos da tabela de origem e de destino tem exatamente o memo nome, simplifique um pouco o código e minimize a digitação (tem campo pra caramba, ufa!!!) utilizando for com a propriedade Fields e with...do procedure TfrmPrincipal.BBMigrarClick(Sender: TObject); var Idx :Integer; Field :TField; begin with DMMigrator do begin TAntiga.First; while not TAntiga.Eof do begin TNova.Append; for Idx := 0 to TAntiga.Fields.Count -1 do begin Field := TNova.FindField(TAntiga.Fields[Idx].FieldName); if Assigned(Field) then Field.Assign(TAntiga.Fields[Idx]); end; TNova.ApplyUpdates; TAntiga.Next; end; end; end; []s
  10. Ivano, agora você diz que se um nó existe na lista da direita, mas não existe na da esquerda, você quer copiar ele para a lista da esquerda??? :blink: Afinal, você quer mover apenas da esquerda para a direita ou em qualquer direção? Acho que resolvida esta questão, a resolução das outras dúvidas fica mais fácil. É esse endereço vai ter que ser o texto do item, mas respeitando a hierarquia, pelo que você já citou antes, porque eventualmente se você tiver itens com mesmo nome em posições diferentes da árvore, vai virar uma bagunça.
  11. Micheus

    Print

    M@tEuS, são TEdit's mesmo, você não grava as informações numa tabela? Porque se os dados forem para uma tabela, você pode dar uma olhada nesta dica do Progr'amador - link.Mas, ser forem só dados digitados na tela a serem impressos, então fica só um pouco diferente. Resolvi adicionar o exemplo e tutorial na sessão Tutoriais e Dicas - veja link Veja se era isso que você precisava. []s
  12. O objetivo deste modesto tutorial é dar uma idéia de como imprimir qualquer texto que não seja obtido de uma base de dados, por ex.: simples Edits em form's. Ao final do tutorial tem o link para download do exemplo. Desenhando o Relatório 1) Adicione um form ao seu projeto o qual estará seu relatório. Dê um nome ao form, tipo RelImprimeEdit; 2) Da paleta do Quickreport adicione um componente QuickRep (o 1º da lista) e posicioneo no canto superior esquerdo para facilitar o trabalho de desenho. Como você não iremos obter as informações de uma tabela, mas sim iremos "prencher" o relatório utilizando de labels, defina a propriedade PrintIfEmpty para TRUE; 3) Dê um duplo click na "folha" branca que apareceu (QuickRep) e configure as informações do papel (tamanho e posicionamento: Portrait ou Landscape), defina as margens (observe que a unidade de medida deve estar em MM), defina o tamanho padrão das letras (será utilizado para cada componente que você adicionar ao relatório), defina as bandas que você quer no relatório (header, title, footer, ...). Em meu exemplo adicionei Page header, Detail e Page footer; 4) Estas bandas adicionadas ao relatório podem ser ajustadas em sua altura. Então ajuste conforme necessário; 5) Para colocar um texto de título na banda PageHeader, vá na paleta do QuickReport localize o componente QRLabel (passando o mouse sobre os componentes da paleta você vê no hint o nome dos componentes, caso tenha dúvida). Clique nele para selecionar e a seguir clique na banda PageHeader. Ajuste posição e faça os ajustes das propriedades que você necessitar modificar. 6) Para imprimir o conteúdo dos Edit's que você deseja, você também utilizará os componentes QRLabel (eventualmente um QRMemo ou QRRichEdit). Entretando, estes QRLabel's são adicionados na banda Detail. Coloque-os de acordo com sua necessidade. Por ex. um para o label e outro para receber o valor; 7) Para adicionar o nº de página, data/hora do sistema no rodapé da página (PageFooter), você utiliza o componente QRSysData e altera sua propriedade Data (qrsDateTime, qrsPageNumber, ...) Particularmente eu prefiro passar as informações por parâmetro para os relatórios, então vou seguir desta forma. Mas, nada impede que você acesse diretamente os componentes que foram adicionados ao form do relatório a partir do form que chama a impressão. Preparando o relatório para mostrar os dados Na sessão Public da declaração do form do relatório (RelImprimeEdit), defina uma procedure que conterá todos os parâmetros a serem passados. Em meu exemplo teremos apenas doi parâmetros: Nome e Endereço; type TRelImprimeEdit = class(TForm) ... public procedure Imprime(Nome, Endereco :string); end; implementation ... procedure TRelImprimeEdit.Imprime(Nome, Endereco :string); begin // inicializa os QRLabel's correspondentes aos campos informados QRLNome.Caption := Nome; QRLEndereco.Caption := Endereco; // Aqui o relatório será apresentado na tela, para visualizar e imprimir QuickRep1.Preview; end; Chamando o relatório para mostrar os dados No form que chama a impressão (RelImprimeEdit), utilizei um botão para isto. Então, no evento OnClick do mesmo adicionamos o código que cria/destroi o form do relatório dinamicamente: procedure TFrmMain.Button1Click(Sender: TObject); begin RelImprimeEdit := TRelImprimeEdit.Create(Self); try RelImprimeEdit.Imprime(Edit1.Text, Edit2.Text); finally RelImprimeEdit.Free; end; end; Como criamos o relatório dinamicamente, devemos remover o mesmo da auto-criação. Para isso, no menu principal do Delphi, vá em Projects->Options e na guia Form localize e remova o form RelImprimeEdit da caixa Auto-create forms Download do exemplo - link (Relatórios\ImprimeEdit.zip)
  13. Se são iguais, mas você quer copiar apenas um nó de cada vez, então você quer fazer como?Supondo: +- Pai 1 | +- Filho 1 | | +- Neto 1 | | | L- Bisneto 1 | | L- Neto 2 | L- Filho 2 +- Pai 2 | +- Filho 1 | L- Neto 1 | +- Filho 2 | | L- Neto 1 | | +- Bisneto 1 | | L- Bisneto 2 +- Pai 3 L- Filho 1 +- Neto 1 L- Neto 21) Estando selecinado Bisneto 1 (Pai 1\Filho 1\Neto 1), você quer copiar para a outra árvore o Bisneto 1 e seus predecessores (Pai 1, Filho 1 e Neto 1)? 2) Se estiver selecionado Neto 1 (Pai 2\Filho 2), você quer copiar para a outra árvore o Neto 1 e seus predecessores (Pai 2\Filho 2) apenas, ou também seus sucessores (Bisneto 1 e Bisneto 2)?
  14. Micheus

    Ajuda Com Ini

    VDLR, vamos sincronizar as idéias. - você está com um erro de compilação? Qual? - esta linha com certeza resulta em problemas: IBContrSMS.DatabaseName :='Phoenix2:\VDLR - Controle SMS\BDados\BDSMS.GDB'+URL; Note que você está concatenando o valor de URL, lido do arquivo ini com o caminho fixo (texto). Deveria ficar deste modo: IBContrSMS.DatabaseName := URL; - em run-time você está adicionando linhas a Params, sendo que se você colocou algo nesta propriedade em design-time poderá ter erros também. Então o correto é que você limpe seu conteúdo antes de prenchê-lo: IBContrSMS.Params.Clear; Segue uma sugestão de como esta parte de leitura e gravção poderiam ficar:procedure TFRlembrdoc.FormCreate(Sender: TObject); Var url,usr,pws : String; begin Ler_Configuracao(Url,Usr,pws); IBContrSMS.Params.Clear; // *** limpa qualquer informação que você tenha colocado em design-time IBContrSMS.Params.Add('user_name='+Usr); IBContrSMS.params.Add('password='+PWS); IBContrSMS.DatabaseName := URL; IBContrSMS.Open; end; procedure TFRlembrdoc.Gravar_Configuracao(Url, Usr, pws : String); var BDSMS :TIniFile; begin BDSMS := TIniFile.Create(ExtractFilePath(Application.ExeName) + '\Database.ini'); try BDSMS.WriteString('Database', 'Local', URL); BDSMS.WriteString('Database', 'user_name', USR); BDSMS.WriteString('Database', 'password', PWS); finally BDSMS.Free; end; end; procedure TFRlembrdoc.Ler_Configuracao(var Url, Usr, Pws: String); var BDSMS :TIniFile; IniFile :String; begin // inicializa com os valores default URL := '\\Phoenix2\C\VDL - Controle SMS\BDados\BDSMS.GDB'; USR := 'SYSDBA'; PWS := 'masterkey'; // monta nome do arquivo ini com sua localização (path) IniFile := ExtractFilePath(Application.ExeName) + '\Database.ini'; if FileExists(IniFile) then begin BDSMS := TIniFile.Create(IniFile); try URL := BDSMS.ReadString('Database', 'Local', URL); USR := BDSMS.ReadString('Database', 'user_name', USR); PWS := BDSMS.ReadString('Database', 'password', PWS); finally BDSMS.Free; end; end else // isso provavelmente ocorrerar apenas uma única vez Gravar_Configuracao(Url, Usr, pws); end;Espero não ter errado nada ;) Gostaria de alertá-lo para o fato de que não é prática correta armazenar, desta forma, as informações do usuário (usuário e senha). Se você pretende, manter apenas o uso do usuário e senha padrão (SYSDBA e Masterkey), ou seja, não haverá tela de login e controles de acesso, seria conveniente que você os definisse apenas em design-time. Apenas o servidor/banco (url) poderia ser armazenado no arquivo ini sem maiores restrições. Se você levar em consideração este último comentário, deverão ser feitos os respectivos ajustes no código de gravação e leitura do aquivo ini. []s p.s. No post que lhe falei sobre o break-point, esqueci de lhe dizer como continuar a execução. Seria através das teclas: -> F9 = executar até termino do programa ou próximo break; -> F8 = execução linha após linha, sendo que na chamada à procedimentos este são executados diretamente -> F7 = execução linha após linha, sendo que na chamada à procedimentos o programa desvia para dentro dele de modo "monitorar" a execução de cada linha existente; mais ou menos isso.
  15. Micheus

    Dbeedit

    M@tEuS, você está utilizando TTable? Experimente chamar tabela.Cancel.Quando você tem habilitado o cached updates, para desfazer (undo) as alterações no registro atual pode utilizar RevertRecord (dê uma olhada no help, procurando por CancelUpdates)
  16. Micheus

    Ajuda Com Ini

    Cara como eu faço isso, nunca fiz. Abraços Valdecir :unsure: :( Na linha do código, onde você ativa a conexão, você tecla F5 (a linha deve ficar vermelha e um ponto vermelho aparece na margem esquerda do editor). Este procedimento adiciona um Break-point (ponto de parada). Quando você executar seu programa (normalmente via F9), ele irá parar nesta linha no momento em que ela estiver para ser executada. Neste momento você estará devolta a IDE do Delphi e poderá utilizar o avaliador de expressões (diálogo Evaluate/Modify). Na caixa Expression você digita o nome variável/componente que você quer verificar/alterar o conteúdo (tem que por o "caminho" completo se ele estiver noutro lugar que não a unit atual - p.e. um datamodule), por exemplo: IBContrSMS.Params.TextDeste modo você conseguirá ver o conteúdo da propriedade params. Observe que esta propriedade é um TStings, então você também poderá ver linha a linha se utilizar IBContrSMS.Params[0], IBContrSMS.Params[1]. Este método é o que se utiliza para identificar problemas deste tipo. []s
  17. Micheus

    Ajuda Com Ini

    Já que você disse (no post anterior) que direto do componente você havia consseguido a conexão, então deve estar ocorrendo algum problema com o usuário e senha que você está adicionando na propriedade Params.Voce tentou depurar o código no momento antes da conexão do database, para certificar-se do conteúdo de Params? []s
  18. luizf, apenas complementando o que o Churc sugeriu, caso não seja o que você já está fazendo, no evento OnKeyUp coloque apenas a chamada para o procedimento OnClick do seu ListBox (não repita o código). Tipo:procedure Form1.Lstbox_executKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin Lstbox_executClick(Sender); end;
  19. Micheus

    Ajuda Com Ini

    ufa!!! :D Depois que você colocou que resolveu deste modo, lembre da tal string de conexão. Tem diferença em acessar com o path ou através de um servidor. Dá uma olhada neste artigo e veja se você consegue clarear as idéias - link Que tipo de problema/mensagem...
  20. Thales, seria algo assim? procedure TForm1.WndProc(var Message: TMessage); begin case Message.Msg of WM_ACTIVATEAPP : begin Message.Result := 0; Exit; end; WM_ACTIVATE : case Message.WParamLo of WA_ACTIVE, WA_CLICKACTIVE : begin PostMessage(Message.LParam, Message.Msg, WA_ACTIVE, Handle); Message.Result := 0; Exit; end; end; WM_MOUSEACTIVATE : begin Message.Result := MA_NOACTIVATEANDEAT; // MA_NOACTIVATE Exit; end; end; inherited; end; É o que eu tinha testado, mas o melhor que consegui foi não ativar com o click do mouse. E mesmo assim, o foco não volta para a aplicação anterior (nem enviando WM_SETFOCUS). Quando a janela é apresentada na execução do programa ela ganha o foco; Quando você clica no icone dela na barra de tarefas, ela tambem ganha o foco. Que será que tá errado? Naquele exemplo postado pelo Churc, basicamente o form (keypad) é criado com:Procedure TNumericKeypad.CreateParams(var params: TCreateparams); Begin inherited; params.style := params.style and not WS_CAPTION; params.exstyle := params.exstyle and WS_EX_NOACTIVATE; End; { TNumericKeypad.CreateParams } e manipula duas mensagens:Procedure TNumericKeypad.WMMouseActivate(var msg: TWMMouseActivate); Begin msg.Result := MA_NOACTIVATEANDEAT; FMouseDown := true; End; { TNumericKeypad.WMMouseActivate } Procedure TNumericKeypad.WMEnable(var msg: TWMEnable); Begin inherited; If not msg.enabled Then EnableWindow( handle, true ); End;
  21. Super_Zica_Man, na verdade no site da RemObjects, na página de download, tem pelo menos 5 artigos relacionados a este produto - dê uma olhada neles - link. Realmente não é fácil encontrar algo sobre este produto, talvez porque não seja free. Se a dificuldade com os artigos do site forem relacinadas ao idioma, tente utilizar o Altavista-Babelfish para traduzir todo o conteúdo da página. Não fica 100%, mas pode ser útil. Retirado deste blog: Sugestão, em January 17th, 2006: Resposta, em January 17th, 2006: Tente dar uma pesquisada nesta revista para ver se realmente já saiu algo. A RemObjects tem outro produto interessante, que já havia colocado no tópico links, o Pascal Scripts - esse free. []s
  22. Micheus

    Pointer -> Integer

    Apenas complementando, tenha em mente que você deverá estar armazenando uma área de memória válida. E seu conteúdo será válido apenas em memória (run-time). Não dá para armazenar num arquivo, por exemplo (com este procedimento).
  23. Micheus

    Ajuda Com Ini

    Já que mais ninguém sugeriu nada, vamos continuar por este caminho. A título de "teste", tente mapear a unidade. Isso siguinifica que você passará a se referir a este caminho como um drive (disco) no seu computador. Pelo caminho que você está utilizando parece que todo o disco C da máquina Phoenix2 está compartilhado, é isto? Se for não é o tipo de coisa mais aconselhável. Normalmente você compartilha apenas uma determinada pasta, assim evita que os usuários façam algum tipo de estrago "sem querer". Mapear unidade de rede não é complicado. Mas se a pasta compartilhada tiver restrições de acesso, só determinado grupo de usuário pode se conectar, daí pode ser um pouco mais chato. Acho que não parece ser o seu caso. Se estiver utilizando Win95 ou Win98 este link (no 2ºtópico - Acessando discos e pastas compartilhados) explica como fazer. Em W2K e XP é similar, então acho que você não terá dificuldades. Tem esse outro link também. A letra da nova unidade você é que escolhe. Só para saber, seu servidor de banco de dados é Interbase(IB) mesmo ou FireBird(FB)? As máquinas em questão estão com que versão de Windows? []s
  24. Micheus

    Ajuda Com Ini

    Mas este com certeza é o melhor meio de você tirar as dúvidas. Quando conseguir conectar, resolverá o problema. Será que pode ter a ver com nomes longos. Tipo, será que teria que ser digitado \\Phoenix2\C\VDL-Co~1\BDados\BDSMS.GDB, um caminho DOS - ou algo assim? Já tentou mapear este caminho para uma unidade de rede e utilizá-la?
  25. Micheus

    Ajuda Com Ini

    Valdecir, você tentou fazer o que disse antes: Porque se você conseguir selecionar o banco desta forma e ativar sem problemas o database, em design-time, não deverá ter problemas em run-time.
×
×
  • Criar Novo...