kategoria: Blitz
[#1] Openscreentaglist i problem z odświeżaniem
Temat otworzyłem w dziale Blitz ale to chyba jest bardziej ogólne.

Otwieram ekran poleceniem z tytułu a potem 2 okna na nim(ekran jest Public).
Jedno okno zaraz po otwarciu jest aktywne.
Kikam na okno drugie, które staje się aktywne ale ono pierwsze przejmuje tytuł okna drugiego.
Przesuwam oknem (obojętne którym) tak by zakryć tytuł ekranu na belce i po odsłonięciu belki widnieje tam też nazwa ona drugiego (zamiast pierwotnego tytułu ekranu)
O co tu chodzi?
Zakładam że coś robię zle

Dzieki


Edit
Tagi jakie używam przy ekranie to:
SA_LikeWorkbencH
SA_Type, PUBLICSCREEN
SA_PubName, "blabla"
SA_Title, "znowu blabla"

I zmieniam status ekranu
Pubscreenstatus()

Okna otwieram jako smartrefresh



Wybaczcie dosc ogolnikowe przedstawienie tematu ale pisze z telefonu i już tracę do niego cierpliwosc

Ostatnia aktualizacja: 30.07.2018 03:52:16 przez peceha
[#2] Re: Openscreentaglist i problem z odświeżaniem

@peceha, post #1

Załączam obrazek jak to wygląda.
Są tu 4 fazy (od góry):
- Start programu, ekran i ona mają różne tytuły
- Aktywacja drugiego okna -okno 1 przyjmuje tytuł okna 2
- Przesunięcie okna 1 na belke ekranu
-Odsłoniecie belki -ekran otrzymuje tutul okna 2

[#3] Re: Openscreentaglist i problem z odświeżaniem

@peceha, post #2

Wszystko fajnie tylko zarówno na podstawie zrzutów ekranu jak i szczątkowego kodu bardzo ciężko cokolwiek powiedzieć. Jeśli to nie tajemnica to zamieść cały kod - wtedy będzie większa szansa.
[#4] Re: Openscreentaglist i problem z odświeżaniem

@asman, post #3

Zamieszczę szeroki uśmiech
Po prostu nie miałem za bardzo jak tego szybko zrobić i myślałem że te wyborcze informacje starcza

Wrócę tu koło soboty z kodem.

Dzięki
[#5] Re: Openscreentaglist i problem z odświeżaniem

@peceha, post #4

Poniżej znajduje się kod który nie robi nic więcej poza otwarciem ekranu i dwóch okien.
...no i tu występuje ten problem opisany wyżej

DEFTYPE.Screen          *scr
DEFTYPE.Window          *win0,*win1,*win2
DEFTYPE.IntuiMessage    *msg

DEFTYPE.l               win0_sigBit
DEFTYPE.l               win1_sigBit

DEFTYPE.w               scrW
DEFTYPE.w               scrH
DEFTYPE.b               scrBarH
DEFTYPE.b               fontH
DEFTYPE.b               bBottom
DEFTYPE.b               bTop
DEFTYPE.b               bRight
DEFTYPE.b               bLeft

DEFTYPE.l               theClass
DEFTYPE.l               theCode
DEFTYPE.l               theQualifier
DEFTYPE.l               theIAddress

DEFTYPE.b               quitFlag


Dim tags.TagItem(11)

tags(0)\ti_Tag = #SA_LikeWorkbench,  True
tags(1)\ti_Tag = #SA_Type,           #PUBLICSCREEN
tags(2)\ti_Tag = #SA_PubName,        "blabla"
tags(3)\ti_Tag = #SA_SysFont,        1
tags(4)\ti_Tag = #SA_Title,          "przeMulti"
tags(5)\ti_Tag = #TAG_DONE,          0

*scr  = OpenScreenTagList_(0,tags(0))
If *scr=0 Then End
suc.l = PubScreenStatus_(*scr,0)




scrW    = *scr\Width
scrH    = *scr\Height
scrBarH = *scr\BarHeight+1
fontH   = *scr\Font\ta_YSize
bLeft   = *scr\WBorLeft
bRight  = *scr\WBorRight
bBottom = *scr\WBorBottom
bTop    = *scr\WBorTop + (*scr\Font\ta_YSize + 1)




winW.w=scrW/4
winH.w=scrH-scrBarH

idcmp.l=#IDCMP_CLOSEWINDOW|#IDCMP_RAWKEY|#IDCMP_REFRESHWINDOW|#IDCMP_GADGETUP|#IDCMP_GADGETDOWN|#ARROWIDCMP


tags(0)\ti_Tag  = #WA_Left,         0
tags(1)\ti_Tag  = #WA_Top,          scrBarH
tags(2)\ti_Tag  = #WA_Width,        winW
tags(3)\ti_Tag  = #WA_Height,       winH
tags(4)\ti_Tag  = #WA_PubScreen,    *scr
tags(5)\ti_Tag  = #WA_Title,        "list"
tags(6)\ti_Tag  = #WA_Activate,     True
tags(7)\ti_Tag  = #WA_Flags,        #WFLG_DRAGBAR|#WFLG_CLOSEGADGET
tags(8)\ti_Tag  = #WA_IDCMP,        idcmp
tags(9)\ti_Tag  = #WA_Gadgets,      0
tags(10)\ti_Tag = #TAG_DONE,        0

*win0=OpenWindowTagList_(0,tags(0))
If *win0=0 Then End
win0_sigBit=1 LSL *win0\UserPort\mp_SigBit





tags(0)\ti_Tag  = #WA_Left,         winW+1
tags(1)\ti_Tag  = #WA_Top,          scrBarH
tags(2)\ti_Tag  = #WA_Width,        scrW-winW
tags(3)\ti_Tag  = #WA_Height,       winH
tags(4)\ti_Tag  = #WA_PubScreen,    *scr
tags(5)\ti_Tag  = #WA_Title,        "preview"
tags(6)\ti_Tag  = #WA_Activate,     False
tags(7)\ti_Tag  = #WA_Flags,        #WFLG_DRAGBAR|#WFLG_CLOSEGADGET
tags(8)\ti_Tag  = #WA_IDCMP,        #IDCMP_CLOSEWINDOW|#IDCMP_RAWKEY|#IDCMP_REFRESHWINDOW
tags(9)\ti_Tag  = #WA_Gadgets,      0
tags(10)\ti_Tag = #TAG_DONE,        0


*win1 = OpenWindowTagList_(0,tags(0))
If *win1=0 Then End
win1_sigBit=1 LSL *win1\UserPort\mp_SigBit




;-----------------


.main
  Repeat
    theClass      =0
    theCode       =0
    theQualifier  =0
    signalMask.l=Wait_(win0_sigBit|win1_sigBit)
    Select signalMask
      Case signalMask&win0_sigBit
        Gosub idcmp_win0:
      Case signalMask&win1_sigBit
        Gosub idcmp_win1:
    End Select
  Until quitFlag
  CloseWindow_(*win1)
  CloseWindow_(*win0)
  FreeGadgets_(*gList)
  FreeVisualInfo_(*vi)
  CloseScreen_(*scr)
End



;==============================================================================



.idcmp_win0
Repeat
  *msg          = GT_GetIMsg_(*win0\UserPort)
  theClass      = *msg\Class
  theCode       = *msg\Code
  theQualifier  = *msg\Qualifier
  theIAddress   = *msg\IAddress

  GT_ReplyIMsg_(*msg)
  Select theClass
    Case #IDCMP_CLOSEWINDOW
      quitFlag=True
  End Select
 Until *msg=0
Return

.idcmp_win1
  *msg          = GetMsg_(*win1\UserPort)
  theClass      = *msg\Class
  theCode       = *msg\Code
  theQualifier  = *msg\Qualifier

  ReplyMsg_(*msg)
  Select theClass
    Case #IDCMP_CLOSEWINDOW
      quitFlag=True
  End Select
Return
[#6] Re: Openscreentaglist i problem z odświeżaniem

@peceha, post #5

Ja to widzę tak, że problem jest, że używasz tags zarówno do okna win0 jak i win1. Stwórz tags0 i tags1 i wtedy powinno być dobrze.
[#7] Re: Openscreentaglist i problem z odświeżaniem

@asman, post #6

Ja to widzę tak, że problem jest, że używasz tags zarówno do okna win0 jak i win1. Stwórz tags0 i tags1 i wtedy powinno być dobrze.


Problem moze byc zabawniejszy. Samo tags nie jest problemem, bo OpenScreenTagList uzywa tej struktury tylko raz i potem nie jest mu do niczego potrzebna (moze byc na stosie, moze byc uzyda do czegokolwiek innego, niewazne).

Problemem jest raczej samo WA_Title. Najpierw:

tags(5)\ti_Tag  = #WA_Title,        "list"


A w czasie tworzenia drugiego okna:

tags(5)\ti_Tag  = #WA_Title,        "preview"


Pytanie za 100 punktow brzmi: jak zachowa sie blitz. Czy blitz moze zwolnic pamiec po takim ciagu znakow jezeli nie jest juz uzywany w dalszym kodzie? Jezeli tak, to tutaj lezy problem.

@pecha:
Pamietaj, ze przy tworzeniu okna albo ekranu ciag znakow stanowiacy jego nazwe nie jest nigdzie kopiowany. System pracuje na twoim buforze wiec musisz zadbac o to zeby istnial tak dlugo jak dlugo okno/ekran z niego korzystaja.
[#8] Re: Openscreentaglist i problem z odświeżaniem

@mschulz, post #7

Spróbowałem dać:
t1$="list"
t2$="preview"
tags(5)\ti_Tag  = #WA_Title,        t1$
tags2(5)\ti_Tag  = #WA_Title,        t2$

Nie pomogło.
[#9] Re: Openscreentaglist i problem z odświeżaniem

@peceha, post #5

Jezeli w BlitzBasicu select dziala tak samo jak switch w C i innych, to masz problem tutaj w kodzie:

signalMask.l=Wait_(win0_sigBit|win1_sigBit)
    Select signalMask
      Case signalMask&win0_sigBit
        Gosub idcmp_win0:
      Case signalMask&win1_sigBit
        Gosub idcmp_win1:
    End Select


Ten kod dziala poprawnie tylko w wypadku kiedy otrzymujesz sygnal tylko od jednego okna. Gdy sygnal przychodzi od dwoch okien jednoczesnie, to znaczy kiedy odebrana signalMask == (win0_sigBit|win1_sigBit), nie dzieje sie nic.

Poniewaz zazyczyles sobie od intuition przysylanie sygnalu IDCMP_REFRESHWINDOW (ktory jest generowany takze po aktywowaniu/deaktywowaniu okna) taka sytuacja zdaza sie za kazdym razem kiedy zmieniasz aktywne okno. Sygnal przychodzi, wiadomosci w UserPort czekaja, a ty ich nie obslugujesz...

Popraw kod na cos takiego (o ile dobrze zrozumialem manual od BlitzBasica):

signalMask.l=Wait_(win0_sigBit|win1_sigBit)
    Select True
      Case signalMask And win0_sigBit
        Gosub idcmp_win0:
      Case signalMask And win1_sigBit
        Gosub idcmp_win1:
    End Select


bo w kazdym przypadku "Case" wartosc jest porownywana z ta podana w "Select".

I jeszcze jedno. Podales flage IDCMP_REFRESHWINDOW ale nie obslugujesz jej poprawnie. Zgodnie z manualem musisz przynajmniej wywolac BeginRefresh()/EndRefresh():


As a minimum, the application must call BeginRefresh() and
EndRefresh() for the window after receiving an IDCMP_REFRESHWINDOW
event. Create the window with the WA_NoCareRefresh attribute if you
do not want to manage these events. See the "Intuition Windows"
chapter for details.



Ostatnia aktualizacja: 06.08.2018 10:28:49 przez mschulz
[#10] Re: Openscreentaglist i problem z odświeżaniem

@mschulz, post #9

Dziękuję wszystkim za podpowiedzi.
Sprawdzę najszybciej jak będę mógł.

Co do flagi REFRESHWINDOW to pozostałość z całości kodu gdzie jest użyte gadtools (nocarerefresh miałem już wcześniej i też nie pomogło). Mimo wszystko sprawdzę i ten wątek dokładnie.

Ostatnia aktualizacja: 06.08.2018 11:03:19 przez peceha
[#11] Re: Openscreentaglist i problem z odświeżaniem

@peceha, post #10

Miałem chwilę by posprawdzac.
Dodanie innej zmiennej dla tagów dla okna niestety nie pomaga.

Zmiana kodu w SELECT.. END też nie.

Poszedłem krok dalej i usunąłem z programu drugie okno (zostało tylko win0)
Ma ono przypisana tylko jedna flagę CLOSEWINDOW.
Komendę Wait_(...) zamieniłem na WaitPort_(*win0\UserPort)
Po przesunięciu takiego okna na belke i ponownym odsłonięciu belki w dalszym ciągu zmienia się tutul ekranu (przyjmuje nazwę okna).

Ale czy problem nie może leżeć gdzie indziej (np. Brak jakiegoś taga przy inicjowaniu ekranu)?
Jeśli przyslonie oknem belkę do połowy (w pionie) to zmienia się tylko ta przysłonieta, dolna połowa nazwy (odslonieta zostaje bez zmian po ponownym przesunięciu okna ) -tak samo w drugą stronę. Gdy zaslonie końcówkę tytułu belki w poziomie to tylko ta część zaslonieta zostanie podmieniona.
[#12] Re: Openscreentaglist i problem z odświeżaniem

@peceha, post #11

Rozwiązanie problemu:
t1$="list"
tags(5)\ti_Tag  = #WA_Title,        &t1$

Podobnie dla drugiego okna.
[#13] Re: Openscreentaglist i problem z odświeżaniem

@cholok, post #12

Naprawdę????
Tam ma być adres tekstu???
Cholera😠

Dzięki!!! Hehe

Dodano.
Potwierdzam szeroki uśmiech
Oczywiście tak samo muszę podmienić przy tagu dla ekranu.
Dzięki!!

Ostatnia aktualizacja: 06.08.2018 14:24:03 przez peceha
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