Programujeme v Delphi / 6. časť

Na za­čiat­ku prog­ra­mo­va­nia e-mai­lo­vé­ho klien­ta sme spo­me­nu­li pot­re­bu spra­cú­vať vý­nim­ky. Za­tiaľ bo­la v kó­de len jed­na, a to pri od­osie­la­ní poš­ty. Vý­nim­ka sa vy­vo­lá vždy, pre­to­že pôj­de o chy­bu ob­slú­že­nú ope­rač­ným sys­té­mom. Tre­ba však na ňu my­slieť skôr, tak ako na ne mys­le­li prog­ra­má­to­ri ap­li­ká­cií, kto­ré pou­ží­va­te. Dô­vod je jed­no­du­chý. Vďa­ka ob­slu­he vý­nim­ky mô­že­te pou­ží­va­te­ľo­vi jas­ne de­fi­no­vať chy­bu, kto­rú po­cho­pí. Hlá­se­nia ty­pu Ac­cess vio­la­tion... prav­de­po­dob­ne ne­po­cho­pí a ne­bu­dú mať preň­ho ni­ja­kú in­for­mač­nú hod­no­tu.

Zá­pis na viac spô­so­bov

Exis­tu­je nie­koľ­ko mož­nos­tí, ako sa s vý­nim­ka­mi vy­rov­nať. Ako sme už v kó­de uvied­li, zá­kla­dom je blok try..except ale­bo try..fi­nal­ly. Vždy sa mu­sí­te roz­hod­núť, kto­rý z prí­ka­zov pou­ži­je­te, ale ako vid­no, vďa­ka vno­re­niu sa da­jú pou­žiť oba, te­da except aj fi­nal­ly.

Except – ak­cia sa vy­ko­ná pri vy­vo­la­ní vý­nim­ky, inak sa blok ig­no­ru­je. Ak chce vy­ko­nať viac prí­ka­zov, tre­ba ich umies­tniť do blo­ku be­gin..end.

Fi­nal­ly – ak­cia sa vy­ko­ná vždy bez oh­ľa­du na to, či vý­nim­ka nas­ta­la, ale­bo nie. Tým sme vy­rie­ši­li od­po­je­nie kom­po­nen­tu IdSMTP1 od server­a.

Ok­rem to­ho je tu eš­te prí­kaz Rai­se. Ten vy­vo­lá vý­nim­ku pri spl­ne­ní pod­mien­ky a pou­ží­va­teľ ju de­fi­nu­je sám.

Ošet­re­nie pri chý­ba­jú­cej e-mai­lo­vej ad­re­se mô­že byť rie­še­né nap­rík­lad tak­to:

If Edit2.text='' then rai­se Excep­tion.Crea­te('Chý­ba e-mai­lo­vá ad­re­sa v po­li
Ko­mu');

Spô­sob, akým sa prog­ra­má­tor vy­rov­ná s neo­ča­ká­va­ný­mi uda­los­ťa­mi, zá­vi­sí od ne­ho, net­re­ba všet­ko rie­šiť vy­slo­ve­ne cez vý­nim­ky. Zá­pis by mo­hol vy­ze­rať aj tak­to:

If Edit2.text<>'' then Speed­But­ton1.Enab­led:=true; - pri zob­ra­ze­ní for­mu­lá­ra v uda­los­ti On­Show by sme dopl­ni­li kód: Speed­But­ton1.Enab­led:=fal­se; - kód mu­sí byť vlo­že­ný pria­mo, nie­len v Ob­ject In­spec­to­re pred kom­pi­lá­ciou, inak by pri dru­hej e-mai­lo­vej sprá­ve (resp. zob­ra­ze­ní ok­na) už ne­bo­lo tla­čid­lo znep­rís­tup­ne­né.

Na dru­hej stra­ne tým však ne­vy­rie­ši­me mož­nú chy­bu, ako pou­ží­va­teľ za­dá do Edi­tu čo i len me­dze­ru. Nas­le­du­jú­ci kód nie je vše­liek, ale po­mô­že pri ošet­re­ní väč­ši­ny prí­pa­dov pri chyb­nej e-mai­lo­vej ad­re­se:

if Pos('@',edit1.text) > 0 then
el­se
ShowMes­sa­ge('Nes­práv­na e-mai­lo­vá ad­re­sa');

Vy­užiť mô­že­te nap­rík­lad aj ten­to zá­pis:

if key in ['/', '?', '<'] then
key:=#0;

Do hra­na­tých zá­tvo­riek si vpí­še­te mno­ži­nu zna­kov, kto­ré nie sú prí­pus­tné na za­da­nie v ak­tuál­nom texto­vom po­li, a kód vlo­ží­te do uda­los­ti On­KeyP­ress.

Ke­by sme pou­ži­li v spo­mí­na­nej uda­los­ti ten­to kód: if key =#13 then Edit2.Set­Fo­cus;, po stla­če­ní klá­ve­su En­ter sa pre­su­nie kur­zor na ďal­ší Edit. Vy­užiť však mô­že­te štan­dar­dné pre­chá­dzanie po­mo­cou ta­bu­lá­to­ra. No tre­ba si dať po­zor, aby ste ma­li správ­ne de­fi­no­va­nú vlas­tnosť Ta­bOr­derOb­ject In­spec­to­re. Za­čí­na sa nu­lou a pok­ra­ču­je zvy­šo­va­ním čís­la pri ďal­ších pr­vkoch na for­mu­lá­ri. Po stla­če­ní ta­bu­lá­to­ra dos­ta­nú fo­cus v po­ra­dí, aké ste de­fi­no­va­li. Del­phi vy­tvá­ra Ta­bOr­der vždy po vlo­že­ní kom­po­nen­tov, ale po­čas vý­vo­ja sa mô­že nie­čo zme­niť, kom­po­nent vy­ma­že­te, vlo­ží­te iný ale­bo za­čne­te vlo­že­ním kom­po­nen­tu Me­mo na text sprá­vy a po­tom dopl­ní­te Edit na de­fi­no­va­nie pa­ra­met­rov sprá­vy a už je po­ra­die nep­ri­ro­dze­né na po­hodl­né pre­chá­dzanie pou­ží­va­te­ľom.

Tlač e-mai­lo­vej sprá­vy

K štan­dar­dným sú­čas­tiam nie­len toh­to prog­ra­mu pat­rí mož­nosť tla­če. Ob­sah e-mai­lu sa dá jed­no­du­cho vy­tla­čiť, ale pri kom­po­nen­te Me­mo tre­ba pou­žiť tro­chu iný prin­cíp. Zjed­no­du­še­nie tla­če sa dá vy­rie­šiť veľ­mi jed­no­du­cho, sta­čí Me­mo vy­me­niť za Ri­chE­dit. Ten­to kom­po­nent pod­po­ru­je zob­ra­zo­va­nie sú­bo­rov RTF a na­vy­še má pria­mu pro­ce­dú­ru na tlač je­ho ob­sa­hu. Zá­pi­som Ri­chE­dit1.Print vy­tla­čí­te ak­tuál­ny ob­sah kom­po­nen­tu.

Pri Me­mo je pos­tup nas­le­du­jú­ci:

pro­ce­du­re Tlac(Uda­je: TStrings);
var

  Tlac: TextFi­le; - vy­tvo­re­nie pre­men­nej na pou­ži­tie bež­né­ho texto­vé­ho sú­bo­ru; jed­no­du­cho doň za­pí­še­te aj pre­čí­ta­te dá­ta a texto­vá po­do­ba je z poh­ľa­du ne­ná­roč­nej kom­pa­ti­bi­li­ty za­tiaľ naj­lep­ším rie­še­ním

  x: word; - klad­ná hod­no­ta do 65 535 – vzhľa­dom na to, že Me­mo nik­dy ne­bu­de mať „zá­por­ný“ po­čet riad­kov, je ten­to typ pos­ta­ču­jú­ci

be­gin

  As­signPrn(Tlac); - pri­ra­de­nie sú­bo­ru na tlač

  try

  Rewri­te(Tlac); - ot­vo­re­nie sú­bo­ru na zá­pis

  try

  for x := 0 to Uda­je.Count - 1 do – vy­po­čí­ta­nie poč­tu riad­kov

  wri­teln(Tlac, Uda­je.Strings[x]); - a ich za­pí­sa­nie do sú­bo­ru, prí­kaz Wri­teLN za­pí­še vždy no­vý ria­dok

  fi­nal­ly

  Clo­se­Fi­le(Tlac); - uzat­vo­re­nie sú­bo­ru – po tom­to prí­ka­ze bu­de tre­ba vždy pou­žiť Rewri­te, ak bu­de­te chcieť doň eš­te za­pi­so­vať

  end;

  except

  on EInOu­tError do – ošet­re­nie akej­koľ­vek vstup­no-vý­stup­nej chy­by

  Mes­sa­geDlg('Chy­ba tla­če!', mtError, [mbOk], 0);

  end;

end;

 

Zá­pis pro­ce­dú­ry: Tlac(Me­mo1.Li­nes);

Pou­ži­tie pro­ce­dú­ry sa ho­dí nie­len na Me­mo, pre­to bu­de­te mať uni­ver­zál­ny a rých­ly spô­sob, ako ju pou­žiť aj pre iné kom­po­nen­ty, nap­rík­lad na Lis­tBoxy – Tlac(Lis­tbox1.Items);

Auto­ma­tic­ká kon­tro­la poš­ty

Vynimka1.png
Chy­bo­vé hlá­se­nie vy­vo­la­né pria­mo v Del­phi – Edit1, kto­rý má mať hod­no­tu na Inter­val kom­po­nen­tu Ti­mer1, je prázd­ny

Na ilus­trá­ciu sme do prog­ra­mu pri­da­li aj mož­nosť kon­tro­ly poš­ty. Ide o veľ­mi jed­no­du­chý prík­lad, kto­rý bu­de kon­tro­lo­vať poš­tu v da­nom inter­va­le.

if Chec­kBox1.Chec­ked then
if edit1.Text<>'' then be­gin
Ti­mer1.Enab­led:=true;
Ti­mer1.Inter­val:=Str­ToInt(Edit1.Text);
Tool­But­to­n3.Click;
end
el­se
Ti­mer1.Enab­led:=fal­se;

Po­zos­tá­va z kon­tro­ly, či vô­bec chce­me tú­to fun­kciu za­pnúť. Pred skom­pi­lo­va­ním tre­ba nas­ta­viť Ti­mer1.Enab­led na hod­no­tu fal­se Do Edit1 za­pí­še­me hod­no­tu inter­va­lu. Ten je v mi­li­se­kun­dách, tak­že pre 20 se­kúnd pla­tí hod­no­ta 20 000. Lep­šie je však do kó­du prip­ra­viť pre­vod ms na se­kun­dy ale­bo mi­nú­ty, nap­rík­lad:

Var
Pre­vod:Car­di­nal; - prí­pad­ne LongWord

pre­vod:=Str­ToInt(Edit1.Text)*1000; - te­raz už mô­že­te za­dá­vať text v se­kun­dách, ke­by ste chce­li pou­žiť mi­nú­ty, sta­čí hod­no­tu eš­te vy­ná­so­biť 60.

Vynimka2.png
Tá is­tá chy­ba, ale zob­ra­ze­ná ope­rač­ným sys­té­mom – prog­ram je spus­te­ný už mi­mo la­dia­ce­ho re­ži­mu vý­vo­jo­vé­ho nás­tro­ja

Zdroj: PCR 12/2011



Ohodnoťte článok:
   
Hľadáte predošlé príspevky? Zobraziť pôvodnú diskusiu
comments powered by Disqus
 

24 hodín

týždeň

mesiac

Najnovšie články

Slov­ní­ček poj­mov vo vý­poč­to­vej tech­ni­ke
Predstavuje činnosť zameranú na vyhľadávanie a označovanie nezabezpečených bezdrôtových sietí, cez ktoré sa dá pripojiť (často nelegálne) do internetu. čítať »
 
No­vin­ky z vy­da­va­teľ­stva Zo­nerPress
Kniha Michaela Freya vychádza z diela známeho krajinárskeho fotografa Ansela Adamsa. čítať »
 
Pre vy­zná­va­čov dob­ré­ho pi­va
Milovníkov kvalitného piva zaiste potešíte darčekovými baleniami z dielne Pilsner Urquell. Tieto Vianoce je k dispozícii široký výber darčekových balení. čítať »
 
Prog­ra­mu­je­me v Del­phi / 6. časť
Na začiatku programovania e-mailového klienta sme spomenuli potrebu spracúvať výnimky. Zatiaľ bola v kóde len jedna, a to pri odosielaní pošty. čítať »
 
La­dí­me a op­ti­ma­li­zu­je­me sys­tém / 1. časť
Operačný systém ako celok obsahuje univerzálne nastavenia, ktoré sú kompromisom medzi výkonom, vzhľadom a možnosťami. čítať »
 
 
 
  Zdieľaj cez Facebook Zdieľaj cez Google+ Zdieľaj cez Twitter Zdieľaj cez LinkedIn Správy z RSS Správy na smartfóne Správy cez newsletter