Forum AmigaOne Zone

Forum użytkowników Amigi i nie tylko
Teraz jest czwartek, 29 cze 2017, 05:57

Strefa czasowa: UTC + 1 [ DST ]




Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 44 ]  Przejdź na stronę Poprzednia strona  1, 2, 3  Następna strona
Autor Wiadomość
PostNapisane: wtorek, 24 sty 2017, 19:15 
Offline
Administrator
Administrator

Dołączył(a): poniedziałek, 16 sty 2012, 14:40
Posty: 170
Lokalizacja: okolice Lublina
Przez przypadek znalazłem taką oto stronę http://www.ummon.eu/Amiga/index/AmigaOS.html

Dawno nie aktualizowana i nie kompletna, ale podaję jako ciekawostkę.


Udostępnij dla FacebookUdostępnij dla TwitterUdostępnij dla Google+
Góra
 Zobacz profil  
Cytuj  
PostNapisane: wtorek, 24 sty 2017, 20:10 
Offline
Administrator
Administrator

Dołączył(a): poniedziałek, 16 sty 2012, 14:40
Posty: 170
Lokalizacja: okolice Lublina
Hextreme napisał(a):
Musisz ręcznie po ustaleniu wartości tych zmiennych wpisać je do odpowiednich pól w liście tagów.

Polecam skorzystanie z funkcji FindTagItem() w bibliotece utility.library.

Kod:
/* Ustalenie wartości zmiennych */
   WindowWidth=pubscr->Width-200;      //Dopisane
   WindowHeight=pubscr->Height-100;    //Dopisane

/* Wpisanie tych wartości do odpowiednich pól w liście tagów */
struct TagItem *tag;
if (tag = FindTagItem(WA_Width, taglist)) tag->ti_Data = WindowWidth;
if (tag = FindTagItem(WA_Height, taglist)) tag->ti_Data = WindowHeight;


Nie wiem czy załapałem: Muszę nową listę tagów zrobić i dopiero przy jej pomocy otworzyć okno, czy po prostu funkcja ta w locie podmienia tagi?


Góra
 Zobacz profil  
Cytuj  
PostNapisane: wtorek, 24 sty 2017, 20:15 
Offline
Aktywny forumowicz
Aktywny forumowicz
Avatar użytkownika

Dołączył(a): piątek, 20 sty 2012, 06:09
Posty: 297
tchomasz napisał(a):
Nie wiem czy załapałem: Muszę nową listę tagów zrobić i dopiero przy jej pomocy otworzyć okno, czy po prostu funkcja ta w locie podmienia tagi?


Funkcja podmienia tagi, nie musisz robić oddzielnej listy tagów.

Można robić też tak ale nie polecam tego sposobu:
Kod:
taglist[2].ti_Data = WindowWidth;


Dzięki FindTagItem() zabezpieczasz się w razie gdybyś modyfikował swoją listę tagów (np. dodawał nowe tagi na początku). Zawsze odpowiednie pola będą zmodyfikowane.


Góra
 Zobacz profil  
Cytuj  
PostNapisane: wtorek, 24 sty 2017, 23:59 
Offline
Administrator
Administrator

Dołączył(a): poniedziałek, 16 sty 2012, 14:40
Posty: 170
Lokalizacja: okolice Lublina
Powiem szczerze, nie mam pojęcia jak to zrobić - nie wiem gdzie i co dopisać.


Góra
 Zobacz profil  
Cytuj  
PostNapisane: środa, 25 sty 2017, 00:13 
Offline
Aktywny forumowicz
Aktywny forumowicz
Avatar użytkownika

Dołączył(a): piątek, 20 sty 2012, 06:09
Posty: 297
Podałem Ci - masz to umieścić tuż za ustaleniem wartości zmiennych WindowWidth i WindowHeight przed otwarciem okienka.

Postaram się omówić teraz bardziej szczegółowo:

W poniższym kodzie deklarujemy zmienną pomocniczą tag (w niej przechowujemy wynik operacji FindTagItem()).
Następnie szukamy tagu WA_Width w liście tagów (taglist).

Otrzymujemy wskaźnik do tagu lub zero, w przypadku niepowodzenia. Umieszczamy wynik w zmiennej tag. Sprawdzamy poprawność wyniku.

Następnie modyfikujemy pole ti_Data zawierające w tym przypadku wartość szerokości okienka (ponieważ wskazuje na tag WA_Width). Analogicznie postępujemy z wysokością (tag WA_Height).

Kod:
struct TagItem *tag; /* Zmienna pomocnicza */

if (tag = FindTagItem(WA_Width, taglist)) /* Szukamy tagu WA_Width */
{
    tag->ti_Data = WindowWidth; /* Wstawiamy nową wartość */
}

if (tag = FindTagItem(WA_Height, taglist)) /* Szukamy tagu WA_Height */
{
    tag->ti_Data = WindowHeight; /* Wstawiamy nową wartość */
}


Góra
 Zobacz profil  
Cytuj  
PostNapisane: środa, 25 sty 2017, 01:14 
Offline
Administrator
Administrator

Dołączył(a): poniedziałek, 16 sty 2012, 14:40
Posty: 170
Lokalizacja: okolice Lublina
Zrobiłem tak:

Kod:
...
struct Menu *menu;
struct Screen *pubscr;
void *vi;

char koniec;

int WindowWidth, WindowHeight;
struct TagItem *tag;

struct TagItem taglist[]=
{
        WA_Left,        0,
        WA_Top,         0,
        WA_Width,       280,
        WA_Height,      100,
        WA_MaxWidth,    -1,
...


Kod:
...
    pubscr=LockPubScreen(0);
    if (!pubscr)
    {
        return -1;
    }
    printf("Width: %d,  Height: %d.\n", pubscr->Width, pubscr->Height);
    WindowWidth=pubscr->Width-200;
    WindowHeight=pubscr->Height-100;
    if (tag = FindTagItem(WA_Width, taglist))
    {
        tag->ti_Data = WindowWidth;
    }
    if (tag = FindTagItem(WA_Height, taglist))
    {
        tag->ti_Data = WindowHeight;
    }
    vi=GetVisualInfoA(pubscr, 0);
    if (!vi)
    {
        return -1;
    }
    LayoutMenus(menu, vi, GTMN_NewLookMenus, TRUE, TAG_DONE);
    window=OpenWindowTagList(0, taglist);
...


Przy kompilacji wywala mi coś takiego:

menu_test.c: In function `init':
menu_test.c:154: warning: assignment makes pointer from integer without a cast
menu_test.c:158: warning: assignment makes pointer from integer without a cast


Góra
 Zobacz profil  
Cytuj  
PostNapisane: środa, 25 sty 2017, 01:27 
Offline
Aktywny forumowicz
Aktywny forumowicz
Avatar użytkownika

Dołączył(a): piątek, 20 sty 2012, 06:09
Posty: 297
Musisz załączyć prototypy utility.library, w których znajduje się m.in. FindTagItem().


Góra
 Zobacz profil  
Cytuj  
PostNapisane: środa, 25 sty 2017, 01:56 
Offline
Administrator
Administrator

Dołączył(a): poniedziałek, 16 sty 2012, 14:40
Posty: 170
Lokalizacja: okolice Lublina
Działa!!!
Zapomniałem dodać #include <proto/utility.h>, dopisałem tylko #include <utility/tagitem.h>

To teraz kolejne pytanie. Z racji tego, że w programiku będę wywoływał file requestera (1- odczyt pliku, 2- zapis pliku) - to tag ASL_OKText będzie miał inny tekst (1- Wczytaj, 2- Zapisz). Czy w tym przypadku tak samo podmieniam zawartość tagów - czyli przed wywołaniem file requestera używam FindTagItem() do wstawienia nowych wartości?


Góra
 Zobacz profil  
Cytuj  
PostNapisane: środa, 25 sty 2017, 02:07 
Offline
Aktywny forumowicz
Aktywny forumowicz
Avatar użytkownika

Dołączył(a): piątek, 20 sty 2012, 06:09
Posty: 297
Cytuj:
To teraz kolejne pytanie. Z racji tego, że w programiku będę wywoływał file requestera (1- odczyt pliku, 2- zapis pliku) - to tag ASL_OKText będzie miał inny tekst (1- Wczytaj, 2- Zapisz). Czy w tym przypadku tak samo podmieniam zawartość tagów - czyli przed wywołaniem file requestera używam FindTagItem() do wstawienia nowych wartości?

Tak.


Góra
 Zobacz profil  
Cytuj  
PostNapisane: środa, 25 sty 2017, 11:08 
Offline
Administrator
Administrator

Dołączył(a): poniedziałek, 16 sty 2012, 14:40
Posty: 170
Lokalizacja: okolice Lublina
Nawet działa :D

Kolejne dziwne pytanie - czy jeżeli mam otwarte okno i sobie zmienię jego wielkość, to gdzieś aktualna rozdzielczość okna jest przechowywana, żeby można ją było 'wyciągnąć' tak jak rozdzielczość ekranu?


Góra
 Zobacz profil  
Cytuj  
PostNapisane: środa, 25 sty 2017, 14:19 
Offline
Aktywny forumowicz
Aktywny forumowicz
Avatar użytkownika

Dołączył(a): piątek, 20 sty 2012, 06:09
Posty: 297
tchomasz napisał(a):
Nawet działa :D

Kolejne dziwne pytanie - czy jeżeli mam otwarte okno i sobie zmienię jego wielkość, to gdzieś aktualna rozdzielczość okna jest przechowywana, żeby można ją było 'wyciągnąć' tak jak rozdzielczość ekranu?


Tak, w strukturze Window też są pola Width i Height, które określają aktualny rozmiar okienka, oraz GZZWidth i GZZHeight, które określają rozmiar wnętrza okienka (nie uwzględniając ramki).

Dodatkowo są tam też rozmiary każdej z ramek - BorderTop, BorderLeft, BorderRight i BorderBottom.


Góra
 Zobacz profil  
Cytuj  
PostNapisane: czwartek, 26 sty 2017, 11:43 
Offline
Administrator
Administrator

Dołączył(a): poniedziałek, 16 sty 2012, 14:40
Posty: 170
Lokalizacja: okolice Lublina
Do otwarcia pliku używam filerequestera, a np. jakbym chciał zmieniać jakieś ustawienia w programie, to muszę otworzyć nowe okno i do niego dodawać gadżety?


Góra
 Zobacz profil  
Cytuj  
PostNapisane: czwartek, 26 sty 2017, 16:43 
Offline
Aktywny forumowicz
Aktywny forumowicz
Avatar użytkownika

Dołączył(a): piątek, 20 sty 2012, 06:09
Posty: 297
tchomasz napisał(a):
Do otwarcia pliku używam filerequestera, a np. jakbym chciał zmieniać jakieś ustawienia w programie, to muszę otworzyć nowe okno i do niego dodawać gadżety?

Jeśli chcesz zrobić okienko do zmiany ustawień swojego programu to tak, najlepiej otworzyć oddzielne okienko z ustawieniami.

Istnieje jeszcze jedna możliwość, której nie opanowałem jeszcze zbyt dobrze (choć planuję), a są to tzw. Requestery. W skrócie używa się ich do zapytania użytkownika o coś. I nie musi się to sprowadzać do zapytania o włożenie dyskietki do stacji, czy zapytania o jedną z kilku opcji.

Pełne Requestery (tzw. True Requesters) mogą zawierać dowolny układ gadżetów i być używane do zapytania o kolor z palety, czy właśnie o ustawienia programu. Pełny requester blokuje oryginalne gadżety okienka i użytkownik musi dokonać wyboru stawianego przez requester. Dopiero po dokonaniu wyboru może wznowić pracę.

Używasz już Requesterów w dwóch miejscach: do okienka "About" oraz właśnie do zapytania o plik (FileRequester).

Różnica polega na tym, że pełne Requestery wymagają dodatkowej wiedzy w zakresie struktury Requester i obsługi requesterów. Znajdziesz te informacje na płycie Amiga Developer w ROM Kernel Reference Manual w części o bibliotekach w rozdziale "Intuition Requesters".

Jeśli nie czujesz się jeszcze na siłach by opanować ten dodatkowy element polecam po prostu utworzyć odrębne okienko z gadżetami. Ja sam podchodzę do tematu pełnych requesterów od dłuższego czasu, ale jeszcze nie zgłębiłem tematu.


Góra
 Zobacz profil  
Cytuj  
PostNapisane: czwartek, 26 sty 2017, 23:46 
Offline
Administrator
Administrator

Dołączył(a): poniedziałek, 16 sty 2012, 14:40
Posty: 170
Lokalizacja: okolice Lublina
Dzięki za wyczerpującą odpowiedź.
Popatrzyłem sobie odnośnie True Requesters i stwierdzam, że fajnie to wygląda, ale za cienki za uszami jestem na to w tej chwili. Poza tym jakby było to gdzieś opisane po polsku to pewnie bym do tematu usiadł, a tak zostanę przy okienku z gadżetami.


Góra
 Zobacz profil  
Cytuj  
PostNapisane: sobota, 25 lut 2017, 21:33 
Offline
Administrator
Administrator

Dołączył(a): poniedziałek, 16 sty 2012, 14:40
Posty: 170
Lokalizacja: okolice Lublina
Poniżej załączam moje wypociny z podmianą tagów - nie będę wklejał bo niezły tasiemiec z tego wyjdzie. Powiązałem pozycję okna z rozdzielczością ekranu, oraz pozycję filerequestera z rozdzielczością okna.
Teraz zacząłem dłubać przy obsłudze plików.
Za pomocą funkcji Examine() wyciągam sobie rozmiar pliku. Czy da się zarezerwować obszar pamięci dla funkcji Read(), w którym mają być odczytane dane z pliku za pomocą tego wyciągniętego rozmiaru - mam nadzieję że nie zamotałem. Chodzi o to, żeby odczytując plik dane były zapisywane do bufora o wielkości identycznej jak wielkość pliku.


Załączniki:
menu_test.c [6.4 KiB]
Pobrane 9 razy
Góra
 Zobacz profil  
Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 44 ]  Przejdź na stronę Poprzednia strona  1, 2, 3  Następna strona

Strefa czasowa: UTC + 1 [ DST ]


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Powered by phpBB® Forum Software © phpBB Group
Przyjazne użytkownikom polskie wsparcie phpBB3 - phpBB3.PL
phpBB SEO