Lista de Exercícios Resolvidos: Java | Python | VisuAlg | Portugol | C | C# | VB.NET | C++
Você está aqui: Delphi ::: Dicas & Truques ::: Recursão (Recursividade)

Como usar recursividade em Delphi - Como usar recursão ou funções recursivas em Delphi

Quantidade de visualizações: 15176 vezes
Recursão ou recursividade é a habilidade que uma procedure ou function (função) possui de chamar a si própria uma vez, várias, indefinidamente ou até que a solução do problema a ser resolvido seja encontrada. Assim, podemos definir uma função recursiva (aqui uma procedure recursiva) em Delphi da seguinte forma (atenção: não execute este código):

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

// uma procedure recursiva
procedure Recursiva;
begin
  // chama a si própria
  Recursiva;
end;

// vamos chamar a procedure pela primeira vez
// a partir do Click de um botão
procedure TForm1.Button1Click(Sender: TObject);
begin
  Recursiva;
end;

O fato de eu pedir para que você não execute o código é que, uma vez clicado o botão, a procedure Recursiva será chamada e continuará chamando a si mesma até que a pilha do sistema estoure, ou seja, como funções recursivas são implementadas usando a pilha do sistema operacional e não na área de memória destinada a cada aplicativo o resultado será um travamento do programa, e, caso não estejamos com sorte, um travamento do sistema operacional. Sabedor do risco, clique no botão para ver o resultado você mesmo.

O que devemos saber a respeito das funções recursivas é que estas precisam saber o ponto de parada, de forma a evitar chamadas infinitas. Como exemplo, veja uma procedure recursiva que conta de 0 até 10. Note como cada chamada verifica se já é hora de interromper a cadeia:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

// uma procedure recursiva que conta de 0 até 10
procedure Contar(valor: Integer);
begin
  // vamos exibir o valor atual
  ShowMessage(IntToStr(valor));

  // é hora de parar?
  if valor = 10 then
    ShowMessage('Terminei')
  else
    begin
      // chama a si própria (note que aumentamos o valor atual em 1)
      Inc(valor);
      Contar(valor);
    end;
end;

// vamos chamar a procedure pela primeira vez
// a partir do Click de um botão
procedure TForm1.Button1Click(Sender: TObject);
begin
  // chama a função recursiva fornecendo o valor inicial
  Contar(0);
end;

Execute este código e veja o resultado. Observe que a cada chamada recursiva nós incrementamos a variável de controle. Ela é a responsável por evitar que chamadas infinitas sejam feitas.

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

Link para compartilhar na Internet ou com seus amigos:

Delphi ::: VCL - Visual Component Library ::: TListBox

Como obter o índice do item selecionado em uma ListBox do Delphi usando a propriedade ItemIndex da classe TListBox

Quantidade de visualizações: 14817 vezes
Muitas vezes precisamos saber o índice do item atualmente selecionado em uma ListBox. Para isso podemos obter o valor da propriedade ItemIndex. Esta propriedade retorna um valor inteiro correspondente ao índice do item selecionado. O primeiro item da lista possui o índice 0. Se nenhum item estiver selecionado, ItemIndex retorna -1. Veja o exemplo:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

procedure TForm1.Button2Click(Sender: TObject);
var
  indice: Integer;
begin
  // vamos obter o índice do item selecionado na ListBox
  indice := ListBox1.ItemIndex;

  // mostra o resultado
  ShowMessage('O índice do item selecionado é: '
    + IntToStr(indice));
end;

Note que esta propriedade não se aplica às ListBoxes de seleção múltipla.

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


Delphi ::: Dicas & Truques ::: Data e Hora

Como adicionar ou subtrair meses de uma data em Delphi usando a função IncMonth()

Quantidade de visualizações: 21237 vezes
Em algumas situações precisamos adicionar ou subtrair meses de uma determinada data. Em Delphi isso pode ser feito com o auxílio da função IncMonth() da unit DateUtils. Este função aceita um TDateTime e a quantidade de meses que queremos acrescentar ao TDateTime fornecido como argumento. O retorno será um novo TDateTime com a quantidade de meses acrescida.

Veja um trecho de código no qual adicionamos 2 meses à data atual:

----------------------------------------------------------------------
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
  hoje: TDateTime;
begin
  // não esqueça de adicionar DateUtils ao seus uses

  // vamos obter a data de hoje
  hoje := Now;

  // vamos exibir a data de hoje
  ShowMessage('Hoje é: ' + DateToStr(hoje));

  // vamos adicionar 2 meses à data de hoje
  hoje := IncMonth(hoje, 2);

  // vamos exibir o resultado
  ShowMessage('Daqui a 2 meses será: ' + DateToStr(hoje));
end;

É possível também usar a função IncMonth() para substrair meses de uma data. Para isso só precisamos fornecer uma quantidade negativa de meses. 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
  hoje: TDateTime;
begin
  // não esqueça de adicionar DateUtils ao seus uses

  // vamos obter a data de hoje
  hoje := Now;

  // vamos exibir a data de hoje
  ShowMessage('Hoje é: ' + DateToStr(hoje));

  // vamos subtrair 3 meses da data de hoje
  hoje := IncMonth(hoje, -3);

  // vamos exibir o resultado
  ShowMessage('Há 3 meses era: ' + DateToStr(hoje));
end;

O valor padrão para o segundo argumento de IncMonth() é 1.

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


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

Como tornar o TClientDataSet do Delphi somente leitura usando a propriedade ReadOnly

Quantidade de visualizações: 11551 vezes
Em algumas situações gostaríamos que um TClientDataSet fosse somente leitura, ou seja, não queremos permitir inserção, atualização ou exclusão dos dados do dataset. Para isso podemos usar a propriedade ReadOnly. Se seu valor for True, os dados do TClientDataSet serão apenas para leitura. Se o valor for False, os dados podem ser modificados e/ou novos dados podem ser inseridos no dataset. O valor padrão é False.

Em tempo de design a propriedade ReadOnly do TClientDataSet pode ser ajustada selecionando-se o componente no formulário e acessando o Object Inspector. Em tempo de execução esta propriedade pode ser ajustada por meio do 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 TForm3.Button3Click(Sender: TObject);
begin
  // vamos tornar o TClientDataSet somente leitura
  ClientDataSet1.ReadOnly := True;
end;

Se necessário, podemos obter o valor desta propriedade em tempo de execução da seguinte forma:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

procedure TForm3.Button3Click(Sender: TObject);
begin
  // vamos verificar se o TClientDataSet é somente leitura
  if ClientDataSet1.ReadOnly then
    ShowMessage('O ClientDataSet é somente leitura')
  else
    ShowMessage('O ClientDataSet NÃO é somente leitura')
end;

Ao executarmos este código e clicarmos no botão teremos uma mensagem parecida com:

"O ClientDataSet NÃO é somente leitura".

É importante observar que se tentarmos efetuar alguma operação que modifica o conteúdo de um TClientDataSet somente leitura nós teremos uma exceção do tipo:

Project Project2.exe raised exception class EDatabaseError with message 'ClientDataSet1': Cannot modify a read-only dataset'.

Quando ajustamos o valor da propriedade ReadOnly para True, automaticamente a propriedade CanModify do dataset é ajustada para False.

Importante: Mesmo que o valor da propriedade ReadOnly seja False, os usuários ainda podem ser impedidos de modificar os dados de um client dataset se este obtém seus dados a partir de um provider (por exemplo: TDataSetProvider). A propriedade Options do provider pode limitar se os dados podem ser editados e, se puderem, os tipos de alterações permitidos.

Esta dica foi escrita e testada no Delphi 2009.


Vamos testar seus conhecimentos em Fenômeno de Transportes e Hidráulica

Perda de carga

Perda de carga é a energia dissipada em forma de calor devido ao atrito e à viscosidade em uma canalização.

Nesse sentido, a perda de carga unitária em um tubo de 50mm de diâmetro, coeficiente de atrito de 0,031 e comprimento de 100m, sendo que a água escoa com vazão de 0,01 m3/s, é de:

A) 0,47m/m.

B) 0,52m/m.

C) 0,74m/m.

D) 0,82m/m.

E) 0,94m/m.
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em AutoCAD Civil 3D

COGO Points no AutoCAD Civil 3D

Qual das ordens de fluxo de trabalho abaixo é a correta para definir o estilo da label de um COGO point na janela Panorama?

A) Selecione Edit Points na aba Toolpace -> Prospector, botão direito no título da coluna Point Label Style, selecione o Point Label Style na lista e clique o botão OK.

B) Selecione Edit Points na aba Toolpace -> Prospector, duplo-clique na célula desejada na coluna Point Label Style, selecione o Point Label Style na lista e clique o botão OK.

C) Selecione Refresh na aba Toolpace -> Prospector, duplo-clique na célula desejada na coluna Point Label Style, selecione o Point Label Style na lista e clique o botão OK.

D) Selecione Edit Points na aba Toolpace -> Toolbox, duplo-clique no título da coluna Point Label Style, selecione o Point Label Style na lista e clique o botão OK.
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em Ética e Legislação Profissional

Ética Empresarial e Profissional: Noções Gerais

Para Cortella (2007), a ética é um grupo de princípios e valores que usamos para optar entre três situações significativas da nossa existência. Elas estão presentes em nosso cotidiano e, por essa razão, é necessário estar preparado para efetuar a escolha da melhor forma possível. Assinale a alternativa que contém as três grandes situações que nos afligem e requerem decisão.

A) Quero; devo; é verdadeiro.

B) É falso; posso; quero.

C) Quero; devo; posso.

D) Posso; moral; certeza.

E) Posso; devo; religiosidade.
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em Engenharia Civil - Estruturas de Aço e Madeira

Perfil em aço

As conexões dos perfis de aço contribuem para a projetação das estruturas de uma edificação, sendo responsáveis pela ligação entre pilares e vigas ou entre outros elementos. Elas podem variar, dependendo do tipo de esforço que se pretende resistir com o elemento estrutural.

Considerando a figura apresentada a seguir, assinale a alternativa que indica corretamente o tipo de conexão que está sendo utilizado para unir essas peças.



A) Conexão de cisalhamento.

B) Conexão de momento com pinos.

C) Conexão de cisalhamento com solda.

D) Conexão de momento com solda.

E) Conexão de tensão com solda.
Verificar Resposta Estudar Cards Todas as Questões

Vamos testar seus conhecimentos em JavaScript

Analise o seguinte trecho de código JavaScript

var valores = new Array(2, 4);

Este código

A) cria uma matriz chamada valores com 2 linhas e 4 colunas.

B) cria um array valores e atribui os valores 2 e 4 para valores[1] e valores[2].

C) cria um array valores e atribui os valores 2 e 4 para valores[0] e valores[1].

D) cria um array de três elementos com os índices variando de 2 até 4.
Verificar Resposta Estudar Cards Todas as Questões

Desafios, Exercícios e Algoritmos Resolvidos de Delphi

Veja mais Dicas e truques de Delphi

Dicas e truques de outras linguagens

Códigos Fonte

Programa de Gestão Financeira Controle de Contas a Pagar e a Receber com Cadastro de Clientes e FornecedoresSoftware de Gestão Financeira com código fonte em PHP, MySQL, Bootstrap, jQuery - Inclui cadastro de clientes, fornecedores e ticket de atendimento
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
Controle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidadesControle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidades
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
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: Delphi
6º lugar: C
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby



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