kategoria: Programy
[#91] Re: Pakowanie danych do kilku plików

@Don_Adan, post #89

Napisałem to tak:
;WYBIERAMY WERSJE DO INSTALACJI
(set #wersja
 (askchoice
  (prompt "Select a version of LHA for You")
  (help "Version must be compatible with Your CPU")
  (choices
   "LHA 1.50r with keyfile"
   "LHA 2.10"
   "LHA 2.15 for 68000"
   "LHA 2.15 for 68020"
   "LHA 2.15 for 68040"
  )
  (default 2)
 )
)

;WYBIERAMY SCIEZKE INSTALACJI - POZNIEJ I TAK BEDZIE "SYS:C/"
(set #dest
 (askdir
  (prompt "Select a drawer to install files")
  (help "Select a drawer to install files")
  (default "RAM:")
 )
)

;USTAWIAMY NAZWE KOPIOWANEGO PLIKU
(set #plik
 (select #wersja 
 "LHA_1.50r"
 "LHA_2.10"
 "LHA_68k"
 "lha_68020"
 "lha_68040"
 )
)

;KOPIUJEMY KONKRETNY PLIK
(copyfiles
 (source #plik)
 (dest #dest)
)

;JESLI ISTNIEJE PLIK "LHA" TO GO USUWAMY, BO NIE ZMIENIMY NAZWY PLIKU
(if =0 (exists (tackon #dest "LhA"))
 (delete (tackon #dest "LhA"))
)

;ZMIENIAMY NAZWE SKOPIOWANEGO PLIKU NA "LhA"
(rename (tackon #dest #plik) (tackon #dest "LhA"))

;SZYBKIE WYJSCIE
(exit (quiet))


Teraz działa tak, jakbym chciał. Nie wiem, dlaczego If mi ciągle płatał figle. Później jeszcze chciałbym dopisać warunek dla wersji LHA 1.50r, żeby kopiował plik z kluczem oraz zmienić #dest na "SYS:C/".

Jeśli będę mieć jakieś pytania, to będę pytać
[#92] Re: Pakowanie danych do kilku plików

@tukinem, post #91

Porada praktyczna, często używane wyrażenia umieszczaj w zmiennych. Na przykład trzy razy masz użyte
(tackon #dest "LhA")
Możesz zrobić
(set #path_to_lha (tackon #dest "LhA"))
i potem trzy razy użyć zmiennej "#path_to_lha".
[#93] Re: Pakowanie danych do kilku plików

@tukinem, post #90

Skoro to w celach naukowych to co innego.
Ale o ile to jest systemowe "copy" to jest raczej na pewno mozliwe uzycie
copy lhaxxxx as c:lha
Dla mnie to prostsze i krotsze, choc nie lubilem tego typu instalatorow, bo czesto kopiowaly starsza wersje biblioteki/programu na nowsza.
Dobre instalatory to sprawdzaly zainstalowana juz wersje w systemie i sie pytaly.
Ogolnie to ja sobie z tym poradzilem zmieniajac bity protekcji waznych plikow z RWED na R-E-
1
[#94] Re: Pakowanie danych do kilku plików

@Krashan, post #92

Faktycznie masz rację. Zbyt często powielam tą samą funkcję.

Powiedz mi jeszcze jak poprawnie zapisać np If #wersja = 0 Then ... . Chodzi mi o przyrównanie zmiennej #wersja do 0 bo póki co, to za każdym razem mi działa że jest równa 0 więc źle to zapisałem. Może bez znaku = trzeba?
[wyróżniony] [#95] Re: Pakowanie danych do kilku plików

@tukinem, post #94

Powiedz mi jeszcze jak poprawnie zapisać np If #wersja = 0 Then ...
(if <warunek> <zrób_to_jeżeli_prawdziwy> <zrób_to_jeżeli_fałszywy>)
Natomiast warunek zapisujemy tak:
(<operator> <wartość1> <wartość2>)
Zbierając to wszystko w całość, sprawdzenie czy #wersja jest równa 0 i zrobienie wtedy czegoś będzie wyglądało tak:
(if (= #wersja 0) <zrób_dla_wersji_0>)
[#96] Re: Pakowanie danych do kilku plików

@Krashan, post #95

(if (= #wersja 0) <zrób_dla_wersji_0>)
A no właśnie tego nie mogłem w kursie Installera znaleźć
[#97] Re: Pakowanie danych do kilku plików

@tukinem, post #96

;WYBIERAMY WERSJE DO INSTALACJI
(set #wersja
 (askchoice
  (prompt "Select a version of LHA for You")
  (help "Version must be compatible with Your CPU")
  (choices
   "LHA 1.50r with keyfile"
   "LHA 2.10"
   "LHA 2.15 for 68000"
   "LHA 2.15 for 68020"
   "LHA 2.15 for 68040"
  )
  (default 2)
 )
)

(set #dest "SYS:C/")
(set #destplik (tackon #dest "LhA"))

;USTAWIAMY NAZWE KOPIOWANEGO PLIKU
(set #plik
 (select #wersja 
 "LHA_1.50r"
 "LHA_2.10"
 "LHA_68k"
 "lha_68020"
 "lha_68040"
 )
)

;KOPIUJEMY KONKRETNY PLIK
(copyfiles
 (source #plik)
 (dest #dest)
)

;JESLI ISTNIEJE PLIK "LHA" TO GO USUWAMY, BO NIE ZMIENIMY NAZWY PLIKU
(if (= 1 (exists #destplik))
 (delete #destplik)
 (message "File not exists")
)

;ZMIENIAMY NAZWE SKOPIOWANEGO PLIKU NA "LhA"
(rename (tackon #dest #plik) #destplik)

;KOPIUJEMY KLUCZ
(if (= #wersja 0)
 (copyfiles
  (source "LhA.key")
  (dest "SYS:L/")
 )
)

;SZYBKIE WYJSCIE
(exit (quiet))


Tu są dwie sekwencje z If. Czy obie są prawidłowe? Na pewno obie działają tak, jak chcę, ale czy zapis może być i taki i taki? Chodzi o kolejność:
(If (= 1 #zmienna)
)
(If (= #zmienna 1)
)
[#98] Re: Pakowanie danych do kilku plików

@tukinem, post #97

Tu są dwie sekwencje z If. Czy obie są prawidłowe? Na pewno obie działają tak, jak chcę, ale czy zapis może być i taki i taki? Chodzi o kolejność:
Tu kolejność nie ma znaczenia, bo operator "=" jest przemienny. Czyli jeżeli a = b, to również b = a. Z operatorem nieprzemiennym różnica już jest, np.
(> 1 #zmienna)
(> #zmienna 1)
nie oznaczają tego samego warunku.

Przy okazji, porównanie przy "exists" jest nadmiarowe. Można napisać
(if (exists #file) ...)


Ostatnia aktualizacja: 21.04.2024 10:10:58 przez Krashan
[#99] Re: Pakowanie danych do kilku plików

@Krashan, post #98

To dobrze.

Wolałem spytać, bo w basicu różnica jest między
If A=1

a:
If 1=A ; kod bez sensu
[#100] Re: Pakowanie danych do kilku plików

@tukinem, post #99

Kurczę, fajna zabawka.

Mam kolejne pytanie:
Skoro instrukcja warunkowa działa tak: (if (warunek) (działanie) (działanie gdy warunek niespełniony) ),
to mając kilka komend przy spełnionym warunku muszę sprawdzać go za każdym razem? Czy trzeba je brać w nawiasy? Przykład:
(if (warunek)
  (
    (dzialanie1)
    (dzialanie2)
    (dzialanie3)
  )
  (
    (dzialanieELSE1)
    (dzialanieELSE2)
    (dzialanieELSE3)
  )
)

Czy taki zapis jest poprawny? Bo jeśli nie, to tu dam przykład jak napisałem sobie instalację Birdie wraz z dodaniem wpisu do user-startup:
(set #source "Birdie")
(set #dest "SYS:C/")
(set #question "Do you want to setup Birdie in User-Startup?")

;KOPIUJE PLIK BIRDIE
(copyfiles
  (source #source)
  (dest #dest)
)

;PYTANIE O PIERWSZE USTAWIENIE PROGRAMU
(set #choice
  (askchoice
    (prompt #question)
    (help #question)
    (choices "Yes" "No")
    (default 0)
  )
)

;JESLI TAK TO WYBIERAMY PIERWSZY IFF DLA AKTYWNEGO OKIENKA
(if (= #choice 0)
  (set #iff1
    (askfile
      (prompt "Select IFF for active pattern")
      (help "Select IFF for active pattern")
      (default "SYS:")
    )
  )
)

;JESLI TAK TO WYBIERAMY DRUGI IFF DLA NIEAKTYWNYCH OKIENEK
(if (= #choice 0)
  (set #iff2
    (askfile
      (prompt "Select IFF for non-active pattern")
      (help "Select IFF for non-active pattern")
      (default (pathonly #IFF1))
    )
  )
)

;USTAWIAM ZMIENNA TEKSTOWA DO WPISU W USER-STARTUP
(set #us ("Run >NIL: C:Birdie %s %s Activepattern" #IFF1 #IFF2))

;ZNOWU JESLI TAK TO DODAJE WPIS DO USER-STARTUP
(if (= #choice 0)
  (startup "Birdie" 
    (prompt "Birdie sequence")
    (help "Adding user-startup sequence for Birdie")
    (command #us)
  )
)


Ten kod działa poprawnie, aczkolwiek 3x sprawdzam czy zmienna #choice jest równa 0.
[#101] Re: Pakowanie danych do kilku plików

@tukinem, post #100

(if (warunek)
  (
    (dzialanie1)
    (dzialanie2)
    (dzialanie3)
  )
  (
    (dzialanieELSE1)
    (dzialanieELSE2)
    (dzialanieELSE3)
  )
)
Czy taki zapis jest poprawny?

Tak, jest poprawny. W Installerze można też tworzyć procedury i to nawet z argumentami, chociaż ma to sens, jeżeli dany blok instrukcji jest wykonywany więcej niż raz. Mechanizm procedur ma jednak swoje ograniczenia, np. nie ma zmiennych lokalnych dla procedury.
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