Τρίτη 15 Μαρτίου 2016

Αναθεώρηση 190 - Περισσότερα Στοιχεία ελέγχου!

Συνάμα με τα στοιχεία που πρόσθεσα έκανα και μερικές βελτιώσεις, όπως για παράδειγμα η εναλλαγή παραθύρων γίνεται με το Ctrl+Tab, και το Alt+F4 κλείνει τα παράθυρα (μπορεί κανείς να βάλει ένα Unload Event και να κόψει το κλείσιμο).

Πολλές προσθήκες. Δεν χρειάζεται να βάζουμε την συνάρτηση που παίρνει και στέλνει τα μηνύματα από τα γεγονότα. Στην ουσία το σύστημα κάνει Bypass της κλήσης ενδιάμεσης ρουτίνας και εκτελεί άμεσα τα γεγονότα όπως εκείνα που επιστρέφουν τιμές στο αντικείμενο που πυροδοτεί τα γεγονότα.

Σε προηγούμενα παραδείγματα είχαμε παράθυρα που είχαν γραμμές και την "κονσόλα", τη βασική οθόνη της Μ2000 που έγραφε τα μηνύματα από τα γεγονότα. Τώρα θα το δούμε αλλιώς! Έχουμε γραφικά στην Οθόνη πίσω από τα παράθυρα και κείμενο που ολισθαίνει στα παράθυρα!

Θα δούμε τέσσερα στοιχεία ελέγχου (ένα από αυτά είναι παραλλαγή άλλου).


  • TextBox, γράφουμε σε μια γραμμή, κάνουμε επικόλληση αλλά όχι αντιγραφή. Η επικόλληση αλλάζει το μέρος των δεδομένων. Μπορούμε να έχουμε κάτι στην αρχή όπως μια λέξη  και κάτι στο τέλος όπως μονάδες. Αυτά δεν πειράζονται. Μπορούμε σε κάθε αλλαγή να κοιτάμε στο γεγονός ValidString() τι αλλαγή έχουμε και αν θέλουμε την κάνουμε αποδεκτή ή όχι, δηλαδή αλλάζουμε την νέα τιμή με την παλιά. Αυτά γίνονται πριν ο χρήστης δει να εμφανίζεται αυτό που πληκτρολόγησε (άρα γίνεται να μην το δει καθόλου). Εξ ορισμού έχει 50 χαρακτήρες μαζί με τους χαρακτήρες αρχής και τέλους.
  • TextBox ως Spinner,για αριθμητικές τιμές. Η τιμή αλλάζει με βελάκια, με γράψιμο, με μπάρα ολίσθησης. Και εδώ έχουμε στην αρχή και στο τέλος χαρακτήρες που θέλουμε
  • CheckBox Έχουμε δυο καταστάσεις, αλλά έχουμε και την δυνατότητα να στέλνουμε μήνυμα με την τρέχουσα κατάσταση, με ολίσθηση δεξιά ή με enter.
  • Button, Όταν τα επιλέγουμε αλλάζουν χρώμα, με διπλό κλίκ, με enter ή με απλή ολίσθηση δεξιά σκανδαλίζονται.
Μπήκαν και άλλες ευκολίες οι οποίες δεν θα αναπτυχθούν εδώ. Μια από αυτές όμως είναι σημαντική. Έφτιαξα την Val() η οποία γυρίζει σε αριθμό, έναν αριθμό σε αλφαριθμητικό, ώστε να δουλεύει με όποιο σύμβολο δεκαδικών ισχύει., αλλά και με δεύτερη παράμετρο, το σύμβολο που θέλουμε εμείς.  Έτσι αν έχουμε κόμμα για δεκαδικά τότε δουλεύει και με κόμμα και με τελεία.
Print val("10,2"), val("10.2"), val("10&2","&")
Σε υπολογιστή που έχει οριστεί το κόμμα για δεκαδικά η παραπάνω εντολή θα δώσει τρεις φορές το ίδιο ακρινώς: 10,2 10,2 10,2
Η Val() στα Ελληνικά είναι Τιμή() και Αξία() έχει δηλαδή δυο μορφές.

Η εντολή Eval( ) ή Έκφρ()όμως που παίρνει παράσταση θέλει πάντα με τελεία, τα δεκαδικά. Για να γυρίσουμε σε αλφαριθμητικό έναν δεκαδικό με σίγουρη την τελεία ως διαχωριστικό, τότε χρησιμοποιούμε την Str$() ή Γραφή$() χωρίς δεύτερη παράμετρο. Η δεύτερη παράμετρος, αν είναι αλφαριθμητικό τότε του λέει πώς θα βγάλει τον αριθμό, και ενώ εκεί βάζουμε τελεία, θα πάρουμε το σύμβολο όπως έχει οριστεί στα Windows, στα Regionals στο πίνακα ελέγχου.




Έχω επιλέξει μεγάλους χαρακτήρες για να φανεί η διαφορά.




Title "Example#1"
Pen 14
Cls 5,0
Function Dec3$ { =Str$(Number/1000,"####0.000")}
Function Dec$ { =Str$(Number,"####0.000")}
Declare Form1 Form
Method Form1, "FontAttr", "Tahoma", 48
Method Form1, "CtrlFontAttr", "Tahoma", 24
Layer Form1 {
      Window 14, 12000,8000
      Font "Verdana"
      Print $(4,8) \ Proportional and  8 char width for columns
}
Declare Text1 TextBox Form Form1
Method Text1,"move", 3000, 2000, 8000, 900
With Text1, "Prompt", "Name: ", "MaxCharLength", 30+6


Declare Spinner TextBox Form Form1
\\\ spinner values: ShowBar, MinValue , MaxValue , LargeValue.
\\Range include MinValue and MaxValue
\\ So we have integers (sign long) but we can display it like a float

Method Spinner "Spinner", True, 0,2000,30
Method Spinner "Move", 3000, 3000, 8000, 900
With Spinner, "Prompt", "A_Value: ",  "Value" as Spi, "VarText" as Feed$, "ThisKind"," units"
\\ Spinner is a textbox with some advanced performance
\\ We use ValidString to check every new value
\\ we use SpinnerValue to format the value
\\ Inside ValidString we use "Value" as Spi, to cut off higher or lower values.

Function Spinner.SpinnerValue {
            Read val
            Feed$=Dec3$(val)
            }

Function Spinner.ValidString {
            \\ this function called direct from textbox
            Read New &this$, &thispos
            Local Alfa
            Try {
                  \\ Spi is an alias for Value property  
                Alfa=val(this$)*1000 : Spi= Alfa : Alfa=Spi
            }
            if valid(Alfa) then {
                  this$=dec3$(Alfa)
            } else {
                  thispos=1000
      }
}
Feed$=Dec$(1.34)

Declare CheckBox1 CheckBox Form Form1
Method CheckBox1 "Move", 3000, 4000, 8000, 900
With CheckBox1,"Caption", "Check This Please", "Checked" as CheckGet, "CheckReset" as CheckPut
CheckPut=True

Declare Button1 Button Form Form1
Method Button1 "Move", 3000, 5000, 8000, 900
With Button1,"Caption", "Reset CheckButton"

Function Button1.Click {
      CheckPut= Not CheckGet
      \\ No Event Fired, so we make here the change
      If CheckGet Then {
            With Button1,"Caption", "Reset CheckButton"
      } Else {
            With Button1,"Caption", "Set CheckButton"
      }
}

Function CheckBox1.Changed {
      Read Val
      Layer Form1 {Print "CheckBox Value ";Val}
      If Val Then {
            With Button1,"Caption", "Reset CheckButton"
      } Else {
            With Button1,"Caption", "Set CheckButton"
      }
}
Function CheckBox1.Click {
      Read Val
      Layer Form1 {Print "CheckBox Value ";Val}
}

With Form1, "Title", "First Window", "visible" as visible
Method Form1,"Show"
Layer Form1 {
      Cls 1,0
      Scroll Split 2 \\ scroll from 3rd line - same as Cls ,2
      Cursor 0, Height/2-1
      Report 2, "Hello World"
}

With Text1, "VarText" as VarText$
Thread {
      Static work \\ we use it for trash bin
      if not empty then work=ask(letter$,"Four Controls in M2000") : Flush \\ stack is empty now
} as worker interval 100
Function Text1.Click {
      Layer Form1 {Print "click" }
}
Function Text1.Enter {
      Layer Form1 {Print VarText$ }
}
Function Spinner.Enter {
      Layer Form1 {Pen 15 {Print Val(Feed$)}}
}
Function Form1.Click {
      \\ we can push values to Thread Stack for Values
      \\ Data push at bottom, Push push at top
      \\ always we pop from top we Read Variables or
      \\ immediate with Number/Letter$
      Document Doc$={Hello There
      }
      Doc$="This is your name "+VarText$+{
      }
      Doc$="This is a value "+Feed$+{
      }
      Doc$="The CheckBox is "+Str$(CheckGet,{;"Checked";"No Checked";})+{
      }
      Thread worker Execute Data Doc$
      Clear Doc$
}

\\ some nice background tasks
kk=0
Thread {
      kk++
      layer {
            layer Form1 {
                  print kk
                  refresh
            }
            Draw To Random(Scale.x), Random(Scale.y), Random(7,15)
      }
} As Print2Form Interval 50

\\  main loop
Main.Task 50 {
       if not visible then exit
}

Declare Form1 Nothing


Είκονα από άλλο υπολογιστή. Εδώ το όνομα Γιω̃ργος Καρρα̃ς έχει Unicode Character 'COMBINING TILDE' (U+0303)
Για να το βάλουμε μετά το ω πατάμε [Alt]  και όσο είναι πατημένο βάζουμε τη δεκαεξαδική μορφή[+303] ή την δεκαδική [771]  (το + καθορίζει αν ακολουθεί δεκαεξαδικό ή όχι, το alt πρέπει να είναι συνέχεια πατημένο, μετά το αφήνουμε). Δείτε πόσο μικρό είναι το κανονικό παράθυρο όπως αυτό του NotePad. Για να αλλαχτεί σε αυτό το μέγεθός του...θα πρέπει να γίνει η αλλαγή για όλα τα προγράμματα. Η Μ2000 κάνει την αλλαγή για το πρόγραμμα που τρέχει, και μάλιστα για το παράθυρο που θέλουμε με δυο εντολές, μια για τον τίτλο και μια για στοιχεία ελέγχου, αν και μπορούμε ανά στοιχείο να τα διαφοροποιήσουμε! (σε επόμενη αναθεώρηση θα μπουν και Buttons με στρογγυλεμένες άκρες!
Method Form1, "FontAttr", "Tahoma", 48
Method Form1, "CtrlFontAttr", "Tahoma", 24






Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.