[#1] Problem z Button(gadget) w systemach OS 1.3/3.0/ i innych
Opisze dokładniej zjawisko bo samemu nie rozwikłam tej zagadki.

Chodzi o umieszczenie w oknie kilku przycisków w moim przykładzie czterech.
Przyciski te stanowią grupę wyboru. Jeden jest zawsze podświeltony (wybrany) kiedy
klikamy na inny on staje się (wybrany) podświetlony a pozostałe powinny powrócić
do stanu nieaktywnego.Powinny... ale to co dzieje się z umieszczonym w przycisku napisem
zaskoczy chyba każdego wytrawnego Amigowca.W chwili odswieżenia listy gadget'ów zmieniają
się kolory tekstu albo jego tła lub nawet ramki przycisku.


Program działa prawidłowo,więc czemu to niewłaściwe odświeżanie????




Efekt jest taki sam pod systemami OS 1.3/OS 3.0/OS 3.1 innych nie sprawdzałem....

Zmiany stanu aktywności przycisków dokonuje poprzez modyfikację flagi GADG_SELECTED w
strukturze (Gadget) danego przycisku a potem odświeżam listę gadget'ów okna aby doszło
do aktualizacji ich wyglądu.


Testowy kod wygląda tak:


;-------------------------------------------------------------------
;Program testowy gadgety button jako opcje podswietlane po wybraniu.
;(1).Otwieramy okno i wstawiamy na nim cztery przyciski.
;(2).Przyciski funkcjonują w trybie (TOGGLESELECT) przełącznika.
;(3).Chcemy aby aktywowanie jednego przycisku gasiło pozostałe?

;Testy: Niewłaściwe odswieżanie dezaktywowanych przycisków.


;CPU: MC68000
;Assembler: DevPac v3.02
;Platforma: Amiga 500 Os 1.3 Kickstart (v34)


Exec: equ 4
OldOpenLibrary: equ -408
CloseLibrary: equ -414
OpenWindow: equ -204
CloseWindow: equ -72
WaitPort: equ -384
GetMsg: equ -372
ReplyMsg: equ -378
RefreshGadgets: equ -222


;Pola bitowe zmiennej (Type) struktury (NewWindow)

WBENCHSCREEN: EQU $0001 ;Wyswietl okno na Workbench'u

;Pola bitowe zmiennej (Flags) struktury (NewWindow)

WINDOWDRAG: EQU $0002 ;Belka do przemieszczania okna.
WINDOWDEPTH: EQU $0004 ;Gadgety do przeslaniania okien.
WINDOWCLOSE: EQU $0008 ;Gadget do zamykania okna.
ACTIVATE: EQU $1000 ;Wyswietlone jako aktywne.

;Pola bitowe zmiennej (IDCMP_Flags) struktury (NewWindow)

GADGETUP: EQU $0040 ;Wciśnięto i puszczono przycisk myszy.
CLOSEWINDOW: EQU $0200 ;Dostaniemy komunikat z gadgetu zamykania.

;Flags bit status for Gadget struct.

GADGHCOMP: EQU $0000
GADGHBOX: EQU $0001 ;Po wcisnieciu gadgetu rysuje na okolo niego ramke.
GADG_DISABLED: EQU $0100
GADG_SELECTED: EQU $0080 ;Aktywny odrazu

;Activation bit status for Gadget struct.

RELVERIFY: EQU $0001 ;Sygnalizuj oknu puszczenie lewego przycisku myszy.
GADGIMMEDIATE: EQU $0002 ;Sygnalizuj oknu wcisniecie lewego przycisku myszy.
TOGGLESELECT: EQU $0100 ;Gadget przelacznik typu CheckBox

;Gadget Type bits status for Gadget struct.

BOOLGADGET: EQU $1 ;przycisk


Start: move.l Exec.w,a6
lea IntName(pc),a1
jsr OldOpenLibrary(a6)
tst.l d0
beq Error_0
move.l d0,IntBase
;-----------------------
move.l IntBase,a6
move.l #NewWindow,a0
jsr OpenWindow(a6)
tst.l d0
beq Error_1
move.l d0,WindowBase
;-----------------------
Wait_Message: move.l WindowBase(pc),a0
move.l $56(a0),a0 ;MsgPort czyli UserPort okna.
move.l Exec.w,a6
jsr WaitPort(a6)

move.l WindowBase(pc),a0
move.l $56(a0),a0
move.l Exec.w,a6
jsr GetMsg(a6)
tst.l d0
beq.s Wait_Message

move.l d0,a1
move.l 20(a1),d2 ;do d2 pobieramy rodzaj komunikatu IDCMP
move.l 28(a1),a2 ;do a2 pobieramy adres gadgetu ktory wyslal komunikat.
move.l Exec.w,a6
jsr ReplyMsg(a6)

cmp.l #CLOSEWINDOW,d2
beq.s Koniec
cmp.l #GADGETUP,d2
beq.s Gadget_Click
bra.s Wait_Message

Gadget_Click:

;teraz w rej. a2 mamy adres gadgetu ktory wyslal komunikat "GADGETUP"

clr.l d0
move.w 38(a2),d0

;teraz rej. d0 = odczytane pole Gadget_ID
;z gadgetu ktory wyslal komunikat i na podstawie
;numeru z pola Gadget_ID identyfikujemy dany gadget!

cmp.w #1,d0
beq.s Gadget_Nr1
cmp.w #2,d0
beq Gadget_Nr2
cmp.w #3,d0
beq Gadget_Nr3
cmp.w #4,d0
beq Gadget_Nr4
bra.s Wait_Message

;teraz reakcja na wybranie danego przycisku

Gadget_Nr1:
Gadget_Nr2:
Gadget_Nr3:
Gadget_Nr4:

move.l #Gadget_Button_001,a0
move.l #$55555555,d1 ;identyfikator grupy przycisków.
bsr ButtonChecked




Refresh_Gadgets: move.l IntBase,a6
move.l WindowBase,a1
move.l #Gadget_Button_001,a0
move.l #0,a2
jsr RefreshGadgets(a6)

bra Wait_Message

Koniec: move.l IntBase,a6
move.l WindowBase,a0
jsr CloseWindow(a6)
;-----------------------
Error_1: move.l Exec.w,a6
move.l IntBase,a1
jsr CloseLibrary(a6)
clr.l d0
rts
Error_0: moveq.l #-1,d0
rts

;--------------------------------------------------------------
;Funkcja: ButtonChecked(A0.l,D0.w,D1.l)
;WEJSCIE:
;Rej. A0.L = Adres pierwszej struktury typu 'Gadget' od ktorej zaczynamy poszukiwanie.
;Rej. D0.W = Wartosc pola 'Gadget_ID' gadgetu ktory ma zostac wlaczony.
;Rej. D1.L = Wartosc pola 'MutualExclude' grupujacego gadgety ktore maja byc objete przełączeniem.

;OPIS:
;Funkcja pozwala na aktywowanie tylko jednego wskazanego
;przycisku z danej grupy przycisków zawierających opcje wyboru.
;Przynależność danego przycisku do ustalonej grupy przycisków
;definujemy wspólną dla danej grupy wartościa pola 'MutualExclude'
;struktury (Gadget)
;Aktywacja danego przycisku odbywa sie poprzez ustawienie w polu
;'Flags' struktury (Gadget) bitu GADG_SELECTED a w pozostałych
;odnalezionych przyciskach z tej grupy bit ten jest zerowany.
;DZIALANIE:
;Funkcja przeszukuje struktury (Gadget) od pierwszej wskazanej rejestrem A0
;do ostatniej w ktorej wskaznik 'NextGadgetPtr' na kolejna zawiera 0.
;W przeszukiwanych strukturach (Gadget) sprawdzane jest pole 'MutualExclude'
;jesli wartosc tego pola pokrywa sie z wartoscia podana w rejestrze D1 wtedy
;dokonywana jest modyfikacja struktury (Gadget) obejmujaca dwie kombinacje.
;1).W przypadku gdy wartość w polu 'Gadget_ID' pokrywa się z rejestrem D0
;ustawiony zostaje bit GADG_SELECTED w polu 'Flags' tej struktury (gadget).
;2).Kiedy wartość w polu 'Gadget_ID' jest inna od zawartej w rejestrze D0
;wyzerowany zostaje bit GADG_SELECTED w polu 'Flags' tej struktury (gadget).


ButtonChecked: movem.l d0-d1/a0,-(sp)
BC_PP2: cmp.l 30(a0),d1 ;30 = Offset MutualExclude
bne.s BC_PP1
cmp.w 38(a0),d0 ;38 = Offset Gadget_ID
bne.s BC_PP3
bset.b #7,13(a0) ;12 = Offset Flags + 1 low byte
bra.s BC_PP1
BC_PP3: bclr.b #7,13(a0) ;12 = Offset Flags + 1 low byte
BC_PP1: tst.l (a0) ;sprawdzamy NextGadgetPtr
move.l (a0),a0
bne.s BC_PP2
movem.l (sp)+,d0-d1/a0
rts


;--------------------------------------------------------------
NewWindow: DC.W 0
DC.W 0
DC.W 320
DC.W 200
DC.B 0
DC.B 1
DC.L CLOSEWINDOW+GADGETUP
DC.L WINDOWCLOSE+WINDOWDRAG+WINDOWDEPTH+ACTIVATE
DC.L Gadget_Button_001
DC.L 0
DC.L NazwaOkna
DC.L 0
DC.L 0
DC.W 100
DC.W 100
DC.W 320
DC.W 180
DC.W WBENCHSCREEN

;--------------------------------------------------------------
NazwaOkna: DC.B '<-- Close Window!',0
WindowBase: DC.L 0
;--------------------------------------------------------------
IntBase: DC.L 0
IntName: DC.B 'intuition.library',0
;--------------------------------------------------------------
Font: dc.l TopazFont
dc.w $8 ;wysoksc czcionki
dc.b $0 ;zdefiniowany styl
dc.b $0 ;flagi

TopazFont: dc.b 'topaz.font',0
;---------------------------------------------------------------
BorderButton: dc.w 0 ;Left Edge
dc.w 0 ;Top Edge
dc.b 1 ;FrontPen kolor lini
dc.b 0 ;BackPen kolor tla
dc.b 0 ;DrawMode tryb rysowania
dc.b 9 ;CountLine liczba punktow rysowania ramki jaka zawiera tabela XY.
dc.l TabelaLini_003 ;XY Ptr adres tabeli zawierajacej wspolrzedne punktow ramki.
dc.l 0 :Next Border Ptr
;--------------------------------------------------------
TabelaLini_003: dc.w -2,-1 ;Tu rysujemy ramke
dc.w 73,-1 ;w obrembie przycisku
dc.w 73,13 ;rozmiary ramki moga
dc.w -2,13 ;byc mniejsze od rozmiaru
dc.w -2,-1 ;pola przycisku.
dc.w -1,-1
dc.w -1,13
dc.w 72,13
dc.w 72,-1
;--------------------------------------------------------------

;--------------------------------------------------------------
Gadget_Button_001: dc.l Gadget_Button_002
dc.w 16,18,72,13,GADGHCOMP,RELVERIFY+TOGGLESELECT,BOOLGADGET
dc.l BorderButton,0,TextButton_001,$55555555,0
dc.w 1 ;Gadget_ID
dc.l 0 ;UserData
;--------------------------------------------------------------
TextButton_001: dc.b 1,0,1,0
dc.w 4+4,3
dc.l Font,TXT_001,0
;--------------------------------------------------------------
Gadget_Button_002: dc.l Gadget_Button_003
dc.w 16,36,72,13,GADGHCOMP,RELVERIFY+TOGGLESELECT,BOOLGADGET
dc.l BorderButton,0,TextButton_002,$55555555,0
dc.w 2 ;Gadget_ID
dc.l 0 ;UserData
;--------------------------------------------------------------
TextButton_002: dc.b 1,0,1,0
dc.w 4+4,3
dc.l Font,TXT_002,0
;--------------------------------------------------------------
Gadget_Button_003: dc.l Gadget_Button_004
dc.w 16,53,72,13,GADGHCOMP,RELVERIFY+TOGGLESELECT,BOOLGADGET
dc.l BorderButton,0,TextButton_003,$55555555,0
dc.w 3 ;Gadget_ID
dc.l 0 ;UserData
;--------------------------------------------------------------
TextButton_003: dc.b 1,0,1,0
dc.w 4+4,3
dc.l Font,TXT_003,0
;--------------------------------------------------------------
Gadget_Button_004: dc.l 0 ;pole wyzerowane to brak kolejnego gadgetu.
dc.w 16,71,72,13,GADGHCOMP,RELVERIFY+TOGGLESELECT,BOOLGADGET
dc.l BorderButton,0,TextButton_004,$55555555,0
dc.w 4 ;Gadget_ID
dc.l 0 ;UserData
;--------------------------------------------------------------
TextButton_004: dc.b 1,0,1,0
dc.w 4+4,3
dc.l Font,TXT_004,0
;--------------------------------------------------------------
TXT_001: dc.b 'Button1',0
TXT_002: dc.b 'Button2',0
TXT_003: dc.b 'Button3',0
TXT_004: dc.b 'Button4',0
;--------------------------------------------------------------
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