[#1]
Re: Directory Opus Magellan: Filetype ADF, czyli obrazy amigowych dyskietek
"I zadanie dla bardziej zaawansowanych użytkowników Magellana, a jednocześnie pomysł na ulepszenie. Załóżmy, że mamy otwarty lister/okno z zawartością jakiegoś zamontowanego obrazu ADF. Dobrze by było, aby ten lister ulegał zamknięciu równocześnie wraz z usunięciem tego dysku."
[url= http://aminet.net/package/biz/dopus/DiskRemove]Aminet jest odpowiedzią na wszystkie pytania[/url] ;)
-------------------------------------------------------------------------------------------------------
"Kto pierwszy wpadnie na pomysł co i jak należy zrobić, by Magellan jednoznacznie rozpoznawał - powiedzmy - cztery napędy wirtualne i usuwał lub umieszczał w nich obrazy ADF?"
O! Ja! Mogę ja? ;)
Na początku ostrzegam - nie używałem Magellana od lat i niewiele pamiętam, a nawet nie mam jak tego sprawdzić (musiałbym go zainstalować) - więc to takie teoretyzowanie na sucho będzie...
Pomysł na "karuzelę" - czyli montujemy obrazy kolejno w napędach AD0: do AD3:
Tworzymy skrypt ADOS o nazwie np. Karuzela_z_ADFami, ;) który zapisujemy w C: (nie zapomnieć dodać mu flagi S). Zawartość skryptu:
----------------------------------------
GetENV ADFUnit >NIL:
IF WARN
SetENV ADFUnit 0
SetENV ADFDevice AD0:
ELSE
EVAL $ADFUnit + 1 TO ENV:ADFUnit
SetENV ADFDevice AD$ADFUnit:
IF $ADFUnit GE 4
SetENV ADFUnit 0
SetENV ADFDevice AD0:
ENDIF
ENDIF
Copy ENV:ADF#? TO ENVARC: QUIET
----------------------------------------
Co robi skrypt: Na początku (GetENV ADFUnit >NIL:) sprawdza, czy już korzystaliśmy z niego (skryptu) - czyli, czy montowaliśmy już coś w ADx:. Jeżeli nie (IF WARN), to tworzy zmienne ADFUnit i ADFDevice, i przypisuje im wartości 0 oraz AD0:.
Jeżeli skrypt był już wywoływany (ELSE), to zwiększa wartość zmiennej ADFUnit o jeden (EVAL $ADFUnit + 1 TO ENV:ADFUnit) oraz synchronizuje z nią zmienną ADFDevice (SetENV ADFDevice AD$ADFUnit:).
Jeżeli wartość zmiennej ADFUnit w wyniku dodawania osiągnie wartość równą lub większą od 4, to następuje reset zmiennych, czyli ustawienie ich wartości na 0 dla ADFUnit oraz AD0: dla ADFDevice.
2x ENDIF to zakończenie warunku.
Na koniec (opcjonalnie) kopiujemy zmienne z ENV: do ENVARC, dzięki czemu "karuzela" staje się odporna na reset (po resecie ostatnie wartości zmiennych zostaną przywrócone, a co za tym idzie montowanie obrazów w napędach będzie kontynuowane od ostatniego użytego napędu a nie od zerowego). Jak już pisałem, jest to opcjonalna funkcja skryptu - mająca sens wyłącznie w przypadku, gdy opisywany pakiet również potrafi przeżyć reset. Jeżeli nie (jeżeli automatycznie nie montuje po resecie obrazów ADF), to linijkę "Copy ENV:ADF#? TO ENVARC: QUIET" należy usunąć.
Następnie należy zmodyfikować funkcję
Function:
AmigaDOS C:Karuzela_z_ADFami
AmigaDOS RemoveDisk UNIT $ADFUnit
AmigaDOS Diskchange $ADFDevice
AmigaDOS C:InsertDisk UNIT $ADFUnit {f}
Command ScanDir $ADFDevice
AmigaDOS DiskChange $ADFDevice
AmigaDOS Play16 DOpus5:Sounds/RELOAD.WAV
Flags: Run asynchronously
Pytanie tylko, czy "Command ScanDir $ADFDevice" zabangla