Τρίτη 23 Μαΐου 2017

Αναθεώρηση 3 (Έκδοση 8.8)

Σε αυτήν την αναθεώρηση εκτός από μικρές διορθώσεις, μπήκαν πρόσθετα πράγματα ειδικά στο τρόπο χειρισμού αντικειμένων που φορτώνουμε από τα Windows.

Το απλό πρόγραμμα που δείχνει μια φόρμα του vbRichClient, με κίτρινο φόντο, και ώρα στο τίτλο της φόρμας.

' cConstructor
\\ Title "Any Title Here",0  \\ hide console
Declare appform application form
Declare New_c "{CAECC935-9C70-4176-8BED-C39B2E33B31F}"
Method New_c, "Cairo" as Cairo
Print Type$(New_c)
Print Type$(Cairo)
With Cairo, "WidgetForms" as Cairo.WidgetForms
Method Cairo.WidgetForms, "Create", 1,"My Main-Form Caption, Click Me!" withevents as Form1
Print type$(Form1)
'  Form.WidgetRoot.BackColor = vbYellow
vbYellow=65535
vbRed=255
vbFixedDialog=3
vbSizableToolWindow=5
' Make a variable to hold a link, but no reference to value - only a hard link to Form1 and the property "WidgetRoot"
Print Type$(Form1)
With Form1,  "visible" as visible
With Form1, "hWnd" as Form1.hWnd
With Form1, "caption" as caption$
Function Form1_KeyPress {
\\stack
      Read &KeyInteger
      If KeyInteger=13 then {
            Print
      } Else {
            Print chrcode$(KeyInteger);
      }
      Refresh
}
Function Form1_Click {
\\\stack
            If pos>0 then Print
            Print "Hello There", now
            caption$="ok.................."
            Refresh
}
for this {
With Form1,"WidgetRoot" set WidgetRoot
With WidgetRoot, "BackColor", vbYellow
}
Method Form1 "Show", 0, appform
Refresh
Every 100 {
      if Form1.hWnd else exit
      caption$=str$(now,"hh:mm:ss")
      \\  if keypress(1) then exit  \\ click in console
}
Declare form1 nothing

Declare cairo nothing
Declare New_c nothing
Show


Και εδώ το πιο μεγάλο με νήμα που τρέχει πίσω από τις φόρμες! Δεν είναι τέλειο γιατί βγαίνει μια φορά το modal παράθυρο...(μετά δεν ξέρω γιατί δεν ξαναβγαίνει). \

Οι συναρτήσεις για τα γεγονότα εκτελούνται με τρόπο ώστε οι μεταβλητές του τμήματος να είναι θεατές σε αυτές. (ενώ οι κανονικές συναρτήσεις δεν έχουν αυτήν την ιδιότητα). Ότι μεταβλητές φτιάξουμε θα διαγραφούν. Μεταβλητές που διαβάζονται με αναφορά επειδή μπορούν να πάρουν μία μόνο αναφορά για κάθε περίπτωση πρέπει να τις διαβάσουμε ως νέες (Read New), που σημαίνει ότι πρόσκαιρα θα μπορούν να συνυπάρχουν δυο ίδιες μεταβλητές στο όνομα αλλά όχι στη τιμή. Απλά η πιο πρόσφατη θα διαγραφεί πρώτη.
Τα γεγονότα από τις φόρμες έρχονται ένα κάθε φορά (στην αρχή ερχόντουσαν όλα μαζί και ναι μεν εκτελούνταν, αλλά υπήρχε θέμα και μάλιστα υπήρχαν προβλήματα με "διαρροή μνήμης" (memory leaks). Τώρα έχει διορθωθεί η κατάσταση. Στις φόρμες της Μ2000 δεν υπάρχει αυτό το πρόβλημα γιατι διαχειρίζεται το σύστημα εσωτερικά την ροή των γεγονότων. Τώρα σε αυτήν την αναθεώρηση έχουμε επίσης χειρισμό των εξωτερικών γεγονότων από το περιβάλλον της Μ2000. Λέμε ότι είναι εξωτερικά γιατί τρέχουν στο dll της vbRitchClient5. Στην αναθεώρηση αυτήν έχω βάλει ένα φίλτρο όπου μηνύματα που δεν τα χρησιμοποιούμε να βγαίνουν εκτός (έρχονται αλλά δεν προωθούνται). Αυτό το φίλτρο καθαρίζει με την δημιουργία του Event Sink Object και σχηματίζεται αν η φόρμα είναι ορατή (οπότε αν δεν είναι δεν βάζει φραγή, πράγμα που θα έκανε αν οι συναρτήσεις για τα γεγονότα ορίζονταν μετά την γραμμή που ορίζουμε το αντικείμενο Event Sink).





Έγινε διόρθωση για τις νεότερες εκδόσεις της Μ2000, όπου οι μεταβλητές (παράμετροι) στις συναρτήσεις εξυπηρέτησης γεγονότων δεν είναι με αναφορά, πρέπει να τις διαβάζουμε χωρίς το σύμβολο της αναφοράς &. Παλαιότερα όλες έρχονταν σαν να ήταν με αναφορά.


' cConstructor
'Title "",0
Declare AppForm Application Form
Declare New_c "{CAECC935-9C70-4176-8BED-C39B2E33B31F}"
Method New_c, "Cairo" as Cairo
Print Type$(New_c)
Print Type$(Cairo)
With Cairo, "WidgetForms" as Cairo.WidgetForms
Method Cairo.WidgetForms, "Create", 1,"My Main-Form Caption, Click Me!" as Form1
Print type$(Form1)
'  Form.WidgetRoot.BackColor = vbYellow
vbYellow=65535
vbRed=255
vbFixedDialog=3
vbSizableToolWindow=5
' Make a variable to hold a link, but no reference to value - only a hard link to Form1 and the property "WidgetRoot"
Print Type$(Form1)
With Form1, "WidgetRoot" as Form1.WidgetRoot, "visible" as visible
Print type$(Form1.WidgetRoot)
With Form1, "hWnd" as Form1.hWnd
With Form1.WidgetRoot, "BackColor", vbYellow
Method Cairo.WidgetForms, "Create", vbFixedDialog,"MyDialog ... Click Me!",-1 , 800, 600 as Form2

With Form2, "WidgetRoot" as Form2.WidgetRoot
With Form2.WidgetRoot, "BackColor", vbRed
         
Method Cairo.WidgetForms, "Create", vbSizableToolWindow, "MyToolWindow - Resize Me!", -1, 800, 600 as Form3
Method Form3,"SetMinMaxDimensions", 200, 400, 300, 600
With Form3, "visible" as Form3.visible
mClicks=0
one=false
Function Form2_Click {
        mClicks++
        With Form2, "Caption", "Click-Count so far:" +Str$(mClicks)
}
once=false
Function Form1_Move {
      Read New X, Y
      Print X, Y
      wait 1
}
Function Form2_Move {
      Read New X, Y
      Print X, Y
      wait 1
}
Function Form1_Click {
      Print envelope$() \\ return S is a string
      stack   \\ show empty string
      refresh
      if once then exit
      once=true
      Layer {
            Try ok {
            Report "First we show a modal Dialog-Window, and count the Clicks on it"
            if one else Method Form2 "Show", 1
            Report format$("The Dialog was clicked {0} times.", mClicks)
            Report  {Now we show a non-modal ToolWindow, which remains in the ForeGround of this Form
                              and will close itself automatically, when the MainForm is destroyed
                              }
            refresh
            if one then {
                  Form3.visible=true
                  Print Form3.visible
            } else Method Form3, "Show",0,Form1 : one=true
            }
            if error then print error$
            once = false
            Print "once=false"
      }
    
    
}
Thread {
try {
      If pos>0 then print
      Print now, visible, once
      }
      refresh
} as alfa interval 100
Print Visible
Declare WithEvents Form1
Declare WithEvents Form2
'Declare WithEvents Form3
Method Form1, "Show", 0, AppForm
Print Visible
\\Method Cairo.WidgetForms, "EnterMessageLoop"
Task.Main 100 {
      if Form1.hWnd else exit
'      if keypress(1) then exitEDIT
}
Threads erase
Declare form1 nothing
Declare form3 nothing
Declare cairo nothing
declare New_c nothing
Show

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

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

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