602SQL-┌plnß dokumentace Index   Tisk  

Aplikace °φzenß programem se smyΦkou zprßv

Pru₧nΘ interaktivnφ aplikace se nejΦast∞ji budujφ s vyu₧itφm konstrukce, kterΘ se °φkß smyΦka zprßv. SmyΦka zprßv je cyklus, v n∞m₧ program Φekß na zprßvu od u₧ivatele, a kdy₧ p°ijde, pak na nφ p°edepsan²m zp∙sobem reaguje. Jednotliv²m zprßvßm jsou p°i°azeny reakce programu, mezi nimi₧ je jedna, kterß zp∙sobφ opuÜt∞nφ smyΦky a ukonΦenφ programu.

Typickß smyΦka zprßv

AplikaΦnφ program zaΦφnß pracovat v situaci, kdy je na obrazovce prßzdnΘ hlavnφ okno bez menu. Zpravidla nejprve provede pot°ebnΘ inicializaΦnφ akce a pak umφstφ na obrazovku v²chozφ ovlßdacφ objekty - menu nebo formulß°e. PotΘ vstoupφ do smyΦky zprßv, v nφ₧ pomocφ funkce Get_ext_message zφskßvß dalÜφ Φekajφcφ zprßvu a zpracovßvß ji. Ve smyΦce setrvßvß do tΘ doby, dokud si v reakci na vhodnou zprßvu nenastavφ p°φznak ukonΦenφ b∞hu. Typickß struktura programu vypadß takto:

const
  zprßva_1 = 1001;  
  zprßva_2 = 1002;  
  zprßva_konec = 1999;
var
  konec : Boolean;  
  msg : integer;  handle : window_id;
.............................................
begin
  { inicializace }
  ...........................................
  { otev°enφ v²chozφho menu nebo formulß°e: }
  Main_menu("*hlavnφ_mn");
  ...........................................
  konec := FALSE;
  while not konec and 
    Get_ext_message(msg, handle, nil) do
  begin
      case msg of
       zprßva_1: ...zpracovßnφ zprßvy 1 ...
         zprßva_2: ...zpracovßnφ zprßvy 2 ...
       ....................................
       zprßva_konec: konec := TRUE
      end;
  end;
  { ·klid }
  ...........................................
end.

Funkce Get_ext_message Φekß, dokud nep°ijde dalÜφ zprßva, a potΘ vrßtφ jejφ Φφslo ve v²stupnφm parametru msg. B∞hem Φekßnφ zßrove≥ doruΦuje b∞₧nΘ slu₧ebnφ zprßvy okn∙m na obrazovce a tφm umo₧≥uje u₧ivateli s nimi interaktivn∞ pracovat, provßd∞t p°φkazy z menu a v∙bec komunikovat s aplikacφ. Funkce Get_ext_message vrßtφ hodnotu FALSE, kdy₧ dostane zprßvu s Φφslem -1, Φeho₧ lze takΘ vyu₧φt k ukonΦenφ smyΦky.

╚innost vzorovΘho programu ukonΦφ p°φchod zprßvy zprßva_konec. Ostatnφ zprßvy jsou zpracovßvßny v p°φsluÜnΘ v∞tvi p°φkazu CASE nebo jsou ignorovßny.

P°i pou₧itφ smyΦky zprßv nenφ nutnΘ, aby p°es nφ prochßzeny vÜechny operace, a zpravidla tomu tak nenφ. V∞tÜina operacφ se v aplikacφ provßdφ tak, ₧e formulß°, menu nebo ovlßdacφ liÜta p°φmo provedou pot°ebnou akci nebo zavolajφ vhodn² podprogram.

JakΘ zprßvy dostßvß aplikaΦnφ program?

AplikaΦnφ program dostßvß prost°ednictvφm funkce Get_ext_message zprßvy vznikajφcφ r∙zn²m zp∙sobem:

Zprßvy pou₧itΘ v aplikaci (krom∞ zprßv automaticky generovan²ch) oznaΦuje jejφ autor Φφsly v rozsahu od 1001 do 60000. Zprßva s Φφslem -1 mß vyhrazen² v²znam - je to ₧ßdost o ukonΦenφ aplikace. Tato zprßva sice b∞₧φcφ aplikaci sama neukonΦφ, ale zp∙sobφ, ₧e funkce Get_ext_message po jejφm p°ijetφ vrßtφ hodnotu FALSE, na nφ₧ m∙₧e program reagovat ukonΦenφm svΘ Φinnosti.

╚φsla zprßv v rozsahu od 0 do 1000 a v∞tÜφ ne₧ 60000 jsou rezervovßna pro 602SQL a nenφ dovoleno jich pou₧φvat.

Pro oznaΦenφ zprßv je v²hodnΘ pou₧φt konstant definovan²ch v programu ve vnit°nφm jazyce. Je-li tento program nastaven jako projekt (viz kapitola o programovacφm prost°edφ), lze identifikßtory zprßv vyu₧φt v nßvrhu formulß°∙ a menu.

SmyΦka zprßv s funkcφ Peek_message

Funkce Peek_message se od Get_ext_message liÜφ tφm, ₧e pokud na vstupu ₧ßdnß zprßva nenφ, pak neΦekß, skonΦφ a vrßtφ FALSE. Hodφ se k implementaci tzv. aktivnφho Φekßnφ, kdy₧ program si zßrove≥ d∞lß svou prßci a zajiÜ¥uje funkΦnost u₧ivatelskΘho rozhranφ.

V n∞kter²ch situacφch program pot°ebuje umo₧nit u₧ivateli prßci s formulß°em pouze po urΦitou dobu a pak pokraΦovat ve v²poΦtu. Pokud okam₧ik, kdy mß v²poΦet pokraΦovat, nenφ ohlßÜen ₧ßdnou zprßvou, pak je nutno mφsto funkce Get_ext_message pou₧φt Peek_message.

P°φklad:

View_open('*form_x');
while not ... podmφnka ukonΦenφ ...
    do Peek_message;
View_close('*form_x');

Tento ·sek programu otev°e formulß°, umo₧nφ u₧ivateli s nφm pracovat do doby, dokud nenφ spln∞na podmφnka ukonΦenφ, pak formulß° zav°e a pokraΦuje.

Princip programovßnφ se smyΦkou zprßv

P°i programovßnφ aplikacφ se smyΦkou zprßv musφte respektovat toto pravidlo:

Pokud mß program reagovat na Φinnost u₧ivatele, musφ v cyklu volat funkce Get_ext_message nebo Peek_message. B∞hem provßd∞nφ cyklu neobsahujφcφho opakovanΘ volßnφ ₧ßdnΘ z t∞chto funkcφ poΦφtaΦ na Φinnost u₧ivatel nereaguje.

Dobu, po kterou nenφ k dispozici ₧ßdnß zprßva urΦenß programu, program trßvφ uvnit° funkce Get_ext_message, kde vy°izuje slu₧ebnφ zprßvy a tφm umo₧≥uje u₧ivateli normßlnφ prßci s menu a okny na obrazovce.

Pokud p°i prßci s formulß°em nebo menu u₧ivatel vyvolß n∞jakΘ akce (nap°. stiskne tlaΦφtko, kterΘ volß proceduru), pak provßd∞nφ t∞chto akcφ se vno°φ do volßnφ funkce Get_ext_message nebo Peek_message - prob∞hne uvnit° nφ.

Automaticky generovanΘ zprßvy

B∞hem prßce u₧ivatele s formulß°em je automaticky generovßna °ada zprßv. Program na n∞ m∙₧e, ale nemusφ reagovat. Ka₧dß takovß zprßva nese dvojφ informaci: handle okna formulß°e, kterΘho se t²kß, a oznaΦenφ udßlosti, k nφ₧ ve formulß°i doÜlo. P°i p°φjmu t∞chto zprßv funkce Get_ext_message vrßtφ v parametru handle hodnotu handle okna, kterΘ zprßvu vyslalo.

OznaΦenφ udßlosti je dßno tabulkou:

╚φslo zprßvy Udßlost
1 Formulß° byl otev°en
2 Formulß° byl uzav°en
3 U₧ivatel p°eÜel na nov² zßznam
4 U₧ivatel zm∞nil obsah slo₧ky
5 Vybran² zßznam se p°ekresluje
6 Cel² formulß° se p°ekresluje
7 Formulß° p°echßzφ k subkurzoru (QBE)
8 Formulß° se vracφ k superkurzoru
9 Otev°en zßvisl² formulß°
10 Uzav°en zßvisl² formulß°
11 Otev°en textov² editor
12 Uzav°en textov² editor
13 Otev°eno okno pro prohlφ₧enφ obrßzku
14 Uzav°eno okno pro prohlφ₧enφ obrßzku

Na tyto zprßvy program reaguje pouze tehdy, pokud chce oÜet°it urΦitou situaci, kterß je zprßvou signalizovßna. Ostatnφ zprßvy program ignoruje.

P°φklad:

Chce-li program zachytit okam₧ik, kdy u₧ivatel zm∞nφ obsah n∞kterΘ slo₧ky ve formulß°i ID, pak analyzuje dochßzejφcφ zprßvy takto:

Get_ext_message(msg, handle, nil);
if (handle = ID) and (msg = 4)
    then ...   { reakce na zm∞nu obsahu slo₧ky }
else ...       { zpracovßnφ ostatnφch zprßv }