home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1997 #3 / amigamamagazinepolishissue03-1 / ma_1995 / 11 / ami044.txt < prev    next >
Text File  |  1997-04-07  |  12KB  |  324 lines

  1. PO RAZ OSTATNI...
  2.  
  3. <lead>Proszë o minutë ciszy. Okazja do powspominania jest
  4. niebywaîa. Otóû koïczy sië minikurs jëzyka E.
  5.  
  6. <a>Rafaî Wiosna
  7.  
  8. <txt>Okazaîo sië, ûe miesiâc temu skîamaîem i nie zamieôciîem
  9. wszystkich opisów wiadomoôci IDCMP. Artykuî w pierwotnej formie
  10. sië nie zmieôciî, dlatego teû w tym odcinku naprawdë dokoïczë
  11. opisywanie wnëtrznoôci Intuition.
  12.  
  13. <sr>IDCMP_...
  14.  
  15. <txt>IDCMP_CHANGEWINDOW -- wiadomoôê wysyîana aplikacji w chwili
  16. zmiany wymiarów lub poîoûenia okna. Moûe to zrobiê uûytkownik lub
  17. sam program, uûywajâc funkcji SizeWindow(), MoveWindow(),
  18. ChangeWindowBox() lub ZipWindow().
  19.  
  20. IDCMP_MENUHELP -- bardzo ciekawy typ wiadomoôci. Aplikacja
  21. otrzyma jâ, gdy uûytkownik naciônie klawisz [Help] podczas
  22. wybierania jakiejô opcji z menu. MENUHELP dziaîa nawet wówczas,
  23. gdy opcja jest niedostëpna (ghosted). Wiadomoôci tego typu bëdâ
  24. wysyîane tylko wtedy, gdy w tagach, przekazywanych funkcji
  25. OpenWindowTagList() znajduje sië tag WA_MenuHelp. (Nie ma
  26. odpowiednika tego tagu wôród flag typu WFLG_!)
  27.  
  28. Programista moûe odczytaê, który element menu zostaî "wybrany" w
  29. polu code. Jeûeli ûadna opcja nie znajdowaîa sië pod kursorem
  30. myszy, w chwili gdy uûytkownik naciskaî [Help], wartoôê pola code
  31. bëdzie wynosiîa MENUNULL.
  32.  
  33. IDCMP_GADGETHELP -- (nowoôê w systemie V39, czyli 3.0) wiadomoôê
  34. wysyîana wtedy, gdy kursor myszy znajduje sië nad gadûetami. Aby
  35. z tego skorzystaê, naleûy uûyê funkcji HelpControl() w celu
  36. wîâczenia moûliwoôci otrzymywania wiadomoôci typu
  37. IDCMP_GADGETHELP. W jej polu code jest numer gadûetu, nad którym
  38. znajduje sië kursor myszy.
  39.  
  40. To mniej wiëcej wszystkie typy wiadomoôci, które moûe otrzymaê
  41. aplikacja. Zajmijmy sië teraz flagami, którymi okreôla sië
  42. parametry i stan nowo otwieranego okna.
  43.  
  44. <sr>WFLG_...
  45.  
  46. <txt>WFLG_SIZEGADGET -- decyduje o obecnoôci gadûetu,
  47. umoûliwiajâcego zmianë rozmiaru okna.
  48.  
  49. WFLG_DRAGBAR -- okno bëdzie miaîo listwë, umoûliwiajâcâ jego
  50. przesuwanie. Jeûeli nie uûyjesz tej flagi, okna nie bëdzie moûna
  51. przesunâê.
  52.  
  53. WFLG_DEPTHGADGET -- gadûet umoûliwiajâcy ustawianie okna wzglëdem
  54. innych.
  55.  
  56. WFLG_CLOSEGADGET -- gadûet umoûliwiajâcy zamkniëcie okna. Jeûeli
  57. nie uûyjesz tej flagi, Twojego okna nie bëdzie moûna zamknâê
  58. (aplikacja nie otrzyma wiadomoôci IDCMP_CLOSEWINDOW nawet, gdy
  59. zaûâdasz, aby jâ przysyîano!).
  60.  
  61. WFLG_SIZEBRIGHT -- okno bëdzie miaîo dodatkowâ listwë po prawej
  62. stronie (np. na suwaki).
  63.  
  64. WFLG_SIZEBBOTTOM -- okno bëdzie miaîo dodatkowâ listwë u doîu
  65. (np. na suwaki).
  66.  
  67. WFLG_SMART_REFRESH -- flaga dotyczâca odtwarzania zawartoôci
  68. okna, kiedy zmieniâ sië jego parametry, np. wielkoôê. Tym razem
  69. zadba o to system.
  70.  
  71. WFLG_SIMPLE_REFRESH -- jw., ale o odtwarzanie zawartoôci okna
  72. dba aplikacja.
  73.  
  74. WFLG_SUPER_BITMAP -- jw., w tym wypadku system magazynuje
  75. zawartoôê okna (która moûe byê wiëksza niû samo okno) w
  76. specjalnym buforze, dziëki czemu odôwieûanie zawartoôci (tak jak
  77. w wypadku WFLG_SMART_REFRESH i WFLG_SIMPLE_REFRESH) jest
  78. wîaôciwie niepotrzebne.
  79.  
  80. Wiëcej o odôwieûaniu okien napisaîem w 12. odcinku cyklu.
  81.  
  82. WFLG_BACKDROP -- okreôla specjalny typ okna. Jest ono otwierane
  83. pod wszystkimi innymi "normalnymi" oknami, ale nad innymi oknami
  84. backdrop. Zwykle ten typ okna okreôla sië jeszcze flagâ
  85. WLFG_BORDERLESS (o tym za chwilë), dziëki temu okno jest
  86. niewidoczne na ekranie. Tym sposobem uzyskuje sië zîudzenie
  87. dziaîania pustego ekranu tak jak okna -- wszak ekrany nie
  88. otrzymujâ wiadomoôci IDCMP... Okno o tych samych rozmiarach co
  89. ekran, bez nazwy i otworzone z flagami
  90. WFLG_BORDERLESS+WFLG_BACKDROP pozwala na zrealizowanie podobnych
  91. rozwiâzaï interfejsu uûytkownika, jak np. w PowerPackerze czy
  92. programach malarskich. Jedynym gadûetem systemowym w tej
  93. sytuacji, którego moûna uûyê, jest gadûet zamkniëcia okna (gadûet
  94. zmiany wielkoôci jest bez sensu, a zmiany gîëbokoôci zasîoni jego
  95. odpowiednik na ekranie).
  96.  
  97. WFLG_REPORTMOUSE -- aplikacja bëdzie otrzymywaîa wiadomoôci typu
  98. IDCMP_MOUSEMOVE i/lub IDCMP_DELTAMOVE.
  99.  
  100. WFLG_GIMMEZEROZERO -- okreôla poîoûenie poczâtku koordynat okna.
  101. W normalnej sytuacji znajduje sië on w lewym górnym rogu ramki
  102. okna. Uûywajâc GZZ moûna go umieôciê w lewym górnym rogu
  103. wewnëtrznego obszaru okna. Poczâtkujâcy programiôci robiâ bîad,
  104. nie uûywajâc tej techniki do lokalizacji gadûetów, tekstów i
  105. innych elementów graficznych. Gdy uûytkownik zmieni wielkoôci
  106. domyôlnych czcionek, czësto sië zdarza, ûe napis "wychodzi" na
  107. ramkë. (Przy okazji: poîoûenia kursora myszy, zwracane przez
  108. wiadomoôci typu IDCMP_MOUSEMOVE, sâ zawsze relatywne do ramki
  109. okna, niezaleûnie od tego, czy uûyto flagi WFLG_GIMMEZEROZERO. W
  110. strukturze otwartego okna znajdujâ sië dwa pola --- gzzmousex i
  111. gzzmousey, które podajâ poîoûenie kursora w stosunku do rogu
  112. obszaru roboczego.)
  113.  
  114. WFLG_BORDERLESS -- okno nie bëdzie miaîo obwódki. Jeûeli chcesz,
  115. ûeby okno nie byîo w ogóle widoczne, nie moûesz uûyê flagi
  116. WFLG_DRAGBAR oraz flag umieszczajâcych w jego ramce gadûety.
  117. Pamiëtaj teû, aby tytuî okna byî pusty.
  118.  
  119. WFLG_ACTIVATE -- okno po otworzeniu bëdzie aktywne (normalnie --
  120. nie zostanie uaktywnione).
  121.  
  122. WFLG_RMBTRAP -- po wciôniëciu prawego przycisku myszy menu nie
  123. zostanie pokazane. Aplikacja powinna sama zadbaê o to, aby dostëp
  124. do menu zostaî zapewniony (np. Deluxe Paint).
  125.  
  126. WFLG_NOCAREREFRESH -- programistë nie obchodzi odôwieûanie okna
  127. (aplikacja nie otrzyma wiadomoôci IDCMP_REFRESHWINDOW).
  128.  
  129. Istniejâ jeszcze inne flagi, ale przeznaczone sâ one dla
  130. zaawansowanych programistów.
  131.  
  132. <sr>Resztki
  133.  
  134. <txt>Pozostaîo jeszcze kilka wbudowanych w Amiga E rozkazów, które
  135. trzeba omówiê. Pierwszy z nich to:
  136.  
  137. <l>CloseW(windowptr)
  138.  
  139. <txt>gdzie windowptr to wskaúnik struktury okna, zwracany przez
  140. OpenW(), oraz systemowe funkcje zajmujâce sië otwieraniem okien.
  141. Jedynâ róûnicâ miëdzy tym rozkazem a systemowâ funkcjâ
  142. CloseWindow() jest fakt, ûe tutaj moûna podaê NIL jako argument
  143. (podajâc NIL, czyli zero do CloseWindow() moûna sië od razu
  144. przygotowaê na wizytë naszego czerwonego migajâcego przyjaciela).
  145. Jest to uîatwienie dla programisty, gdyû nie musi on sprawdzaê,
  146. czy okno, które chce zamknâê, w ogóle zostaîo otworzone. Ot,
  147. kilkanaôcie bajtów mniej w kodzie úródîowym... Przy okazji
  148. CloseW() ustawia standardowe wartoôci wewnëtrznej zmiennej
  149. stdrast, uûywanej przez E do wskazania uûywanego rastportu.
  150.  
  151. <l>kod:=Mouse()
  152.  
  153. <txt>Instrukcja ta jest przydatna, gdy nie chcemy bawiê sië w
  154. wiadomoôci IDCMP, a programista ma chëê sprawdziê, czy i który
  155. klawisz myszki zostaî wciôniëty. Funkcja ta zwraca wartoôê 1, gdy
  156. wciôniëto LMB, 2, gdy wciôniëto RMB i 3, gdy wciôniëto oba. 0
  157. zwracane jest wtedy, gdy uûytkownik nie wcisnâî ûadnego klawisza
  158. myszki. Warto zauwaûyê, ûe Mouse() nie pozwala na sprawdzenie
  159. stanu trzeciego klawisza myszki, jeûeli taki akurat mamy.
  160.  
  161. Przy okazji pewna uwaga. Otóû Mouse() nie korzysta z
  162. intuition.library, ale siëga (jako jedyna w Amiga E) bezpoôrednio
  163. do rejestrów sprzëtowych Amigi. Otóû uûywanie tej funkcji nie
  164. jest mile widziane w aplikacjach otwierajâcych wîasne GUI! Jeûeli
  165. tak rozwiâûesz kwestië rozpoznawania stanu klawiszy myszy, Twoja
  166. aplikacja bëdzie reagowaê na klikniëcia, majâce miejsce w innych
  167. programach! Ogólnie mówiâc, nie uûywaj tej funkcji, gdy Twój
  168. program ma byê przyjazny dla systemu operacyjnego. Moûesz za to
  169. skorzystaê z nastëpujâcej funkcji i rozkazu:
  170.  
  171. <l>stan:=LeftMouse(windowptr)
  172.  
  173. WaitLeftMouse(windowptr)
  174.  
  175. <txt>które nie uûywajâ rejestrów sprzëtowych, ale systemu
  176. operacyjnego. Pierwsza funkcja zwraca stan wciôniëcia lewego
  177. klawisza myszki (0 -- nie wciôniëty, 1 -- wciôniëty), druga
  178. natomiast czeka, aû uûytkownik go naciônie. Obie wymagajâ podania
  179. jako argumentu wskaúnika do struktury okna. Wartoôê ta zwracana
  180. jest przez wewnëtrzny rozkaz OpenW(), jak i systemowe funkcje
  181. otwierania okna.
  182.  
  183. Nastëpne dwie funkcje:
  184.  
  185. <l>x:=MouseX(windowptr)
  186.  
  187. y:=MouseY(windowptr)
  188.  
  189. <txt>Zwracajâ poîoûenie kursora myszy w stosunku do lewego
  190. górnego rogu okna, do kórego struktury przekazywany jest wskaúnik
  191. jako argument.
  192.  
  193. Jednâ z bardzo przydatnych funkcji E jest:
  194.  
  195. <l>klasa:=WaitIMessage(windowptr)
  196.  
  197. <txt>która przekazuje aplikacji klasë wiadomoôci IDCMP, jaka
  198. pojawiîa sië dla okna. Dziëki temu moûna zdecydowanie uproôciê
  199. aplikacjë, dla której waûne sâ wiadomoôci bezargumentowe (np.
  200. IDCMP_CLOSEWINDOW). Jak zwykle w takich sytuacjach argumentem
  201. funkcji jest wskaúnik do struktury okna, które chcemy
  202. "podsîuchiwaê". Aby dokîadniej wyjaôniê, co WaitIMessage() robi,
  203. przytoczë kawaîek kodu, który odpowiada wywoîaniu tej funkcji:
  204.  
  205. <l>PROC waitimessage(windowptr:PTR TO window)
  206.  
  207.     DEF port,mes:PTR TO intuimessage,class,code,qual,iaddr
  208.  
  209.     port:=windowptr.userport
  210.  
  211.     IF (mes:=GetMsg(port))=NIL
  212.  
  213.         REPEAT
  214.  
  215.             WaitPort(port)
  216.  
  217.         UNTIL (mes:=GetMsg(port))<>NIL
  218.  
  219.     ENDIF
  220.  
  221.     class:=mes.class
  222.  
  223.     code:=mes.code
  224.  
  225.     qual:=mes.qualifier
  226.  
  227.     iaddr:=mes.iaddress
  228.  
  229.     ReplyMsg(mes)
  230.  
  231. ENDPROC class
  232.  
  233. <txt>Jak widaê, funkcja zwraca klasë ostatniej wiadomoôci, jaka
  234. pojawiîa sië w messageporcie okna.
  235.  
  236. Uzupeîniajâce funkcje to:
  237.  
  238. <l>kod:=MsgCode()
  239.  
  240. kwal:=MsgQualifier()
  241.  
  242. iaddr:=MsgIaddr()
  243.  
  244. <txt>zwracajâce odpowiednie pola wiadomoôci, którâ rozpoznaîa
  245. funkcja WaitIMessage().
  246.  
  247. <sr>*
  248.  
  249. <txt>To by byîo tyle. Przez ponak rok nauczaîem Was, jak
  250. programowaê w E, korzystajâc z systemu operacyjnego Amigi.
  251. Pamiëtaj, NIGDY nie posîuguj sië wartoôciami bezpoôrednimi (np.
  252. $00F5). Gdy coô przekazujesz funkcjom systemowym, uûywaj zawsze
  253. staîych zdefiniowanych w moduîach. Ta maniera odda Ci
  254. nieoczekiwane przysîugi, gdy bëdziesz sië staraî odpluskwiê swój
  255. program lub powrócisz do niego po kilkumiesiëcznej przerwie.
  256.  
  257. Nauka programowania w systemie Amigi to bardzo mocna podstawa,
  258. którâ moûesz wykorzystaê w przyszîoôci. Idea architektury
  259. klient-serwer (klientem jest aplikacja, serwerem -- system
  260. operacyjny, wzajemnie przekazujâ sobie róûne informacje w postaci
  261. wiadomoôci itp.) jest bardzo podobna dla wszystkich nowoczesnych
  262. platform komputerowych -- Windows (brrr...), Windows NT, OS/2,
  263. Unix... Oczywiôcie, to nie to samo, ale to, czego nauczyîeô sië
  264. na Amidze, pozwoli Ci swobodnie napisaê program np. pod OS-a lub
  265. przenieôê na niego aplikacjë amigowskâ.
  266.  
  267. Pominâîem w kursie programowanie obiektowe. Gîównie ze wzglëdu na
  268. to, ûe jest ono na poczâtku trudne do zrozumienia. Zresztâ, o
  269. zawiîoôci tej techniki niech ôwiadczy fakt, ûe wydana przez nasze
  270. Wydawnictwo ksiâûka o programowaniu obiektowym w C++ liczy niemal
  271. 600 stron! A to tylko wprowadzenie...
  272.  
  273. Amiga E jest wspaniaîym jëzykiem dla poczâtkujâcych, ale takûe
  274. zaawansowani programiôci znajdâ tu coô dla siebie. Nie wspomniaîem w
  275. tym cyklu ani sîowem o komórkach, strukturze danych, znanej z
  276. jëzyka LISP. Pominâîem teû milczeniem fakt, ûe E obsîuguje format
  277. zmiennoprzecinkowy. Nie byîo teû sîowa o najnowszej modzie -- GUI
  278. adaptujâcym sië do ustawieï uûytkownika, a taki mechanizm jest
  279. dostëpny w pakiecie EasyGUI, który jest skîadnikiem pakietu Amiga
  280. E. Wszystko to zostawiam na deser, a raczej podwieczorek, gdyû
  281. tak naprawdë na deser zarezerwowaîem sobie omówienie najnowszej,
  282. w chwili obecnej, wersji.
  283.  
  284. <sr>Amiga E 3.2a
  285.  
  286. <txt>Nowoôci w tej wersji to:
  287.  
  288. ^* moûliwoôê tworzenia bibliotek (.library),
  289.  
  290. ^* nowe moûliwoôci debuggera EDBG,
  291.  
  292. ^* nowe moûliwoôci pakietu EasyGUI,
  293.  
  294. ^* ochrona skompilowanego programu przed zawieszeniem sië z
  295. powodu korzystania z nie zainicjowanych danych (takich, których
  296. wartoôciâ jest NIL, czyli 0; wszystkie odwoîania przez "." oraz
  297. przez "[]" mogâ byê sprawdzane przed uûyciem),
  298.  
  299. ^* moduîy do Kickstartu w wersji 40,
  300.  
  301. ^* nowe moduîy E -- Src, Class, ScrollWin, etc.,
  302.  
  303. ^* zaktualizowana dokumentacja, tym razem wszystko w formie
  304. AmigaGuide,
  305.  
  306. ^* przykîady z ksiâûki Rom Kernel Manual: Libraries przepisane na
  307. Amiga E (sic!).
  308.  
  309. Poniûej przedstawiam metryczkë Amiga E:
  310.  
  311. <r>
  312. wersja    data    wielkoôê kompilatora (KB)
  313. v0.3    wrzesieï 91    5
  314. v1.0    maj 92    20
  315. v2.0    paúdziernik 92    38
  316. v2.1a    styczeï 93    44
  317. v2.1b    kwiecieï 93    45
  318. v3.0a    lipiec 94    82
  319. v3.0b    wrzesieï 94    82
  320. v3.0e    listopad 94    83
  321. v3.1a    grudzieï 94    85
  322. v3.2a    lipiec 95    85
  323.  
  324.