Delphi - Fundamentos Object Pascal

  • Upload
    erineto

  • View
    39

  • Download
    1

Embed Size (px)

DESCRIPTION

Delphi - Fundamentos Object Pascal

Citation preview

  • Fundamentos de Object Pascal

    0Conceitos de Programao Orientada a ObjetosAntes de partir para a linguagem propriamente dita, vamos revisar alguns conceitos bsicos de ProgramaoOrientada a Objetos.Classe: Definio de tipo dos objetos, modelo de objeto.Objeto: Instncia de classe, varivel cujo tipo uma classe.Atributos: Variveis de instncia, so os dados de um objeto.Mtodos: Funes e procedimentos de um objeto.Propriedades: Apelido usado para evitar o acesso direto aos atributos de um objeto, onde podemos especificarmtodos que sero usados para ler e atribuir seus valores a esses atributos.Mensagens: Chamada de mtodos, leitura e atribuio de propriedades.Encapsulamento: Conjunto de tcnicas usadas para limitar o acesso aos atributos e mtodos internos de umobjeto.Herana: Possibilidade de criar uma classe descendente de outra, aproveitando seus mtodos, atributos epropriedades.Ancestral: Super classe ou classe de base, a partir da qual outras classes podem ser criadas.Descendente: Subclasse.Hierarquia de Classes: Conjunto de classes ancestrais e descendentes, geralmente representadas em umarvore hierrquica.Polimorfismo: Capacidade de redefinir mtodos e propriedades de uma classe em seus descendentes.1Estrutura de UnitsVamos examinar o cdigo gerado para um novo Form, identificando as principais sees de uma Unit tpica. Crieuma nova aplicao e observe na Unit principal as seguintes clusulas.Unit: A primeira declarao de uma unit seu identificador, que igual ao nome do arquivo.Interface: Seo interface, onde ficam declaraes que podem ser usadas por outras Units.Uses: Na clusula uses fica a Lista de Units usadas.Type: Na clusula type fica a definio de tipos, aqui temos a declarao da classe do Form.Var: Na clusula var so declaradas as variveis, aqui temos a declarao da instncia do Form.Implementation: Na seo implementation ficam as definies dos mtodos.End: Toda Unit termina com um end a partir de onde qualquer texto ignorado.2VariveisNo Delphi, toda varivel tem que ser declarada antes de ser utilizada. As declaraes podem ser feitas aps apalavra reservada var, onde so indicados o nome e o tipo da varivel. Os nomes de variveis no podem teracentos, espaos ou caracteres especiais como &, $ ou % e o primeiro caractere de um nome de varivel tem queser uma letra ou um sublinhado. O Delphi ignora o caso das letras.Variveis GlobaisAs variveis abaixo so globais, declaradas da Interface da Unit. Podem ser acessadas por qualquer Unit usuria.var

    I: Integer;Usuario: string;A, B, Soma: Double;Ok: Boolean;

    Variveis LocaisAs variveis abaixo so locais ao mtodo, ou seja elas s existem dentro do mtodo, no podem ser acessadas defora, mesmo que seja na mesma Unit. Na verdade essas variveis so criadas quando o mtodo chamado edestrudas quando ele encerrado, seu valor no persistente.procedure TFrmExemplo.BtnTrocarClick(Sender: TObject);var

    Aux: string;begin

    Aux := EdtA.Text;EdtA.Text := EdtB.Text;EdtB.Text := Aux;

    end;

  • 3AtributosOs atributos so variveis de instncia. Para declarar um atributo em uma classe basta definir o identificador e otipo do atributo na declarao da classe, feita na seo type da Interface da Unit, como abaixo.type

    TFrmSomar = class(TForm)private

    { Private declarations }A, B: Double;

    public{ Public declarations }Soma: Double;

    end;4EncapsulamentoOs principais nveis de visibilidade dos atributos e mtodos de uma classe so mostrados abaixo.Nvel Visibilidade

    Private Os itens declarados nesse nvel s podem ser acessados na mesma unit.Public Nesse nvel, qualquer unit usuria poder acessar o item.Protected Os itens s podero ser acessados em outra unit se for em uma classe descendentePublished o nvel default, igual ao Public, mas define propriedades e eventos usados em tempo de projeto5Classes

    Classes so tipos de objetos, uma classe declarada na clusula type da seo interface e os mtodos sodefinidos na seo implementation. Examine o cdigo de um Form para identificar os elementos de sua classe.interfacetype

    TFrmSomar = class(TForm)EdtA: TEdit;EdtB: TEdit;BtnSoma: TButton;procedure BtnSomaClick(Sender: TObject);

    private{ Private declarations }

    public{ Public declarations }

    end;

    implementation

    procedure TFrmSoma.BtnSomaClick(Sender: TObject);begin

    ShowMessage(EdtA.Text + EditB.Text);end;6ObjetosUm Objeto tratado como uma varivel cujo tipo uma classe. A declarao de objetos igual declarao deuma varivel simples, tendo no lugar do tipo a classe do objeto.var

    FrmSomar: TFrmSomar;7LiteraisValores literais so valores usados em atribuies e expresses. Cada tipo tem uma sintaxe diferente.Tipo Definio

    Inteiro Seqncia de dgitos decimais (0 a 9), sinalizados ou noInteiro Hexadecimal Seqncia de dgitos hexadecimais (0 a F), precedidos por um sifro ($)Real Igual ao tipo Inteiro, mas pode usar separador decimal e notao cientficaCaractere Letra entre apstrofos ou o caracter # seguido de um nmero inteiro entre 0 e 255 (ASCII)String Seqncia de caracteres delimitado por apstrofos8Constantes

    So declaradas na seo const, podem ser usadas como variveis, mas no podem ser alteradas. Geralmente onome das constantes escrito em letras maisculas e na declarao dessas constantes no indicado o tipo.const

    G = 3.94851265E-19;NUM_CHARS = '0123456789';CR = #13;SPACE = ' ';MAX_VALUE = $FFFFFFFF;

    Constantes TipadasNa verdade, constantes tipadas so variveis inicializadas com valor persistente, que podem ser alteradasnormalmente, como qualquer varivel. A nica diferena de sintaxe entre constantes tipadas e simples que o tipoda constante indicado explicitamente na declarao. Se uma constante tipada for declarada localmente, ela no

  • ser destruda quando o mtodo for encerrado. Para diferenciar das constantes normais, costuma-se declararestas com letras de caso varivel, como abaixo.const

    Cont: Integer = 1;Peso: Double = 50.5;Empresa: string = 'SENAC';9Instrues

    Os programas so compostos por instrues, que so linhas de cdigo executvel. Exemplos de instruessimples so atribuies, mensagens entre objetos, chamadas de procedimentos, funes e mtodos, comomostradas abaixo. As instrues podem ser divididas em vrias linhas, o que indica o fim de uma instruo oponto e vrgula no final. Quando uma instruo quebrada, costuma-se dar dois espaos antes das prximaslinhas, para melhorar a leitura do cdigo.Caption := 'Gabba Gabba Hey!';Form2.ShowModal;Application.MessageBox('Voc executou uma operao ilegal, o programa ser finalizado.',

    'Falha geral', MB_ICONERROR);Voc pode usar vrias instrues agrupadas em uma instruo composta, como se fosse uma s instruo. Umainstruo composta delimitada pelas palavras reservadas begin e end. Toda instruo, simples ou composta, terminada com um ponto-e-vrgula.if CheckBox1.Checked thenbegin

    ShowMessage('O CheckBox ser desmarcado.');CheckBox1.Checked := False;

    end;Estilo de CodificaoAs instrues e todo o cdigo de uma Unit devem ser distribudos para facilitar o mximo a leitura. Para isso,podemos usar a indentao, geralmente de dois espaos para indicar os nveis de cdigo. Procure criar um estiloprprio, que melhor se molde sua realidade. Se for desenvolver em grupo, melhor que todos usem o mesmoestilo para evitar confuses.10ComentriosExistem 3 estilos de comentrio no Delphi, como mostrado abaixo.(* Comentrio do Pascal Padro *){ Comentrio do Turbo Pascal }// Comentrio de linha do C++Cuidado com as diretivas de compilao, pois elas so delimitadas por chaves e podem ser confundidas comcomentrios. A diretiva de compilao mostrada abaixo includa em todas as Units de Forms.{$R*.DFM}11Tipos de Dados PadroO Delphi trata vrios tipos de dados padro, segue uma descrio sucinta desses tipos.Tipos InteirosSo tipos numricos exatos, sem casas decimais. O tipo Integer o tipo inteiro padro.Tipo Tamanho em Bytes Valor Mnimo Valor Mximo

    ShortInt 1 -128 127SmallInt 2 -32768 32767Longint 4 -2147483648 2147483647Byte 1 0 255Word 2 0 65535Integer 4 -2147483648 2147483647Cardinal 4 0 2147483647Tipos ReaisSo tipos numricos com casas decimais. O tipo Double o tipo real padro.Tipo Tamanho em Bytes Valor Mnimo Valor Mximo Dgitos Significativos

    Real 6 10-39 1038 11-12Single 4 10-45 1038 7-8Double 8 10-324 10308 15-16Extended 10 10-4932 104932 19-20Comp 8 -1018 1018 19-20Currency 8 -1012 1012 19-20Tipos TextoOs tipos texto podem operar com caracteres simples ou grupos de caracteres. O tipo texto padro o tipo string.Tipo Descrio

    Char Um nico caractere ASCIIString Texto alocado dinamicamente, pode ser limitado a 255 caracteres conforme configuraoPChar String terminada em nulo (#0), usada geralmente nas funes da API do Windows

  • O operador + pode ser usado para concatenar strings e voc pode usar uma varivel do tipo string como uma listade caracteres.ShowMessage('5 letra do ttulo da janela: ' + Caption[5]);Label1.Text := '2 letra do Edit: ' + Edit1.Text[2];Existem vrias funes de manipulao de strings, veja algumas das mais importantes mostradas abaixo.Funo Descrio

    AnsiCompareText Compara 2 strings sem sensitividade de maisculas/minsculasAnsiLowerCase Converte todas as letras de uma string para minsculasAnsiUpperCase Converte todas as letras de uma string para maisculasCopy Retorna parte de uma stringDelete Apaga parte de uma stringInsert Insere uma string em outraLength Nmero de caracteres de uma stringPos Posio de uma string em outraTrim Remove todos os espaos de uma stringTrimLeft Remove os espaos esquerda de uma stringTrimRight Remove os espaos direita de uma stringFormat Formata uma string com uma srie de argumentos de vrios tipos

    Por exemplo, para comparar o texto de dois Edits, poderamos usar a funo AnsiCompareText.if AnsiCompareText(EdtA.Text, EdtB.Text) = 0 then

    ShowMessage('O texto dos dois Edits so iguais.');A funo Format especialmente til na formatao de strings, veja alguns exemplos.ShowMessage(Format('O nmero %d a parte inteira do nmero %f.', [10, 10.5]));ShowMessage(Format('Este texto%sfoi formatado%susando o caractere #%d.', [#13, #13, 13]));ShowMessage(Format('O preo do livro %s %m.', ['Como Programar em Delphi', 50.7]));Um detalhe que deve ser observado que as propriedades dos objetos no podem ser usadas como variveis emfunes. Veja a declarao do procedimento Delete no help.procedure Delete(var S: string; Index, Count:Integer);Digamos que voc deseje apagar as 5 primeiras letras de um Edit, como a string do Delete varivel, no poderiausar o cdigo abaixo.Delete(Edit1.Text, 1, 5);Para voc poder fazer a operao desejada, teria que usar uma varivel como varivel auxiliar.var

    S: string;begin

    S := Edit1.Text;Delete(S, 1, 5);Edit1.Text := S;

    end;Tipos OrdinaisTipos ordinais so tipos que tem uma seqncia incremental, ou seja, voc sempre pode dizer qual o prximo valorou qual o valor anterior a um determinado valor desses tipos. So tipos ordinais o Char, os tipos inteiros, o Booleane os tipos enumerados. Algumas rotinas para ordinais so mostradas abaixo.Funo Descrio

    Dec Decrementa varivel ordinalInc Incrementa varivel ordinalOdd Testa se um ordinal mparPred Predecessor do ordinalSucc Sucessor do ordinalOrd Ordem de um valor na faixa de valores de um tipo ordinalLow Valor mais baixo na faixa de valoresHigh Valor mais alto na faixa de valores

    Por exemplo, use o cdigo abaixo no evento OnKeyPress de um Edit e veja o resultado.Inc(Key);BooleanVariveis do tipo Boolean podem receber os valores lgicos True ou False, verdadeiro ou falso. Uma varivelBoolean ocupa 1 byte de memria.TDateTimeO tipo TDateTime guarda data e hora em uma estrutura interna igual ao tipo Double, onde a parte inteira onmero de dias desde 31/12/1899 e a parte decimal guarda a hora, minuto, segundo e milissegundo. As dataspodem ser somadas ou subtradas normalmente.Existem vrias rotinas de manipulao de datas e horas, usadas com o tipo TDateTime, veja algumas abaixo.Rotina Descrio

    Date Retorna a data do sistemaNow Retorna a data e hora do sistemaTime Retorna a hora do sistema

  • DayOfWeek Retorna o dia da semana de uma data especificadaDecodeDate Decodifica um valor TDateTime em Words de dia, ms e anoDecodeTime Decodifica um valor TDateTime em Words de hora, minuto, segundo e milissegundosEncodeDate Retorna um TDateTime a partir de Words de dia, ms e anoEncodeTime Retorna um TDateTime a partir de Words de hora, minuto, segundo e milissegundos

    No help de cada uma das funes acima voc vai encontrar alguns exemplos, veja os colocados abaixo.if DayOfWeek(Date) = 1 then

    ShowMessage('Hoje Domingo, p de cachimbo!')else

    ShowMessage('Hoje no Domingo, p de cachimbo!');var

    A, M, D: Word;begin

    DecodeDate(Date, A, M, D);ShowMessage(Format('Dia %.2d do ms %.2d de %d.', [D, M, A]));

    end;VariantTipo genrico, que pode atribuir e receber valores de qualquer outro tipo. Evite usar variveis do tipo Variant, pois ouso dessas variveis podem prejudicar a performance do programa, alm de diminuir a legibilidade do cdigo fontee a integridade do executvel, veja o trecho de cdigo abaixo e note como esse tipo de varivel tem umcomportamento estranho.var

    V1, V2, V3: Variant;begin

    V1 := True;V2 := 1234.5678;V3 := Date;ShowMessage(V1 + V2 + V3);

    end;12Converses de TipoFreqentemente voc vai precisar converter um tipo de dado em outro, como um nmero em uma string. Paraessas converses voc pode usar duas tcnicas, o TypeCasting e as rotinas de converso de tipos.TypeCastingTypeCast uma converso direta de tipo, usando o identificador do tipo destino como se fosse uma funo. Comoo Delphi no faz nenhuma verificao se a converso vlida, voc deve tomar um certo cuidado ao usar umTypeCast para no criar programas instveis.var

    I: Integer;C: Char;B: Boolean;

    beginI := Integer('A');C := Char(48);B := Boolean(0);Application.MessageBox(PChar('Linguagem de Programao' + #13 + 'Delphi 3'), 'SENAC',

    MB_ICONEXCLAMATION);end;Rotinas de ConversoAs principais rotinas de converso esto listadas na tabela abaixo. Caso voc tente usar uma dessas rotinas emuma converso invlida, pode ser gerada uma exceo.Rotina Descrio

    Chr Byte em CharStrToInt String em IntegerIntToStr Integer em StringStrToIntDef String em Integer, com um valor default caso haja erroIntToHex Nmero em String HexadecimalRound Arredonda um nmero real em um IntegerTrunc Trunca um nmero real em um IntegerStrToFloat String em RealFloatToStr Real em stringFormatFloat Nmero real em string usando uma string de formatoDateToStr TDateTime em string de data, de acordo com as opes do Painel de ControleStrToDate String de data em TDateTimeTimeToStr TDateTime em Strind de HoraStrToTime String de hora em TDateTimeDateTimeToStr TDateTime em string de data e horaStrToDateTime String de data e hora em TDateTime

  • FormatDateTime TDateTime em string usando uma string de formatoVarCast Qualquer tipo em outro usando argumentos do tipo VariantVarAsType Variante em qualquer tipoVal String em nmero, real ou inteiroStr Nmero, real ou inteiro, em String

    Veja alguns exemplos de como usar essas rotinas. Converso de dados uma operao muito comum naprogramao em Object Pascal, seeria interessante dar uma olhada no help de cada uma das funes acima.var

    I: Integer;D: Double;S1, S2: string;

    beginD := 10.5;I := Trunc(D);S1 := FloatToStr(D);S2 := IntToStr(I);ShowMessage(S1 + #13 + S2);

    end;

    varA, B, Soma: Bouble;

    beginA := StrToFloat(EdtA.Text);B := StrToFloat(EdtB.Text);Soma := A + B;ShowMessage(Format('%f + %f = %f', [A, B, Soma]);

    end;13ExpressesUma expresso qualquer combinao de operadores, variveis, constantes, valores literais e chamadas defunes que resultem em um valor de determinado tipo. Uma expresso usada sempre que precisamos de umavalor que possa ser obtido por uma expresso.

    A + 12 * CDate - 4StrToInt(Edit1.Text + Edit2.Text)StrToDate(Edit2.Text) - StrToDate(Edit1.Text)12 * A / 100A < B14Operadores

    Os operadores so usados em expresses e a ordem em que as expresses so executadas depende daprecedncia desses operadores. Veja abaixo a lista de operadores em ordem descendente de precedncia.Operador DescrioOperadores Unrios

    @ Endereonot No booleano ou bit voltado para noOperadores Multiplicativos e de direo de Bit* Multiplicao ou interseo de conjuntos/ Diviso de Realdiv Diviso de Inteiromod Resto de diviso de Inteirosas TypeCast seguro quanto ao tipo (RTTI)and E booleano ou bit voltado para eshl Deslocamento de bits esquerdashr Deslocamento de bits direitaOperadores Aditivos+ Adio ou unio de conjuntos- Subtrao ou diferena de conjuntosor Ou booleano ou bit voltado para ouxor Ou exclusivo booleano ou bit voltado para ou exclusivoOperadores Relacionais= Igual Diferente< Menor> Maoir= Maior ou igualin Pertinncia a conjuntosis Compatibilidade de tipos (RTTI)

    Para forar uma expresso de menor precedncia a ser executada antes, voc pode usar os parnteses, comomostrado abaixo.

  • (5 - 2) * 3;(A > B) and (A < C)

    Para fazer potenciao, use a funo Power, abaixo temos que A igual a A elevado a 4.A := Power(A, 4);15Estruturas de Deciso

    IfO if uma estrutura de deciso usada para realizar instrues em determinadas condies. O if consideradouma s instruo, por isso, s encontramos o ponto-e-vrgula no final. O else opcional.if Opn.Execute then

    Img.Picture.LoadFromFile(Opn.FileName);

    if Nota < 5 thenShowMessage('Reprovado')

    elseShowMessage('Aprovado');

    CasePermite que o fluxo da execuo seja desviado em funo de vrias condies de acordo com o valor doargumento, que tem que ser ordinal, caso o valor do argumento no corresponda a nenhum dos valores listados,podemos incluir um else.case Ch of

    ' ': ShowMessage('Espao');'0'..'9': ShowMessage('Dgito');'+', '-', '*', '/': ShowMessage('Operador');

    elseShowMessage('Caractere especial');

    end;

    case CbbBorda.ItemIndex of0: BorderStyle := bsDialog;1: BorderStyle := bsSingle;2: BorderStyle := bsSizeable;

    end;16Estruturas de RepetioWhileO lao while executa uma instruo at que uma condio seja falsa.I := 10;while I >= 0 dobegin

    ShowMessage(IntToStr(I));Dec(I);

    end;ForO lao for executa uma instruo um nmero determinado de vezes, incrementando uma varivel de controleautomaticamente a cada iterao. Caso seja preciso que a contagem seja decremental, pode-se usar downto emvez de to.for I := 1 to ComponentCount do

    ShowMessage('O ' + IntToStr(I) + ' Componente ' + Components[I - 1].Name);for I := Length(Edit1.Text) downto 1 do

    ShowMessage(Edit1.Text[I]);RepeatO lao repeat executa instrues at que uma condio seja verdadeira.I := 1;repeat

    S := InputBox('Acesso', 'Digite a senha', '');Inc(I);if I > 3 then

    Halt;until S = 'fluminense';Quebras de LaoEm qualquer um dos laos mostrados podemos usar o procedimento Break para cancelar a repetio e sair dolao, podemos tambm forar a prxima iterao com o procedimento Continue.I := 1;while true dobegin

    Inc(I);if I < 10000000 then

    Continue;ShowMessage('Chegamos a dez milhes');

  • Break;end;17Tipos Definidos Pelo UsurioO usurio tambm pode declarar tipos no definidos pelo Delphi. Essas declaraes so feitas na seo type, dainterface ou implementation, sendo que na implementation esses tipos no podero ser usados em outras Units.Dificilmente voc ter que definir tipos, a no ser classes, pois os tipos padro do Delphi so o bastante para amaioria das aplicaes.Strings LimitadasCaso se deseje limitar o nmero de caracteres que uma string pode receber, podemos criar um tipo de stringlimitada.TNome = string[40];TEstado = string[2];Tipo Sub-Faixa um subconjunto de um tipo ordinal e possui as mesmas propriedades do tipo original.TMaiusculas = 'A'..'Z';TMes = 1..12;

    EnumeraesDefine uma seqncia de identificadores como valores vlidos para o tipo. A cada elemento da lista deidentificadores associado internamente um nmero inteiro, iniciando pelo nmero 0, por isso so chamados detipos enumerados.TBorderIcon = (biSystemMenu, biMinimize, biMaximize, biHelp);TDiaSemana = (Seg, Ter, Qua, Qui, Sex, Sab, Dom);PonteirosPonteiros armazenam endereos de memria, todas as classes em Object Pascal so implementadas comoponteiros, mas raramente o programador vai precisar us-los como tal.TIntPtr: ^Integer;

    RecordsO tipo record uma forma de criar uma nica estrutura com valores de diferentes tipos de dados. Cada um dosdados de um record chamado de campo.TData = record

    Ano: Integer;Mes: TMes;Dia: Byte;

    end;

    varFesta: TData;

    beginFesta.Ano := 1997;Festa.Mes := Mai;Festa.Dia := 8;

    end;ArraysArrays fornecem uma forma de criar variveis que contenham mltiplos valores, como em uma lista ou tabela,cujos elementos so do mesmo tipo. Veja abaixo alguns exemplos de arrays de dimenses variadas.TTempDia = array [1..24] of Integer;TTempMes = array [1..31, 1..24] of Integer;TTempAno = array [1..12, 1..31, 1..24] of Integer;

    varTD: TTempDia;I: Integer;

    beginfor I := 1 to 24 do

    TD[I] := StrToIntDef(InputBox('Temperaturas', 'Digite a temperatura na hora '+ IntToStr(I), ''), 30);

    end;Um array pode ser definido como constante tipada, onde todos os seus elementos devem ser inicializados.FAT: array[1..7] of Integer = (1, 2, 6, 24, 120, 720, 5040);O tipo dos elementos de um array pode ser qualquer um, voc pode ter uma array de objetos, de conjuntos, dequalquer tipo que quiser, at mesmo um array de arrays.TTempMes = array [1..31] of TTempDia;TBtnList = array [1..10] of TButton;SetsSo conjuntos de dados de um mesmo tipo, sem ordem, como os conjuntos matemticos. Conjuntos podemconter apenas valores ordinais, o menor que um elemento pode assumir zero e o maior, 255.TBorderIcons = set of TBorderIcon;

  • BorderIcons := [biSystemMenu, biMinimize];

    if MesAtual in [Jul, Jan, Fev] thenShowMessage('Frias');

    Os conjuntos podem ser definidos como constantes ou constantes tipadas, como abaixo.DIG_HEXA = ['0'..'9', 'A'..'Z', 'a'..'z'];DIG_HEXA: set of Char = ['0'..'9', 'A'..'Z', 'a'..'z'];18Procedimentos, Funes e MtodosAs aes de um objeto devem ser definidas como mtodos. Quando a ao no pertence a um objeto, como umatransformao de tipo, essa ao deve ser implementada em forma de procedimentos e/ou funes.ProcedimentosProcedimentos so sub-rotinas, que realizam uma tarefa e no retornam um valor. A declarao de umprocedimento feita na seo interface e a definio, na seo implementation. Ao chamar o identificador doprocedimento, com os parmetros necessrios, esse procedimento ser executado. Veja abaixo o exemplo deuma unit com a implementao um procedimento.unit Tools;

    interface

    procedure ErrorMsg(const Msg: string);

    implementation

    uses Forms, Windows;

    procedure ErrorMsg(const Msg: string);begin

    Application.MessageBox(PChar(Msg), 'Operao invlida', MB_ICONERROR);end;

    end.FunesFunes so muito semelhantes a procedimentos a nica diferena que as funes retornam um valor. O tipo dovalor de retorno deve ser informado no cabealho da funo. Na implementao da funo deve-se atribuir o valorde retorno palavra reservada Result ou ao identificador da funo. Pode-se ento usar a funo em expresses,atribuies, como parmetros para outras funes, em qualquer lugar onde o seu valor possa ser usado.function Average(A, B: Double): Double;begin

    Result := (A + B) / 2;end;MtodosMtodos so funes ou procedimentos que pertencem a alguma classe, passando a fazer parte de qualquerobjeto dessa classe. Na implementao de um mtodo precisamos indicar qual a classe qual ele pertence. Parachamar um mtodo em algum lugar no pertencente sua classe, como procedimentos, funes ou mtodos deoutras classes, deve ser indicado o objeto que deve executar o mtodo. Os mtodos usam os mesmos nveis deencapsulamento dos atributos.type

    TFrmMsg = class(TForm)LblMsg: TLabel;BtnOk: TButton;BtnCancelar: TButton;ImgMsg: TImage;

    publicprocedure ShowMsg(const Msg: string);

    end;

    procedure TFormMsg.ShowMsg(const Msg: string);begin

    LblMsg.Caption := Msg;ShowModal;

    end;ParmetrosExistem trs tipos de passagem de parmetros, que devem ser indicados na declarao da funo ouprocedimento. Parmetros de tipos diferentes de vem ser separados por ponto e vrgula.function MultiStr(const S: string; N: Double; var Erro: Integer): string; Quando no indicado o tipo de passagem, passado o valor do parmetro, como constante. Ao usar a palavra-chave var, no ser enviado o valor do parmetro e sim uma referncia a ele, tornando

    possvel mudar o valor do parmetro no cdigo do procedimento.

  • Como alternativa voc pode passar um parmetro por referncia constante, para isso use a palavra constantes da declarao do parmetro.

    19WithUsado para facilitar o acesso s propriedades e mtodos de um objeto.with Edt dobegin

    CharCase := ecUpperCase;MaxLenght := 10;PasswordChar := '*';Text := 'Brasil';

    end;20SelfSelf usado quando se quer referenciar a instncia atual da classe. Se voc precisar referenciar a instncia atualde uma classe, prefervel usar Self em vez de usar o identificador de um Objeto, isso faz com que o cdigocontinue funcionando para as demais instncias da classe e em seus descendentes.21Criando e Destruindo ObjetosAntes de tudo, voc deve declarar o objeto, se quiser referenci-lo. Para cri-lo, use o mtodo Create, que ummtodo de classe. Para voc usar um mtodo de classe, referencie a classe, no o Objeto, como mostrado abaixo.var

    Btn: TBitBtn;begin

    Btn := TBitBtn.Create(Self);With Btn dobegin

    Parent := Self;Kind := bkClose;Caption := '&Sair';Left := Self.ClientWidth - Width - 8;Top := Self.ClientHeight - Height - 8;

    end;end;Porm, se voc no precisar referenciar o Objeto, poderia criar uma instncia sem referncia.with TBitBtn.Create(Self) dobegin

    Parent := Self;Kind := bkClose;Caption := '&Sair';Left := Self.ClientWidth - Width - 8;Top := Self.ClientHeight - Height - 8;

    end;Para destruir um objeto, use o mtodo Free. Para Forms, recomendado usar o Release, para que todos oseventos sejam chamados.O parmetro do mtodo Create usado apenas em Componentes, para identificar o componente dono. Ao criarForms, poderamos usar o Objeto Application.FrmSobre := TFrmSobre.Create(Application);FrmSobre.ShowModal;FrmSobre.Release;Para criar objetos no componentes, voc no precisa de nenhum parmetro no mtodo Create.var

    Lst: TStringList;begin

    Lst := TStringList.Create;Lst.Add('Al, Teresinha!');Lst.Add('Uhh uhh...');Lst.SaveToFile('Teresinha.txt');Lst.Free;

    end;22RTTIRun Time Type Information a informao de tipo dos objetos em tempo de execuo. O operador is usado parafazer comparaes e o operador as usado para fazer um TypeCast seguro com objetos.for I := 0 to ComponentCount - 1 do

    if Components[I] is TEdit thenTEdit(Components[I]).Clear;

    (Sender as TEdit).Color := clYellow;

  • Exerccios1. Faa um Form, com um Edit e botes para passar o texto do Edit para maisculas, minsculas e apagar

    todos os espaos.2. Crie um Form com dois Edits, um boto para verificar se os dois textos so iguais sem levar em considerao

    o caso, um boto para inserir o texto do primeiro Edit no meio do segundo e outro boto para verificar se otexto do primeiro Edit est dentro do texto do segundo.

    3. Crie um projeto com um Form de mltiplas pginas, onde possa ser feita uma analise de balano. Na primeiraguia, devem ser informados o patrimnio lquido da empresa, os valores circulante, realizvel a longo prazo epermanente. Na Segunda guia mostre uma anlise vertical, tome o patrimnio lquido como 100% e mostre opercentual de cada um dos outros valores informados. Na terceira guia, mostre um grfico com panelsrepresentando cada um dos percentuais mostrados na segunda guia.

    4. Faa um programa que sugira que o usurio pare de trabalhar quando o relgio do sistema no estiver emhorrio comercial.

    5. Sabendo que M e N so inteiros, o que podemos concluir desses nmeros se a expresso M div N * N = Mretornar true e qual outra expresso poderia ser usada para testar a mesma condio?

    6. Sendo I um nmero inteiro, R um real e S uma string com um texto numrico como encontrar o resultado dasoma dos 3 valores, e de que tipo ser esse resultado?

    7. Como poderamos mandar o texto de um Edit chamado Edit1 para uma caixa de mensagem do tipoMessageBox, que recebe parmetros do tipo PChar?

    8. Faa um programa para encontrar as razes de uma equao de 2 grau cujos coeficientes sejam informadospelo usurio. Para relembrar, a frmula ax2 + bx + c = 0, o delta D = b2 - 4ac e as razes sodadas como x1 = (- b + RAIZ(D))/2a e x2 = (- b - RAIZ(D))/2a.

    9. Qual expresso podemos usar para encontrar a mdia aritmtica entre M e N, sabendo que M uma stringnumrica e N um caractere numrico?

    10. Sabendo que no SENAC a mdia mnima 7,0 e a tolerncia de faltas 15 % da carga horria do curso, faaum programa que pea as informaes necessrias e informe a situao do usurio.

    11. Faa uma funo que retorne o nmero de caracteres numricos que existem em uma string.12. Faa uma funo que defina se o ano bissexto ou no. Sabendo que para ser bissexto, o ano precisa ser

    divisvel por 4 e, alm disso, no ser divisvel por 100. Se for divisvel por 100 o ano tem que ser divi'sivel por400 para ser bissexto.

    13. Sabendo que a chamada de funo Pos(Str1, Str2) retorna a posio da string Str1 dentro de Str2, queDelete(S, 4, 6) remove 6 caracteres da string S a partir do caractere 4, e que Lenght(S) retorna o nmero decaracteres da string S, crie um procedimento chamado Remover que remova as ocorrncias de uma stringdentro de outra.

    14. Crie uma funo que retorne a string enviada como parmetro de trs para frente.15. Usando a funo anterior crie um Form com dois Edits, onde ao digitar um texto no primeiro Edit, esse texto

    aparea invertido no segundo.16. Usando a funo anterior faa uma funo que receba como parmetro uma data e retorne quantos dias h

    no ms e ano dessa data. Como fazer com que um Edit s aceite que sejam digitados caracteres numricosem seu interior?

    17. Faa um programa onde o usurio informe 2 datas e seja mostrado o nmero de anos, meses e dias entreelas.

    18. Faa um programa que pea a data de nascimento do usurio, converta o texto dessa data para uma formade ano com 4 dgitos e mostre a idade do usurio.

    19. Digamos que peso ideal de uma pessoa em quilos seja sua altura menos 1,15 m. Faa um programa quepea a altura e o peso do usurio e informe quanto ele precisa engordar ou emagrecer.

    20. Faa um programa que mostre quantos caracteres numricos e quantos alfabticos existem em um Memo