Você já se viu escrevendo o mesmo código repetidamente para executar alguma tarefa comum dentro manipuladores de eventos? Sim! É hora de você aprender sobre os programas dentro de um programa. Vamos chamar essas sub-rotinas de mini-programas.
Introdução às sub-rotinas
As sub-rotinas são uma parte importante de qualquer linguagem de programaçãoeDelphi não é exceção. No Delphi, geralmente existem dois tipos de sub-rotinas: uma função e um procedimento. A diferença usual entre uma função e um procedimento é que uma função pode retornar um valor, e um procedimento geralmente não o fará. Uma função é normalmente chamada como parte de uma expressão.
Veja os seguintes exemplos:
procedimento Diga olá(const sWhat:corda); início
ShowMessage ('Hello' + sWhat); fim; função Anos(const BirthYear: inteiro): inteiro; var
Ano, Mês, Dia: Word; início
DecodeDate (Data, Ano, Mês, Dia); Resultado: = Ano - BirthYear; fim;
Depois de definidas as sub-rotinas, podemos chamá-las uma ou mais vezes:
procedimento TForm1.Button1Click (Remetente: TObject);
início
SayHello ('Usuário Delphi'); fim; procedimento TForm1.Button2Click (Remetente: TObject); início
SayHello ('Zarko Gajic'); ShowMessage ('Você tem' + IntToStr (YearsOld (1973)) + 'anos!'); fim;
Funções e Procedimentos
Como podemos ver, funções e procedimentos agem como miniprogramas. Em particular, eles podem ter seu próprio tipo, constantes e declarações de variáveis dentro deles.
Dê uma olhada em uma função SomeCalc (variada):
função SomeCalc. (const sStr: corda; const iYear, iMonth: inteiro; var iDay: inteiro): booleano; início...fim;
Todo procedimento ou função começa com um cabeçalho que identifica o procedimento ou função e lista os parâmetros a rotina usa, se houver. Os parâmetros estão listados entre parênteses. Cada parâmetro tem um nome de identificação e geralmente tem um tipo. Um ponto e vírgula separa os parâmetros em uma lista de parâmetros.
sStr, iYear e iMonth são chamados parâmetros constantes. Parâmetros constantes não podem ser alterados pela função (ou procedimento). O iDay é passado como um parâmetro var, e podemos fazer alterações, dentro da sub-rotina.
As funções, como retornam valores, devem ter um tipo de retorno declarado no final do cabeçalho. O valor de retorno de uma função é dado pela atribuição (final) ao seu nome. Como toda função implicitamente possui uma variável local Result do mesmo tipo que as funções retornam valor, atribuir a Result tem o mesmo efeito que atribuir ao nome da função.
Sub-rotinas de posicionamento e chamada
As sub-rotinas são sempre colocadas na seção de implementação da unidade. Essas sub-rotinas podem ser chamadas (usadas) por um manipulador de eventos ou sub-rotina na mesma unidade que é definida após ela.
Nota: a cláusula uses de uma unidade informa quais unidades ela pode chamar. Se queremos que uma sub-rotina específica em uma Unidade1 seja utilizável pelos manipuladores de eventos ou sub-rotinas em outra unidade (por exemplo, Unidade2), precisamos:
- Adicione Unit1 à cláusula usos da Unit2
- Coloque uma cópia do cabeçalho da sub-rotina na seção de interface da Unidade1.
Isso significa que as sub-rotinas cujos cabeçalhos são fornecidos na seção de interface são escopo global.
Quando chamamos uma função (ou um procedimento) dentro de sua própria unidade, usamos seu nome com qualquer parâmetros são precisos. Por outro lado, se chamarmos uma sub-rotina global (definida em alguma outra unidade, por exemplo, MyUnit), usaremos o nome da unidade seguido por um período.
... // O procedimento SayHello é definido dentro desta unidade
SayHello ('Usuário Delphi'); // A função YearsOld é definida dentro da unidade MyUnit
Manequim: = MyUnit. YearsOld (1973);...
Nota: funções ou procedimentos podem ter suas próprias sub-rotinas incorporadas. Uma sub-rotina incorporada é local para a sub-rotina do contêiner e não pode ser usada por outras partes do programa. Algo como:
procedimento TForm1.Button1Click (Remetente: TObject); função É pequeno(const sStr:corda):boleano; início// IsSmall retorna True se sStr estiver em minúsculas, False caso contrário
Resultado: = LowerCase (sStr) = sStr; fim; início// IsSmall pode ser usado apenas dentro do evento Button1 OnClickE se IsSmall (Edit1.Text) então
ShowMessage ('Todos os minúsculos em Edit1.Text')
outro
ShowMessage ('Nem todos os versaletes no Edit1.Text'); fim;