
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
Esses tempos atrás fiz uma gambiarra para implementar algo parecido para destacar ocorrências de determinada palavra no texto. Mas, pesquisando um pouco mais, descobri que o recurso está disponível a partir da versão 2.0 do RichEdit (msdn - procurar por background) - quem mandou eu não pesquisar primeiro. :ph34r: Então, procurando simplificar o código e generalizá-lo, de modo a ser colocado em uma unit de "rotinas úteis", eu o escrevi para receber o RichEdit como parâmetro, bem como as cores de fundo e frente e modo de marcação - seleção, palavra ou todo texto. O código para implementar a função destaca texto, ficou assim: // Modos possíveis: SCF_ALL / SCF_SELECTION / SCF_WORD (*** declaradas na unit RichEdit) procedure MarkRichEditText(RichEdit :TRichEdit; fgColor, bkColor :TColor; MarkMode :Integer); var CharFormat :TCharFormat2; begin // na marcação de palavra, na chamada a EM_SETCHARFORMAT deve ser // concatenado SCF_SELECTION ao parâmetro SCF_WORD if MarkMode = SCF_WORD then MarkMode := MarkMode or SCF_SELECTION; CharFormat.cbSize := SizeOf(CharFormat); CharFormat.dwMask := CFM_BACKCOLOR or CFM_COLOR; CharFormat.crBackColor := ColorToRGB(bkColor); CharFormat.crTextColor := ColorToRGB(fgColor); SendMessage(RichEdit.handle, EM_SETCHARFORMAT, MarkMode, LongInt(@CharFormat)); end; forma de uso: - Marcar texto selecionado -> MarkRichEditText(RichEdit1, clRed, clLime, SCF_SELECTION); - Marcar texto inteiro -> MarkRichEditText(RichEdit1, clBlack, clYellow, SCF_ALL); - Marcar palavra sob o cursor -> MarkRichEditText(RichEdit1, RichEdit1.Font.Color, clAqua, SCF_WORD); Ref. EM_SETCHARFORMAT (msdn), CHARFORMAT (msdn), CHARFORMAT2 (msdn) Abraços _________ Edit: Atualizados os links
-
A menos que você tenha desabilitado a depuração integrada (no D7 Tools->Debugger Options->Language Exceptions, Stop on Delphi Exceptions desmarcada), na ocorrência de um erro de execução o fluxo do programa deveria ser desviado para dentro da IDE do Delphi sendo o cursor posicionado na linha (senão, próximo a ela) da ocorrência do erro. De qualquer modo, se você não estiver com esta opção desabilitada, você pode colocar um break-point na linha aonde você chama seu cadastro de pedidos ou, no cadastro de pedidos, colocá-lo num ponto aonde você imagina possa estar o problema (tipo um .open) e executar passo-a-passo de modo a avaliar o conteúdo de variáveis/propriedades e descobrir aonde está o problema. Esse negócio de depuração é bem pessoal e você aprende a achar os pontos a monitorar a medida que entende como as coisas funcionam (o uso contínuo lhe trará a experiência). Se você não tiver uma idéia aproximada de como utilizar os break-points/evaluate-modify, dê uma lida neste post (link) mais a nota no rodapé deste post (link) e este último (link), talvez sirvam de pontos de partida. Abraços
-
Carlos, a mensagem parece indicar que você está abrindo uma query sem as instruções SQL definidas na respectiva propriedade. Pelo código não dá para verificar isso, já que aparentemente você adiciona-as em design-time (só com o projeto na mão). Mas, queria lhe sugerir que desse uma boa revisada no seu código. Do meu ponto de vista tem algumas coisas estranhas: 1) No Create normalmente as queries seriam abertas - não fechadas; 2) No Close normalmente as queruies seriam fechadas - não abertas; 3) Apesar de comentado, aquele Action := caFree, nunca existirá no OnDestroy - mas sim no OnClose; 4) Eu não tenho como conferir agora, mas se não estou enganado FindField é utilizado para encontrar um campo (classe TField..) na lista de fields da query/table e não como um FindKey que é o que parece você pretendia utilizar com TmpQry.FindField(QryPedidosCodigoPedido.AsString) na procedure RecalculaPedido; Sugestões: 1) Não use Abort onde apenas a lógica resolve o problema. Quando você a utiliza dentro dos if..then..else e nada mais poderia vir a ser executado não faz o menor sentido utilizá-las (está apenas poluindo seu código); Um lugar onde ela poderia ser realmente útil é no SpdBtnGravarClick. Observe que lá você faz uma série de validações e utiliza showmessage com setfocus, mas isso não evitará que o Post no final do procedimento seja executado - então, a validação não está atingindo seu propósito. 2) evite utilizar a propriedade Fields como em QryClientes2.Fields[0].Value. Além de não ficar claro de qual campo você está tratando, caso você venha a incluir novos campos na query/tabela e alguma coluna mudar de posição, isto lhe acarretará proclemas. Então, se você não trabalhar com os campos adicionados ao projeto, sugiro que você utilize FieldByName(nome_campo) no lugar de Fields[indice]; 3) em teste como if Text = ' / / ' then, eu lhe recomendaria utilizar if Trim(Text) = '/ /' then (sem os espaços do dia e ano), porque se você mudar a máscara de 4 para 2 dígitos para o ano, não terá qualquer efeito colateral. Não leve a mal os comentários, mas achei que poderia ser interessante lhe chamar a atenção para eles. Se coloquei algo de errado, por favor, me corrija - sem problemas. Abraços
-
Obter A Quantidade De Decimais De Um Campo, Em Delphi6,
pergunta respondeu ao paulobergo de Micheus em Delphi, Kylix
Se não estou enganado, existe num TFloatField (e similares) a propriedade Precision (acho que é isso), mas não estou certo se ele é atualizado com o valor vindo do banco ou se é uma propriedade que você define para o TField. Abraços -
Dá para aproveitar um pouco do que utilizei num outro post, ainda estes dias (link), e criar uma nova função para conversão de imagens de um formato para outro. Eu utilizo a unit GraphicEx que possibilita a carga de muitos outros formatos além dos tradicionais (jpg, bmp, ico), então testei com TIF e WMF e funcionou direitinho (teve uma imagem TIF que não consegui abrir, então depende de a classe estar preparada para a versão em questão) - veja se funcionará para o que você precisa. É uma função genérica. Voce passa o path\nome do arquivo da imagem e o resultado (imagem de saída) depende da classe que você passa em DstPic (TBitmap, TJPEGImage - teoricamente poderia ser qualquer classe de imagem descendente de TGraphic): function ConvertImage(SrcName :string; DstPic :TGraphic) :boolean; var Picture :TPicture; ImageBMP :TBitmap; begin Result := False; // Criamos um TPicture para ler "virtualmente" qualquer tipo de imagem Picture := TPicture.Create; try // Carregamos a imagem a partir do arquivo indicado em SrcName Picture.LoadFromFile(SrcName); // O tipo TBitmap, aparentemente, é intercambiável entre os diversos formatos. // Deste modo, conseguiremos, por exemplo carregar um WMF e gravá-lo em JPG - já // diretamente não seria possível (pelo menos não consegui rsrs) ImageBMP := TBitmap.Create; try // Ajustamos as dimensões do bitmap ImageBMP.Width := Picture.Width; ImageBMP.Height := Picture.Height; // Desenhamos no bitmap a imagem carregada ImageBMP.Canvas.Draw(0, 0, Picture.Graphic); // "Forçamos" a cópia da imagem no bitmap para o tipo de imagem passada // via parâmetro DstPic. A classe TGraphic é base para varias classes // que manipulam imagem - assim, teoricamente, qualquer que seja a classe de // imagem passada como parâmetro, esta receberá a imagem contida na origem DstPic.Assign(ImageBMP); // Indicamos que a conversão transcorreu sem problemas Result := True; finally ImageBMP.Free; end; finally Picture.Free; end; end; Segue um exemplo de uso do que você pediu, com alguns adendos apenas para mostrar outras manipulações com a imagem (marquei com * o que não lhe interessa ;) ):procedure TForm1.Button3Click(Sender: TObject); var ImageBMP :TBitmap; (*) ImageJpg :TJPEGImage; begin if OpenPictureDialog1.Execute then begin ImageBMP := TBitmap.Create; (*) ImageJpg := TJPEGImage.Create; try if ConvertImage(OpenPictureDialog1.FileName, ImageJpg) then begin // Utilizamos um TImage para mostrar imagem na tela mas não é obrigatório Image1.Picture.Assign(ImageJpg); (*) // Para gravar no disco a imagem convertida para JPG... ImageJpg.SaveToFile('c:\temp\teste.jpg'); (*) // Para gravar no disco como BMP a partir do JPG convertido ImageBMP.Assign(ImageJpg); (*) ImageBMP.SaveToFile('c:\temp\teste.bmp'); (*) // ... // Para copiar para o ClipBoard Clipboard.Assign(ImageJpg); end; finally ImageJpg.Free; ImageBMP.Free; (*) end; end; end; Abraços
-
Juntar Duas Imagens, E Gravar Como Uma Só.(resolvido)(+...)
pergunta respondeu ao schaukoski de Micheus em Delphi, Kylix
schaukoski, você deveria ter colocado este comentário como uma resposta, assim, teria gerado um novo post e alguém poderia ter lhe respondido antes. Tente o seguinte: não use o free, simplesmente utilize image1.picture.assign(nil) para "limpar" a imagem de seu TImage. -
Veja se este Post de 2003 atende a sua necessidade.
-
Não seria o caso de definir na sua máscara se ela é ou não gravada com os dados, como sugeriu no post #3 o colega Antonio?Se você tem um campo CPF com a máscara "999.999.999-99;1;_" e não houver números digitados no campo, em seu banco os "pontos" na máscara serão gravados (' . . - '), mas se você utilizar "999.999.999-99;0;_", isto não ocorrerá. Seria isto?
-
Struct No Delphi (como Parâmetro De Função)
pergunta respondeu ao Mauro Sano de Micheus em Delphi, Kylix
Churc, permita-me fazer um comentário sobre a conversão:- Quando em C são declaradas "string's" como no formato "CHAR szLogArqNom[256]", costumo entendê-las como sendo um array of char no Delphi. Devemos observar que está explícito o tamanho do campo, mesmo assim não é a mesma coisa que utilizar o shortstring, já que este não é "null terminated". Utilizando o tipo String não estamos especificando o tamanho (reservando o espaço "solicitado") em bytes ocupado pelo campo na declaração original do registro. É claro que isto poderia ser contornado utilizando a função SetLength, mas acho que não seria muito prático. Penso que seja mais prático declarar como array of char e na utilização fazer o type-cast se necessário. Abraços -
Eu nem me preocupei com este detalhe, porque dependendo o caso não é necessário.Mas, considerando que você tenha que informar um nome para o TabSheet sendo criado, não há qualquer problema já que você deverá ter ele de ante-mão. Assim, modificando um pouco o código: procedure AddTabSheet(PageControl :TPageControl; SheetName, Caption :string); var TS :TTabSheet; begin // tentamos encontra a TabSheet na lista de componentes do Owner do PageControl (já que é este mesmo // Owner que passamos ao novo TabSheet que criamos) e caso não seja encontrada, criamos ela TS := PageControl.Owner.FindComponent(SheetName); if not Assigned(TS) then begin TS := TTabSheet.Create(PageControl.Owner); TS.Name := SheetName; TS.Caption := Caption; TS.PageControl := PageControl; // é aqui que você a insere na PageControl end; // aqui criamos o Memo (sem o uso de variável local), passando o Owner do PageControl // que normalmente é o Form em que ele está inserido with TMemo.Create(PageControl.Owner) do begin Parent := TS; // "indica" aonde ele será "pintado" // estes dados também poderiam ser parâmetros na função Top := 8; Left := 8; Height := 100; Width := 200; // ou se for para alinhá-los a área client, então bastaria somente: // Align := alClient; end; end;Acredito que esteja funcional (não testei) ;) Abraços
-
Ele manipula estes eventos e não os exporta. Mas você sabe quando foi dado um click (mousedown+mouseup) através do evento OnCellClick. Apesar de que não servirá para o que você quer.
-
(Resolvido) Memo1.lines.add(msg) Como Adicionar Na Mesma Linha
pergunta respondeu ao mariquito de Micheus em Delphi, Kylix
Só para clarear as coisas, Memo1Lines.Add sempre incluirá uma linha no final do memo (sua lista de strings). Outra coisa, é sobre como você fez sua pergunta. Voce colocou: "como eu faço para adicionar uma messagem na mesma linha", e isto sugere que você quer incluir uma linha numa determinada posição - empurrando o resto "para baixo". Se for isso, experimente utilizar: Memo1.Lines.Insert(INDEX, Msg); Mas, se sua pergunta devesse ser: "como eu faço para alterar uma messagem na mesma linha"(ou seja, alterar uma linha no memo), e isto significaria substituir uma linha numa determinada posição, então você vai utilizar o que o colega Churc propôs: Abraços -
Pegando um gancho no exemplo, e tornando uma função genérica:P/ criar: procedure AddTabSheet(PageControl :TPageControl; Caption :string); var TS :TTabSheet; begin TS := TTabSheet.Create(PageControl.Owner); TS.Caption := Caption; TS.PageControl := PageControl; // é aqui que você a insere na PageControl. // aqui criamos o Memo (sem o uso de variável local), passando o Owner do PageControl // que normalmente é o Form em que ele está inserido with TMemo.Create(PageControl.Owner) do begin Parent := TS; // "indica" aonde ele será "pintado" // estes dados também poderiam ser parâmetros na função Top := 8; Left := 8; Height := 100; Width := 200; // ou se for para alinhá-los a área client, então bastaria somente: // Align := alClient; end; end;e vale para qualquer componente que você quiser adicionar ao TabSheet (ou outro componente "container"). Abraços end;
-
Carlos, no primeiro caso, se você observar, quando você está no modo edição e testa: if QryClientesCPF_CNPJ.Value = DBEditCPF_CNPJ.Text then você está testando duas coisas iguais - o campo ligado à DBEditCPF_CNPJ não é justamente QryClientesCPF_CNPJ? Acredito que seja. E, neste caso, sugiro que você compare o valor anterior a edição com a atual: if QryClientesCPF_CNPJ.Value = QryClientesCPF_CNPJ.OldValue then Teste e veja se funca. Abraços
-
Então você tem um Alias definido via BDE Administrator, não? Se a resposta ao item anterior é sim, então para este item: você havia definido o mesmo alias no BDE nesta máquina? Abraços
-
Não é estranho não. você fez o contrário do que o Progr'amador sugeriu. Tem que ser assim:... If NOT QryVisita.IsEmpty Then QuickRep1.Preview else begin ShowMessage('Nenhum Registro Encontrado!'); exit; end; ...Observe o Not Empty - visualiza se não estiver vazio. Abraços
-
Como Faço Um Tratamento De Error Nesse Comando?
pergunta respondeu ao mariquito de Micheus em Delphi, Kylix
a tentativa de execução de um programa utilizando WinExec não gera uma Exception. você deve avaliar o resultado da função. Veja o que diz o help: "Return Value If the function succeeds, the return value is greater than 31. If the function fails, the return value is one of the following error values: Value Meaning 0 The system is out of memory or resources. ERROR_BAD_FORMAT The .EXE file is invalid (non-Win32 .EXE or error in .EXE image). ERROR_FILE_NOT_FOUND The specified file was not found. ERROR_PATH_NOT_FOUND The specified path was not found." Ou seja, você testa o retorno da função (você pode até utilizar uma variável para armazená-la) e se ele for ele for maior que 31 não houve qualquer erro. Do contrário, pode ser alguns dos citados no help. Ficaria algo assim:... Erro := WinExec('comando', SW_SHOW); if Erro <= 31 then case Erro of 0 : ErroMsg := 'The system is out of memory or resources.'; ERROR_BAD_FORMAT : ErroMsg := 'The .EXE file is invalid (non-Win32 .EXE or error in .EXE image).'; ERROR_FILE_NOT_FOUND : ErroMsg := 'The specified file was not found.'; ERROR_PATH_NOT_FOUND : ErroMsg := 'The specified path was not found.'; else ErroMsg := 'Erro não tratado'; end else ErroMsg := 'Fim'; ShowMessage(ErroMsg); ... Abraços -
Como você está fazendo o acesso ao banco? Qual a configuração no componente Database (se você o utiliza) ou algo assim (Drive utilizado, conteúdo de Params...). Esta eu passo. :rolleyes: É comum ver o pessoal utilizando os componentes para acesso ao InterBase. Mas se está funcionando na máquina aonde está a instalação do D4, então deveria funcionar com os componentes que você utilizaram. Na instalação no cliente, também foi feita a instalação do BDE? Dependendo dos componentes utilizados é necessário.
-
Como Mandar Texto Via Serversocket Clientsocket? Dar Error
pergunta respondeu ao mariquito de Micheus em Delphi, Kylix
ocorre um mesagem de error ao atualizar conexão com o serve..eu queria que esse error não mostrasse tipo já tentei esse codigo de error e não conseguir try ChatClientSocket.Active := not ChatClientSocket.Active; except end; end; você sabe como eu posso tirar essa mensagem de error? Qual é a mensagem de erro? E porque você ativa a conexão em um timer? -
Se você conhece o formato, então não seria apenas abrir o arquivo (como qualquer outro) e procurar pelas informações nele contidas?En todos os casos, dê uma espiada neste link(procure por DC-DSP Components v.1.0) e veja se já não há um componente para o que você quer fazer. Na pior das hipóteses, pode lhe dar uma "luz". Abraços
-
Como Mandar Texto Via Serversocket Clientsocket? Dar Error
pergunta respondeu ao mariquito de Micheus em Delphi, Kylix
mariquito, não dá para precisar onde estaria o erro porque não está claro aonde ele ocorre. Entretanto, observe que no Server o evento OnClientConnect ocorre apenas a cada client que se conecta a este servidor. A instrução que você utilizou (ServerSocket1.Socket.Connections[0].SendText(valor+'thiago')) irá sempre enviar a mensagem (valor+'thiago') para o 1º client que se conectou (Socket.Connections[0]), o que pode não ser o desejado se houver a possibilidade de mais que um cliente se conectar. Neste caso, seria mais correto você utilizar o parâmetro Socket o qual se refere ao client sendo conectado (Socket.SendText...). A lista de conexões pode ser utilizada para enviar uma mensagem a um determinado client num momento específico (click de um botão enviar, por ex.). Mas eu não saberia lhe dizer como saber quantas conexões estão presentes - não conheço uma propriedade tipo "ConnectionCount" ou similar que permita indexar a lista Connections. O que eu já fiz, em uma oportunidade é manter uma lista (até porque na época era conveniente mesmo) com o nome do client e sockt recebidos na conexão. Eu fiz um exemplo (form) contendo um Server e 2 Client's para tentar auxiliar na compreensão do que estou dizendo e, quem sabe, auxiliá-lo a resolver seu problema. (Download) Abraços -
Usar Query Zeos Ou Query Bde Por Referência! Solucionado!
pergunta respondeu ao paulobergo de Micheus em Delphi, Kylix
paulobergo, acredito que você possa fazer algo parecido sim. Observe que ambas as classes (componentes) são descendentes de TDataSet. E neste caso, a lógica diz que, os métodos são herdados ou sobrescritos para garantir a funcionalidade existente na classe pai. Deste modo, você poderia fazer algo como (costumo usar bastante): procedure .... var QryUnknow :TDataSet; begin If bMySQLUse then QryUnknow := zQuery1 Else QryUnknow := Query1; sCampoNome := 'descricao'; sConteudo := QryUnknow.FieldByName(sCampoNome).AsString; end;o nome do campo poderia ser passado diretamente para o método FieldByName, ok?! Abraços -
Fique a vontade. ;)
-
Veja então qual é o cabeçalho do arquivo RIFF - link
-
Procure no help por SetLocaleInfo, acho que dá. Abraços