Forum AmigaOne Zone
https://forum.amigaone.pl/

Programowanie pod AmigaOS 3.1 - kilka pytań.
https://forum.amigaone.pl/programowanie-f13/programowanie-pod-amigaos-3-1-kilka-pytan-t935-15.html
Strona 2 z 4

Autor:  tchomasz [ wtorek, 24 sty 2017, 18:15 ]
Tytuł:  Re: Programowanie pod AmigaOS 3.1 - kilka pytań.

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ę.

Autor:  tchomasz [ wtorek, 24 sty 2017, 19:10 ]
Tytuł:  Re: Programowanie pod AmigaOS 3.1 - kilka pytań.

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?

Autor:  Hextreme [ wtorek, 24 sty 2017, 19:15 ]
Tytuł:  Re: Programowanie pod AmigaOS 3.1 - kilka pytań.

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.

Autor:  tchomasz [ wtorek, 24 sty 2017, 22:59 ]
Tytuł:  Re: Programowanie pod AmigaOS 3.1 - kilka pytań.

Powiem szczerze, nie mam pojęcia jak to zrobić - nie wiem gdzie i co dopisać.

Autor:  Hextreme [ wtorek, 24 sty 2017, 23:13 ]
Tytuł:  Re: Programowanie pod AmigaOS 3.1 - kilka pytań.

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ść */
}

Autor:  tchomasz [ środa, 25 sty 2017, 00:14 ]
Tytuł:  Re: Programowanie pod AmigaOS 3.1 - kilka pytań.

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

Autor:  Hextreme [ środa, 25 sty 2017, 00:27 ]
Tytuł:  Re: Programowanie pod AmigaOS 3.1 - kilka pytań.

Musisz załączyć prototypy utility.library, w których znajduje się m.in. FindTagItem().

Autor:  tchomasz [ środa, 25 sty 2017, 00:56 ]
Tytuł:  Re: Programowanie pod AmigaOS 3.1 - kilka pytań.

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?

Autor:  Hextreme [ środa, 25 sty 2017, 01:07 ]
Tytuł:  Re: Programowanie pod AmigaOS 3.1 - kilka pytań.

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.

Autor:  tchomasz [ środa, 25 sty 2017, 10:08 ]
Tytuł:  Re: Programowanie pod AmigaOS 3.1 - kilka pytań.

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?

Autor:  Hextreme [ środa, 25 sty 2017, 13:19 ]
Tytuł:  Re: Programowanie pod AmigaOS 3.1 - kilka pytań.

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.

Autor:  tchomasz [ czwartek, 26 sty 2017, 10:43 ]
Tytuł:  Re: Programowanie pod AmigaOS 3.1 - kilka pytań.

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?

Autor:  Hextreme [ czwartek, 26 sty 2017, 15:43 ]
Tytuł:  Re: Programowanie pod AmigaOS 3.1 - kilka pytań.

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.

Autor:  tchomasz [ czwartek, 26 sty 2017, 22:46 ]
Tytuł:  Re: Programowanie pod AmigaOS 3.1 - kilka pytań.

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.

Autor:  tchomasz [ sobota, 25 lut 2017, 20:33 ]
Tytuł:  Re: Programowanie pod AmigaOS 3.1 - kilka pytań.

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.

Strona 2 z 4 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/