Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. Sim. vms, você não poderia fazer isto simplesmente usando a opção fornecida pelo próprio Windows?- Selecione a pasta Arquivos de programas no windows explorer; - acesse propriedades da pasta; - selecione a guia Segurança; - clique no botão Avançado; - selecione o usuário ou grupo e clique em Editar...; - localize a opção Excluir e marque o checkbox Negar. Via programação é possível, mas parece-me estranho implementar o recurso de habilitar/desabilitar direitos de acesso em sua aplicação, quando isto já está disponível no próprio Windows. Se quiser realmente partir para a programação, deixo apenas o caminho: procure por SetNamedSecurityInfo, lembrando que para executar este tipo de ação o usuário que executa o programa deverá ter direitos de administrador. Boa sorte.
  2. Yokota, observe que, como a leitura deve parar apenas quando uma seqüência de 3...., você deverá utilizar um laço repita... até que condição satisfeita (ou seja, repeat ... until <condição>); O mais cabeludo, vai ser você achar um meio de verificar se os dígitos estão em sequência - esta será a condição para abandonar a leitura. Voce está fazendo a leitura na variável Cont, então, para que seria aquele Cont := Cont +1? Não há nada neste exercício que justifique ele. Neste seu código, há mesmo a necessidade de ler os valores para variáveis reais? Não poderia ser direto para inteiras? E para não interferir no código que você já postou, diria que está faltando você trabalhar a opção em que o 2º valor seja menor que o 1º, conforme previsto no enunciado (só isso - eu acho :)). Abraços
  3. João Paulo Taraciuk, ao que me parece a única coisa "fora do lugar" é esta configuração no QRGroup: LinkBand: QRBand2 você não tem que linkar nada - deixe esta propriedade vazia. Abraços
  4. Jhonas, permita-me apenas acrescentar que este correto vale para a máscara que o colega lmroot usou. Caso ele venha a modificar a máscara para 99/99/99;1,_, já não funcionaria, porque o teste deveria ser com ' / / '. O oposto também seria verdade. Assim, sendo e partindo do princípio de que sempre será montada a máscara com 2 dígitos para o mês, seria mais "seguro" fazer deste modo: if Trim(MaskEdit1.Text) <> '/ /' then Lembrando que mesmo que não esteja vazio, não quer dizer que a data informada seja válida. você deverá tratar a conversão. Abraços
  5. João Paulo Taraciuk, pelo que você disse na MP, parece-me que você não setou a propriedade DataSet do QuickRep com o dataset ZQuery_niver. Quando isso ocorre, ele não movimenta o dataset e por consequência, apenas o registro atual é impresso. Abraços
  6. Agora dá para dizer que é isto mesmo que ele quer Imroot. vms, dê uma olhada neste post http://scriptbrasil.com.br/forum/index.php...pic=90144"" target="_blank">Pegando o Endereço MAC da Placa de Rede do nosso colega Kikonanet, existente na seção Tutoriais & Dicas. Abraços
  7. Dá para explicar melhor? Já que parece que não se trata de endereço IP na rede.
  8. Voce pode alterar o arquivo dialogs.pas onde estão estas funções C:\Arquivos de programas\Borland\Delphi5\Source\Vcl\dialogs.pas Esta opção modificará definitivamente e para todas as aplicações que você a utilizar. Lembrando, ainda, que apenas realizando a alteração em BorderIcons para remover a opção biSystemMenu não evitará que a janela seja fechada. Deverá ser monitorado o fechamento ou feito o bloqueio da combinação ALT+F4. O local a ser modificada a propriedade BorderIcons, possivelmente seja o mesmo do Delphi7: function CreateMessageDialog Esta opção seria mais interessante. Em geral, apenas em diálogos de confirmação seria necessário que seu fechamento ocorresse pelo pressionamento de um botão. Mas, quando realmente necessário, ainda poderia ser contornado sem que se mexesse nos códigos fonte originais (o qual tenho aversão). Fica uma sugestão para você testar. É uma função em que definimos um parâmetro a mais do que comumente se usa na função MessageDlg. Faz-se necessário declara um novo tipo que será um conjunto que manterá os resultados possíveis e desejados. type TMsgDlgResults = set of byte; ... function ForcedMessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint; DlgResults :TMsgDlgResults): Word; begin repeat Result := MessageDlg(Msg, DlgType, Buttons, HelpCtx); until Result in DlgResults; end; para usar basta acrescentar o último parâmetro em relação à função tradicionalmente utilizada: procedure TForm1.Button9Click(Sender: TObject); begin if ForcedMessageDlg('Mensagem', mtConfirmation, [mbYes, mbNo], 0, [mrYes, mrNo]) = mrYes then ShowMessage('Pressionado YES') else ShowMessage('Pressionado NO'); end; Abraços
  9. João Paulo Taraciuk, é muito fácil fazer isto porque a propriedade Expression tem uma espécie de wizard. Selecione o QRGroup e localize ela na janela Object Inspector; Depois clique no botãozinho [...] e na tela que aparece, você terá um botão Database Field (campo da base de dados); na tela que aparece, você selecionar à esquerda o dataset em questão (no seu caso deverá haver apenas um - ZQuery_niver) e à direita seleciona o campo que, pelo exemplo que dei, deverá ser o Mês. Nesta banda group você provavelmente vai querem mostra o nome do mês e há várias formas de fazer isso. Mas eu creio que a mais simples, neste caso, seria adicionar um TQRLabel (QRLabelMes) na banda Group e escrever no evento BeforePrint: procedure TRelNiver.QRGroup1BeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean); begin QRLabelMes.Caption := FormateDateTime('mmmm', ZQuery_niverNacimento.AsDateTime); end; O que é importante neste tipo de relatório é que os dados já estejam ordenados de forma que o quick possa fazer a quebra correta através da banda group. Abraços
  10. a primeira dica é mudar sua consulta. Voce deve trazer a informação de modo que o mês fique agrupado com facilidade e seja utilizado no quick: select extract(month from nascimento) as mes, id_cliente, nome, telefone, email, nascimento from clientes order by 1, extract(day from nascimento) veja que incluímos a coluna MES, que será utilizado para a quebra no quick (numa banda group) e ordenamos o resultado pelo mês (campo 1) e pelo dia para que a listagem fique ordenada corretamente por Mês e Dia. Voce precisará de uma banda qrGroup e um qrDetail. Na group você define o expression para o campo MES e na detail, você coloca os campos que você quer mostrar. Deve ficar parecido com outro relatório que já lhe dei umas dicas neste outro tópico: http://scriptbrasil.com.br/forum/index.php...st&p=468172 Abraços
  11. só para exclarecer, neste tipo de máscara os 0 (zeros) indicam posição onde é obrigatória a digitação de um número, enquanto que 9 são opcionais. Abraços
  12. Perfeito skac. Usando o Paradox, voce precisará fazer uso de um campo do tipo Memo Formatado (F). Eu dei uma conferida, e dá para usar um meio mais simples que o Stream, basta fazer uso dos métodos LoadFromFile e SaveToFile do campo (Field) em questão. Supondo uma tabela Table1, com o campo para armazenamento do documento chamado DocWord, para carregar para o field você usa: Table1DocWord.LoadFromFile(<nome arquivo doc>); e para gravá-lo no disco devolta: Table1DocWord.SaveToFile(<nome arquivo doc>); Obs: 1) a tabela deverá estar em inserção/edição no carregamento; 2) você deverá verificar a necessidade de gravar o nome original do arquivo em algum outro campo; 3) ao gravar, você deverá prover meios de testar a existência ou não do arquivo e, conforme o caso, solicitar o nome do arquivo ou obtê-lo de um campo. Abraços
  13. Tatiane.InterArt, você guarda a hora junto à data neste campo. Se sim, esta é a explicação, por no filtro você passa apenas a data (ao menos pelos exemplos que apareceram) a idéia é que você usasse ele. Eu o preparei para ler os dados do arquivo no diretório do programa compilado.Assim, teríamos 99,9% de certeza de que deve ser algo com sua versão do Banco, já que aqui funciona perfeitamente. Abraços
  14. Micheus

    (Resolvido) OR / AND ?

    Rafael Oliveira, se você prestar bem atenção no que esta consulta representa para o banco, você verá que está perfeitamente correta a apresentação do resultado apenas com o OR. Vejao que é pedido ao banco: selecione cod_filial da tabela filial onde a cidade "seja" Campinas e a cidade "seja" Rio de Janeiro agora, sabendo que esta avaliação (teste da cláusula where) será confrontado com cada linha da tabela filial para retornar o cod_filial de acordo com a condição, como poderia em uma linha, o campo cidade conter ao mesmo tempo dois valores (Campinas e Rio de Janeiro)? Não tem como, não é?! Assim, ao usar o OR, a linha onde aparece cidade igual a Campinas é retornada pelo select, bem como a outra linha avaliada que contenha Rio de Janeiro também será! É assim com qualquer banco. Abraços
  15. Greed, vale usar o clipboard? você precisará fazer algo como: ... // já carregado o texto em JvRichEdit1 // seleciona todo ele JvRichEdit1.SelectAll; // copia para o clipboard JvRichEdit1.CopyToClipboard; // cancela seleção do texto JvRichEdit1.SelLength := 0; // posicionar no final do texto principal Editor.SelStart := Length(Editor.Lines.Text); // cola texto copiado Editor.PasteFromClipboard; Veja se consegue colocar isto no seu código e avaliar se lhe atende. Abraços
  16. dando continuidade às ponderações "técnicas"... Rento, como eu disse, é apenas um bom hábito fazer isto. Mas, para justificá-lo, vou por um trecho do que o help diz em TObject and TClass: "(...) If the declaration of a class type doesn't specify an ancestor, the class inherits directly from TObject. Thus type TMyClass = class ... end; is equivalent to type TMyClass = class(TObject) ... end; (...) Se a declaração de uma classe não especifica ancestral, a classe herda diretamente de TObject. Assim class ... é equivalente à ... class(TObject) como você vê, esta sua classe criada "por fora" (eu diria sem herança), na verdade é sim descendente da classe base TObject e como esta classe possui constructor e destructor (dentre outros métodos), parece-me justificável que, ao reescrevê-los, os chamemos. Você deve ter observado, por exemplo, que o recurso de auto-completar código deve ter lhe mostrados outros métodos que não os que você programou em sua classe. Correto. Ou você usa um, ou outro, visto que ambos irão remover a instância do objeto e uma segunda tentativa de remoção vai resultar em erro. Entretanto, a recomendação constante no help, diz que para destruir o objeto, deve-se fazer a chamada ao método Free e não ao destructor Destroy: "(...) Do not call Destroy directly. Call Free instead. Free verifies that the object reference is not nil before calling Destroy." (...) Não chame Destroy diretamente. Prefira chame Free. Free verifica que a referência para o objeto não é nil antes de chamar Destroy. Por este motivo, eu também diria que é um bom hábito utilizar Free ao invés de Destroy - exceção feita à classe TForm, quando o help recomenda seja utilizado Release. Abraços
  17. Apenas lembrando que este artigo é para Firebird e Interbase. No MySQL (banco usado pelo Sergio), a sintax é um pouco diferente, deverá aparecer ao final do select: FOR UPDATE LOCK IN SHARE MODE ver Manual de referência do MySQL - Sintax SELECT.
  18. Micheus

    Query

    Sergio, sua outra dúvida foi separada deste tópico. Veja ela em "Como evitar que outros usuários editem um registro ao mesmo tempo"
  19. Tatiane.InterArt, isto muito provavelmente se deve a um problema associado a números com ponto flutuante e ao fato de MinutesBetween não arredondar valores.Veja o que consta no help: "(...) MinutesBetween counts only entire minutes. Thus, MinutesBetween reports the difference between 9:00:00 AM and 9:00:59:999 AM as 0 because the difference is one millisecond short of an entire minute." lembrando que esta é a apresentação em forma de horas, quando o valor em si (um double), convertido em minutos seria: 09:00:00 => 540 minutos 09:00:55:999 => 540,9999833333... e ao observar que ele considera a diferença como 0, concluí-se que a função não faz arredondamento - usa a parte inteira. Associado a isso, tem a questão da operação com ponto flutuante - até já comentei isto na dica "Formatando horas além das 23:59h" (no parágrafo em que cito uma correção incluída) Uma sugestão especificamente para "substituição" da função MinutesBetween - eu não sou tão bonzinho :D function NewMinutesBetween(aNow, aThen :TDateTime) :Int64; var MinDiff :Extended; begin MinDiff := (aThen -aNow) *24 *60; if (MinDiff -Trunc(MinDiff)) > 0.9999 then MinDiff := Round(MinDiff); Result := Trunc(MinDiff); end; A título de curiosidade, se quiser testar o que tentei explicar, a função MinutesBetween deve estar definida mais ou menos assim: function MinutesBetween(aNow, aThen :TDateTime) :Int64; begin Result := Trunc((aThen -aNow) *24 *60); end; E um exemplinho de teste, colocando os valores em 2 labels - observe os resultados: procedure TForm1.Button2Click(Sender: TObject); begin Label1.Caption := IntToStr(MinutesBetween(StrToTime(MaskEdit1.Text),StrToTime(MaskEdit2.Text))); Label2.Caption := IntToStr(NewMinutesBetween(StrToTime(MaskEdit1.Text),StrToTime(MaskEdit2.Text))); end; :huh: :o Abraços
  20. K!ko, é possível sim. A implementação pode variar um pouco de acordo com o que você fará no seu programa, mas para que qualquer evento do Windows (nisto incluí-se, mensagens de: teclado, mouse, ...) seja processado, você precisa viabilizar isto dentro de qualquer loop demorado (ou "infinito"), fazendo a chamada ao método ProcessMessages do seu objeto Application (como mencionou o colega Rento). segue anexo um exemplo tosco, mas acho que exemplifica o básico (porque é muito simples, mesmo). Está comentado, e para não fazer uso de uma variável de controle global, optei pelo uso da propriedade Tag do TAction utilizado para executar/pausar o loop. Dê uma olhada, e poste novas dúvidas. Abraços LoopWhile.zip
  21. Rento, vejo que compartilhou sua solução na sessão Tutoriais & Dicas. Tenho certeza de que será de proveito para muitos. Eu dei uma passada no código e gostaria de fazer um pequeno comentário, apenas com o intuito de chamar a atenção para uma situação que pode vir a ser "problema" em algum tipo de aplicação. Vou pô-lo aqui, porque penso que naquela sessão, o lugar não é próprio às discussões. Diz respeito ao 2º método rSendMessage. Apesar de ser apenas uma possibilidade, mas ela há, conforme aplicação implementada. procedure TServer.rSendMessage(pData: Pointer; pMsg: string); begin rSendMessage(FConIds.IndexOf(pData), pMsg); end; Partindo do princípio de que pData deveria ser um endereço válido armazenado na lista FConIds não há qualquer problema com a chamada realizada no código, passando o IndexOf. Entretanto, se por algum motivo a mensagem for enviada e o destino não mais for válido, IndexOf irá retornar -1 e como resultado, a mensagem que deveria ir para 1 única conexão, irá para todas (conforme implementação no 1º método: if pIdx = -1 then ...). Assim, seria interessante o teste antes do envio e você ainda poderia tratar o "erro" do ID da conexão inválida: procedure TServer.rSendMessage(pData: Pointer; pMsg: string); var Idx :integer; begin Idx := FConIds.IndexOf(pData); if Idx >=0 then rSendMessage(Idx, pMsg) else ... // ID da conexão inválida end;o uso da variável Idx evita que seja varrida a lista uma segunda vez. E só mais uma observação com relação a criação de novas classes: é um bom hábito fazer referência aos métodos antecessores, como no caso do construtor Create e destruidor Destroy: é usar o inherited, no início do construtor e ao final do destruidor. Abraços.
  22. Colocar um arquivo do Word em um blob não seria o problema - daria para usar o método LoadFromStream e utilizar um TFileStream para carregar o arquivo. A questão é: você quer visualizar e manipular esse arquivo em sua aplicação ou simplesmente guardá-lo no banco e visualizá-lo posteriormente com o próprio Word?
  23. Sabe que eu lembrei deste inconveniente ontem. Quando se trata de valores, normalmente são alinhados à direita, então os espaços tem que ser incluídos à esquerda, mas quando se trata de textos normalmente o alinhamento é à esquerda e daí os espaços ficam à direita. Vamos melhorar a função: // Source = a string passada para ser formatada // Ch = caracter a ser utilizado para preencher à esquerda // Size = tamanho da string que deve ser retornada (largura da coluna) // LeftAlign = indica se o alinhamento será à esquerda (True) ou à direita (False) function FormatStrSize(Source :string; Ch :char; Size :byte; LeftAlign :Boolean) :string; begin if LeftAlign then Result := Copy(Source +StringOfChar(Ch, Size), 1 ,Size) else Result := RightStr(StringOfChar(Ch, Size) +Source, Size); end; E usando ela: ... while not Table1.Eof do begin Writeln(F, FormatStrSize(Table1.Fields[0].AsString, ' ', 10, False) + ';' + // alinhado à direita FormatStrSize(Table1.Fields[1].AsString, ' ', 5, True) + ';' + // alinhado à direita ... end; Abraços
  24. Tem certeza?!Olhe este tópico: Enviar direto para impressora, Tabulado A única diferença é que a variável Texto, não será a LPT1, mas sim seu arquivo (no seu exemplo: F) - não tem que mudar uma vírgula do conceito. ;) Abraços
  25. Greed, eu não uso os componente Jedi, mas acredito que nesta questão não haja diferença para os RichEdit padrão. Quando você usa Lines.AddStrings, está substituindo todo o conteúdo do seu Editor pelo lido através de JvRichEdit1. Não é isto? Supondo que seja, experimente o seguinte: Editor.Lines.Add(JvRichEdit1.Lines.Text); O método Add, adicina string ao final das linhas existentes - tente. Imagino que em algum momento você deve utilizar Editor.Lines.Clear para iniciar um documento limpo.
×
×
  • Criar Novo...