Publikované pred rokom: 05.12.2011 / Michal Reiter, čítaní: 4
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. Výnimka sa vyvolá vždy, pretože pôjde o chybu obslúženú operačným systémom. Treba však na ňu myslieť skôr, tak ako na ne mysleli programátori aplikácií, ktoré používate. Dôvod je jednoduchý. Vďaka obsluhe výnimky môžete používateľovi jasne definovať chybu, ktorú pochopí. Hlásenia typu Access violation... pravdepodobne nepochopí a nebudú mať preňho nijakú informačnú hodnotu.
Existuje niekoľko možností, ako sa s výnimkami vyrovnať. Ako sme už v kóde uviedli, základom je blok try..except alebo try..finally. Vždy sa musíte rozhodnúť, ktorý z príkazov použijete, ale ako vidno, vďaka vnoreniu sa dajú použiť oba, teda except aj finally.
Except – akcia sa vykoná pri vyvolaní výnimky, inak sa blok ignoruje. Ak chce vykonať viac príkazov, treba ich umiestniť do bloku begin..end.
Finally – akcia sa vykoná vždy bez ohľadu na to, či výnimka nastala, alebo nie. Tým sme vyriešili odpojenie komponentu IdSMTP1 od servera.
Okrem toho je tu ešte príkaz Raise. Ten vyvolá výnimku pri splnení podmienky a používateľ ju definuje sám.
Ošetrenie pri chýbajúcej e-mailovej adrese môže byť riešené napríklad takto:
If Edit2.text='' then raise Exception.Create('Chýba e-mailová adresa v poli
Komu');
Spôsob, akým sa programátor vyrovná s neočakávanými udalosťami, závisí od neho, netreba všetko riešiť vyslovene cez výnimky. Zápis by mohol vyzerať aj takto:
If Edit2.text<>'' then SpeedButton1.Enabled:=true; - pri zobrazení formulára v udalosti OnShow by sme doplnili kód: SpeedButton1.Enabled:=false; - kód musí byť vložený priamo, nielen v Object Inspectore pred kompiláciou, inak by pri druhej e-mailovej správe (resp. zobrazení okna) už nebolo tlačidlo zneprístupnené.
Na druhej strane tým však nevyriešime možnú chybu, ako
používateľ zadá do Editu čo i len medzeru. Nasledujúci kód nie je všeliek,
ale pomôže pri ošetrení väčšiny prípadov pri chybnej e-mailovej adrese:
if Pos('@',edit1.text) > 0 then
else
ShowMessage('Nesprávna e-mailová adresa');
Využiť môžete napríklad aj tento zápis:
if key in ['/', '?', '<'] then key:=#0;
Do hranatých zátvoriek si vpíšete množinu znakov, ktoré nie sú prípustné na zadanie v aktuálnom textovom poli, a kód vložíte do udalosti OnKeyPress.
Keby sme použili v spomínanej udalosti tento kód: if key =#13 then Edit2.SetFocus;, po stlačení klávesu Enter sa presunie kurzor na ďalší Edit. Využiť však môžete štandardné prechádzanie pomocou tabulátora. No treba si dať pozor, aby ste mali správne definovanú vlastnosť TabOrder v Object Inspectore. Začína sa nulou a pokračuje zvyšovaním čísla pri ďalších prvkoch na formulári. Po stlačení tabulátora dostanú focus v poradí, aké ste definovali. Delphi vytvára TabOrder vždy po vložení komponentov, ale počas vývoja sa môže niečo zmeniť, komponent vymažete, vložíte iný alebo začnete vložením komponentu Memo na text správy a potom doplníte Edit na definovanie parametrov správy a už je poradie neprirodzené na pohodlné prechádzanie používateľom.
K štandardným súčastiam nielen tohto programu patrí možnosť tlače. Obsah e-mailu sa dá jednoducho vytlačiť, ale pri komponente Memo treba použiť trochu iný princíp. Zjednodušenie tlače sa dá vyriešiť veľmi jednoducho, stačí Memo vymeniť za RichEdit. Tento komponent podporuje zobrazovanie súborov RTF a navyše má priamu procedúru na tlač jeho obsahu. Zápisom RichEdit1.Print vytlačíte aktuálny obsah komponentu.
Pri Memo je postup nasledujúci:
procedure Tlac(Udaje: TStrings); var
Tlac: TextFile; - vytvorenie premennej na použitie bežného textového súboru; jednoducho doň zapíšete aj prečítate dáta a textová podoba je z pohľadu nenáročnej kompatibility zatiaľ najlepším riešením
x: word; - kladná hodnota do 65 535 – vzhľadom na to, že Memo nikdy nebude mať „záporný“ počet riadkov, je tento typ postačujúci
begin
AssignPrn(Tlac); - priradenie súboru na tlač
try
Rewrite(Tlac); - otvorenie súboru na zápis
try
for x := 0 to Udaje.Count - 1 do – vypočítanie počtu riadkov
writeln(Tlac, Udaje.Strings[x]); - a ich zapísanie do súboru, príkaz WriteLN zapíše vždy nový riadok
finally
CloseFile(Tlac); - uzatvorenie súboru – po tomto príkaze bude treba vždy použiť Rewrite, ak budete chcieť doň ešte zapisovať
end;
except
on EInOutError do – ošetrenie akejkoľvek vstupno-výstupnej chyby
MessageDlg('Chyba tlače!', mtError, [mbOk], 0);
end;
end;
Zápis procedúry: Tlac(Memo1.Lines);
Použitie procedúry sa hodí nielen na Memo, preto budete mať univerzálny a rýchly spôsob, ako ju použiť aj pre iné komponenty, napríklad na ListBoxy – Tlac(Listbox1.Items);
Chybové hlásenie vyvolané priamo v Delphi – Edit1, ktorý má mať hodnotu
na Interval komponentu Timer1, je prázdny
Na ilustráciu sme do programu pridali aj možnosť kontroly pošty. Ide o veľmi jednoduchý príklad, ktorý bude kontrolovať poštu v danom intervale.
if CheckBox1.Checked then if edit1.Text<>'' then begin Timer1.Enabled:=true; Timer1.Interval:=StrToInt(Edit1.Text); ToolButton3.Click; end else Timer1.Enabled:=false;
Pozostáva z kontroly, či vôbec chceme túto funkciu zapnúť. Pred skompilovaním treba nastaviť Timer1.Enabled na hodnotu false Do Edit1 zapíšeme hodnotu intervalu. Ten je v milisekundách, takže pre 20 sekúnd platí hodnota 20 000. Lepšie je však do kódu pripraviť prevod ms na sekundy alebo minúty, napríklad:
Var Prevod:Cardinal; - prípadne LongWord
prevod:=StrToInt(Edit1.Text)*1000; - teraz už môžete zadávať text v sekundách, keby ste chceli použiť minúty, stačí hodnotu ešte vynásobiť 60.
Tá istá chyba, ale zobrazená operačným systémom – program je spustený už mimo
ladiaceho režimu vývojového nástroja
Zdroj: PCR 12/2011