******************* GenerujGadgety(): ************************ [ fragment ] /*** Gadgety stale ***/ /* Typ ukladu */ GadData.ng_LeftEdge=pozX(13); GadData.ng_TopEdge=pozY(0); GadData.ng_Width=rozX(14); GadData.ng_Height=rozY(1)-2; GadData.ng_GadgetText=GetLoc(GAD_Type); GadData.ng_Flags=PLACETEXT_LEFT; GadData.ng_GadgetID=ID_Null; Gadgety=CreateContext(&GadBaseL); Gadgety=CreateGadget(TEXT_KIND,Gadgety,&GadData, GTTX_Text,aktualny.NAZWA, GTTX_Clipped,TRUE, GTTX_Justification,GTJ_CENTER, GTTX_Border,TRUE, TAG_END); Gad[gad].wsk=GadBaseL; /* Firmware */ GadData.ng_LeftEdge=pozX(41); GadData.ng_TopEdge=pozY(5); GadData.ng_GadgetText=GetLoc(GAD_Firmware); GadData.ng_Width=rozX(7); GadData.ng_GadgetID=ID_Null; Gadgety=CreateGadget(TEXT_KIND,Gadgety,&GadData, GTTX_Text,wersja_firm, GTTX_Clipped,TRUE, GTTX_Justification,GTJ_CENTER, GTTX_Border,TRUE, TAG_END); [.... tutaj kolejne gadgety do listy...] GadData.ng_TopEdge=pozY(11); GadData.ng_GadgetText=GetLoc(GAD_ICSign); GadData.ng_GadgetID=ID_Syg; Gadgety=CreateGadget(BUTTON_KIND,Gadgety,&GadData,TAG_END); printf("CreateContex: %xn",GadBaseL); printf("Typ,Firmware,przyciski:n"); GadAddLicz(gad, Gadgety); /* statyczne opisy opcji */ print(&GadOpis[0]);/*zabezpiecznie*/ /*** Gadgety dynamiczne ***/ /* przycisk "Ustawienia" */ GadData.ng_LeftEdge=pozX(2); GadData.ng_TopEdge=pozY(12); GadData.ng_Width=rozX(16); GadData.ng_GadgetText=GetLoc(GAD_ICSet); GadData.ng_Flags=PLACETEXT_IN; GadData.ng_GadgetID=ID_Ustaw; Gadgety=CreateGadget(BUTTON_KIND,Gadgety,&GadData, TAG_END); Gad[ustaw].wsk=Gadgety; printf("Ustawienia:n"); GadAddLicz(ustaw,Gadgety); [tutaj kolejne sekwencje CreateGadget() + GadAddLicz()] **************** koniec fragmentu GenerujGadgety ********************* void GadAddLicz(enum selGad poz, struct Gadget *ToGadget)//oblicza z ilu struktur sklada sie gadget { static struct Gadget *LastGadget=NULL; struct Gadget *MyGad; UWORD i,GadPoz; printf("nGadAddLicz():n"); if (!LastGadget) /* policz istniejace juz gadgety */ { printf("GadAddLicz::Initn"); LastGadget=OknoG->FirstGadget; printf("GadOkno->First: %x ",LastGadget); while (LastGadget->NextGadget) { LastGadget=LastGadget->NextGadget; }; printf("... ===> %xn",LastGadget); }; printf("ndodaje gadget %x na pozycje %un", Gad[poz].wsk, GadPoz=AddGList(OknoG,Gad[poz].wsk,(UWORD)~0,(UWORD)~0,NULL)); /* dodaj gadgety do okna */ Gad[poz].status=TRUE; //sygnalizacja dodania gadgetu do okna Gad[poz].wskG=LastGadget->NextGadget; //adres pierwszego dodanego gadgetu printf("ToGadget->NextGadget=%xn",ToGadget->NextGadget); ToGadget->NextGadget=NULL; // ** kolejne udziwnienie => po AddGadget pole to zawiera wskaźnik na ostatni element dodawanej listy(!) Gad[poz].ile=0; printf("LastGadget z poz.%x ",LastGadget); MyGad=LastGadget->NextGadget; //Gad[poz].wsk; do { Gad[poz].ile++; LastGadget=MyGad; MyGad=LastGadget->NextGadget; } while(MyGad); printf(" >>> na pozycje: %x ",LastGadget); printf("[dodano %d gadgetow]n",Gad[poz].ile); LiczGad(); //wyswietlenie aktualnych gadgetow okna } ************ koniec programu ******************** i teraz fragment logu: ******* poczatek ********* CreateContex: 10532cc4 Typ,Firmware,przyciski: GadAddLicz(): GadAddLicz::Init GadOkno->First: 10454744 ... ===> 10457524 dodaje gadget 10532cc4 na pozycje 3 ToGadget->NextGadget=0 LastGadget z poz.10457524 >>> na pozycje: 1053404c [dodano 9 gadgetow] >[0] >> liczgad(): 10454744 >[1] >> liczgad(): 104574ac >[2] >> liczgad(): 10457524 >[3] >> liczgad(): 10532cc4 >[4] >> liczgad(): 10532d64 >[5] >> liczgad(): 10532dec >[6] >> liczgad(): 10532e74 >[7] >> liczgad(): 10532edc >[8] >> liczgad(): 10532f44 >[9] >> liczgad(): 10532fac >[10] >> liczgad(): 10533014 >[11] >> liczgad(): 1053404c aktualnie jest 12 gadgetów Ustawienia: GadAddLicz(): dodaje gadget 105340b4 na pozycje 13 ToGadget->NextGadget=105340b4 LastGadget z poz.1053404c >>> na pozycje: 105340b4 [dodano 1 gadgetow] >[0] >> liczgad(): 10454744 >[1] >> liczgad(): 104574ac >[2] >> liczgad(): 10457524 >[3] >> liczgad(): 10532cc4 >[4] >> liczgad(): 10532d64 >[5] >> liczgad(): 10532dec >[6] >> liczgad(): 10532e74 >[7] >> liczgad(): 10532edc >[8] >> liczgad(): 10532f44 >[9] >> liczgad(): 10532fac >[10] >> liczgad(): 10533014 >[11] >> liczgad(): 1053404c >[12] >> liczgad(): 105340b4 aktualnie jest 13 gadgetów **************** koniec ********************** i tutaj moje pytania: 1. Dlaczego gadget "Ustawienia" jest zwracany jako dodany na pozycjć 13 kiedy w rzeczywistości jest dodawany na pozycjć 12? 2. W przypadku MX_KIND jeszcze inaczej: CreateGadget() zwraca adres gadgetu, a po dodaniu do listy (AddGadget()) okazuje sić, że przed tym gadgetem pojawią sić dodatkowe (domyślam sić, że to gadgety intution generowane przez bibliotekć GadTools). Tyle tylko, ze jeżeli usuwam taki gadget podajć mu adres zwrócony przez CreateGadget() czyli nie bćdą odłączony od okna "cały" Gadget... (przykład): [ciach] >[20] >> liczgad(): 10563d7c aktualnie jest 21 gadgetów Zabezpiecz[1]: GadAddLicz():
@MaaG^dA, post #1
CreateContext musi być jedno i tylko jedno a to wynika właśnie z tego, że gadżetami GadTools się nie manipuluje (poczytaj rozdział o GadTools w RKRM Libraries). CreateContext tworzy prywatne struktury danych właśnie do zarządzania gadżetami GT i tam trzyma informacje ile gadżetów Intuition tworzy jeden gadżet GT, jaka jest ich pozycja w liście gadżetów okna, itp.
@Jacek Rzeuski, post #2