Você está aqui: Delphi ::: VCL - Visual Component Library ::: TRichEdit |
Como destacar URLs em um TRichEdit e abrí-las no browser quando clicadasQuantidade de visualizações: 10837 vezes |
Em algumas situações gostaríamos de destacar as URLs no texto de um TRichEdit e, quando o usuário clicar nas URLs, abrí-las no navegador. Nesta dica eu mostro como isso pode ser feito: O primeiro passo é colocar um TRichEdit no seu formulário. Em seguida siga atentamente os passos abaixo: a) Adicione uma declaração de procedure que sobrescreve WndProc() na seção protected do formulário. Isso é necessário para que possamos ter acesso à mensagem WM_NOTIFY da API do Windows: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- protected // precisamos sobrescrever a procedure WndProc procedure WndProc(var Message: TMessage); override; b) Faça a implementação da procedure WndProc(var Message: TMessage): ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- procedure TForm1.WndProc(var Message: TMessage); var p: TENLink; // contém informação sobre a mensagem de notificação EN_LINK strURL: string; // guardará a URL a ser aberta no navegador begin // a mensagem é WM_NOTIFY? if (Message.Msg = WM_NOTIFY) then begin // o código da mensagem de notificação é EN_LINK? if (PNMHDR(Message.lParam).code = EN_LINK) then begin // vamos preencher a estrutura TENLink p := TENLink(Pointer(TWMNotify(Message).NMHdr)^); // o usuário pressionou o botão esquerdo? if (p.Msg = WM_LBUTTONDOWN) then begin // vamos selecionar o texto contendo o link SendMessage(RichEdit1.Handle, EM_EXSETSEL, 0, Longint(@(p.chrg))); // vamos obter o texto selecionado (que contém o link) strURL := RichEdit1.SelText; // finalmente vamos abrir o endereço contido no link no navegador ShellExecute(Handle, 'open', PChar(strURL), 0, 0, SW_SHOWNORMAL); end end end; inherited; end; c) Finalmente coloque o código abaixo no evento Create do formulário: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- procedure TForm1.FormCreate(Sender: TObject); var mascara: Word; begin // não esqueça de adicionar Richedit e ShellAPI no uses mascara := SendMessage(Handle, EM_GETEVENTMASK, 0, 0); SendMessage(RichEdit1.Handle, EM_SETEVENTMASK, 0, mascara or ENM_LINK); // vamos fazer com que o RichEdit detect URLs e aplique a formatação de links SendMessage(RichEdit1.Handle, EM_AUTOURLDETECT, Integer(True), 0); end; Para que você aproveite bem a dica, segue o código completo para a unit: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Richedit, ShellAPI, StdCtrls, ComCtrls; type TForm1 = class(TForm) RichEdit1: TRichEdit; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } protected // precisamos sobrescrever a procedure WndProc procedure WndProc(var Message: TMessage); override; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var mascara: Word; begin // não esqueça de adicionar Richedit e ShellAPI no uses mascara := SendMessage(Handle, EM_GETEVENTMASK, 0, 0); SendMessage(RichEdit1.Handle, EM_SETEVENTMASK, 0, mascara or ENM_LINK); // vamos fazer com que o RichEdit detect URLs e aplique a formatação de links SendMessage(RichEdit1.Handle, EM_AUTOURLDETECT, Integer(True), 0); end; procedure TForm1.WndProc(var Message: TMessage); var p: TENLink; // contém informação sobre a mensagem de notificação EN_LINK strURL: string; // guardará a URL a ser aberta no navegador begin // a mensagem é WM_NOTIFY? if (Message.Msg = WM_NOTIFY) then begin // o código da mensagem de notificação é EN_LINK? if (PNMHDR(Message.lParam).code = EN_LINK) then begin // vamos preencher a estrutura TENLink p := TENLink(Pointer(TWMNotify(Message).NMHdr)^); // o usuário pressionou o botão esquerdo? if (p.Msg = WM_LBUTTONDOWN) then begin // vamos selecionar o texto contendo o link SendMessage(RichEdit1.Handle, EM_EXSETSEL, 0, Longint(@(p.chrg))); // vamos obter o texto selecionado (que contém o link) strURL := RichEdit1.SelText; // finalmente vamos abrir o endereço contido no link no navegador ShellExecute(Handle, 'open', PChar(strURL), 0, 0, SW_SHOWNORMAL); end end end; inherited; end; end. |
![]() |
Delphi ::: Dicas & Truques ::: Arquivos e Diretórios |
Como listar todos os arquivos de um diretório usando DelphiQuantidade de visualizações: 1642 vezes |
Como listar todos os arquivos de um diretório usando Delphi Em algumas situações precisamos listar todos os arquivos contidos em um determinado diretório. Para isso podemos usar a função abaixo. Esta função recebe o caminho e nome de um diretório e uma coleção de strings TStrings. Como resultado de sua execução, a função insere em TStrings todos os nomes dos diretórios encontrados. Para facilitar o entendimento do exemplo eu incluí uma chamada à função a partir do evento Click de um botão. Tenha a certeza de colocar uma TListBox no formulário antes de executar o código: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- procedure listarArquivosDir(diretorio: string; lista: TStrings); var search_rec: TSearchRec; begin if FindFirst(diretorio + '*.*', faAnyFile, search_rec) = 0 then begin repeat if search_rec.Attr <> faDirectory then lista.Add(search_rec.Name); until FindNext(search_rec) <> 0; FindClose(search_rec); end; end; procedure TForm1.Button1Click(Sender: TObject); begin listarArquivosDir('c:\', ListBox1.Items); end; Para fins de compatibilidade, esta dica foi escrita usando Delphi 2009. |
Delphi ::: Dicas & Truques ::: Arrays e Matrix (Vetores e Matrizes) |
Delphi para iniciantes - Como escrever uma função que retorna uma matriz de IntegerQuantidade de visualizações: 13542 vezes |
Em algumas situações precisamos retornar uma matriz a partir de uma função. Nesta dica eu mostro como isso pode ser feito. O primeiro passo é declarar um novo tipo. Veja:---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- type // vamos declarar um novo tipo TMatrizInteiros = array of Integer; Aqui o tipo TMatrizInteiros representa uma matriz de inteiros. Veja a unit completa para o exemplo: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; type // vamos declarar um novo tipo TMatrizInteiros = array of Integer; var Form1: TForm1; implementation {$R *.dfm} // função usada para construir e retornar uma // matriz de Integer function obterValores: TMatrizInteiros; var tempArray: TMatrizInteiros; i: integer; begin // vamos definir o tamanho da matriz SetLength(tempArray, 10); // vamos inicializar a matriz com os números pares de 0 até 18 // note que em matrizes abertas o índice inicial é sempre 0 for i := Low(tempArray) to High(tempArray) do begin tempArray[i] := i * 2; end; Result := tempArray; // vamos retornar a matriz end; procedure TForm1.Button1Click(Sender: TObject); var valores: TMatrizInteiros; // uma matriz do tipo TMatrizInteiros i: Integer; begin valores := obterValores(); // que já temos a matriz, vamos exibir os valores de // seus elementos for i := 0 to High(valores) do begin Memo1.Lines.Add(IntToStr(valores[i])); end; end; end. Note que a função retornará uma matriz aberta (open array). Desta forma, seu índice inicial será sempre 0. |
Delphi ::: Dicas & Truques ::: Rotinas de Conversão |
Como converter strings em valores TDateTime usando as funções StrToDate() e StrToDateDef() do DelphiQuantidade de visualizações: 18300 vezes |
A função StrToDate() da unit SysUtils é usada quando queremos converter strings em valores TDateTime. No Delphi 2009 esta função possui duas assinaturas:function StrToDate(const S: string): TDateTime; overload; function StrToDate(const S: string; const FormatSettings: TFormatSettings): TDateTime; overload; A primeira versão de StrToDate() recebe uma string contendo uma data e retorna um objeto TDateTime. Veja o seguinte trecho de código: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); var data: string; data2: TDateTime; begin // vamos converter a data 22/02/2005 data := '22/02/2005'; // a conversão acontece aqui. Note que, caso a conversão // não seja possível, uma exceção do tipo EConvertError será // disparada (lançada) try data2 := StrToDate(data); ShowMessage(DateTimeToStr(data2)); except on e: EConvertError do ShowMessage('Não foi possível efetuar a conversão: ' + e.Message); end; end; Note que a função StrToDate() lançará uma exceção do tipo EConvertError se a string não possuir uma data válida. Os valores de strings representando datas válidas incluem mês/dia/ano, dia/mês/ano e ano/mês/dia. A ordem de dia, mês e ano é determinada pela variáve global ShortDateFormat. Se fornecermos valores apenas para o dia e o mês a função incluirá o ano atual. Não podemos esquecer a barra de separação de datas. Se seu aplicativo foi desenvolvido para rodar em outras localidades, obtenha o separador de datas por meio da variável global DateSeparator. A primeira versão da função StrToDate() não é segura em relação a threads (thread-safe) devido ao uso de informações de localização contidas em variáveis globais, ou seja, se uma thread modificar os valores de tais variáveis, código sendo executado em outras threads sofrerão as consequencias. Para evitar isso podemos usar a segunda versão de StrToDate(), que usa um objeto FormatSettings para guardar as informações de localização. Veja um exemplo: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); var data: string; data2: TDateTime; formato: TFormatSettings; begin // vamos converter a data 22/02/2005 data := '22/02/2005'; // a conversão acontece aqui. Note que, caso a conversão // não seja possível, uma exceção do tipo EConvertError será // disparada (lançada) try GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, formato); data2 := StrToDate(data, formato); ShowMessage(DateTimeToStr(data2)); except on e: EConvertError do ShowMessage('Não foi possível efetuar a conversão: ' + e.Message); end; end; A função StrToDateDef() é similar à função StrToDate(). A diferença é que, se a string possuir uma data inválida, a função StrToDateDef() retorna uma data padrão, ou seja, não haverá nenhuma exceção atirada. Veja: ---------------------------------------------------------------------- Se precisar de ajuda com o código abaixo, pode me chamar no WhatsApp +55 (62) 98553-6711 (Osmar) ---------------------------------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); var data: string; data2: TDateTime; begin // vamos converter a data 2s2/02/2005 (inválida) data := '2s2/02/2005'; // a conversão acontece aqui. Note que, caso a conversão // não seja possível, a data atual será retornada data2 := StrToDateDef(data, Now); ShowMessage(DateTimeToStr(data2)); end; Para fins de compatibilidade, esta dica foi escrita usando Delphi 2009. |
Desafios, Exercícios e Algoritmos Resolvidos de Delphi |
Veja mais Dicas e truques de Delphi |
Dicas e truques de outras linguagens |
Laravel - Como criar um CRUD completo em Laravel 8 - CRUD em Laravel usando PHP e MySQL (MariaDB) - Parte 2 R - R para Matemática e Estatística - Como calcular desvio padrão usando a função sd() da linguagem R |
Códigos Fonte |
![]() Diga adeus às planilhas do Excel e tenha 100% de controle sobre suas contas a pagar e a receber, gestão de receitas e despesas, cadastro de clientes e fornecedores com fotos e histórico de atendimentos. Código fonte completo e funcional, com instruções para instalação e configuração do banco de dados MySQL. Fácil de modificar e adicionar novas funcionalidades. Clique aqui e saiba mais |
![]() Tenha o seu próprio sistema de controle de estoque web. com cadastro de produtos, categorias, fornecedores, entradas e saídas de produtos, com relatórios por data, margem de lucro e muito mais. Código simples e fácil de modificar. Acompanha instruções para instalação e criação do banco de dados MySQL. Clique aqui e saiba mais |
Linguagens Mais Populares |
1º lugar: Java |