
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
Predes, acho que uma solução rápida passa pelo uso de Fontes true-type, mas neste tópico você também encontra dicas de componentes: Código de Barras 3 de 9 Abraços
-
(Resolvido) deixar o QRBand (detail) negito
pergunta respondeu ao danielrgoes de Micheus em Delphi, Kylix
danielrgoes, é bem simples:- declare uma variável na sessão Private do form (digamos: ContaLinha :Integer;) - no evento BeforePrint, você inicializa ela com 0 (ContaLinha := 0;) - no evento BeforePrint da banda do tipo rbDetail, você verifica se ela é igual a 3 (if ContaLinha = 3 then) e coloca a fonte em (...Font.Style := [fsBold]; ) - no evento AfterPrint da banda do tipo rbDetail, você incrementa ela (Inc(ContaLinha);) e verifica se ela é diferente de 3 (if ContaLinha = 3 then) e coloca a fonte sem o bold (...Font.Style := []; ) Abraços -
Vincular adoquery com informações dbgrid Delphi ACCESS [RESOLVIDO]
pergunta respondeu ao Mesfistofeles de Micheus em Delphi, Kylix
Mesfistofeles, você precisa dar uma melhorada na sua explicação - não entendi direito o que está ocorrendo. Isto ocorreu em design-time, é o que me parece. Dá para dar mais detalhes. É que se você não inicializa o parâmetro via código, então deveria estar dando um erro. Sei lá, tá bem estranha a sua explicação. Tenha em mente que se você quer filtrar o código do orçamento, então antes de abrir a consulta você tem que inicializar este parâmetro. Essa consulta continua errada. Ela não gera erro na execução (se você passar o parâmetro), mas veja que você usa duas tabelas na cláusula FROM - sempre que você faz isto, deve relacionar ambas na cláusula WHERE (já falei sobre isto no post#7). <_< Ahhh!! E não declare parâmetros da forma como está fazendo (:orcamento.codigoorca) - identificador composto, use apenas um nome. Veja de onde vem o campo Valora. Voce só tem este campo no SELECT, então só pode vir de uma das tabelas e imagino que seja OrcaAcab. Como o agupamento é feito pelo campo codigoorca (da tabela Orcamento), imagino que você queira totalizar por este código. Entretanto, observo que ele supostamente é o mesmo que NumAcab (já que você está comparando eles no where). Assim, você não precisa incluir a tabela Orcamento na consulta - apenas use os campos existentes na tabela OrcaAcab: Select sum (valora) as total from orcaacab where orcaacab.numacab = :codigoorca Group by numacab;Veja que neste exemplo o parâmetro passou a chamar-se codigoorca. Abraços -
Sonyer, segue um código completo para uso da caixa de diálogo TReplaceDialog. Como sugestão, você deve usar componentes TRichEdit e desabilitar a propriedade HideSelection. // Botão que mostra a caixa de diálogo procedure TForm1.Button3Click(Sender: TObject); begin // verfica se ponto de inserção está no fim do texto e posiciona no início if RichEdit1.SelStart = Length(RichEdit1.Text) then RichEdit1.SelStart := 0; // remove qualquer seleção RichEdit1.SelLength; // Mostra a caixa de diálogo ReplaceDialog1.Execute; end; procedure TForm1.ReplaceDialog1Find(Sender: TObject); var FoundPos, StartSearch, EndSearch :LongInt; Options :TSearchTypes; begin // determina busca a partir da posição atual ou do início do texto // se você atribuir StartSearch := 0, então a pesquisa sempre // começa no início (pouco provável este uso) StartSearch := RichEdit1.SelStart +RichEdit1.SelLength; EndSearch := Length(RichEdit1.Text); // determina como será a busca - comparação Options := []; if frMatchCase in ReplaceDialog1.Options then Options := [stMatchCase]; if frWholeWord in ReplaceDialog1.Options then Options := Options + [stWholeWord]; // retorna a posição do texto encontrado ou -1 (não achou) FoundPos := RichEdit1.FindText(ReplaceDialog1.FindText, StartSearch, EndSearch, Options); // Marca (seleciona) o texto encontrado if FoundPos <> -1 then begin RichEdit1.SelStart := FoundPos; RichEdit1.SelLength := Length(ReplaceDialog1.FindText); RichEdit1.SetFocus; end; end; procedure TForm1.ReplaceDialog1Replace(Sender: TObject); var FoundPos, EndSearch, FoundCount :LongInt; Options :TSearchTypes; begin // se não há nada encontrado, não há o que trocar if RichEdit1.SelLength = 0 then Exit; // troca apenas a ocorrência da palavra atual if frReplace in ReplaceDialog1.Options then RichEdit1.SelText := ReplaceDialog1.ReplaceText else // troca todas as ocorrências da palavra if frReplaceAll in ReplaceDialog1.Options then begin // realiza a primeira troca RichEdit1.SelText := ReplaceDialog1.ReplaceText; FoundCount := 1; // determina busca a partir da posição atual ou do início do texto // se você atribuir StartSearch := 0, então a pesquisa sempre // começa no início (pouco provável este uso) EndSearch := Length(RichEdit1.Text); // determina como será a busca - comparação Options := []; if frMatchCase in ReplaceDialog1.Options then Options := [stMatchCase]; if frWholeWord in ReplaceDialog1.Options then Options := Options + [stWholeWord]; repeat FoundPos := RichEdit1.FindText(ReplaceDialog1.FindText, RichEdit1.SelStart, EndSearch, Options); // Marca (seleciona) o texto encontrado if FoundPos <> -1 then begin RichEdit1.SelStart := FoundPos; RichEdit1.SelLength := Length(ReplaceDialog1.FindText); RichEdit1.SetFocus; // substitui o texto selecionado (encontrado) RichEdit1.SelText := ReplaceDialog1.ReplaceText; Inc(FoundCount); end else ShowMessage(Format('Todas as %d ocorrências foram substituidas.', [FoundCount])); until FoundPos = -1; end; end; Abraços
-
laine, para possibilitar a formatação do texto, você deverá usar apenas componentes descendentes da classe TCustomRichEdit que oferecem este recurso. Assim, no lugar de TDBMemo, use TDBRichEdit. Quanto ao código, ele é bastante simples. Para definir as características padrão em termos do fonte, você usa a propriedade DefAttributes (veja no help todas as "sub-propriedades" dela - basicamente é as que usarei no exemplo) - e qualquer alteração nesta propriedade afeta todo o richedit e deve ser feita na criação do form (uma única vez). Já quanto as definições que serão modificadas durante a edição, estas são feitas através da propriedade SelAttributes. Apesar do nome, a alteração do fonte ocorrerá sobre uma seleção existente, mas se nenhuma seleção estiver destacada, a alteração passa a valer do ponto onde o ponto de inserção está em diante. Voce precisa adicionar um componente TFontDialog (paleta Dialogs) o qual será utilizado para possibilitar a alteração das características da fonte. No exemplo, estaremos inicializando estas características a partir daquelas pertencentes à fonte onde o ponto de inserção (vulgo cursor) se encontra. Uma vez que alguma alteração seja realizada e o botão de Ok do dialogo seja clicado, passaremos ao processo inverso, onde ajustamos os atributos da fonte do texto para aqueles da fonte do dialogo: procedure TForm1.Button1Click(Sender: TObject); begin with RichEdit1.SelAttributes do begin FontDialog1.Font.Name := Name; FontDialog1.Font.Charset := Charset; FontDialog1.Font.Color := Color; FontDialog1.Font.Pitch := Pitch; FontDialog1.Font.Size := Size; FontDialog1.Font.Style := Style; FontDialog1.Font.Height := Height; end; if FontDialog1.Execute then with FontDialog1.Font do begin RichEdit1.SelAttributes.Name := Name; RichEdit1.SelAttributes.Charset := Charset; RichEdit1.SelAttributes.Color := Color; RichEdit1.SelAttributes.Pitch := Pitch; RichEdit1.SelAttributes.Size := Size; RichEdit1.SelAttributes.Style := Style; RichEdit1.SelAttributes.Height := Height; end; end; Abraços
-
Vincular adoquery com informações dbgrid Delphi ACCESS [RESOLVIDO]
pergunta respondeu ao Mesfistofeles de Micheus em Delphi, Kylix
Repassando, as tabelas chamam-se: Orcamento, OrcaAcab e OrcaItens. Mesfistofeles, voce não deve deixar o ":" "voando", ou seja, tem que ficar agarradinho como o identificador do parâmetro.De qualquer modo, este seu SQL está "pra lá de bagdá". :blink: Primeiro, o identificador do parâmetro não poderia ser o nome de um campo da tabela. Segundo, retirando o ":", este seu SQL estaria relacionando OrcaAcab e Orcamento apenas se você colocasse do formato correto que é <nome da tabela>.<nome do campo>, mas você pôs invertido. Ou seja, deveria ser algo como: OrcaAcab.NumAcab = Orcamento.CodigoOrca e este também continua nas nuvens. :huh: Voce está referenciando duas tabelas na cláusula from, mas não as está vinculando na cláusula where, e como ela está, não está correta - falta mais alguma coisa. E se continuar a inverter a sequencia <nome tabela>.<nome campo>, suas consultas não vão funcionar nunca. E, como disse o Jhonas: tem vírgula sobrando... Acho que seu problema está em construir as consultas e seria conveniente você procurar material para conhecer um pouco mais sobre a sintax SQL. Abraços -
laine, esta parece ser uma pergunta para a sessão Banco de Dados e não Delphi. Mesmo assim, você deve citar qual o banco de dados está usando. Se você usou alguma ferramenta (front end) para criar a tal chave, poderá usá-lo também para removê-la. De qualquer modo, é bem estranho que seu banco tenha permitodo criar uma chave estrangeira apontando para uma tabela que não existe. :blink: Abraços p.s. Por gentileza, da próxima vez não GRITE (não escreva em caixa alta) ;)
-
Polyanna Wenze, caso seu campo seja do tipo Date (parece ser este o tipo em questão neste tópico), este processo de "desmontagem" não é necessária. Voce pode fazer apenas assim: Mas se o campo no banco for do tipo VARCHAR, ou seja, uma string, ai sim fica ruim trabalhar com a data e por várias razões: - não consegue usar o beetwen; - a ordenação por este campo fica incorreta se você não o gravar no formato "yyyy-mm-dd"; - fica difícil de extrair partes da data, já que não dá para usar as funções específicas; - .... Abraços
-
Acho que não foi o que ela quiz dizer.Ela refereiu-se a string porque usou o método AsString para atribuir um valor ao campo (Field). O que para falar a verdade não é muito interessante já que, considerando o mesmo TDateTimePicker, você poderia fazer: Ex: Tabela.FieldByName('DATA').asDate := DateTimePicker1.Date; // Direto ao ponto - sem conversões ou ainda, se estivesse lendo de um TEdit ou TMaskEdit: Ex: Tabela.FieldByName('DATA').asDate := StrToDate(Edit1.Text); Ex: Tabela.FieldByName('DATA').asDate := StrToDate(MaskEdit1.Text); Na prática, você terá que se preocupar com este formato, apenas se for gerar instruções SQL (a string SQL) com a data concatenada. O que não recomendo. Sempre que for necessário, utilize a parametrização pois como sempre digo, você não precisará se preocupar com que formato de data/hora o banco trabalha. Abraços
-
Igor Leonne, não duplique seus post. (anterior: http://scriptbrasil.com.br/forum/index.php?showtopic=132264) Se precisar melhorar sua pergunta faça isto no post original - acrescente mais alguma informação nele e aguarde. Se não houver resposta, é porque ninguém soube ou quiz responder. ;) Abraços
-
Classe TPanel not found - por favor me ajudem
pergunta respondeu ao nsouza de Micheus em Delphi, Kylix
nsouza, voce adicionou o panel em design-time e não houve erro?Ou você está criando ele em run-time usando o nome da classe? -
silvanirms, considerando que este seu txt esteja carregado em uma lista quaquer (seja em um TStringList, TMemo, TRichEdit) voce poderia utilizar suas propriedades de contagem de itens para obter esta informação (Count, Lines.Count, Lines.Count - respectivamente). Quando você lê o arquivo, você obtem a quantidade de linhas e mostra no label. A cada nova linha que você adicionar, va atualiza o label, .... Abraços
-
Vincular adoquery com informações dbgrid Delphi ACCESS [RESOLVIDO]
pergunta respondeu ao Mesfistofeles de Micheus em Delphi, Kylix
Mesfistofeles, esta dúvida está mais para a sessão de Bando de dados do que Delphi, mas em todos os casos...Nestas consultas, se você quer vincular ao orçamento específico, você deverá acrescentar a cláusula where nestes consultas onde você passará como parâmetro o codigo do orcamento. (similar ao que você postou abaixo) Foi erro de digitação ou você está mesmo utilizando "Ç" no nome dos identificadores? você não deve utilizá-lo. -
Igor Leonne, primeiramente, utilize o nomo correto das classes dos componentes para que possamos falar do "sujeito" certo.Combobox, seria: - TComboBox - TDBComboBox - RxDBComboBox (da paleta RXLib) Lookup, seria: - TDBLookupListBox - TDBLookupComboBox - TRxDBLookupListBox (da paleta RXLib) - TRxDBLookupComboBox (da paleta RXLib) Cada componente tem parâmetros e comportamentos diferentes que podem interferir em uma explicação. ;) Porém, considerando que que qualquer que seja o lookup ele é um componente data-aware (ou seja, você usa ele ligado a um datasource/dataset), posso lhe adiantar que os dados que você visualiza na lista provém justamente do dataset vinculado ao datasource que está ligado à propriedade ListSource deste componente. O componente em si, quando está com o foco, permite que você digite as letras e ele vai tentando posicionar na opção mais próxima do texto digitado. Já se você quizer fazer uma busca via código, pode usar os métodos que utilizar para qualquer dataset: Locate (um deles), deste modo você poderia usar algo como: DBLookupComboBox.ListSource.Dataset.Locate('texto', <nome campo em ListField>, [loCaseInsensitive, loPartialKey]); Esteja atento para a possibilidade de ao posicionar a lista via código, o campo no seu banco de dados não ser alterado (faça testes para ver se ficará tudo ok). Quando você usa as vias normais do componente, ele fará a atualização do campo definido por DataSource/DataField através do valor obtido em ListSource/KeyField. Abraços
-
Voce pode experimentar o deste post (usando o RichEdit) Quanto a isto, naquele tópico eu havia mencionado este post, em que eu já havia citado que não seria possível contornar o problema da versão da dll richedit carregada pelo Delphi sem que fosse usado outro componente de terceiro (JvRichEdit é free) ou a alteração sugerida em um post no forum Expert-Exchange (neste caso, seria necessário você ter o código fonte da unit ComCtrls) Abraços
-
A máscara em si, não interfere na impossibilidade da sua validação. O que ocorre é que o componente TDBEdit apenas chama o método associado ao evento OnExit, após ter feito sua validação interna. Veja o código dele: procedure TDBEdit.CMExit(var Message: TCMExit); begin try FDataLink.UpdateRecord; except SelectAll; SetFocus; raise; end; SetFocused(False); CheckCursor; DoExit; end; É ao chamar DoExit que o seu código no evento OnExit será chamado, mas daí, a conversão já foi "feita" lá no FDataLink.UpdateRecord. Solução? Certo mesmo, apenas derivando um componente a partir do TDBEdit e reescrevento o procedimento CMExit. Há de se ver a conveniência disto. Outras soluções, apenas através de alguns testes. Um caminho pode ser escrevendo um procedimento do tipo TWndMethod para ser atribuido a propriedade WindowProc. Este procedimento de janala (Window Procedure) é responsável pelo processamento das mensagens e é inicializado com um procedimento padrão. Assim, pode-se criar um novo que irá interceptar a mensagem e conforme o processamento, passa a diante para o método antigo ou não. Veja este exemplo: ... Type TForm1 = class(TForm) ... private SavedWindowProc :TWndMethod; procedure WndProc(var Message: TMessage); end; ... procedure TForm1.WndProc(var Message: TMessage); begin if Message.Msg = CM_EXIT then try StrToDate(DBEdit2.Text); except DBEdit2.SetFocus; Raise Exception.CreateFmt('"%s" não é uma data inválida.', [DBEdit2.Text]); end; SavedWindowProc(Message); end; procedure TForm1.FormCreate begin SavedWindowProc := DBEdit2.WindowProc; DBEdit2.WindowProc := WndProc; ... end; ... end.O inconveniente neste caso é que o procedimento serve apenas para um componente. Se tiver outros TDBEdit com entrada para data, teriam que ser criados outros tantos procedimentos iguais, pois é a única forma de sabermos a qual estaremos nos referindo. Ocorre que "teoricamente", poderíamos atribuir este procedimento a mais que um TDBEdit mas, dentro do procedimento, não teríamos como saber qual deles usar para a validação. É que a mensagem para CM_EXIT não tem qualquer parâmetro que nos indique isto. Quanto a mensagem enorme que você postou, ela sempre vai ocorrer quando você estiver em ambiente de desenvolvimento. Se você executar a sua aplicação sozinha, apenas verá a mensagem curta: "'33/22/1111' is not a valid date". Mas em desenvolvimento, ambas serão mostradas. A primeira ao cair na IDE e a segunda após você teclar F9 para prosseguir com o programa. Espero ter conseguido explicar direito. Abraços
-
Preview com mais de uma página, apresenta um erro ?
pergunta respondeu ao António44 de Micheus em Delphi, Kylix
António44, apenas para arredondar, o caminho deveria ficar igual a alco como: C:\Documents and setings\Micheus\Definições locais\Temp, já que %USERPROFILE% corresponde a C:\Documents and setings\<user name>.Ou seja, deveria aparecer o nome do usuário logado na posição onde pus o meu nome. Posto o que eu disse antes, como poderia ter ficado com C:\Windows\Temp ? É estranha esta demora. Não parece fazer muito sentido, porque a princípio não teria como o registro ou as variáveis de ambiente ficarem "lockadas". Difícil de avaliar uma causa.No processo de alteração inicial, por acaso, tudo está ocorrendo corretamente: não há esta demora; a variável está sendo alterada;... Verifique como está a declaração destas variáveis via propriedades do seu computador ->Avançado->Variáveis de ambiente, com tantos testes, ela pode não ter sido restaurada ao seu valor default e pode prejudicar a avaliação do problema. No meu caso (aqui), elas estão: 1) caixa "Variáveis de usuário para Administrador" -> TMP = %USERPROFILE%\Configurações locais\Temp (usando a opção editar) 2) caixa "Variáveis do sistema" -> TMP = %SystemRoot%\TEMP (usando a opção editar) Sempre que este tipo de mensagem aparecer, esteja certo de que a declaração da mesma pode ser removida com segurança. É que alterando aqui, alterando ali, acabou sobrando lixo. ;) Abraços -
Sonyer, Sobre esta parte do undo, veja se este tópico também poderá ser aplicado ao seu TMemo (eu acho que não) - Dúvida com undo\redoEu acredito que seria interessante você substituir este TMemo por um TRichEdit (com muito mais recursos). Abraços
-
Gabriel Cabral, respondendo especificamente à sua pergunta, este erro que você está obtendo é de compilação e está lhe advertindo para o fato de a função IsDate não ter sido identificada (declarada). E na verdade, no Delphi, ela não existe mesmo! Você deve fazer a validação usando um dos métodos que o colega Jhonas lhe apresentou. Também pode usar um deles para criar sua própria função IsDate. Veja o código prontinho no Torry's Delphi Pages. E apenas fazendo uma avaliação do seu código (abaixo), após resolvida a questão da função e quando o seu programa "rodar", você deve observar que da forma como está seu código, a sua tentativa de validação estará incorreta. Quando na primeira linha você usa StrToDate, você já estará forçando uma validação da data informada, pois se o texto estiver incorreto, uma mensagem de erro será apresentada (uma Exception => EConvertError) e nem chegará ao seu primeiro if. Ou seja, se a data for convertida sem erro, é uma data válida, caso contrário, não! Este seu código seria tipicamente substituído por uma das opções que o colega Jhonas lhe passou - use um deles eles.
-
Então, parece que o pacote compilou e instalou... Aqui, a coisa começa a complicar...O nome é bem sugestivo (remete ao processador numérico), mas só avaliando o código para verificar se é algo a ser contornado ou se seria algo que depende especificamente da VCL50. :unsure: Abraços
-
Eder, se eu não estiver enganado, você pode alterar isto no source do DSPack_D5.dpk. Basta editá-lo e na sessão Requires onde aparece vcl50, voce troca por vcl40. Voce pode conferir se é este mesmo o nome, procurando na pasta c:\arquivos de programas\borland\delphi4\LIB\ pelo arquivo vcl40.dcp (acho que é esta a extensão) Abraços
-
(Resolvido) Associar arquivo a um programa
pergunta respondeu ao silvanirms de Micheus em Delphi, Kylix
silvanirms, se o seu programa não vai rodar caso não encontre o tal arquivo, acredito que o lugar mais apropriado para fazer isto, seja no corpo do projeto (Project->View Source - acho que é isto...). Então, você altera ele de modo que tudo o que estiver lá, seja executado apenas se a condição for verdadeira, ou seja, o arquivo existir: ... {$R *.res} begin if FileExists('C:\windows\Teste.dll') then begin // aqui o código normalmente executado no projeto Application.Initialize; Application.CreateForm(TForm1, Form1); // ... outros forms que estejam no auto-create aparecerão aqui Application.Run; end else MessageDlg('Um arquivo necessário ao programa não foi encontrado.', mtError, [mbOk], 0); end.Obs: acrescente a unit Dialogs, na cláusula uses, para uso da função MessageDlg. Abraços -
danielrgoes, há duas coisas a serem comentadas: 1º) possivelmente o erro deve-se ao fato de você estar fazendo a atribuição do nome do arquivo ao campo em si (CDS_clientesNOME_EMITENTE), ao invés de fazer a atribuição ao valor deste campo (o buffer que irá para o bando de dados): modulo.CDS_clientesNOME_EMITENTE.Value := searchResult.Name; 2º) Após a atribuição, você não está "postando" a informação no banco. Apesar de ao ser executado o novo Append, haver uma tentativa de post automático, esta não é uma boa prática. Logo, acrescente a linha modulo.CDS_clientes.Post (ou o ApplayUpdates) após a atribuição do valor. Obs: Quando postar código, use as tags - facilita e muito a visualização do mesmo. Se tiver dúvidas como fazê-lo, veja em Destaque: Otimizando suas perguntas e respostas, do colega MLeandroJr!, como fazer isto. ;) Abraços
-
REFORMULADO - Desenhar com canvas em um form sem foco
pergunta respondeu ao Martha Fernanda de Micheus em Delphi, Kylix
Jhonas, desculpe-me mas não acredito que isto seja necessário (veja que como o exemplo abaixo não há problemas). Caso ela estivesse utilizando o canvas do form, talvez algo assim ocorresse porque se ela pintar direto no canvas dele e uma nova mensagem de pintura (WM_PAINT) chegar para ele - automaticamente ele será limpo, exceto se for provido código para que neste evento (OnPaint) os desenhos sejam refeitos (baseadas nas coordenadas armazenadas na tal lista). Mas, como ela usa um TImage, a imagem deve permanecer inalterada até que seja limpa explicitamente. Penso que seria interessante a colega postar a parte do código que usa para o desenho da imagem. Por acaso, algum tipo de cálculo seria feito com os pontos (tipo escala ou deslocamento)? Deve haver algum detalhe na construção da imagem que esteja causando este efeito. O meu exemplo: Unit1, onde o form contém 01 TImage e 01 TButton: implementation uses Unit2; // referência ao Form2 que permite a entrada de coordenadas para o desenho {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin if not Assigned(Form2) then Form2 := TForm2.Create(Self); Form2.Show; end; procedure TForm1.FormDestroy(Sender: TObject); begin if Assigned(Form1) then Form1.Release; end; end. Unit2, onde o form contém 04 TEdit's e 01 TButton, para entrada das coordenadas e usando o exemplo da colega, ele desenha um retângulo: implementation uses Unit1; // referência ao Form1, que contém o Image1 {$R *.DFM} procedure TForm2.Button1Click(Sender: TObject); begin Form1.Image1.Canvas.Rectangle(StrToIntDef(Edit1.Text, 0), StrToIntDef(Edit2.Text, 0), StrToIntDef(Edit3.Text, 0), StrToIntDef(Edit4.Text, 0)); end; end.a cada conjunto de coordenada entrada e clicando no botão, um retângulo é desenhado no Image1 do Form1. Abraços -
DiabloX3, veja o tópico Conexão Remota, Acessar base de dados remotamente, onde o colega Jhonas faz referências a VPN (Virtual Private Network) - acredito que ele ajudará você nesta dúvida. Abraços