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 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 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/ |