21/7/09

Gambas = Basic σε Linux

Ρε τι κάνει ο ανθρωπος πρώτη μέρα διακοπών! Αντι να πάω για μπάνιο κάθομαι και παίζω με παλαιές γλώσσες.
Είδα λοιπόν λίγο τα περιβάλλοντα εργασίας του Linux για προγραμματισμό μιας και δεν τα έχω ακουμπήσει καιρό κάποια από αυτά ... αναφέρομαι στα Kdevelop, Monodevelop και Gambas.
Εφτιαξα μια μικρή παραλαγή της εφαρμογή εορτολογίου που είχα κατεβάσει και εγκαταστήσει λίγο παλαιότερα (το εορτολόγιo screenlet που έφτιαξε ο Μισδανίτης Δημήτρης από το http://code.google.com/p/eortologio/) ύστερα από την εμφάνιση του στο linux format.
Διάβασα τον κώδικα και εφόσον δεν κάνει τίποτα τρομερό είπα να το κάνω μια παραλλαγή της εφαρμογής δοκιμάζοντας τις λειτουργίες του Gambas.
Αναπωλήσα ! Αχ αυτή η Βasic ... . πολυ όμορφο πράγμα οι αναμνήσεις ... μονο REM δεν έγραψα! To gambas θα σας θυμίσει πάντως την M$ Visual Basic απο 3 εως 6 ....

Αντε να δούμε τώρα πως θα είναι η υπερπίδηση στο MonoDevelop και το εντυπωσιακότατο QT creator της Nokia λέει.

Για όσους ενδιαφέρονται να δούν πως παίζει στο gambas ακολουθεί ο κώδικας. Απλά φτιάξτε τα παρακάτω τρία controls (ένα calendar-DateChooser1 , ένα listbox-lstGiortes και ένα κουμπί-btnPasxa) το ένα κάτω απο το άλλο σε μια φόρμα.

http://rapidshare.com/files/259130716/eortologioGAMBAS.tar.gz




' Gambas class file
STATIC PUBLIC kinites AS String[] = ["-70", "Τελώνου και Φαρισαίου - Αρχή Τριωδίου", "-63", "Του Ασώτου", "-59", "Τσικνοπέμπτη", "-56", "Της Απόκρεω", "-49", "Τυροφάγου", "-48", "Καθαρά Δευτέρα", "-43", "Αγίου Θεοδώρου (Θεόδωρος, Θεοδώρα, Δώρα, Ντόρα, Θόδωρος, Θοδώρα, Θοδωρής, Θοδωράκης, Θώδης, Θώδος, Δώρης)", "-42", "Κυριακή της Ορθοδοξίας (Ορθοδοξία, Λωξάνδρα, Λωξάντρα, Ρωξάνη)", "-35", "Γρηγορίου του Παλαμά (Γρηγόριος, Γρηγόρης, Γρηγορία, Γόλης) (σημείωση: εορτάζεται και στις 14 Νοε)", "-8", "Σάββατο του Λαζάρου (Λάζαρος, Λάζος)", "-7", "Κυριακή των Βαίων (Βάϊος, Βάϊα, Βάγια, Βαία, Δάφνη)", "-6", "Μεγάλη Δευτέρα (Πάγκαλος)", "-5", "Μεγάλη Τρίτη", "-4", "Μεγάλη Τετάρτη", "-3", "Μεγάλη Πέμπτη", "-2", "Μεγάλη Παρασκευή", "-1", "Μεγάλο Σάββατο", "0", "ΤΟ ΑΓΙΟ ΠΑΣΧΑ (Αναστάσιος, Αναστασία, Τάσος, Αναστάσης, Ανέστης, Λάμπρος, Λαμπρινή, Λαμπρίνα, Πασχάλης, Πασχαλίνα, Λίνα, Στασινός)", "+1", "2α Διακαινησίμου - Δευτέρα", "+2", "3η Διακαινησίμου - Τρίτη (Λαμπροτρίτη) - (Ραφαήλ, Νικόλαος και Ειρήνη Αγιοι Μυτιλήνης)", "+3", "4η Διακαινησίμου - Τετάρτη (Θεοχάρης)", "+4", "5η Διακαινησίμου - Πέμπτη", "+5", "Ζωοδόχου Πηγής Πηγή, Κρήνη, Κρηνιώ, Ζήσης, Ζησούλα, Ζήσιμος, Ζωή, Ζώης, Ζωϊτσα, Ζωζώ, Παναγιώτης, Πάνος, Πανούσος, Παναγής, Πανάγος, Γιώτης, Παναγιώτα, Γιώτα, Παναγιούλα, Γιούλα, Παναγούλα", "+6", "7η Διακαινησίμου - Σαββάτο", "+7", "Του Θωμά (Θωμάς, Θωμαή, Τόμας)", "+14", "Των Μυροφόρων (Μυροφόρα)", "+39", "Ανάληψη του Χριστού (Νεφέλη)", "+49", "Πεντηκοστή", "+50", "Αργία: Αγ. Πνεύματος (Τριάδα, Τριάς, Κόρη, Κορίνα, Κορίνος)", "+56", "Αγίων Πάντων"]
PUBLIC pathOfData AS String = "/home/agelos/Development/Gambas/testOfGambas/eortes.dat"
PUBLIC SelectedDate AS Date

PUBLIC SUB _new()

END

PUBLIC SUB Form_Open()
DateChooser1.Value = Now
LoadGiortes
END
PUBLIC SUB Form_Resize()
ME.Text = "Εορτολόγιο"
DateChooser1.Left = 5
DateChooser1.Width = DateChooser1.Parent.Width - 10
DateChooser1.Top = 5
DateChooser1.Height = DateChooser1.Parent.Height / 2 - 100 - 10

lstGiortes.Left = 5
lstGiortes.Width = DateChooser1.Parent.width - 10
lstGiortes.Top = DateChooser1.Top + DateChooser1.Height + 5
lstGiortes.Height = DateChooser1.Parent.Height / 2 + 100 - btnPasxa.Height - 10

btnPasxa.Left = 5
btnPasxa.Width = btnPasxa.Parent.width - 10
btnPasxa.Top = lstGiortes.Top + lstGiortes.Height + 5
'btnPasxa.Height = 100

END

PUBLIC SUB btnPasxa_Click()
DIM PasxaDate AS Date
DIM day1 AS Integer
DIM month1 AS Integer
DIM year1 AS Integer
DIM diafora AS String
DIM thisDate AS Date = DateChooser1.Value
SelectedDate = DateChooser1.Value
PasxaDate = CalculatePasxaDate(Year(SelectedDate))
day1 = Day(PasxaDate)
month1 = Month(PasxaDate)
year1 = Year(PasxaDate)

diafora = posoApexoumeApoPasxa(day1, month1, year1, thisDate)
lstGiortes.Clear()
lstGiortes.Add("Ημερομηνία Πάσχα: " & PasxaDate)
lstGiortes.Add("Απέχουμε απο το Πάσχα: " & diafora & " ημέρες")

lstGiortes.Add("Το πάσχα το " & year1 & " πέφτει στις " & Day(PasxaDate) & "/" & Month(PasxaDate))

END


PUBLIC SUB DateChooser1_Change()
LoadGiortes

END

PUBLIC SUB LoadGiortes()

DIM strStatic AS String[]
DIM StrGiorth AS String
DIM KinitesGiortes AS String[]

lstGiortes.Clear()
lstGiortes.Add("Ημερομηνία : " & DateChooser1.Value)

strStatic = StaticGiortesonDate(DateChooser1.Value)
KinitesGiortes = KinitesGiortesonDate(DateChooser1.Value)
IF strStatic.Count > 0 OR KinitesGiortes.count > 0 THEN
lstGiortes.Add("Σήμερα Γιορτάζουν :")
ELSE
lstGiortes.Add("Σήμερα δεν γιορτάζει κανείς")
END IF


IF strStatic.Count = 0 THEN
'lstGiortes.Add("-------- Δεν υπάρχουν Σταθερές Εορτές--------")
ELSE
'lstGiortes.Add("-------- Σταθερές --------")
FOR EACH StrGiorth IN strStatic

lstGiortes.Add(StrGiorth)
NEXT
END IF


IF KinitesGiortes.Count = 0 THEN
'lstGiortes.Add("-------- Δεν υπάρχουν Κινητές Εορτές--------")
ELSE
'lstGiortes.Add("-------- Κινητές --------")
FOR EACH StrGiorth IN KinitesGiortes
lstGiortes.Add(StrGiorth)
NEXT
END IF


END


PUBLIC FUNCTION KinitesGiortesonDate(DateSelected AS Date) AS String[]
DIM res AS NEW String[]
DIM kinith AS String
DIM iKinithDiaforaGiorths AS Integer
DIM iKinith AS Integer

DIM day1 AS Integer
DIM month1 AS Integer
DIM year1 AS Integer
DIM diaforaHmerwnApoPasxa AS Integer

day1 = Day(DateSelected)
month1 = Month(DateSelected)
year1 = Year(DateSelected)

diaforaHmerwnApoPasxa = posoApexoumeApoPasxa(day1, month1, year1, DateSelected)
'res.Add("Διαφορά ημερών απο το πάσχα :" & diaforaHmerwnApoPasxa)
FOR iKinith = 0 TO kinites.Count - 1 STEP 2 'πάρε ανα δυο τα νούμερα
iKinithDiaforaGiorths = kinites[iKinith]
'res.Add(iKinithDiaforaGiorths & " " & diaforaHmerwnApoPasxa)
IF diaforaHmerwnApoPasxa = iKinithDiaforaGiorths THEN
res.Add(kinites[iKinith + 1])
END IF
NEXT
RETURN res
END

PUBLIC FUNCTION StaticGiortesonDate(DateSelected AS Date) AS String[]
DIM res AS NEW String[]
DIM MyDay AS Integer
DIM myMonth AS Integer
DIM myYear AS Integer
DIM arr_strings AS String[]

DIM LineCheckisANewDate AS Boolean = FALSE
DIM strToCheck AS String
DIM numOfLines AS Integer
DIM iLineCounter AS Integer
DIM foundIandAfter AS Integer
DIM thisSTR AS String
DIM foundSTR AS String
DIM found AS Boolean = FALSE

MyDay = Day(DateSelected)
myMonth = Month(DateSelected)
myYear = Year(DateSelected)

'lstGiortes.Clear()
'res.Add("Ημέρα: " & MyDay)
'res.Add("Μήνας: " & myMonth)
'res.Add("Χρονιά: " & myYear)

arr_strings = Split(File.LOAD(pathOfData), "\n")
numOfLines = arr_strings.Count


strToCheck = MyDay & "/" & myMonth & " : "
'res.Add(strToCheck)


FOR iLineCounter = 0 TO numOfLines - 1
thisSTR = arr_strings[iLineCounter]
IF Comp(strToCheck, thisSTR) = 0 THEN
'lstGiortes.Add(strToCheck & " -- >" & thisSTR)
FOR foundIandAfter = iLineCounter + 1 TO numOfLines - 1
foundSTR = arr_strings[foundIandAfter]
IF Comp(Right$(foundSTR, 2), ": ") = 0 THEN
EXIT
ELSE
'foundSTR = Replace(foundSTR, " ", "")
foundSTR = Trim(foundSTR)
res.Add(foundSTR)
found = TRUE
END IF
NEXT
END IF
IF found THEN
'res.Add("Found and quiting")
EXIT
END IF

NEXT

RETURN res
END

'epistrefei 1 an einai disekto etos k 0 an den einai
PUBLIC FUNCTION IsLeapYear(aYear AS Integer) AS Boolean
IF (((aYear MOD 4 == 0) AND (aYear MOD 100 <> 0)) OR (aYear MOD 400 == 0)) THEN
RETURN TRUE
END IF
RETURN FALSE
END

'H sinartisi epistrefei ton arithmo ton imeron tou mina
PUBLIC FUNCTION howManyDays(aMonth AS Integer, aYear AS Integer) AS Integer
IF aMonth == 2 THEN
IF IsleapYear(aYear) == 1 THEN
RETURN 29
END IF
RETURN 28
END IF
IF (aMonth == 4) OR (aMonth == 6) OR (aMonth == 9) OR (aMonth == 11) THEN
RETURN 30
END IF
RETURN 31
END

'#epistrefei pote einai TO pasxa
PUBLIC FUNCTION CalculatePasxaDate(aYear AS Integer) AS Date
DIM pasxa_month AS Integer = 4
DIM pasxa_day AS Integer
DIM mndays AS Integer
DIM returnPasxaDate AS Date
pasxa_day = ((19 * (aYear MOD 19) + 16) MOD 30) + ((2 * (ayear MOD 4)) + (4 * (ayear MOD 7)) + (6 * ((19 * (ayear MOD 19) + 16) MOD 30))) MOD 7 + 3

mndays = howManyDays(pasxa_month, aYear)

IF pasxa_day > mndays THEN
pasxa_day -= mndays
pasxa_month = pasxa_month + 1
END IF

returnPasxaDate = Date(ayear, pasxa_month, pasxa_day, 0, 0, 0)
RETURN returnPasxaDate
END FUNCTION




'#poso apexei h dothisa Date apo TO pasxa
PUBLIC FUNCTION posoApexoumeApoPasxa(day1 AS Integer, month1 AS Integer, year1 AS Integer, thisDate AS Date) AS Integer
DIM dateOfPasxa AS Date = CalculatePasxaDate(Year(thisDate))
DIM diafora AS Integer
' DIM pasxa_month AS Integer = Year(dateOfPasxa)
' DIM pasxa_day AS Integer = Day(dateOfPasxa)
' DIM dm AS Integer
' DIM metr AS Integer
' IF month1 < diafora =" howManyDays(month1," dm =" pasxa_month" metr =" dm"> 0
' diafora = diafora + howManyDays(pasxa_month - metr, year1)
' metr = metr - 1
' WEND
' diafora = (diafora + pasxa_day) * (-1)
' ELSE
' IF month1 > pasxa_month THEN
' diafora = day1
' dm = Int(month1) - Int(pasxa_month)
' metr = dm - 1
' WHILE metr > 0
' diafora = Int(diafora) + Int(howManyDays(pasxa_month + metr, year1))
' metr = metr - 1
' WEND
' diafora = diafora + (howManyDays(pasxa_month, year1) - pasxa_day)
' ELSE IF month1 == pasxa_month THEN
' diafora = day1 - pasxa_day
' END IF
' END IF

diafora = DateDiff(thisDate, dateOfPasxa, gb.day)
'PRINT thisDate
'PRINT dateOfPasxa
'PRINT DateDiff(thisDate, dateOfPasxa, gb.Day)
RETURN diafora
END FUNCTION


6 σχόλια:

psposito είπε...

Το αρχείο έχει εξαφανιστεί στο rapidshare.

Ακολούθησα τις οδηγίες & έφτιαξα το form σε gambas.

Το eortes.dat πού μπορώ να το βρώ?

Άγγελος Παναγιωτάκης είπε...

Ευγε τέκνον!
θα το βρείς στον πηγαίο του http://code.google.com/p/eortologio/

psposito είπε...

Ξαναχάθηκε το αρχείο. Συγγνώμη αλλά έπαθε άσχημο crash το μηχανημά μου...

Μπορείς να μου πείς, πού θα το βρώ;

Άγγελος Παναγιωτάκης είπε...

ηταν παλιο το repository
θα το μεταφέρω εκεί
https://github.com/agelospanagiotakis/eortologio/

psposito είπε...

Άκυρο, τα κατάφερα τελικά.

psposito είπε...

Καλησπέρα, Μήπως το έβαλες το αρχείο εκεί;