Vous êtes sur la page 1sur 12

PequenosSegredosdoDelphi

Por AndersonHaertelRodrigues
ArtigopublicadonarevistaTheClubEdioNr.102Maro/2003

Introduo
Oartigodestemsnotemaintenodemanterumalgicaenemfalaremapenasumassunto
emespecfico.Entosemudarmosdeassuntoradicalmentenoprximotpico,noestranhe!
IreifalarsobrealgumaspalavrasquevemosnoDelphiesvezesnosabemosdeondeamesma
vemenemoqueexisteportrsdamesma.Mastambm,falareidealgumaspalavraschavesdo
Delphi.
Result
AprimeiradelasqueveremosapalavraResult.Quandoimplementamosumafuno(mtodo):
{...}
type
TForm1=class(TForm)
private
{Privatedeclarations}
functionSoma(pnSoma1,pnSoma2:Double):Double
public
{Publicdeclarations}
end
{...}
functionTForm1.Soma(pnSoma1,pnSoma2:Double):Double
begin
Result:=pnSoma1+pnSoma2
end
JparouparapensardeondevemResult?
R.Euj:).
Resultumavarivel.Cadafuno(oumtodo)declaraimplicitamenteavarivelResult,cujo,o
tipo da varivel o mesmo tipo de retorno da funo declarada. No exemplo acima, do tipo
Double. Result no uma varivel Local ela semelhante a um parmetro var oculto, j
declaradonocabealhodafunction(issoocorrenosbastidores).
Uma dica: O Delphi pode falhar ao inicializar a varivel Result, principalmente em alguns casos
envolvendooretornodeString,ArraysDinmicoseVariant.Nessescasos,porsegurana,devese
inicializar a mesma com: String Vazia, Array Vazio e ou Unassigned (declarada na Uses
VariantsdoDelphi7).

Self
ESelf?
R.Euj(denovo):).
SelfassimcomoResultumavarivel.SelfsvisvelemMtodosquepertencemaumaClasse
enovisvelemFunctionseProceduresnormais.Selfumparmetroocultoetemcomovalor
a Referncia ao Objeto ou, se for o caso de um Mtodo de Classe (Class methods) Self a
RefernciadaClasse.
NoexemploacimadomtodoSoma,Selfreceberiaovalorde:TForm1.Umacoisainteressante,
osmtodospossuemumwithSelfdoimplcitonocorpodomtodo,isto,porissoquequando
fizemososeguintenocorpodeummtodonoprecisamoscolocarSelf:
functionTForm1.Soma(pnSoma1,pnSoma2:Double):Double
begin
Caption:='ArtigoescritoporAHR'
Close
{...}
end
Como o mtodo est envolvido num with Self do implcito (como j explicado) no precisamos
fazer:
Self.Caption,Self.Close,etc,etc.
Const
Econst?
R.Vocdeveestarcansadodeler(Euj)......
Constumapalavrachave,noumavarivelinicializadaimplicitamente(pelocompilador)como
SelfeResult(explicadosmaisacima).ApalavraConstnopossuimistrioalgumparaexplicar.O
quetemdemistrioparaexplicarnapalavrachaveconstcomoamesmasecomportaconforme
a sua declarao e se ligarmos (no Delphi 7) a diretiva de compilao {$J+} ou
{$WRITEABLECONSTON}.Constpodeserdedoistipos:
Constantes(propriamentedita)ouConstantesTipificadas.
Constantes (constantes mesmo!) como estamos acostumados a trabalhar, isto , no
podemos modificar o seu valor dentro de rotinas, por que, o prprio compilador impe essa
restrio,onde,sevoctentarmudarovalordamesma,ocompiladoriremitirumamensagem
deerro.
ConstantesTipificadasnorealmenteumaconstante,esim,umavarivelinicializada,isto,
o Delphi trata a mesma como sendo uma varivel. Mas, existe uma diferena entre constantes
tipificadas e variveis normais locais, Constantes tipificadas mantm o seu valor entre as
chamadas de rotinas, coisa que no acontece com uma varivel local normal, onde, a mesma
sempreserinicializadaconformeoseutipo.
Vamosaosexemplosparaficarmaisclaro:
implementation

{$J+}
//Ou{$WRITEABLECONSTON}
constconstMesmo=42
constTipificada:Integer=7
consObjeto:TForm=nil
{$J}
//Ou{$WRITEABLECONSTOFF}
{$R*.dfm}
No exemplo acima eu liguei a diretiva de compilao {$J+} (tambm poderia ser:
{$WRITEABLECONST ON}), do qual indica que poderemos mudar o valor da constante (mas
lembrese, mesmo ligando a diretiva, ainda necessito especificar o Tipo para a mesma ser
realmenteConstanteTipificada):
procedureTForm1.Button1Click(Sender:TObject)
begin
//constMesmo:=10
constTipificada:=10
consObjeto:=TForm1.Create(Self)
consObjeto.Name:='TESTE'
ShowMessage(IntToStr(constTipificada))
ShowMessage(consObjeto.Name)
end
Ao colocarmos o cdigo no Evento OnClik do Boto (que foi adicionado no Form), podemos
perceberquenemocompiladoremuitomenosemtempodeexecuotivemosalgumamensagem
de erro. Mas, como citado, s podemos modificar o valor de constTipificada e consObjeto, pois,
ambasforamdeclaradascomoseutipo,tornandoassim,ambascomoconstantestipificadas.Quis
tambmusar um Objeto para vermos que tambm podemos fazer o uso de variveis incializadas
comObjetos.
Mesmoligandoasdiretivasacima,constMesmoconstantemesmo,isto,nopodemosmodificar
o seu valor, se tentarmos, receberemos uma mensagem de erro do compilador do Delphi. Para
fazermosoteste,bastaretirarmosocomentriodeconstMesmo.
Vamos colocar um novo boto no Form para testarmos outro aspecto das constantes tipificadas,
que (como j citado) o fato de Constantes tipificadas manterem o seu valor entre as chamadas
derotinas.
Exemplo:
procedureTForm1.Button2Click(Sender:TObject)
begin
ShowMessage(IntToStr(constTipificada))

constTipificada:=constTipificada+10
end

AoclicarmosnovamentenoBoto:

E se clicarmos novamente, ir sempre adicionar mais 10 (Dez) ao valor da constante tipificada,


conformeocdigodoexemplodoButton2.

No Delphi 7 tanto {$J} como {$WRITEABLECONST OFF} por Default esto desligados, ento (isso
no acontecia em verses anteriores), sendo assim, constantes tipificadas so verdadeiramente
constantes.
Class
A palavra chave Class tambm no tem mistrios. O que existe de diferente a forma como a
mesma pode ser declarada. Isto , conforme a declarao podemos ter muitas nuances com a
mesmapalavra,exemplo:
type
TForm1=class(TForm)
private
public
end
{...}
a forma normal que usamos no dia a dia, e estamos apenas indicando (a IDE fez este trabalho
acimaporns)queTForm1herdadaClasseTForm.
J:
TCustomForm=class
uma declarao antecipada (chamada de: Forward declarations), onde estamos apenas dizendo
ao compilador que a classe ser declarada mais adiante na rotina. Se olharmos o fonte da unit:
Forms.pasveremosmuitasdeclaraesdestetipo.
J:
TFormClass=classofTForm
umadeclaraodotipoMetaClasse.Onde,umaMetaClasseumavarivelquepodearmazenar
uma referncia da classe que poder ser usada em qualquer expresso que exija a referncia de
classe,comoaochamarumconstrutoroumtododeclasse.
Observao:CiteiemvriaspartesdoArtigoRefernciadeClasse,nosepreocupe,maisafrente
euexplicocomdetalhesoqueumaRefernciadeClasse.
J:
type
TAlgumaClasse=class
public
classfunctionAlgumaFunction(Operation:string):Booleanvirtual
classprocedureAlgumaProcedure(varInfo:TFigureInfo)virtual
{...}
end
Oprincipaldadeclarao:

classfunctionAlgumaFunction(Operation:string):Booleanvirtual
classprocedureAlgumaProcedure(varInfo:TFigureInfo)virtual
Ocabealhoeocorpodaimplementaodevemcomearcom:classfunction.
Class method um mtodo que opera sobre a classe e no sobre a instncia dessa classe. Eles
podemserexecutadossemanecessidadesecriaroobjetodaclasse.
IS
O operador is no tem mistrios, is uma palavra chave e ele apenas testa se o tipo de
referncia do objeto igual a uma referncia de classe e ou de uma das suas classes derivadas.
Mas, nas internas o operador is chama o mtodo InheritsFrom do Objeto para saber o seu tipo
correto.Adicadooperadoris ,aotestaroobjetocomis nonecessriousarooperadoras,
nestecaso,faaumtypecastingsimplesparaconseguirummelhordesempenho.
NIL
umvalordotipoPointerespecial(Pointer(0)).Seuvalornumrico0(Zero).Ousomaiscomum
paraNILmarcarvariveisdotipoPointer e mtodos para um valor desconhecido. Um exemplo
seriaomanipuladordeeventos,onde,podemosatribuiromesmoparanil:
Button1.OnClick:=nil
Nofizemosnadademaisnoexemploacima,apenasmatamosoendereodomtodo.
Uma caracterstica e curiosidade, o Delphi armazena um Array Dinmico e String longa como um
ponteironil.
with
Oquewithfazapenasacrescentarumarefernciaderegistro,Objeto,ClasseeouInterfaceao
escopopararesolvernomesdesmbolo.
DiferenaentreTStringseTStringList
JparouparapensarqualarealdiferenaentreTStringseTStringList?
R.Euj).
Listas de Strings esto por toda a parte, na VCL, no Mar, no Ar e at mesmo em Marte! ).
Brincadeiras a parte, elas esto por todo o lugar mesmo: Caixa de Listas, Controles de Edies,
ControledeMenu,ListasdeStrings,etc,etc.Apesardeseremfceisdeusarebastantefuncional,
elavitimamuitosdesenvolvedorescomaseguintepergunta:
Eagora?UsoTStringsouTStringList?Nofundo,qualadiferenaentreelas?
R.:Acombinaodeambas!
TStrings uma classe que define todo o comportamento associado a lista de Strings. Entretanto,
TStrings no tem qualquer mtodo e/ou recursos para realmente manter a lista de Strings. Os
descendentesdeTStringsquesoresponsveisporisso,nestecaso,TStringList.Ok,Ok....ento
agoranonecessitomaisusarTStringseapartirdeagorasusareiTStringList!Certo?
R.:Errado!
FazendoissovocperdeumpoderosorecursodaClasseTStrings,queorecursodecpiadeuma
Lista de String para outra Lista de String, usando o mtodo Assign. Diante disso, voc deve
declarar a varivel como TStrings e na criao da mesma, criar usando a referncia de classe
TStringList,jqueTStringListherdadadeTStrings.

Algocomo:
procedureTForm1.FormCreate(Sender:TObject)
var
sStrings:TStrings
begin
sStrings:=TStringList.Create
{...}
end
UmexemplodoqueestoufalandoseriaobservarocomportamentodaClasseTCustomRadioGroup
(Extctrls.pas),onde,ocampodearmazenamentointernoFItemsdeclaradocomoTStrings,mas,
ao observarmos o constructor do mesmo, podemos ver que FItems atribuda a uma ocorrncia
deTStringList.
AdicadeTStringsxTStringListpodeservirmaisparaoscriadoresdecomponentes!
DiferenaentreObjetoseClasses
Umoutrofatoqueeuvejoemalgunscolegas,advidadoqueumaClasse,UmObjetoeat
mesmoumComponente?
Classes
Classes so (pelo menos pense assim) como um Super Registro,ondepodemosdeclarare
descrevermtodos,propriedadesecampos.QuandodeclaramosumaclasseemDelphi(comoem
quase toda linguagem de programao que conheo, seja: C#, C++, etc) definimos nveis
diferentes de acesso aos dados contidos na classe, atravs de Private, Protected, Public,
Published(ouatmesmoAutomated).Umaclasse(emDelphi)herdadeoutraclasse, onde desta
forma,herdatodososcampos,mtodosepropriedades.Senodeclaramosumaclasseancestral
oDelphiautomaticamentecolocaTObjectcomosendoaclasseancestral.
Quando cito e falo em Referncias de Classes (citado algumas vezes nesse artigo) ela na
realidade uma expresso que denomina uma classe especfica. Referncias de Classes so
ponteirosparaatabeladeinformaesdetempodeexecuo(VMT).Quandotestamosumaclasse
com o operador is (explicado acima) voc est testando a referncia de classe. Classes so
sempreapenasparaleituraeresidemnamemriadeLeitura.
Objetos
Um objeto a instncia dinmica de uma classe. no objeto que podemos escrever e
executar operaes, isto , Objetos no so apenas para Leitura conforme a Classe. Voc cria o
objetousandoarefernciadaclasse,chamandooseuconstructor.Exemplo:
oObjeto:=TMinhaClasse.Create
JarefernciadeObjetootrechodememriaondeoDelphiarmazenaosvaloresparatodosos
camposdoObjeto,arefernciadeobjetoumponteiroparaoobjeto.QuandocriamosumObjeto
dinamicamente,somososresponsveisporliberartalobjeto,usando:
oObjeto.Free
sempre envolto num bloco try...finally...end o Delphi no possui coleta de Lixo automtica
(GarbageCollector)comoaconteceno.NET,JAVA,SmallTalk,etc.

Componentes
Explicar o que um componente o mais simples. Componente tudo aquilo (se falando em
Delphi, esquea o COM Component Object Model) que voc pode manipular num formulrio
Delphi.TodocomponentetemqueobrigatoriamenteherdardaClasseTComponentnoseumaisalto
nvelancestral.
Concluso
AintenodoartigoeraapresentaralgumaspalavrasusadasnodiaadiadoDelphidoqualno
tnhamoscertezadeondeasmesmasvinhamecomosecomportavam.Esperoteresclarecido
algumasdvidaseestouabertosugestoe/outrocadeidias.
SucessoeSadeatodos!
UmAbrao.
SobreoAutor
AndersonHaertelRodriguesakaAHR
AutordoLivro:SistemasMulticamadascomDelphidbExpresseDataSnap
EditoraVisualBookswww.visualbooks.com.br
anderson.hr@bol.com.br anderson.hr@zipmail.com.br .
FlorianpolisSantaCatarinaBrasil.
COMENTRIOS
RodrigoBronzelle21/05/200315:49:30

Gosteimuitodoseuartigoejhaviapensadoemalgumasdessaspalavrasporm,
algumasaindaficocomdvida,porexemplo,porqueSTRINGpalavrareservada?
................................................
M?rciaSouza22/05/200308:58:58

Gosteimuitodoartigo,claroeobjetivo.
[]s
................................................
Marc_adans28/05/200318:39:11

Bemfeito,detalhadoenoumtextochatodeserlido
Parabns
................................................
AndersonHaertelRod01/06/200312:10:56

BomdiaTodos,
CaroRodrigo,Stringumapalavrareservadaquedenotaotipodedadosquetuestar?
usandodeclarandotalvari?vel/retornousandoString.
Omistriodapalavra,comousaramesma,isto?,tuconseguesumaboaperformance
usandoamesmacorretamenteecomalgunsmacetes.
Estesite:http://www.optimalcode.com/string.htmmostraalgumasnuancesdapalavrae
comoutilizaramesmadeformacorretaparaumamelhorperformance.
Sucessoatodos,
Anderson.
................................................
F?bioJoSMachado09/06/200311:37:22

Parabnsaoautor,artigomuitobom!

................................................
xicocanha09/06/200316:15:21

vaiproinferninhooboboca,noooootrimassaessesite
................................................
F?bioLuizMagri10/06/200317:54:47

OlAdeN,recordomedeterlidoesteartigoemalgumarevista...Foraisto,parabns!
Seusartigossempresointeressantes...Oanteriordeufocoaopessoaliniciante...Mas
semdvidasfoimaisumartigomuitobom!
Aproveitando,deixemefazerumacobrana...(presumindoqueir?deixar!:))...
EqtoaonossoartigodeDecisionCubeEstamosaguardando...Noseesquea!!!
Umforteabrao.
Atehhh
................................................
Nilce17/06/200320:41:11

VCNOSAJUDOUMUITOCOMESSETRABALHO
OBRIGADOOOOOOOOOOO!!!!!!!!!!!
EPARAbnSPELOSEUEXCELENTETRABALHO!!!
................................................
EdsonCarlos21/06/200323:21:25

Realmenteseutrabalhoedeexcelentequalidade,ememostrouqueagentenuncasabe
tudododelphi,masqueestamossembreabertosanovasideias....

PARAbnSPELOSEUTRABALHO
................................................
EdimilsoMarquesde19/07/200311:00:21

Parabenspeloartigo.
JiParan?RO
................................................
Andr?JorgeRaposo27/07/200300:10:54

Gosteimuitodessem?tododeensino,poisoquenodeixadeser,pormgostariaque
vclevasseemconsideraoumagrandedvidaquetenho...Oassuntoponteiros...Carao
professornafaculdadeenroloueenrolouenoendinounadapragente...Pensenissoque
podeserdvidademuitos...
Grato
................................................
AndersonHaertelRod29/07/200308:50:24

Bomdiaatodos!
Andr?,ponteirosdamesmaformaquepodesersimplesdeseexplicar,podeserdifcilem
umdadomomento.Umavezeuliumartigodeumconhecidomeu(ItaloGomes)que
explicavaousodeponteirosdeumaformabem"fcil"e"simples",mas,infelizmenteno
acheimaisoartigodomesmopelainternet.
Dequalquerforma,ficaadica!
Sucesso,

Anderson
Florian?polisSC
................................................
JOSEANTONIOA.NASC05/09/200300:46:05

ANDERSON,GOSTARIADESABERCOMOFAZERPARAUSARDELHICOM
ACCESSEMREDE,COMOCONFIGURALOETAMB?MCOMODEVOFAZERPARA
DEIXARDEUSAROBDE.SEPUDERMEENVIARTAMB?MPARAEMAIL
jantonioan@hotmail.com
................................................
DionyBarros11/10/200315:19:13

Gosteimuitodasdicas,maiseugostariadereceberporEmilrotinadeSenhaparaum
formeoutraparaomeuprojeto,sepissivelmeemvieumexemploemDelphi5desdej
agradeo.
MeuEmail:prdiony@ig.com.br
................................................
Eben?zer17/10/200317:08:18

muitobomseuartigo,muitobemdivididoemuitobemexplica,commuitafacilidadepara
entender.
Parabns.
................................................
LuizRogerio24/10/200316:29:21

Parabensmesmoaoautor,vocedescreveucommuitodetalheedeformaclaraeobjetiva,
parabens!!!Gostariaqmedessedicassobrebonslivrosdedelphi,temosmuitostitulos,
masnormalmentesaorepetitivos.
................................................
EduardoMoacir25/10/200301:00:03

EstoufazendoCursotcnicodeInformlticanaacademiadoCom?rcioemFlorian?polis,
estamosagoraaprendendoaprogramaremdelphi5,oprofessoraindanocomeoua
explicarconexocombandodedados,estoufazendopesquizanainternetparaverse
consigoaprenderalgumacoisa,poiscomcertezanovouaprendertudonaEscola,tenho
queiratrazdemeuobjetivo,sevctiveralgumacoisainteressantecomrelaoaodelphi5
paramemandareuagradeo!!!
mauemaildinhoedu@bol.com.br
................................................
Foudaseee20/11/200323:08:15

tutaviaduu
................................................
inscria25/11/200309:52:05

Parabnspeloseutrabalho,esperoqsurjamoutrosartigos,poissualinguagemclarae
objetiva,tentepassarmaisdicasptodosn?samantesdaprogramaodecomputadores...
dr0&r4^^^4p0r
................................................
BandidoCarabina18/12/200313:58:20

Rapaiz,,esseseuartiguebodimaisdaconta,numseiseoceissabem,masemMinastem
muitoprogramadorbodeDelphi,(eusoudel?,he,he,he,)
Masagentenuncasabetudodascoisan?,umgrandeabraoproc?mininu,etudodi
bo,,

arildo.a@terra.com.br

................................................
HeitorSchmitz27/12/200309:03:07

SouprogramadoremDelphi,tenhoumadvida,fizumprogramaquepegadadosde
vriastabelasetransportaparaumas?,masoproblemaque,norelatrioeunoquero
todaaminhatabela,euqueroporexemplo:
minhatabelatem21registros,queronaprimeirapartedoregistro1at8edo14ato21,
conseguiatrav?sdeumasql,oproblemaqueeuconseguisomenteessesregistros,
coloqueiosdadosemumdetail,eossomatoriosemumsumary,oproblemaqueeu
queronamesmapginaosdemaisregistroscomossomatriosdosmesmos.
sevocssouberemqualomeuproblemaouumasugestoagradeo.
polrg@terra.com.br
................................................
???????????????????!19/09/200413:32:45

Pownoentendibulhufasdesseartigoae,pow,encrevemaissimplificadementeaecara...
Sevcpuderatenderessecomentrio,Obrigado!
Masmesmoassim,parabnspelotrabalho,epelaatitudedecompartilharseus
conhecimentoscomououtros!
................................................
rpodj29/10/200410:35:25

quemnosabiaistototalmenteanalfabeto!porra!
................................................
WilsioneLessaNaveg12/01/200518:51:39

Gosteidoartigo,poismuitasdasvezesusamosmasnosabemosdireitooquesoeoque
fazemestaspalavras.Abraos!!!!
................................................
webmasters11/02/200509:36:37

Qualocomandoqueusonodelphiparapararumaclassouumactivexnointernet
explorer
................................................
Ice02/09/200519:54:51

GostariadesabercomoeufaoparafazerconsultasnumBDfeitonoACCESSpelo
Delphi,umprogramabemsimples,eucolocoocampoqueeuqueroquepesquisee
cliconobotoparaeretornaroresultadoemoutrajanela,masnotoconseguindofazer,
poderiameajudar?
icebox_br@mail.com
................................................
IsmaelConceiodo29/09/200517:45:20

Valeu,
ltimasdicasparaonossoexclarecimento.
Parabnsmeajudoumuito.
................................................
OEnviodeComentriosestsuspensotemporriamente

Vous aimerez peut-être aussi