Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. robinhocne, neste caso, talvez a solução de quase todos os seus problemas seja pelo uso do componente TCurrencyEdit do pacote RxLib (paleta RX Controls). - Veja que com ele, você poderá obter a formatação monetária: DisplayFormat por padrão é definida como "R$ ,0.00;-R$ ,0.00"; - Voce atribui um valor numérico (extended) diretamente a ele e automaticamente ele irá formatar o texto a ser mostrado; - A edição fica fácil, porque ele aceita a vírgula numa boa; Quando você precisar trabalhar com o valor numérico, utiliza a propriedade Value: CurrencyEdit1.Value := 250.5; Quando precisar do texto formatado, utiliza a propriedade DisplayText: Label1.Caption := CurrencyEdit1.DisplayText; Por acaso você o tem instalado? Se não veja este post
  2. Micheus

    Memo + *.ini

    R.: opa....sem problemas.... o usuario neste caso digita a relação de emails...a qual ele quer gravar...e ai quando fecha o form e grava num *.ini quando ele abre o programa, esta lá a listinha dos emails, pois ele retorna a lista atraves do OnCreate do form. a finalidade total do processo...é como este programinha fica em duas filiais da empresa...e como não quero lidar com tabelas....então ele grava no ini....o processo de guardar os emails é porque são mtos emails...então ele usa esta lista pra emails programados...ou seja..tal hora ele passa determinados emails...para os usuarios que estão cadastrados nesta lista(Memo). Na verdade me referia ao fato de você utilizar uma função Encode e Decode.Não daria para simplesmente gravar o memo usando Lines.SaveToFile e carregá-lo utilizando Lines.LoadFromFile? Porque pelo que percebi, a sua função faz, p.e., a troca do caracter #13 pelo string "#13" e eu não entendi a real necessidade disto. Mas supondo necessário, há funções do tipo replace que substituem diretamente o que é desejado, sem necessidade de implementar tais funções. Abraços
  3. acho que é por ai mesmo. Se você observar ele "escuta" a conexão fazendo uma leitura para um buffer com tamanho de 128 butes (ver #define BUFFER_SIZE).E segue "escutando" até que encontre o texto "#quit"
  4. Neste sentido, sugiro que você dê uma olhada neste exemplo que coloquei neste post. O código está comentado. Abraços
  5. Robinhocne, alterei o título para que mostrasse adequadamente sua dúvida. Do jeito que estava, achei que você queria formatar os edits para mostrar no formato monetário (tipo, "R$ 250,00") Bom o erro é bem óbvio: '250,50' is not a valid integer value que sugere que em algum momento você está querendo converter para inteiro algo que não o é. A pista fica por conta da mensagem, então em algum ponto você tinha uma chamada a função que converte para integer. Localizamos elas em seguimentos como este do seu código: ... If StrToInt(TxtTlDia.text) < 0 Then < ========== AQUI TxtTlDia.font.color := ClRed Else TxtTlDia.font.color := clBlack; // Para quando for negativo mostrar em vermelho o saldo do Total If StrToInt(TxtSoma.text) < 0 Then < ========== AQUI ... Primeiro, o número formatado como está, já não corresponde a um float - lembra a história do "." e da ","? Então, para converter um texto numerico, a casa decimal deverá ser o "."!!! Para a aplicação que você pretende, acho que seria mais produtivo você simplesmente verificar a existência do sinal "-" no texto do número, como segue: ... If Pos('-', TxtTlDia.text) > 0 Then TxtTlDia.font.color := ClRed Else TxtTlDia.font.color := clBlack; em caso que fosse necessário algum tipo de operação, seria mais interessante, então, que você utilizasse variáveis para armazenar os valores e quando necessário, os convertesse para string e mostrasse nos edits. Abraços
  6. Observe as regras do forum Editei o título do seu tópico, mas não estou certo se ficou adequado. Esclareça melhor o que você pretende, já que posso estar entendendo mal sua dúvida.
  7. João, primeiro, você não precisa da variável dia para o uso que você faz dela - pode atribuir direto Date.Segundo, experimente passar o parâmetro indicando seu tipo (algo que vivo pregando por aqui): DM_agenda.ZQry_consulta.ParamByName('date').AsDate := Date; isto deverá resolver esta questão de não funcionar com um campo TDataTime, mas funcionar com uma data String corretamente formatada. Mas, uma informação se faz importante: Como está declarado o tipo de dados para Data em seu banco? (timestamp, date) e confirme se seu banco é MySQL (parece ser, devido ao uso de ZeosLib) se você utilizar apenas um campo TTime, quando avaliar seu valor do ponto de vista da data, realmente você obterá: 01/12/1889. (dê uma olhada neste post para entender um pouco mais sobre o tipo TDateTime)Então, para você ter a data atual e junto a ela o horário, você deverá utilizar uma variável do tipo TDateTime e fazer uso da função Now, que retorna a Data e Hora atuais. A função Date retorna a data atual e a parte fracionária zerada (ou seja, sem horas); A função Time, retorna a parte inteira zerada (ou seja, sem data setada e que neste caso representa 01/12/1889). Assim, para pegar a hora atual (com data e hora) e subtrair os 5 minutos, basta utilizar: IncMinute(Now, 5); Isto deve retornar a data e hora atual, diminuida de 5 minutos conforme você precisa. Abraços
  8. Micheus

    Memo + *.ini

    Eder, o problema está com sua rotina DecodeString. Por conta deste teste: while I < Length(S) do você não está processando o último caracter da string, que por sua vez não é concatenado ao resultado. Voce se importaria em dizer a finalidade destes dois procedimentos: Encode e Decode; Conforme o caso, acho que haveria forma mais simples de obter o mesmo resultado. Abraços
  9. E para complementar... Cabe salientar que fiz um comentário equivocado lá no post #18 (grifado), o que também colaborou para a demora em corrigir o problema: Desculpem-me e observem que a função format, ao contrário do que disse, utilizará também o separador de decimal configurado no Windows (normalmente a ","). Abraços
  10. Voce deve fazer uso do componente TZStoredProc.Inicializa sua propriedade Connection e depois na propriedade StoredProcName deve poder visualizar as procedures em seu banco. Se elas requerem parâmetros, você os acessa via propriedade Params. Para executá-la, no código, você vai fazer algo como: ZStoredProc1.ParamByName('nome_param_1').AsInteger := 1; ZStoredProc1.ParamByName('nome_param_2').AsString := 'parametro 2'; try ZStoredProc1.ExecProc; except ShowMessage('houve erro executando procedure xxxxx'); end; deveria ser por aí... Abraços
  11. brugall a idéia é por aí, mas acho que dá para melhorar um pouquinho, porque existem alguns casos (componentes) que o valor de RecordCount não é confiável e o mais apropriado seria utilizar uma querie com COUNT. Supondo as tabelas: - Equipamento com os campos ID_EQUIPAMENTO (INT) e ID_CLIENTE (INT); - Cliente com o campo ID_CLIENTE (INT); A proposta é utilizar o mais comum nestes casos: uma querie com o MAX. Assim, poderia ser criada uma função para isto: function DMMain.NextEqpID(IDCliente :Integer) :Integer; begin with QryMaxEquipamento do begin SQL.Clear; SQL.Add('SELECT MAX(ID_EQUIPAMENTO) AS ID_EQUIPAMENTO'); SQL.Add('FROM EQUIPAMENTO'); SQL.Add('WHERE ID_CLIENTE = :ID_CLIENTE'); ParamByName('ID_CLIENTE').AsInteger := IDCliente; Open; Result := FieldByName('ID_EQUIPAMENTO').AsInteger +1; Close; end; end; daí, no evento BeforePost de seu dataset (ou qualquer outro evento anterior a efetiva gravação no banco), você chama esta função, passando o código do cliente em questão e atribui o seu retorno ao campo de identificação do equipamento. OBS: - Ocorre com uma abordagem desta (obter o valor máximo) que, se eventualmente, algum equipamento futuramente for excluído do cadastro, ao listar os equipamentos do cliente, poderá haverá uma lacuna (falta de um código no meio); - Por outro lado, se utilizar a contagem de itens, havendo a mesma exclusão, ao ser incluso um novo item, há 99% de chance de erro por duplicação de chave (key violation); Assim, se for necessário manter os itens sempre sequenciais, nenhuma das duas abordagens funcionará corretamente. Entretanto, eu diria que a melhor abordagem é a do MAX; independente das lacunas, que podem ser contornadas nas "visualizações" se for importante, mas que evita dores de cabeça caso você tenha outras informações que se relacionem a estes dados (questões de integridade referencial). Abraços
  12. bom, parece que lá naquela tela que lhe falei antes (e mesmo via propriedades na janela Object View) você não configurou as outras informações: nome do banco, usuário, senha... Dê uma conferida.
  13. Segue um exemplo, porém este não utiliza o acesso ao banco via path direto. divan_cheques.zip - contém o banco de teste e deve ser decompactado na pasta data existente no diretório de instalação do MySQL (no servidor - não estou certo de que seja necessário para e reiniciar o banco para que ele o enxergue); ConectMySQL.zip - contém o exemplo comentado. O nome do host no arquivo ini deverá ser ajustado - ele contém o que utilizei para teste. É interessante observar que a tela de splash mal será mostrada caso não hajam processos "demorados" antes de que o form principal possa ser mostrado. Talves seja necessário adicionar algum tipo de temporização. Veja se o exemplo ajuda. ConectMySQL.zip divan_cheques.zip
  14. Micheus

    Dúvida em algoritmo!

    o problema da compilação é devido a linha: char vetfulano[MAX], char vetpai[MAX], char vetmae[MAX], char procuranome[MAX]; você pode declarar variáveis de um mesmo tipo em uma única linha, apenas separando-as por vírgula, mas o seu tipo é informando apenas no início: char vetfulano[MAX], vetpai[MAX], vetmae[MAX], procuranome[MAX]; se for declarar seu tipo, uma a uma, então coloque o ponto-e-vírgula a cada declaração: char vetfulano[MAX]; char vetpai[MAX]; char vetmae[MAX]; char procuranome[MAX]; bom, agora estará compilando. Basta você continuar implementando/testando. Abraços
  15. Então. Olha a tal da desatenção. <_< Leia o que você postou e o que eu sugeri. Por acaso você não está utilizando a função errada não?! :blink:
  16. Maicon_iniciante, basicamente seus problemas estão nos CASES. Observe por exemplo na sua procedure MenuInsereProdutocd, mais especificamente quando a opção é 3. Veja que este código: ... writeln('--------------------------------------------'); writeln(nro_produto +1, '/',max_prod); writeln('DIGITE A OPÇÃO:'); writeln('- 1 CADASTRAR NO ARMARIO (A) -'); writeln('- 2 CADASTRAR NO ARMARIO (B) -'); writeln('- 3 CADASTRAR NO ARMARIO (C) -'); writeln('- 4 PARA SAIR -'); read(opcaoum); ...deveria estar após o END do CASE, mas está após o END terminador do bloco referente a opção 3. Como você fez alguns CTRL+C/CTRL+V, acabou replicando o problema para outras procedures. Abraços
  17. Maicon_iniciante, se você já sabe que deve utilizar POS, então você já tem a resposta. O POS retorna a posição em que se encontra uma sub-string. Se ela é encontrada, o valor retornado será maior que 0 (zero). Cabe a você, definir se esta pesquisa será válida quando o texto encontrado estiver apenas no início (posição 1) ou em qualquer posição. Também deve ser levado em conta se a pesquisa será case sensitive, ou não. Caso não seja, você deverá se preocupar em converter ambos os textos para maiúsculo ou minúsculo, para então proceder com a comparação. Abraços
  18. Micheus

    Ajuda em splines

    Bom, não é bem minha linguagem, mas baseado no que implementei em Turbo Pascal (desenho de curva b-spline), vou tentar adiantar alguma coisa. Helson Alves, supostamente você deve ser capaz de montar o algoritmo para o cálculo dos pontos que gerarão a curva spline, certo?! Então, para dar uma partida, veja se este exemplo (rodando no Turbo C) lhe ajuda no processo de inicializar o modo gráfico. O exemplo foi baseado no demo que acompanha o Turbo C (BGIDEMO.C). Fica, então, faltando a entrada de dados (parâmetros) de sua linha, coso eles não sejam estáticos e o cálculo dos pontos propriamente dito para então sua apresentação através da função putpixel. A partir daí, serão dúvidas "normais" de programação C e lógica (eu imagino). Espero que o código possa ser útil. Abraços MODOGRAF.zip
  19. Felipee, a grosso modo, pelo seu exemplo e supondo que sua única dúvida seja levantar quem fez hora-extra, daria para dizer que: - quem registrou o ponto antes do horário inicial da sua escala, fez hora-extra; - quem registrou o ponto depois do horário final da sua escala, fez hora-extra. mas, se por acaso há horário flexível e, o cara tem que cumprir as 08:00h, ele poderia entrar às 11:00h e sair ás 19:00h, cumprindo sua jornada, mas não fazendo hora-extra. Também, pode ocorrer de que o sujeito registre seu ponto uns 20 minutos antes ou depois do horário sem que isso represente hora-extra. Provavelmente há algum critério neste sentido e deverá ser levado em conta. Aqui onde trabalho, é padrão eu ter 20minutos de hora-extra, contudo eu devo ter este excedente registrado, caso contrário é validado apenas o disponível. Qualquer outra hora-extra que faça, deverá ser justificada e autorizada para que seja computada e eu a receba. Conforme a complexidade do caso, acho pouco provável que seja possível resolver este problema com um simples SELECT. Muito provavelmente envolverá adição de campos na tabela (como sugeriu o colega Recife) ou o processamento em batch, seja em código no programa ou em uma procedure no banco (preferível). Abraços
  20. João Paulo Taraciuk, você pode simular o efeito LeaveOut manipulando o evento OnMouseMove e capturando os eventos do mouse ao entrar na área do seu panel. Segue um exemplo para entender como funciona o efeito: procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin // conferimos se já não estamos monitorando a saída da área do panel if GetCaptureControl <> Sender then // se não estavamos... begin // capturamos os evento do mouse para este componente SetCaptureControl(TPanel(Sender)); // alteramos o caption para perceber o que ocorre TPanel(Sender).Caption := 'Mouse na área do panel'; end else begin // alteramos o caption para perceber o que ocorre TPanel(Sender).Caption := Format('%d,%d', [X, Y]); // caso o cursor do mouse não esteja na área do panel, está fora do mesmo if not PtInRect(TPanel(Sender).ClientRect, Point(X, Y)) then begin // encerramos a captura dos evento do mouse para este componente SetCaptureControl(nil); // alteramos o caption para perceber o que ocorre TPanel(Sender).Caption := 'Mouse fora da área do panel'; end; end; end; No seu caso, basta algo como: procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if GetCaptureControl <> Sender then SetCaptureControl(TPanel(Sender)); else if not PtInRect(TPanel(Sender).ClientRect, Point(X, Y)) then begin SetCaptureControl(nil); TPanel(Sender).Visible := False; end; end; Abraços
  21. //FrmCheques If ActiveMDIChild = FrmCheques Then begin DmDados.Log.Active := True; DmDados.Log.Append; DmDados.LogUsuario.value := Usu; DmDados.LogDataHora.Value := DateToStr(Date)+' - '+TimeToStr(Time); DmDados.LogAcessos.Value := DmDados.LogAcessos.Value + 'Cheques (Inserir); '; DmDados.Log.Post; DmDados.Log.Active := False; for i := 0 to FrmCheques.ComponentCount - 1 do if FrmCheques.Components[i]is TCustomEdit then begin (FrmCheques.Components[i] as TCustomEdit).Enabled := True; FrmCheques.DBCbbCheques.Enabled := True; FrmCheques.EdtCodigo.Enabled := False; end; DsBotoes.DataSet.Append; FrmCheques.EdtDataRec.SetFocus; end;Vivendo&Aprendendo, sobre o código acima, após uma olhada mais apurada, vai uma dica e uma correção. Dica: Já que aparentemente o campo LogDataHora é do tipo string, troque a linha (4 funções): DmDados.LogDataHora.Value := DateToStr(Date)+' - '+TimeToStr(Time); por (2 funções): DmDados.LogDataHora.Value := FormatDateTime('dd/mm/yyyy - hh:nn', Now); Correção: Observe que no for, que você busca por componentes TCustomEdit, ao encontrá-los (no if), além de habilitá-los, você está desnecessariamente manipulando os componentes DBCbbCheques e EdtCodigo que deveriam ser manipulados fora do loop (uma única vez). Quanto ao problema, há alguma possibilidade de você estar executando algum tipo de verificação no evento OnEnter do componente EdtDataRec, ou no evento OnExit do componente que está no início da lista (tab stop) do seu form (e que não é evidentemente o referido edit) mas que ao perder o foco para EdtDataRec poderia estar interferindo no estado do seu dataset? Abraços
  22. robinhocne, como você pode agora observar, esta mensagem "falando" apenas do caracter "%" pode ficar meio vaga e de difícil auxílio na solução. Mas, com o pouco que avançamos on-line, já deu para perceber que ela deve-se ao fato de na sua string SQL haver a sequência "%.2' como um dos parâmetros. Baseado nisto, e refletindo um pouco sobre a questão, fica logo claro que há algum problema com aquela parte em que o número é formatado utilizando a função Format. Bom, a única possibilidade de esta sequência ter aparecido deste modo é que ela não tenha sido entendida pela função e eu pediria para você confirmar ser acrescentou o "f" após a sequência: Add (Format('%.2f', [tblPar.Fields[02].AsFloat])); A sua ausência seria a primeira explicação para o "problema". Abraços
  23. se não precisar de precisão, poderia utilizar um timer, do contrário, buscando no forum já há discussão sobre temporizadores com maior precisão (mês passado, se não me engano o assunto esteve em voga) para alterar o horário do sistema:- primeiro você terá que ter direitos de acesso para isto (caso do uso de Windows - XP, 2K, NT, ...); - há uma função da API para isto - SetSystemTime. Dê uma olhada neste post - deve informar todos os aplicativos de que a hora do Windows foi alterada, enviando uma mensagem WM_TIMECHANGE. Isto é feito através do envio da mensagem a todas as janelas deste modo: SendMessage(HWND_TOPMOST, WM_TIMECHANGE, 0, 0); Abraços
  24. Cyberhack, não está muito claro, mas parece-me que seria algo relacionado a jogo. Bom, você fala apenas em posição x=0, mas na verdade provavelmente você deveria ter coordenadas (X, Y) para endereçar esta posição e assim, utilizando as coordenadas relativas do mouse (também, X,Y) você estaria ápto determinar um retângulo onde utilizando seu possível conhecimentos sobre vetores, conseguiria achar o vetor resultante (distância; veja "Adição de Vetores" para o caso de triângulo retângulo (aquele com um ângulo de 90º)) e determinar o ângunlo (veja a fórmula em "Decomposição de Vetor" - basta achar o inverso do cosά ou senά). Estas referências que lhe dei são deste artigo: Vetores - Resumo Teórico Para futuros auxílios, seria interessante que você informasse: - se está trabalhando com coordenadas cartesianasbi-dimensional ou tri-dimensional; - como está gerenciando as coordenas (da sua posição e do inimigo); - com qual componente está trabalhando para obtenção destes dados. Abraços
  25. Denis, sim a função existe e faz isto. mas... eu devo discordar desta afirmação.Desde que as variáveis Vencimento e Emissao sejam do tipo TDateTime (que é na verdade um Double), que a variável dias seja um tipo compatível e sabendo que a parte inteira deste Double representa a quantidade de dias decorridos desde 12/30/1899, então, a subtração de um do outro tem que resultar no número de dias decorrido entre as mesmas. no help sobre TDateTime: (...) The integral part of a Delphi TDateTime value is the number of days that have passed since 12/30/1899. The fractional part of the TDateTime value is fraction of a 24 hour day that has elapsed. (...) Abraços
×
×
  • Criar Novo...