Você está aqui: Delphi ::: Dicas & Truques ::: Arquivos e Diretórios |
Como retornar apenas a letra do drive do diretório atualQuantidade de visualizações: 11586 vezes |
A unit System do Delphi nos fornece a procedure GetDir(), usada para retornar o diretório atual. Porém, há situações nas quais precisamos obter apenas a letra do drive atual. Para esta finalidade escrevi a função obterLetraDriveAtual(), que não requer nenhum argumento e retorna a letra do drive atual. Note que incluí uma chamada a ela no evento Click de um botão para tornar o exemplo completo:---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- // função que permite obter a letra do drive // atual function obterLetraDriveAtual: Char; var s: string; letra: Char; begin GetDir(0, s); letra := s[1]; Result := letra; end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage('A letra do drive atual é: ' + obterLetraDriveAtual); end; Para fins de compatibilidade, esta dica foi escrita usando Delphi 2009. |
![]() |
Delphi ::: Dicas & Truques ::: Data e Hora |
Como obter a quantidade de dias para um determinado ano usando a função DaysInAYear() do DelphiQuantidade de visualizações: 11468 vezes |
Quando estamos trabalhando com datas, geralmente precisamos saber a quantidade de dias que um determinado ano possui, ou seja, alguns anos possuem 365 dias, outros possuem 366. A unit DateUtils possui uma função chamada DaysInAYear() que serve para este propósito. Ela aceita um inteiro representando o ano desejado e retorna um inteiro representando a quantidade de dias que tal ano possui. Veja o exemplo:---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); var ano, dias_ano: Integer; begin ano := 2010; // vamos obter a quantidade de dias para o // ano de 2010 dias_ano := DaysInAYear(ano); // exibe o resultado ShowMessage('O ano informado contém ' + IntToStr(dias_ano) + ' dias'); end; Este trecho de código nos informará que o ano de 2010 possui 365 dias. Note que o argumento para a função DaysInAYear() deve estar entre 1 e 9999 (inclusive). Para fins de compatibilidade, esta dica foi escrita usando Delphi 2009. |
Delphi ::: Dicas & Truques ::: Arquivos e Diretórios |
Como excluir um arquivo em Delphi usando a função DeleteFile()Quantidade de visualizações: 31980 vezes |
Em algumas situações nossas aplicações precisam excluir arquivos. Para isso o Delphi nos fornece a função DeleteFile(), presente na unit SysUtils. Esta função recebe o caminho e nome do arquivo a ser excluído e retorna true se a exclusão foi feita com sucesso e false em caso contrário. Veja um trecho de código no qual excluímos um arquivo chamado "dados.txt": ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); var arquivo: string; begin // diretorio e nome do arquivo arquivo := 'C:\arquivo de codigos\dados.txt'; // vamos remover o arquivo if DeleteFile(arquivo) then ShowMessage('O arquivo foi excluído com sucesso') else ShowMessage('Não foi possível excluir o arquivo'); end; Para fins de compatibilidade, esta dica foi escrita usando Delphi 2009. |
Delphi ::: Dicas & Truques ::: Ponteiros, Referências e Memória |
Como usar nil para testar ou indicar que um ponteiro Delphi não referencia nenhuma posição de memóriaQuantidade de visualizações: 15095 vezes |
O propósito dos ponteiros é nos permitir acessar e manipular os valores de outras variáveis. Isso é feito acessando-se diretamente o endereço de memória destas variáveis. Porém, há situações nas quais queremos testar se um determinado ponteiro está realmente apontando para um local na memória. Veja o seguinte trecho de código:---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); var pvalor: ^integer; begin // vamos exibir o valor da variável referenciada pelo // ponteiro pvalor ShowMessage(IntToStr(pvalor^)); end; Ao executarmos este código nós teremos um valor aleatório sendo exibido (e um warning do tipo W1036 Variable 'pvalor' might not have been initialized. Isso acontece porque criamos um ponteiro para um Integer mas não indicamos o endereço da variável para a qual ele aponta, ou seja, até o momento este ponteiro é nulo (não aponta para nenhuma posição de memória). Mova a declaração do ponteiro para a seção interface e verá que código compilará mas teremos uma exceção do tipo EAccessViolation (Exception class EAccessViolation with message 'Access violation at address ... in module ...). Clássico erro de lógica. Estamos tentando acessar dados não existentes na memória. Esta situação pode ser evitada testando se o ponteiro ainda é nulo antes de tentarmos desreferenciá-lo. Veja: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); begin // vamos exibir o valor da variável referenciada pelo // ponteiro pvalor if pvalor = nil then ShowMessage('O ponteiro ainda é nulo.') else ShowMessage(IntToStr(pvalor^)); end; Note que movi a declaração do ponteiro para a secão interface, de forma a torná-la global. Isso evita que o ponteiro seja automaticamente inicializado (o que sempre acontece com as variáveis locais). Ao executar o código novamente você verá a mensagem indicando que o ponteiro ainda é nulo. Podemos também usar nil para, explicitamente, marcar um ponteiro como nulo, ou seja, definir que o ponteiro não aponta para nenhum local na memória. Comece declarando as variáveis abaixo na seção interface do formulário: valor: Integer; pvalor: ^Integer; Em seguida coloque o código abaixo no evento Click de um botão: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); begin // vamos atribuir um valor à variável valor valor := 14; // vamos "apontar" nosso ponteiro para o local de // memória da variável valor pvalor := @valor; // vamos exibir o valor da variável apontada por pvalor ShowMessage(IntToStr(pvalor^)); // vamos marcar pvalor como nulo pvalor := nil; // vamos causar um EAccessViolation já que pvalor // não aponta para nenhum local na memória agora ShowMessage(IntToStr(pvalor^)); end; Sempre que marcamos um ponteiro como nil, a memória até então ocupada por ele é liberada para uso por parte do sistema operacional ou demais programas. Este procedimento ajuda a evitar os vazamentos de memória (memory leak) tão frequentes em códigos que trabalham com memória alocada dinamicamente. Para fins de compatibilidade, esta dica foi escrita usando Delphi 2009. |
Delphi ::: Dicas & Truques ::: Strings e Caracteres |
Como verificar se uma substring está contida no final de uma string usando a função AnsiEndsStr() do DelphiQuantidade de visualizações: 11365 vezes |
Em algumas situações precisamos verificar se uma substring está contida no final de uma string, ou seja, se a string termina com um determinado sufixo. Em Delphi isso pode ser feito com o auxílio da função AnsiEndsStr(). Esta função requer a substring a ser pesquisada e a string alvo da pesquisa. O retorno será true se a substring estiver contida no final da string. Do contrário o retorno será false. Veja o exemplo:---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); var frase: string; begin frase := 'Gosto muito de Delphi e Java'; // vamos verificar se a string termina com "Java" if AnsiEndsStr('Java', frase) then ShowMessage('A frase termina com a substring indicada') else ShowMessage('A frase NÃO termina com a substring indicada') end; Não se esqueça de adicionar a unit StrUtils no uses do seu formulário. Para questões de compatibilidade, esta dica foi escrita usando Delphi 2009. |
Delphi ::: Data Controls (Controles de Dados) ::: TDBGrid |
Como aplicar cores alternadas às linhas de um TDBGrid do Delphi (efeito zebrinha)Quantidade de visualizações: 9603 vezes |
Em algumas situações gostaríamos de aplicar o efeito zebrinha, ou seja, aplicar cores alternadas às linhas de um controle TDBGrid. Esta técnica é muito útil quando temos grids com várias linhas e queremos facilitar a visualização dos dados por parte dos usuários. A forma mais comum de se aplicar cores alternadas às linhas do DBGrid é por meio do evento OnDrawColumnCell. Veja o trecho de código abaixo: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- procedure TForm3.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var grid: TDBGrid; linha: Integer; begin // obtém um referência ao DBGrid grid := sender as TDBGrid; // obtém o número da linha atual usando a propriedade // RecNo da classe TDataSet linha := grid.DataSource.DataSet.RecNo; // o número da linha é par? if Odd(linha) then grid.Canvas.Brush.Color := clWhite else grid.Canvas.Brush.Color := clYellow; // vamos terminar de desenhar a célula grid.DefaultDrawColumnCell(Rect, DataCol, Column, State); end; Execute este código e verá que a primeira linha é pintada de branco, a segunda de amarelo, a terceira de branco e assim por diante. Note que neste código eu não tratei a seleção de células, na qual a cor do texto se iguala ao branco do fundo da célula. Veja mais dicas nesta seção para saber como realizar esta tarefa você mesmo. Esta dica foi escrita e testada no Delphi 2009. |
Delphi ::: Dicas & Truques ::: Trigonometria - Funções Trigonométricas |
Como calcular o cateto oposto dadas as medidas da hipotenusa e do cateto adjascente em DelphiQuantidade de visualizações: 2642 vezes |
Todos estamos acostumados com o Teorema de Pitágoras, que diz que "o quadrado da hipotenusa é igual à soma dos quadrados dos catetos". Baseado nessa informação, fica fácil retornar a medida do cateto oposto quando temos as medidas da hipotenusa e do cateto adjascente. Isso, claro, via programação em linguagem Delphi. Comece observando a imagem a seguir: ![]() Veja que, nessa imagem, eu já coloquei os comprimentos da hipotenusa, do cateto oposto e do cateto adjascente. Para facilitar a conferência dos cálculos, eu coloquei também os ângulos theta (que alguns livros chamam de alfa) e beta já devidamente calculados. A medida da hipotenusa é, sem arredondamentos, 36.056 metros. Então, sabendo que o quadrado da hipotenusa é igual à soma dos quadrados dos catetos (Teorema de Pitógoras): \[c^2 = a^2 + b^2\] Tudo que temos que fazer é mudar a fórmula para: \[a^2 = c^2 - b^2\] Veja que agora o quadrado do cateto oposto é igual ao quadrado da hipotenusa menos o quadrado do cateto adjascente. Não se esqueça de que a hipotenusa é o maior lado do triângulo retângulo. Veja agora como esse cálculo é feito em linguagem Delphi: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- procedure TForm2.Button1Click(Sender: TObject); var a, b, c: Real; begin c := 36.056; // medida da hipotenusa b := 30; // medida do cateto adjascente // agora vamos calcular o comprimento da cateto oposto a := sqrt(sqr(c) - sqr(b)); // e mostramos o resultado Edit1.Text := 'A medida do cateto oposto é: ' + FloatToStr(a); end; Veja que o cálculo é feito a partir do evento Click de um botão Button1 e o resultado é apresentado na propriedade Text de uma caixa de texto Edit1. Ao executar este código Delphi nós teremos o seguinte resultado: A medida do cateto oposto é: 20,0008783807112 Como podemos ver, o resultado retornado com o código Delphi confere com os valores da imagem apresentada. |
Delphi ::: Dicas & Truques ::: Imagens e Processamento de Imagens |
Como carregar uma imagem JPG, convertê-la em Bitmap e desenhá-la no formulário usando DelphiQuantidade de visualizações: 18504 vezes |
Em algumas situações nós precisamos carregar uma imagem JPG, convertê-la em Bitmap e desenhá-la em nosso formulário. Nesta dica eu mostro como isso pode ser feito. Vamos começar lendo a imagem JPG a partir do diretório da aplicação:---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- procedure TForm3.Button1Click(Sender: TObject); var bmp: TBitmap; jpg: TJPEGImage; begin // uses Jpeg; // não esqueça // vamos criar o bitmap bmp := TBitmap.Create; // vamos criar o JPG jpg := TJPEGImage.Create; try // vamos carregar a imagem JPG jpg.LoadFromFile('foto.jpg'); // vamos convertê-la para Bitmap bmp.Assign(jpg); // vamos desenhar o bitmap no formulário // começando nas coordenadas x = 0; y = 0 a partir // do canto superior esquerdo da área cliente do formulário Form3.Canvas.Draw(0, 0, bmp); finally Jpg.Free; Bmp.Free; end; end; Veja que a técnica consiste em carregar a imagem JPG e convertê-la em Bitmap usando o método Assign() da classe TBitmap. Em seguida só precisamos usar o método Draw() do Canvas do formulário para desenhar a imagem já convertida. Caso você precise carregar a imagem JPG em tempo de execução, basta colocar um TOpenPictureDialog no formulário e alterar o código do evento Click do botão para: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- procedure TForm3.Button1Click(Sender: TObject); var bmp: TBitmap; jpg: TJPEGImage; begin // uses Jpeg; // não esqueça if OpenPictureDialog1.Execute then begin // vamos criar o bitmap bmp := TBitmap.Create; // vamos criar o JPG jpg := TJPEGImage.Create; try // vamos carregar a imagem JPG jpg.LoadFromFile(OpenPictureDialog1.FileName); // vamos convertê-la para Bitmap bmp.Assign(jpg); // vamos desenhar o bitmap no formulário // começando nas coordenadas x = 0; y = 0 a partir // do canto superior esquerdo da área cliente do formulário Form3.Canvas.Draw(0, 0, bmp); finally Jpg.Free; Bmp.Free; end; end; end; Vamos complicar um pouco mais? Que tal uma função que carrega a imagem JPG, faz a conversão para Bitmap e retorna o Bitmap para o chamador? Veja: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- function jpg2bitmap(const imagem: String): TBitmap; var bmp: TBitmap; jpg: TJPEGImage; begin // uses Jpeg; // não esqueça // vamos criar o bitmap bmp := TBitmap.Create; // vamos criar o JPG jpg := TJPEGImage.Create; try // vamos carregar a imagem JPG jpg.LoadFromFile(imagem); // vamos convertê-la para Bitmap bmp.Assign(jpg); except bmp := nil; end; // vamos retornar o bitmap resultante Jpg.Free; Result := bmp; end; procedure TForm3.Button1Click(Sender: TObject); var bmp: TBitmap; begin // vamos obter o Bitmap a partir da função personalizada bmp := jpg2bitmap('foto2.jpg'); // a imagem Bitmap foi obtida com sucesso? if bmp <> nil then begin // vamos desenhar o bitmap no formulário // começando nas coordenadas x = 0; y = 0 a partir // do canto superior esquerdo da área cliente do formulário Form3.Canvas.Draw(0, 0, bmp); bmp.Free; end else ShowMessage('Não foi possível obter o Bitmap'); end; Para fins de compatibilidade, esta dica foi escrita usando Delphi 2009. |
Delphi ::: Dicas & Truques ::: Strings e Caracteres |
Como trabalhar com strings em Delphi - Como usar strings na linguagem DelphiQuantidade de visualizações: 28156 vezes |
Strings estão presentes em praticamente todos os programas que desenvolvemos, não importa a linguagem de programação usada. Sempre que queremos trabalhar com nomes de pessoas, nomes de cidades, palavras, frases e textos, as strings estão lá para nos auxiliar. Assim, para as linguagens de programação, as strings são apenas matrizes de caracteres (letras ou símbolos). Em Delphi podemos declarar e inicializar strings da seguinte forma: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); var nome: string; // declara uma variável do tipo string begin nome := 'Osmar J. Silva'; // inicializa a variável ShowMessage(nome); // exibe o conteúdo da string end; Quando declaramos uma string em Delphi usando a palavra-chave string, o compilador automaticamente assume o tipo UnicodeString, com uma capacidade de 2^30 caracteres (mais ou menos 1.073.741.824 caracteres) com uma capacidade variando de 4 bytes até 2GB. Além do tipo string, o Delphi suporta outros tipos que possibilitam também o trabalho com strings e caracteres. Entre eles podemos citar ShortString, AnsiString, WideString entre outros. Quando puder dê mais uma revisada nas minha dicas sobre strings e caracteres para aprender mais. É possível também usar o tipo string para criar strings com tamanhos pré-definidos. Veja: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- var nome: string[5]; // declara uma variável do tipo string // que guardará apenas 5 caracteres Aqui temos uma string que não suportará mais que cinco caracteres. Importante notar que, internamente, teremos agora uma string do tipo ShortString e não mais UnicodeString como anteriormente. Se tentarmos atribuir mais que cinco caracteres nesta variável, o restante será truncado: ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- nome := 'Osmar J. Silva'; // inicializa a variável ShowMessage(nome); // mostrará apenas "Osmar" Para finalizar, veja como podemos solicitar ao usuário que informe seu nome e exibí-lo usando a função ShowMessage(): ---------------------------------------------------------------------- Se precisar de ajuda para ajustar o código abaixo de acordo com as suas necessidades, chama a gente no WhatsApp +55 (62) 98553-6711 (Osmar) Ah, e se puder, faça uma DOAÇÃO de qualquer valor para nos ajudar a manter o site livre de anúncios. Ficaremos eternamente gratos ;-) Nosso PIX é: osmar@arquivodecodigos.com.br ---------------------------------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); var nome: string; // declara uma variável do tipo string begin // vamos solicitar ao usuário que informe seu nome nome := Dialogs.InputBox('Nome', 'Informe seu nome:', ''); ShowMessage('Seu nome é: ' + nome); // mostrará apenas "Osmar" end; Para questões 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 |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
1º lugar: Java |