Ofereço ajuda em Java, C/C++, Python, C#, LISP, AutoLisp, AutoCAD
+55 (062) 98553-6711
Ofereço ajuda em PHP, Python, C#, JavaScript, Laravel, Google Ads e SEO
+55 (062) 98243-1195

Você está aqui: 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ória

Quantidade 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.

Link para compartilhar na Internet ou com seus amigos:

Delphi ::: Dicas & Truques ::: Rotinas de Conversão

Como converter strings em valores TDateTime usando as funções StrToDate() e StrToDateDef() do Delphi

Quantidade de visualizações: 18351 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 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
  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 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
  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 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
  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.


Delphi ::: Dicas & Truques ::: Strings e Caracteres

Como verificar se uma substring está contida no final de uma string usando a função AnsiEndsStr() do Delphi

Quantidade 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 ::: Dicas & Truques ::: Imagens e Processamento de Imagens

Como carregar uma imagem JPG, convertê-la em Bitmap e desenhá-la no formulário usando Delphi

Quantidade 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 ::: VCL - Visual Component Library ::: TComboBox

Como usar a propriedade Items da classe TComboBox do Delphi

Quantidade de visualizações: 13190 vezes
A propriedade Items da classe TComboBox representa um objeto da classe TStrings, a classe base para objetos que representam uma lista de strings. Isso quer dizer que podemos acessar a propriedade Items e usar todos os métodos e propriedades da classe TStrings, tais como Add(), Clear(), Delete(), Exchange(), etc.

Veja, por exemplo, como usar o método Add() para adicionar um novo item no ComboBox:

----------------------------------------------------------------------
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 adicionar um novo item ao ComboBox
  comboBox1.Items.Add('Arquivo de Códigos');
end;

É possível obter um referência à propriedade Items para manipular os itens do ComboBox indiretamente. 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);
var
  lista: TStrings;
begin
  // vamos obter a lista de itens do ComboBox
  lista := comboBox1.Items;

  // vamos adicionar um novo item à lista
  lista.Add('Arquivo de Códigos');
end;

Esta técnica é útil quando queremos inserir itens em um TComboBox a partir de uma função ou procedure. 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 personalizada para inserir itens em um TComboBox
procedure inserirItensComboBox(lista: TStrings);
begin
  lista.Add('Arquivo de Códigos');
  lista.Add('Osmar J. Silva');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // vamos chamar a procedure que adiciona os itens no ComboBox
  inserirItensComboBox(ComboBox1.Items);
end;

Para finalizar, veja como escrever uma função personalizada que constrói e retorna uma lista de strings. Note como usamos o objeto TStrings retornado para preencher o ComboBox:

----------------------------------------------------------------------
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 personalizada que constrói e retorna uma lista
// de strings
function obterLista: TStrings;
var
  lista: TStringList;
begin
  lista := TStringList.Create;
  lista.Add('Arquivo de Códigos');
  lista.Add('Osmar J. Silva');

  Result := lista;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // vamos obter a lista de strings
  ComboBox1.Items := obterLista;
end;

Observe que, embora o retorno seja TStrings, no corpo da função nós construímos um objeto da classe TStringList. Isso acontece porque TStrings é uma classe abstrata e, portanto, não podemos chamar seu construtor. Como TStringList herda de TStrings e é uma classe concreta, esta é a escolha mais óbvia.

Para fins de compatibilidade, esta dica foi escrita usando Delphi 2009.


Delphi ::: Data Access Controls (Controles de Acesso a Dados) ::: TClientDataSet

Como usar o método FindField para pesquisar um campo no TClientDataSet do Delphi e retornar um objeto da classe TField

Quantidade de visualizações: 13987 vezes
O método FindField pode ser usado quando queremos pesquisar um campo no TClientDataSet e retornar um objeto da classe TField. Este método possui a seguinte assinatura:

function FindField(const FieldName: string): TField;
Se o campo for encontrado, um objeto da classe TField é retornado. Em caso contrário, o valor nil é retornado.

Veja um trecho de código no qual eu mostro como encontrar um campo chamado "autor" em um ClientDataSet e retornar seu valor no registro atual:

----------------------------------------------------------------------
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.Button3Click(Sender: TObject);
var
  campo: TField;
begin
  // vamos obter o campo com o nome "autor" no ClientDataSet
  campo := ClientDataSet1.FindField('autor');

  // este campo existe no dataset?
  if campo <> nil then
    ShowMessage('O campo existe e seu valor no registro atual é: ' +
      campo.AsString)
  else // o campo não existe no dataset
    ShowMessage('O campo não existe no dataset');
end;

Se o campo existir no dataset, veremos uma mensagem parecida com:

"O campo existe e seu valor no registro atual é: M. D. Deitel".

Em geral usamos o método FindField para determinar se um determinado componente field existe no dataset. O argumento para o método é o nome do campo que queremos pesquisar. Este nome pode ser o nome de um campo simples, o nome de um sub-campo de um objeto field que tenha sido qualificado pelo nome do campo pai ou o nome de um campo agregado.

O comportamento do método FindField é o mesmo do método FieldByName. A diferença é que FindField retorna o valor nil se o campo não existir, enquanto FieldByName lança uma exceção do tipo EDatabaseError com a mensagem "Field not found".

Esta dica foi escrita e testada no Delphi 2009.


Delphi ::: Dicas & Truques ::: Arquivos e Diretórios

Como ler todo o conteúdo de um arquivo texto usando Delphi - As funções AssignFile(), ReadLn() e Eof() do Delphi

Quantidade de visualizações: 31321 vezes
Nesta dica mostro como usar o Delphi para ler todo o conteúdo de um arquivo texto. Esta leitura será feita linha a linha e adicionaremos cada linha a um TMemo à medida que ela for lida.

O primeiro passo para se ler um arquivo texto usando Delphi é declarar uma variável do tipo TextFile. Em seguida usamos a procedure AssignFile() para associar a variável TextFile ao arquivo em disco.

Como queremos ler o conteúdo do arquivo, a função Reset() deve ser usada. Esta função abre o arquivo texto fornecido e posiciona o cursor de leitura no início do arquivo. A partir daí podemos usar um laço while e a função ReadLn() para ler cada linha do arquivo. Note o uso da função Eof() para testarmos se o ponteiro de leitura ainda não atingiu o fim do arquivo.

Veja o exemplo para um melhor entendimento:

----------------------------------------------------------------------
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: TextFile;
  linha: String;
begin
  // vamos fazer uma ligação entre a variável arquivo e o
  // arquivo que queremos ler
  AssignFile(arquivo, 'C:\arquivo de codigos\dados.txt');

  // vamos abrir o arquivo em  modo leitura
  Reset(arquivo);

  // vamos ler cada linha e adicioná-la a um Memo
  while not Eof(arquivo) do
  begin
    ReadLn(arquivo, linha);
    Memo1.Lines.Add(linha);
  end;

  // hora de fechar o arquivo
  CloseFile(arquivo);
end;


Para fins de compatibilidade, esta dica foi escrita usando Delphi 2009.


Delphi ::: VCL - Visual Component Library ::: TStringGrid

Como obter ou definir a quantidade de linhas e colunas fixas em um TStringGrid do Delphi

Quantidade de visualizações: 12199 vezes
Um controle TStringGrid possui a capacidade de exibir linhas e colunas fixas, ou seja, estas linhas e colunas permanecem visíveis na área do componente quando as barras de rolagem são acionadas. Isso é útil na exibição dos títulos das colunas ou numeração das linhas.

A quantidade de linhas fixas no controle TStringGrid pode ser definida por meio da propriedade FixedRows, enquanto a quantidade de colunas fixas pode ser definida por meio da propriedade FixedCols. Estas propriedades podem ser manipuladas em tempo de design ou execução. Veja um trecho de código no qual eliminamos as linhas e colunas fixas (definindo o valor 0 para ambas as propriedades):

----------------------------------------------------------------------
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 definir a quantidade de linhas e colunas fixas
  // no TStringGrid
  StringGrid1.FixedRows := 0;
  StringGrid1.FixedCols := 0;
end;

Em tempo de execução a quantidade de linhas e/ou colunas fixas em um TStringGrid podem ser obtidas com código semelhante ao mostrado 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 TForm1.Button1Click(Sender: TObject);
begin
  // vamos obter a quantidade de linhas e colunas fixas
  // no TStringGrid
  Memo1.Lines.Add('Quantidade de linhas fixas: ' +
    IntToStr(StringGrid1.FixedRows));
  Memo1.Lines.Add('Quantidade de colunas fixas: ' +
    IntToStr(StringGrid1.FixedCols));
end;

Execute este código e clique no botão. Você terá um resultado parecido com:

Quantidade de linhas fixas: 1
Quantidade de colunas fixas: 1


Delphi ::: Dicas & Truques ::: Rotinas de Conversão

Como converter uma string em um valor numérico de ponto-flutuante (com parte fracionária) em Delphi usando as funções StrToFloat(), TryStrToFloat() e StrToFloatDef()

Quantidade de visualizações: 24949 vezes
Em algumas situações precisamos converter strings em valores numéricos do tipo ponto-flutuante, ou seja, números que contenham uma parte fracionária. Isso acontece quando recebemos valores de caixas de texto e precisamos usuá-los em cálculos.

Vamos começar com a função StrToFloat() da unit SysUtils. Esta função recebe uma string representando um valor de ponto-flutuante válido e retorna um valor de ponto-flutuante. 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
  valor1, valor2, soma: Double;
begin
  // vamos receber as strings dos TEdits e converter
  // seus valores para números de ponto-flutuante
  // note que em Delphi, um valor de ponto-flutuante
  // é informado em caixas de texto usando vírgula. Ex: 7,3
  valor1 := StrToFloat(Edit1.Text);
  valor2 := StrToFloat(Edit2.Text);

  // vamos obter a soma dos dois valores
  soma := valor1 + valor2;

  // vamos exibir o resultado. Note o uso de FloatToStr() para
  // converter o valor fracionário em string
  ShowMessage('A soma é: ' + FloatToStr(soma));
end;

Note que, se a string sendo convertida possuir um valor de ponto-flutuante inválido, uma exceção do tipo EConvertError será lançada. Podemos evitar isso usando a função TryStrToFloat(). Esta função recebe dois argumentos: a string a ser convertida e a variável do tipo Extended, Double ou Single que receberá o valor. O resultado será true se a conversão for feita com sucesso e false em caso contrário. 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);
var
  valor: Double;
begin
  // vamos tentar converter o valor da caixa de texto
  // em um valor de ponto-flutuante
  if TryStrToFloat(Edit1.Text, valor) then
    ShowMessage('Conversão efetuada com sucesso.')
  else
    ShowMessage('Erro na conversão');
end;

Há ainda uma terceira possibilidade: usar a função StrToFloatDef(). Esta função funciona exatamente da mesma forma que StrToFloat(), exceto que agora, se houver um erro de conversão, um valor de ponto-flutuante padrão será retornado. 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);
var
  valor: Double;
begin
  // vamos converter o valor da caixa de texto
  // em um valor de ponto-flutuante. Se a conversão não puder
  // ser feita o valor 10,50 será atribuído à varial valor
  valor := StrToFloatDef(Edit1.Text, 10.50);

  // vamos exibir o resultado
  ShowMessage(FloatToStr(valor));
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

E-Books em PDF

E-Book 650 Dicas, Truques e Exercícios Resolvidos de Python - PDF com 1.200 páginas
Domine lógica de programação e a linguagem Python com o nosso E-Book 650 Dicas, Truques e Exercícios Exercícios de Python, para você estudar onde e quando quiser.

Este e-book contém dicas, truques e exercícios resolvidos abrangendo os tópicos: Python básico, matemática e estatística, banco de dados, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book
E-Book 350 Exercícios Resolvidos de Java - PDF com 500 páginas
Domine lógica de programação e a linguagem Java com o nosso E-Book 350 Exercícios Exercícios de Java, para você estudar onde e quando quiser.

Este e-book contém exercícios resolvidos abrangendo os tópicos: Java básico, matemática e estatística, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book

Linguagens Mais Populares

1º lugar: Java
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: C
6º lugar: Delphi
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby



© 2025 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 22 usuários muito felizes estudando em nosso site.