kategoria: ANSI C
[#1] [C, ASL, OS3.x] Wybieranie plikow
Posiada ktos jakis naprawde najprostrzy przyklad wykozystania wybieraczki ASL do wymierania plikow?
Interesuje mnie wynik w postaci sciezki dostepu wraz z nazwa pliku.

Najlepiej jakby byl tez dodany wzorzec do roszerzen plikow.

Odpowiadajac na nurtujce pytanie dlaczego nie ReqTools:
1) ma dzialac tez pod MOSem.
2) ReqTools zle dobiera mi kolory otwierajac sie na wlasnym ekranie przez co np: katalogi wtapiaja sie w tlo.
Co powoduje ze sa niewidoczne (taka paleta wlasnego ekranu). Chyba ze ktos wie jak to rozwiazac.
[#2] Re: [C, ASL, OS3.x] Wybieranie plikow

@Phibrizzo, post #1

Ja używam funkcji AddPart() do łączenia ścieżki i nazwy pliku:

#include <string.h>
#include <libraries/asl.h>
#include <clib/dos_protos.h>

#define BUFOR 256

char bufor[BUFOR + 1];
struct FileRequester *fr;

strncpy(bufor, fr->fr_Drawer, BUFOR);
AddPart(bufor, fr->fr_File, BUFOR);
[#3] Re: [C, ASL, OS3.x] Wybieranie plikow

@Phibrizzo, post #1

Mam coś takiego, ASL, mam też prawie bliźniaczo podobną wersję z Reqtools.
Zainspirowałeś mnie, żeby sprawdzić obie wersje na MorphOSie

MODULE 'asl',
       'libraries/asl',
       'dos/dos',
       'utility/tagitem'

ENUM ERR_NONE, ERR_ASL, ERR_KICK, ERR_LIB

RAISE ERR_ASL  IF AllocAslRequest()=NIL,
/*      ERR_KICK IF KickVersion()=FALSE, */
      ERR_LIB  IF OpenLibrary()=NIL

CONST BUFFERSIZE=512, MYLEFTEDGE=0, MYTOPEDGE=0, MYWIDTH=320, MYHEIGHT=400, MAXFNLEN=108

DEF plik, filename[MAXFNLEN]:STRING

PROC main() HANDLE
  DEF fr:PTR TO filerequester, katalog[MAXFNLEN]:STRING
/*  KickVersion(37)  -> E-Note: requires V37 */
  aslbase:=OpenLibrary('asl.library',0)
  fr:=AllocAslRequest(ASL_FILEREQUEST,
                     [ASL_HAIL,       'Wybierz plik mbx',
                      ASL_HEIGHT,     MYHEIGHT,
                      ASL_WIDTH,      MYWIDTH,
                      ASL_LEFTEDGE,   MYLEFTEDGE,
                      ASL_TOPEDGE,    MYTOPEDGE,
/*                      ASL_OKTEXT,     'Ok',*/
                      ASL_CANCELTEXT, 'Cancel',
/*                      ASL_FILE,       'asl.library',*/
                      ASL_DIR,        'Ram:',
                      NIL])
  IF AslRequest(fr, NIL)

    StrCopy(filename,'',ALL)
    StrCopy(katalog,'',ALL)
    StrCopy(katalog,fr.drawer,ALL)
    AddPart(filename,katalog,MAXFNLEN)
    AddPart(filename,fr.file,MAXFNLEN)
    WriteF('Nazwa pliku: \s\n',filename)
  ELSE
    WriteF('Przerwanie uûytkownika\n')
  ENDIF
  wczytajmaile()
EXCEPT DO
  IF fr THEN FreeAslRequest(fr)
  IF aslbase THEN CloseLibrary(aslbase)
  SELECT exception
  CASE ERR_ASL;  WriteF('Error: Could not allocate ASL request\n')
  CASE ERR_KICK; WriteF('Error: Requires V37\n')
  CASE ERR_LIB;  WriteF('Error: Could not open ASL library\n')
  ENDSELECT
ENDPROC
1
[#4] Re: [C, ASL, OS3.x] Wybieranie plikow

@Skotos, post #3

Zabawa w budowanie ścieżki do pliku wymaga zaalokowania bufora, można sobie z góry założyć jakąś długość i – w dobie wielkich pojemności dysków i długich nazw – się zdziwić. Można też zaalokować bufor dynamicznie, licząc przewidywaną długość ścieżki przez strlen().

Stosuję inną metodę, w której bufor i AddPart() nie są potrzebne. Pseudokod:
  • lock = Lock(fr.drawer)
  • olddir = CurrentDir(lock)
  • file = Open(fr.file)
  • ... działam na pliku ...
  • Close(file)
  • CurrentDir(olddir)
  • Unlock(lock)


Ostatnia aktualizacja: 09.12.2022 08:12:01 przez Krashan
1
[#5] Re: [C, ASL, OS3.x] Wybieranie plikow

@Phibrizzo, post #1

Mam nadzieję że to widziałeś już link.
1
[#6] Re: [C, ASL, OS3.x] Wybieranie plikow

@Krashan, post #4

A da się gdzieś dostać informację od systemu plików jaka jest ustawiona maksymalna długość ścieżki/nazwy pliku?
[#7] Re: [C, ASL, OS3.x] Wybieranie plikow

@Phibrizzo, post #1

Co do reqtools i poprawnych kolorów prawdopodobnie to musisz skopiować trochę kolorów palety z ekranu "Workbencha" na swój ekran. Ja tak przynamniej robiłem w mojej grze MegaSaperPL (i działało to również na MorphOS) ...

ULONG publicColors[3 * 32];

GetRGB32(pPubScreen->ViewPort.ColorMap, 0, 32, &publicColors[0]);
LoadRGB32(&g_pGameScreen->ViewPort, source);

int i;
for (i = 0; i <= 8; i++)
    SetRGB32(&g_pGameScreen->ViewPort, i, publicColors[i * 3], publicColors[i * 3 + 1], publicColors[i * 3 + 2]);
for (i = 16; i <= 24; i++)
    SetRGB32(&g_pGameScreen->ViewPort, i, publicColors[i * 3], publicColors[i * 3 + 1], publicColors[i * 3 + 2]);
[#8] Re: [C, ASL, OS3.x] Wybieranie plikow

@Krashan, post #4

To trochę stary kod, i tak, były problemy z buforem, nie mogłem ustawić sobie dowolnego, choć myślę, że to kompilator robił problem.

Przybliż mi ten pomysł. Dlaczego zachowujesz a potem "oddajesz" stary katalog?
Na sztywno ustawiałem RAM: lub częściej PROGDIR:, w końcu asl requester po to aby user poszukał pliku.


lock = Lock(fr.drawer)
olddir = CurrentDir(lock)


@pisklak
Stare systemy miały 108 znaków na nazwę pliku, i nie pamiętam ile na katalog (chyba do kicka v37).
[#9] Re: [C, ASL, OS3.x] Wybieranie plikow

@asman, post #5

Tego linka nie znalem. Dzieki

@Rafael:
Klopot polega na tym ze paleta jest juz ustalona i pierwszych 64 kolorow nie moge juz zmieniac.

Edit:
Chyba ze.... Cos mi przyszlo do glowy jeszcze. Ale najpierw sprobuje ASL.

Ostatnia aktualizacja: 09.12.2022 17:13:25 przez Phibrizzo
[#10] Re: [C, ASL, OS3.x] Wybieranie plikow

@asman, post #5

A czy ktos sie orientuje jaki tag nalezy dodac aby Req pojawil sie na ekranie uruchomionego programu a nie na WB?
Jesli chce uzyc tagow ASLFR_Window lub ASLFR_Screen to dostaje blad kompilacji:

"Invalid constatn expression" (SAS/C).

A ALSFR_PubScreenName nie dziala.
[#11] Re: [C, ASL, OS3.x] Wybieranie plikow

@Phibrizzo, post #10

Użyj ASL_Window, tu masz przykładzik link
[#12] Re: [C, ASL, OS3.x] Wybieranie plikow

@Phibrizzo, post #9

No a nie możesz po prostu chwilowo palety zmienić?
[#13] Re: [C, ASL, OS3.x] Wybieranie plikow

@Phibrizzo, post #10

Jesli chce uzyc tagow ASLFR_Window lub ASLFR_Screen to dostaje blad kompilacji:

"Invalid constatn expression" (SAS/C).

SAS/C nie dopuszcza inicjowania tablic wartościami innymi niż stałe.

Jeżeli używasz osobnej listy Tagów i dostajesz ten błąd kompilacji, to możesz zrobić to w następujący sposób:

W tablicy Tagów ustawiasz Tag ASLFR_Window, NULL.

A przed funkcją AllocAslRequest() lub AslRequest() dopisujesz funkcję z utility.library:

if (tag = FindTagItem(ASLFR_Window, taglist))
{
    tag->ti_Data = window;
}

Inna możliwość to użyć funkcji ze zmienną liczbę argumentów (varargs). Wtedy możesz sprecyzować wskaźnik do window bezpośrednio:

filerequest = AllocAslRequestTags(ASL_FileRequest, ASLFR_Window, window, ..., TAG_DONE);


Ostatnia aktualizacja: 09.12.2022 19:09:37 przez Hexmage960
[#14] Re: [C, ASL, OS3.x] Wybieranie plikow

@Hexmage960, post #13

Dzieki, pomoglo

@Pisklak:
Nie pomogolo.

@asman:
Dzieki to tez sie przydalo.

Swoja droga... z tymi kolorami w requesterach to jakas dziwna magia jest.
Czy tam sa w ogole jakies algorytmy dobierania kolorow zeby czarnym po czarnym nie malowal.
Na szczecie kozystam z MagicASL i dopiero w MUI tego okna moglem cos pozmieniac zeby bylo uzywalne.


Ostatnia aktualizacja: 09.12.2022 21:10:14 przez Phibrizzo
[#15] Re: [C, ASL, OS3.x] Wybieranie plikow

@Phibrizzo, post #14

No jeśli zmiana części palety (w sumie to wystarczy zmienić 2 albo 1) przed wywołaniem requestera nic nie pomaga to faktycznie coś dziwnego musi się tu dziać. Zakładam że program nie bawi się w np. przerwaniu VBL kolorami palety.... Bo samo ASL palety raczej nie dotyka.
[#16] Re: [C, ASL, OS3.x] Wybieranie plikow

@pisklak, post #15

Myślę że jeśli masz wystarczająco kontrastujące kolory w palecie to być może SetAPen/SetBPen itp. funkcje mogą pomóc. Jak nie no to nie wyobrażam sobie innego sposobu jak właśnie chwilowa zmiana kolorów palety. Na mój mały pisklakowo-chłopski rozum to musi działać...
[#17] Re: [C, ASL, OS3.x] Wybieranie plikow

@pisklak, post #16

Problem definitywnie rozwiazany. Wystarczylo ustawic pisak HIGHLIGHTTEXETPEN.

Ostatnia aktualizacja: 10.12.2022 13:04:01 przez Phibrizzo
1
[#18] Re: [C, ASL, OS3.x] Wybieranie plikow

@Phibrizzo, post #17

No i super! Na przyszłość postaram też o tym pamiętać. A to w tagach samego ASL jest czy gdzieś indziej?
[#19] Re: [C, ASL, OS3.x] Wybieranie plikow

@pisklak, post #18

Nie. Jest to jeden z predefimniowanych systemowych pisakow. W sumie jest ich 12.
Ale trzy z nich doszly dopiero od systemu 3.0.
[#20] Re: [C, ASL, OS3.x] Wybieranie plikow

@Phibrizzo, post #19

Tak głupio pytałem bo miałem nadzieję że jak w tagach samej ASL to ona zajmie się ewentualną zmianą i przywracaniem ostatniej wartości tego pisaka.
[#21] Re: [C, ASL, OS3.x] Wybieranie plikow

@Skotos, post #8

Dlaczego zachowujesz a potem "oddajesz" stary katalog?
Ponieważ jeżeli program zostanie uruchomiony z shella, to - gdybym tego nie zrobił - po jego zakończeniu katalog bieżący będzie inny niż przed. Może to być niewygodne i zaskakujące dla użytkownika. Przy uruchamianiu z ikony możnaby tego nie robić. CurrentDir() zmienia katalog bieżący procesu, w ten sposób można nawet samemu sobie w kodzie podstawić nogę, bo wszystkie odwołania do plików z względnymi ścieżkami (bez urządzenia/wolumenu na początku) są względem katalogu bieżącego.

Drugi powód, to trzymanie porządku w lockach. CurrentDir() wymaga utrzymania locka na katalog, co jest logiczne, bo gdy inny proces np. skasowałby nasz katalog bieżący, to mogłoby to być niewygodne... Z drugiej strony, gdy katalog już nie jest bieżący, wypadałoby locka zdjąć, inaczej po zakończeniu się naszego programu lock zostanie i nie da się skasować tego katalogu aż do restartu Amigi.

Ostatnia aktualizacja: 12.12.2022 08:07:20 przez Krashan
1
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