******************* 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