GADTOOLS.LIBRARY (cz. 2.) Sebastian Koîodziejczyk Na poczâtku zajmijmy sië najprostszym gadûetem -- BUTTON_KIND. Jest on najczëôciej spotykanym gadûetem -- "OK" , "Use", "Save" itp. Wystarczy ustawiê pozycjë, rozmiary i nazwë gadûetu. Dodatkowo za pomocâ tagów moûna ustawiê: GT_Underscore -- symbol, jaki poprzedza podkreôlonâ literë w nazwie gadûtu. Przykîadowo jeûeli w "Cancel" chcemy podkreôliê "C", wtedy w tagu podajemy np. '_' , a w nazwie "_Cancel". Uwaga -- dziaîa od 37. wersji biblioteki. GA_Disabled -- jeûeli podamy TRUE (wartoôê róûnâ od 0), gadûet zostanie wyîâczony -- zostanie pokryty "siateczkâ" i nie bëdzie moûna go wybraê. Domyôlnie FALSE. GA_Immediate -- jeûeli podamy TRUE, bëdziemy otrzymywaê message, gdy tylko gadget zostanie naciôniëty. Domyôlnie FALSE. Uwaga -- dziaîa od wersji 39.! Przy odbieraniu message'ów z okna, w którym sâ gadûety gadtools, funkcje GetMsg i ReplyMsg naleûy zastâpiê funkcjami GetIMsg i ReplyIMsg (skîadnia taka sama, zmieniono tylko typy parametrów -- zamiast p_Message -- od razu p_IntuiMessage). W wypadku BUTTON_KIND otrzymujemy tylko IDCMP_GAGDETUP (dla systemu 1.3 GADGETUP) oraz, od wersji 39., gdy zostanie ustawiony tag GA_Immediate, IDCMP_GADGETDOWN (GADGETDOWN). Naleûy pamiëtaê jeszcze o paru rzeczach: -- Do ustalonych przez nas flag IDCMP naleûy dodaê (or) xxxIDCMP, gdzie xxx jest typem gadûetu jakiego uûywamy, np. BUTTONIDCMP, LISTVIEWIDCMP, MXIDCMP. -- Po utworzeniu gadûetów i otwarciu okna naleûy wywoîaê procedurë GT_RefreshWindow. Format instrukcji: GT_RefreshWindow (window, requester); p_Window p_Requester a0 a1 window -- struktura window okna zawierajâcego gadûety gadtools. requester -- na razie nie uûywany. Zawsze Nil! Jeûeli najpierw otwieramy okno, potem dodajâc gadûety za pomocâ AddGList, naleûy wywoîaê RefreshGList (z intuition.library), a póúniej GT_RefreshWindow. To tyle w tym odcinku. Za miesiâc przedstawië m.in. listing w Kick Pascalu przedstawiajâcy przykîad uûycia biblioteki gadtools.library. Przejdúmy teraz do programu przykîadowego (listing 1). * listing1 * Jeûeli w funkcji Creategadget argument poprzedni_gadget = Nil, wtedy funkcja ta nie utworzy gadûetu -- zwróci Nil. Bezpiecznie moûemy równieû podaê Nil dla funkcji FreeVisualInfo -- funkcja po prostu nie zadziaîa, a nie np. zawiesi komputer. To samo odnosi sië do p_Screen w GetVisualInfo. Wîaôciwoôê ta przydaje sië, jeûeli nie chcemy co chwilë sprawdzaê, czy nie wystâpiî bîâd. We wskaúnik do taglistu prawie zawsze moûemy wstawiê Nil -- funkcja zadziaîa! Informujemy jâ tylko, ûe nie mamy zamiaru niczego ustalaê tagami. Oczywiôcie nie dotyczy to przypadków, w których wymagane jest przekazanie jakichô danych tagami. Do zmiany danych gadûetu (dotyczy danych ustawianych przez tagi) np. wîâczenia gadûetu sîuûy procedura GT_SetgadgetAttrs: GT_SetgadgetAttrs (gadget, Okno, Requster, TagList); p_gadget p_window p_requester p_taglist a0 a1 a2 a3 Gadget -- gadûet, którego dane majâ byê modyfikowane. Okno -- struktura Window okna, w którym gadûet sië znajduje. Od wersji 39. moûe byê to Nil -- gadûet nie zostanie odôwieûony. Requester -- zawsze Nil. TagList -- taglist z nowymi danymi do gadûetu. Dla BUTTON_KIND moûliwy jest tylko jeden tag -- GA_Disabled. Do pobrania informacji o gadûecie sîuûy funkcja GT_GetgadgetAttrs (istnieje od wersji 39.): Iloôê:= GT_GetgadgetAttrs (gadget, Okno, Requster, TagList); long p_gadget p_window p_requester p_taglist d0 a0 a1 a2 a3 Gadget -- gadûet, z którego dane majâ byê pobrane. Okno -- struktura Window okna, w którym gadûet sië znajduje. Od wersji 39. moûe byê to Nil -- gadûet nie zostanie odôwieûony. Requester -- zawsze Nil. TagList -- Taglist, w którym w pola ti_tag wstawiamy tagi identyfikujâce dane, które chcemy pobraê, a ti_data wpisujemy WSKAÚNIKI do zmiennych (typu LONG), w które zostanie wpisana odpowiednia dana. Iloôê -- liczba zmiennych z taglistu, w które wpisano dane. Dla BUTTON_KIND moûliwy jest tylko jeden tag -- GA_Disabled. W wyniku wywoîania GT_GetgadgetAttrs funkcji z tym tagiem, zmienna wskazywana przez ti_data przybierze wartoôê TRUE, jeûeli gadûet jest wyîâczony, w przeciwnym wypadku FALSE. Uwaga! Stosujâc të funkcjë uniemoûliwiamy korzystanie z programu uûytkownikom posiadajâcym bibliotekë w wersji niûszej niû 39. (system 3.0). Zajmijmy sië teraz nastëpnymi typami gadgetów: -- CHECKBOX_KIND gadûet ten sîuûy do zaîâczania opcji, wykorzystany np. w prefs/screenmode wîâczanie/wyîâczanie autoscroll. Do 39. wersji biblioteki musimy uûywaê ustalonych rozmiarów -- CHECKBOX_WIDTH i CHECKBOX_HEIGHT. Od tego gadûetu otrzymujemy message IDCMP_gadgETUP z polem code równym 0 lub 1, w zaleûnoôci od aktualnego stanu. Dla tego typu gadûetu dostëpne sâ nastëpujâce tagi (dla funkcji Creategadget): GT_Underscore -- tak jak w BUTTON_KIND. GA_Disabled -- tak jak w BUTTON_KIND. GTCB_Checked -- poczâtkowy stan gadûetu (TRUE lub FALSE). Domyôlnie FALSE. GTCB_Scaled -- od wersji 39 -- jeûeli TRUE i rozmiary gadûetu sâ róûne od standardowych, to gadûet zostanie przeskalowany do podanych rozmiarów. Jeûeli FALSE, to zostanâ przyjëte rozmiary standardowe. Domyôlnie FALSE. Dla funkcji GT_GetgadgetAttrs i GT_SetgadgetAttrs dostëpne sâ tagi: GA_Disabled i GTCB_Checked. -- INTEGER_KIND Normalny gadûet typu integer (sîuûâcy do wpisywania liczby). Zawartoôê gadûetu odczytujemy z pola LongInt struktury StringInfo. Z kolei wskaúnik do niej otrzymujemy z pola SpecialInfo struktury gadget. Ponadto zawartoôê gadûetu moûna otrzymaê za pomocâ funkcji GT_GetgadgetAttrs, podajâc tag GTIN_Number. Od INTEGER_KIND otrzymujemy message IDCMP_GADGETUP i jeûeli podany zostaî tag GA_Immediate z polem ti_Data róûnym od 0 -- IDCMP_GADGETDOWN. Dostëpne tagi dla Creategadget: GT_Underscore -- tak jak w BUTTON_KIND. GA_Disabled -- tak jak w BUTTON_KIND. GA_Immediate -- tak jak w BUTTON_KIND. GA_TabCycle -- jeûeli TRUE, to naciôniëcie [Tab] spowoduje przejôcie do nastëpnego gadûetu typu INTEGER lub STRING. Domyôlnie TRUE! Tag istnieje od wersji 37. Po naciôniëciu [Tab] otrzymujemy message IDCMP_GADGETUP i ewentualnie od nastëpnego gadûetu IDCMP_GADGETDOWN. GTIN_Number -- zawartoôê gadûetu. Domyôlnie 0. GTIN_MaxChars -- maksymalna liczba znaków w gadûecie. Domyôlnie 10. STRINGA_ExitHelp -- jeûeli TRUE, to klawisz HELP spowoduje wyjôcie z gadûetu. Program otrzyma message IDCMP_GADGETUP z polem code równym $5f. Standardowo FALSE. Tag istnieje od wersji 37. STRINGA_Justyfication -- decyduje, czy liczba w gadûecie bëdzie dosuniëta do lewej strony (STRINGLEFT), prawej (STRINGRIGHT) czy centrowana (STRINGCENTER). Domyôlnie dosuniëta do lewej strony. Tag istnieje od wersji 37. STRINGA_ReplaceMode -- jeûeli TRUE, to w gadûecie wîâczony jest tryb replace (nowe znaki sâ napisywane na stare). Domyôlnie tryb insert. Tag istnieje od wersji 37. Dla funkcji GT_GetgadgetAttrs i GT_SetgadgetAttrs dostëpne sâ tagi: GA_Disabled i GTIN_Number. -- LISTVIEW_KIND gadûet ten sîuûy do wyôwietlania elementów listy, tak jak np. w prefs/printer wybór typu drukarki (drivera). Powoduje wysyîanie messagu IDCMP_GADGETUP, w polu code znajduje sië numer aktualnie wybranego wëzîa. Numer wybranego wëzîa moûna takûe otrzymaê za pomocâ GT_GetgadgetAttrs, z tagiem GTLV_Selected. Lista (wëzîy) nie moûe byê zmieniana w czasie wyôwietlania w gadûecie. Jeûeli chcemy usunâê lub dodaê jekieô wëzîy, musimy wywoîaê procedurë GT_SetgadgetAttrs z tagiem GTLV_Labels, w którym ti_Data bëdzie równe Nil. Od tej chwili lista przestanie byê wyôwietlana w gadûecie i moûna wprowadzaê zmiany, po czym ponownie wywoîaê GT_SetgadgetAttrs z GTLV_Labels, zawierajâcym wskaúnik poprzednio wyôwietlanej listy. Z powodu tego ograniczenia nie moûna wyôwietlaê ûadnych list, które mogâ byê zmienione przez inne programy, w tym, niestety, list systemowych, np. listy bibliotek. Dostëpne tagi dla Creategadget: GT_Underscore -- tak jak w BUTTON_KIND. GA_Disabled -- tak jak w BUTTON_KIND. Dla tego typu gadûetu tag moûna stosowaê od wersji 39. GTLV_Top -- pierwszy widoczny element listy. Domyôlnie 0. GTLV_MakeVisible -- numer wëzîa, który ma byê widoczny w obszarze gadûetu. Uwaga! Moûna uûyê tylko jednego z GTLV_Top i GTLV_MakeVisible. Tag istnieje od wersji 39. GTLV_Labels -- struktura list, której nazwy wëzîów bëdâ wyôwietlane w gadûecie. Domyôlnie Nil. GTLV_ReadOnly -- jeûeli TRUE, to lista jest tylko do odczytu. Domyôlnie FALSE. GTLV_ScrollWidth -- szerokoôê suwaka przy gadûecie. Domyôlnie 16. GTLV_ShowSelected -- gadûet STRING_KIND utworzony wczeôniej za pomocâ gadtools, w którym bëdzie wyôwietlony aktualnie wybrany wëzeî (z moûliwoôciâ edycji). Jeûeli Nil, to wybrany wëzeî bëdzie podôwietlony lub wyôwietlony na dole gadûetu (w zaleûnoôci od wersji gadtools). W przypadku niepodania tego tagu aktualnie wybrany wëzeî nie bëdzie zaznaczony. GTLV_Selected -- numer aktualnie wybranego wëzîa lub -1, jeûeli ûaden. Domyôlnie -1. LAYOUTA_Spacing -- przestrzeï miëdzy liniami. Domyôlnie 0. Dla funkcji GT_GetgadgetAttrs dostëpne sâ tagi: GA_Disabled, GTLV_Top, GTLV_Labels i GTLV_Selected. Dla funkcji GT_SetGagdetAttrs ponadto GTLV_MakeVisible. -- MX_KIND "Guziki radiowe", jak np. w prefs/serial wybór typu potwierdzenia. Podajemy mu tablicë (zakoïczonâ Nil), zawierajâcâ wskaúniki tekstów, które pojawiâ sië przy guzikach. Podobnie jak w CHECKBOX_KIND wymiary pojedynczego elementu sâ ustalone -- MXWIDTH i MXHEIGHT. Zmieniê je moûna od versji 39. Otrzymujemy message IDCMP_GADGETDOWN, w polu code numer wybranego "guzika". Dostëpne tagi dla Creategadget: GT_Underscore -- tak jak w BUTTON_KIND. GA_Disabled -- tak jak w BUTTON_KIND. Dla tego typu gadûetu tag moûna stosowaê od wersji 39. GTMX_Lables -- wskaúnik do tablicy (zakoïczonej zerem) zawierajâcej wskaúniki do napisów przy kaûdym "guziku", np. type MXChoices:array [1..4] of STR; var Labels:MXChoices; begin { ..... } Labels:=MXChoices('2 kolory','4 kolory','8 kolorów',Nil); { ..... } end. Tag ten jest konieczny, by gadget mógî powstaê. GTMX_Active -- aktywny "guzik". Domyôlnie 0 -- pierwszy. GTMX_Spacing -- odstëp pomiedzy "guzikami". Domyôlnie 1. GTMX_Scaled -- tag ten istnieje od wersji 39. jeûeli TRUE, to "guziki" zostanâ przeskalowane, by dopasowaê sië do rozmiarów gadûetu. GTMX_Titleplace -- jedna z flag z Newgadget.gng_Flags. Jeûeli ûadna nie zostanie ustawiona, nazwa gadûetu sië nie pojawi. Tag ten istnieje od wersji 39. Dla funkcji GT_GetgadgetAttrs i GT_SetgadgetAttrs dostëpne sâ tagi: GA_Disabled, GTMX_Active. -- NUMBER_KIND Sîuûy do wyôwietlania liczby (bez moûliwoôci wpisania), np. w prefs/printergfx liczba kolorów. Chociaû podobny efekt moûna uzyskaê nie stosujâc tego gadûetu, to jednak jego uûycie zaoszczëdza wielu problemów z RawDoFmt i PrintIntuiText. Liczbë wyôwietlanâ w gadûecie zmieniamy za pomocâ GT_SetgadgetAttrs z tagiem GTNM_Number. NUMBER_KIND nie powoduje wysîania ûadnych message'ów.