[#1] GadTools problem....
Ostatnimi czasy nie mogć nic wysłać na amiga-dev.pl ... wićc spróbujć tutaj:

Procedura generująca gadgety (fragment):
GetLoc() - obsługa tekstów poprzez locale.library...
rozX, rozY - obliczenie wielkości gadgetu....(skalowanie)
pozX, pozY - obliczenie położenia gadgetu...

*******************  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():


dodaje gadget 10536afc na pozycje 24
ToGadget->NextGadget=10536afc
LastGadget z poz.10563d7c >>> na pozycje: 10536afc [dodano 3 gadgetow]

>[20] >> liczgad(): 10563d7c
>[21] >> liczgad(): 1053fa34 < >[22] >> liczgad(): 10541ab4 < >[23] >> liczgad(): 10536afc << to jest z CreateGadget
aktualnie jest 24 gadgetów
Czyli przy odłaczaniu mam mu podać 0x1053fa34 a nie 10536afc...bo inaczej
odłączony zostaje tylko 10536afc...

I ostatnia sprawa. Jak to jest z CreateContext()? Ma być tylko jedno czy też
dla każdego AddGadget() powinno być oddzielne? Gdy tylko
dałem CreateContext() oddzielne dla każdego dodawanego zestawu gadgetów to
program zachowywał sić zgodnie z przewidywaniami...
(w dokumentacji nie znalazłem ani słowa na temat dopuszczalnej ilości
CreateContext (NDK3.9))

Sorki za długość... ale ktoś tu sie swego czasu domagał źródł ;))

[#2] Re: GadTools problem....

@MaaG^dA, post #1

Na początek dobra rada: odpuść sobie GadTools, jeżeli chcesz dodawać/usuwać gadżety wybiórczo. To po prostu ma szans działać dobrze. Właśnie dlatego, że jeden gadżet GadTools nie równa się jednemu gadżetowi Intuition. Ja już kiedyś to ćwiczyłem i skończyłem pisząc sobie własne gadżety w BOOPSI, nad którymi w pełni da się panować (a skalowanie to już wręcz banalne jest). Inne wyjście to MUI, Reaction, ClassAct, BGUI, Triton czy cokolwiek innego niż Gadtools a bazowane na BOOPSI. Chyba, że chcesz, żeby ten program działał tylko u Ciebie albo w najlepszym razie tylko na jednej konkretnej wersji AmigaOS.

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.

[#3] Re: GadTools problem....

@Jacek Rzeuski, post #2

Wiem, wiem.. rozmawialiśmy już kiedyś o tym. Zainteresowałem sić GT bo było łatwo je opanować. Na początku zupełnie mi wystarczały. A teraz zwyczajnie nie mam czasu aby bawić sić w przepisywanie GUI pod inne biblioteki.. (albo nie mam ochoty ;)..
Problem jednak nie jest w tym, że dynamicznie próbujć modyfikować listć (bo to działa - od os3.1 poprzez os4.0 do mos-a włącznie), tylko w tym, że lista gadgetów nie inicjuje sić prawidłowo...
Gdzieś tu popełniam błąd, ale nie bardzo mogć go namierzyć...

Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem