Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. Apenas para completar o post do Jhonas, segue este outro post, visto que há diferenças em matar um processo em outras versões do Windows. Mas o que vejo como problema é que qualquer dos processos que seja "morto" via gerenciador de tarefas (End Task ou Finalizar Processo) não recebe qualquer evento que informe isso (tipo um WM_QUIT ou WM_CLOSE). Assim, como matar a outra tarefa se a "vítima" nem sabe que vai ser "assassinada"?! Penso que teria que ser utilizada alguma outra abordagem. Abraços
  2. Micheus

    data servidor mysql

    e qual foi o erro obtido? Segundo a documentação do MySQL, sobre funções para data e hora, você poderia utilizar: CURDATE(), CURRENT_DATE(), CURRENT_DATE Não teria relação com o uso da tabela referenciada? Ocorre que ela não diz respeito ao MySQL e tão pouco se faz necessária. Experimente colocar apenas esta instrução SQL: SELECT CURRENT_DATE AS HORA Abraços
  3. Duduh_Capixaba, eu coloquei o exemplo errado para uso da propriedade Fields do DBGrid: DBGrid1.Fields[8].EditMask := '0.00'; DBGrid1.Fields[8].DisplayFormat := '#,##0.00'; Apenas lembrando que esta atribuição só precisa ser ser feita uma única vez. Então, veja lá onde você está pondo esta inicialização. Talvez seja o caso de você dar mais detalhes de como você está tratando isso. Por exemplo: - você adicionou os campos ao seu dataset? - você adicionou os campos ao seu DBGrid ou eles ficam disponíveis apenas após aberto o dataset? - Em que momento você atribui estas propriedades? Abraços
  4. Caso ninguém se habilite... segue o link de um programa pronto: SIA-HOTEL WIN 2.0 a descrição diz freeware, mas vai saber... É instalar e testar.
  5. Como assim juntar?Concatenar mesmo, ou colocar um exe dentro do outro? Explique melhor o que você pretende fazer.
  6. o engraçado é que sempre que eu tento baixar, não tem problema algum. :wacko: Mandei por e-mail.
  7. Veja se seu problema não é apenas com a declaração no cabeçalho da procedure spaceless. Observe que você chama ela passando o endereço da sua variável buf (char buf[100] - que é um array de caracteres com tamanho 100): spaceless(&buf); Ou seja, você passa o endereço da primeira posição do array para a sua procedure, logo, o que você deveria esperar receber na procedure seria o ponteiro para esta primeira posição: void spaceless(char *spaced) A declaração do modo como você fez inicialmente, equivale a dizer que você estaria recebendo o endereço de uma variável, que conteria o endereço do buffer alocado. Mais ou menos isto se não me engano. :unsure: Vamos imaginar uma variável declarada da seguinte forma: char Nome[10] seu endereço em memória (definido pelo compilador) ficaria entre &1001 a &100A, e quando inicializada com meu nome ^_^, ficaria mais ou menos assim: &1001['M'] &1002['I'] &1003['C'] &1004['H'] &1005['E'] &1006['U'] &1007['S'] &1009[x/0] &100A[x/0] quando você chama a procedure passando &Nome, estará na verdade passando ao procedimento o endereço &1001. logo, na procedure, você deve indicar que o parâmetro é um ponteiro (ou seja, o endereço) de uma lista de caracter. Agora, vamos supor que você tenha uma variável que guarde o endereço desta área onde está a lista de caracter (muito comum, quando se usa alocação dinâmica). Vamos chamar esta variável de ptrNome e, como ela armazena um endereço de memória, ela seria declarada como um ponteiro para esta área de memória. Assim, sua declaração seria: char *ptrNome; De modo a apontar para nosso array Nome, nos inicializaríamos ela da seguinte maneira: *ptrNome = &Nome A título de fazer uma analogia (não sei se muito boa), veja como ficaria a impressão do texto em Nome utilizando as duas variáveis: printf("%s\n", *ptrNome); (imprime o conteúdo do endereço apontado por prtNome (&Nome) printf("%s\n", &Nome); (imprime o conteúdo do endereço da variável Nome) Isto posto, a sua procedure como definida inicialmente (void spaceless(char **spaced)), equivale a você esperar que seja passada para ela o endereço de uma variável que armazene o endereço de um array de caracter. Deste modo, utilizando as variáveis do meu exemplo, seria o caso de chamá-la passando ptrNome e não Nome: spaceless(&prtNome); Espero que tenha lhe ajudado e não complicado ainda mais... E caso eu tenha escrito alguma bobagem, por favor alguém me corrija. :D Abraços
  8. Não sendo possível este processo, estou movendo para sessão de Segurança.
  9. Juliana, seguem alguns tópicos que podem lhe auxiliar: Pesquisa De Diretorios Sabendo A Quantidade Vários Arquivos Em Um Listbox Pesquisa em diretório e subdiretórios
  10. Este item, como sempre, tem relação com a interpretação incorreta dos componentes utilizados. Como sempre digo, o DBGrid apenas mostra os dados provenientes de um DataSet, e sendo assim, é na definição dos campos deste dataset que estas configurações devem ser feitas. Quando você acessa a propriedade Fields[<index>], nada mais está fazendo do que acessar o field associado a coluna <index> que corresponde ao field do dataset que você associou ao DBGrid. A propriedade EditMask, como diz o seu nome, é a máscara de edição, ou seja, serve para formatar a entrada de dados. Para formatar os dados na apresentação, ou seja, para definir como os dados serão mostrados você deve utilizar uma outra propriedade: DisplayFormat (observe que o nome já diz tudo). É importante observar que, se você tem o dataset com os campos (Fields) adicionados a ele, é boa prática inicializar estas duas propriedades, já que, indiferente de você utilizar o dataset em um DBGrid ou com DBEdit's, em algum momento você precisará entrar com os dados ou mostrá-los. DBGrid1.Fields[8].EditMask := '0.00'; DBGrid1.Fields[8].Display := '0.00'; apesar da aparência ser a mesma, neste exemplo, a mascara de formatação segue as descrições (caracteres de formato) do tipo TEditMask, enquanto que a formatação de apresentação segue sua própria: DisplayFormat. Qualquer dúvida neste sentido, procure no help do Delphi por elas. Como o Jhonas disse, e reforço acima, é mais prático você configurar estas propriedades nos fields do dataset em design-time. Abraços
  11. Sugestão: quando filtrar por mês, utilize o between e passe o primeiro dia do mês e o último (faça uso de EndOfTheMonth - DateUtil no Delphi7): select id_pedido, vd_data, vendedor, forma_pagto, nome_vendedor, total from vendas, vendedores, items_vendas WHERE vd_data between (:inicio_mes and :fim_mes) and vendas.vd_id_vendedor=vendedores.id_vendedor and items_vendas.id_pedido=vendas.vd_id_pedido ORDER BY vd_data observe a ordenação pela data no código: ZQuery_select.ParamByName('inicio_mes').AsDateTime := EncodeDate(StrToInt(ComboBox1.text), StrToInt(Edit1.text), 1); ZQuery_select.ParamByName('fim_mes').AsDateTime := EndOfTheMonth(ZQuery_select.ParamByName('inicio_mes').AsDateTime); No quick, você precisaria ter o campo referente ao mês para fazer esta quebra (coloca no Expression do QRGroup o campo). Assim, seria conveniente adicionar esta coluna a sua consulta. select extract(month from vd_data) AS mes_venda id_pedido, vd_data, vendedor, forma_pagto, nome_vendedor, total from vendas, vendedores, items_vendas ...algo assim. Mas, se sua consulta filtra apenas 1 mês, porque fazer a quebra por mês? :blink: Abraços
  12. Bom, gastando um pouco de tempo, segue um exemplo utilizando os 3 componentes: TDBLookupComboBox, TDBLookupCombo e TComboBox. Espero que você consiga avançar um pouco agora. Abraços DBLookupCombo.zip
  13. Se você só faz a consulta quando o botão é pressionado e ainda passa um sub-string como filtro, eu diria que esta talvez seja a melhor opção. Observe que você vai buscar no banco apenas os registros similares, o que com certeza retorna muito menos registros do que se você trabalhar com todas as linhas de sua tabela. para fazer algo, você terá que o colocar no evento OnChange do Edit_filtranome_contato e a sua SQL de consulta não terá o filtro como acima (ou seja, sem cláusula where). Abraços
  14. Johelson, você trocou de componente mas não de problema! (estou juntando os tópicos) Aliás, a melhor opção ainda seria continuar com os componentes tratados no outro tópico, já que são os que estão "em linha". Ou seja, este que você passou a usar está fora de linha e pode ser problema futuro - veja o que o help diz: The components on the Windows 3.1 page of the Component palette provide Windows 3.1 control elements for backward compatibility with Windows 3.1 applications built with previous versions of the product. São componentes mantidos para compatibilidade apenas e, na seqüência (é só você teclar F1 com o componente selecionado), há uma relação dos novos equivalentes para uso com Win32.
  15. e será que você lembrou de adicionar este campo à sua consulta (SQL na QryPraticas)?
  16. Exato. Isso porque, a princípio o speedbutton é quase um botão comum. A funcionalidade de operação em grupo, implica na definição de um grupo. Que é o que você faz quando atribui um número a propriedade GroupIndex. Isse quer dizer que você pode ter vários speedbuttons em um form, sendo que cada qual opera de acordo com a configuração daquele grupo. Bom acho que vai ficar mais claro com um exemplo (veja anexo). O SpeedButton só tem um "problema": não recebe foco, ou seja, você não chega nele via teclado - só com o mouse. Tentando contornar isto, e mantendo suas características, o que costumo fazer é definir "atalhos" que executam a ação down do botão (trato o evento OnKeyDown do form). Abraços SpeedButton.zip
  17. para executar qualquer programa com esta metodologia, primeiro você tem que saber que parâmetros de linha de comando ele aceita, para então preparar a linha a ser executada. Vá na pasta de instalação do FilZip e abra o arquivo de ajuda. Tem a opção Advanced Features -> Command Line Boa sorte.
  18. Tente o componente da paleta Additional: TSpeedButoon Vai precisar das propriedades: Down e GroupIndex (talvez da AllowAllUp, também)
  19. utilize a área destacada na figura anexa para adicionar as variáveis. E tinha um erro na procedure - esqueci dos BEGIN's, segue correção na parte da codificação dela: BEGIN pOrd = 0; pCuntCatA = 0; pCuntCatB = 0; pCuntCatC = 0; pCuntCatD = 0; pCuntCatE = 0; FOR Select P.Instrutor, P.Data, P.Horario, P.Categoria From AulasPraticas P, Instrutores I Where P.Aluno=:pAlu AND P.Status=1 AND I.Codigo=P.Instrutor ORDER BY P.Data, P.Horario INTO :pIns, :pDat, :pHor, :pCat DO BEGIN pOrd = :pOrd + 1; IF (:pCat = 'A') THEN BEGIN pCuntCatA = :pCuntCatA +1; pAul = :pCuntCatA; END ELSE IF (:pCat = 'B') THEN BEGIN pCuntCatB = :pCuntCatB +1; pAul = :pCuntCatB; END ELSE IF (:pCat = 'C') THEN BEGIN pCuntCatC = :pCuntCatC +1; pAul = :pCuntCatC; END ELSE IF (:pCat = 'D') THEN BEGIN pCuntCatD = :pCuntCatD +1; pAul = :pCuntCatD; END ELSE IF (:pCat = 'E') THEN BEGIN pCuntCatE = :pCuntCatE +1; pAul = :pCuntCatE; END SUSPEND; END END
  20. MaxLength apenas limita a digitação no DBEdit. - Você tem os campos (Fields) adicionados ao seu dataset? - Estaria fazendo alguma manipulação da propriedade Text do DBEdit no evento OnExit dele? A princípio é meio estranho que os valores sejam truncados sozinhos. Deve ter algo no código que está fazendo isto. Abraços
  21. Se estiver sendo utilizado o Delphi7 (e possivelmente superior), também existem funções prontas, na unit SysUtils, que fazerem este teste e que retornam o valor convertido caso válido: TryStrToBool function TryStrToCurr function TryStrToDate function TryStrToDateTime function TryStrToFloat function TryStrToInt function TryStrToInt64 function TryStrToTime function TryFloatToDateTime function TryFloatToCurr function Exemplo: var Qtd :Integer; PrecoUnit, PrecoTotal :Double; begin if TryStrToFloat(Edit2.Text, PrecoUnit) then begin if TryStrToInt(Edit1.Text, Qtd) then begin PrecoTotal := Qtd *PrecoUnit; ... end else begin Edit1.SetFocus; ShowMessage('Valor em Quantidade é inválida'); end; end else begin Edit2.SetFocus; ShowMessage('Preço unitário é inválido'); end; end; Abraços
  22. José, era isto que falava sim. Mas do lado do server, você deverá desmembrar esta seqüência em "trios" de caracteres, onde cada um corresponde a um valor hexa da seqüência enviada. pegando carona naquele exemplo que postei anteriormente (post#36), poderia ser assim: var ... CharHexaStr :string; begin ... // esta linha abaixo foi modificada em relação ao post inicial HexaValue := ReceivedMsg; // será o texto legível que no caso do exemplo anterior // irá conter o texto "$AA$55$03$07$1F", enquanto que // o texto recebido seria visualizado como "ªU□□□" // (se não me engano) que deve ser o texto em // ReceivedMsg neste ponto do código Memo1.Lines.Add(Format('De: %s > %s %s', [Socket.RemoteAddress, ReceivedCmd, HexaValue])); Memo1.SelStart:= Length(Memo1.Lines.Text); //... ListBox1.ItemIndex := ListBox1.Items.Add(ReceivedCmd); //... Setup.ComPort1.WriteStr(ListBox1.Items.Text); // aqui começa a nova implementação // pelas minhas contas, após o envio do comando, // você está enviando os valores Hexa while HexaValue <> '' do begin CharHexaStr := Copy(HexaValue, 1, 3); // copia primeiro trio da seqüência Delete(HexaValue, 1, 3); // elimina o primeiro trio da seqüência Setup.ComPort1.WriteStr(Char(StrToInt(CharHexaStr))); // envia código no formato char end; ... end; Esta idéia pressupõe: - que a string hexa contenha sempre 3 caractere para representar o valor - no formato $FF; - que os caracteres são válidos, ou seja, números (0..9) e letras (A..F); se por acaso o envio para a porta estiver incorreto, ou seja, esteja indo algum lixo junto, então experimente torna-lo um string concatenando um caracter nulo: Setup.ComPort1.WriteStr(Char(StrToInt(CharHexaStr)) +#0); há ainda a possibilidade de enviar tudo de uma vez, "bufferizado". var ... CmdBuffer :array[1..5] of char; CmdBufferLen :Integer; CharHexaStr :string; begin ... CmdBufferLen := 0; while HexaValue <> '' do begin CharHexaStr := Copy(HexaValue, 1, 3); // copia primeiro trio da seqüência Delete(HexaValue, 1, 3); // elimina o primeiro trio da seqüência Inc(CmdBufferLen); CmdBuffer[CmdBufferLen] := Char(StrToInt(CharHexaStr)); end; Setup.ComPort1.Write(CmdBuffer, CmdBufferLen); // envia a seqüência completa ... end;observe que utilizamos o método Write do componente ComPort, onde passamos o buffer e a quantidade de bytes a "escrever" na porta. Tente uma das alternativas, veja o que consegue. Abraços
  23. OBS: na verdade voce so fecha um relatorio se clicar no botao close do QuickReport supondo que voce deixou o relatorio ( QuickReport ) aberto.... fechar somente desta maneira procedure TFMenu.Timer1Timer(Sender: TObject); begin //if timetostr(time()) >= '21:00:00' then if time() >= strtotime('21:00:00') then begin QRFatura.Destroy; QRFatura.FreeOnRelease; end; end; Jhonas, acho que aqui ocorre mais um caso de uso dos termos inadequados por parte do nosso colega que é iniciante. Eu acho que o colega powerz quiz dizer algo como: Como é que posso emitir o relatório com os dados de uma consulta sempre as 21:00hs Algo como tirar um relatório ao fechar o caixa no final do expediente. Seria interessante ele esclarecer melhor isto. powerz, a título de informação, o DBGrid apenas mostra as informações fornecidas por um dataset (p.e., do tipo Table ou Query). Assim, o que você vê no DBGrid, na verdade é o resultado da sua consulta de modo que você deve referir-se a eles. Não são os dados do DBGrid que serão mostrados em um relatório, mas sim o resultado listado pelo dataset. Então, a mesma consulta que você utiliza para mostrar as informações em um DBGrid, pode ser utilizada para mostrar em um relatório. Um DBGrid, não pode ser tratado como uma matriz tipo o StringGrid ou planilha do Excel. Ele apenas mostras as informações que vem do dataset, ele não as possui. Assim, você só vai poder retornar informações do DBGrid baseado no registro (no dataset) atualmente selecionado (mostrado em destaque na DBGrid). Abraços
  24. e está correto. Lembre-se que o tipo string longo equivale a um PChar e é terminado por um zero.Talvez uma opção seja enviar para o servidor o "string hexa" não o valor dos caracteres. Deixa ver se consigo explicar melhor. Quando você monta deste modo #$1F, é a mesma coisa que você estivesse colocando #31, ou seja você está tratando de caracteres. Minha sugestão é que você trate o valor como string: '$1F'. Deste modo, a string que você citou ficaria assim: '$AA$55$03$00$1F'. Uma alternativa a isto, deveria ser o uso de Stream para troca de dados, ao invés de SendText/ReceiveText. Mas, penso que teriam que ser implementados mais controles. mas, continuando... Depois, na hora de enviar para a porta, você retira cada numero hexa da string e o converte para caracter novamente e o envia em seqüência para a porta. Acho que deve funcionar. este par corresponde a "nova linha" (#13#10). Por acaso você está enviando de algum lugar, ou está pegando o texto de um Memo vazio? Deve ser por aí o problema. Abraços
  25. powerz, realmente são muitas dúvidas. Há respostas à umas poucas aqui neste seu outro tópico. Abraços p.s. Tente não criar tópicos com o mesmo assunto. ;)
×
×
  • Criar Novo...