' Rapid-Q by William Yu (c)1999-2000 . ' ================================================================================ ' Upload_il_tuo_script_su_Rapidq.it ' Capitolo_5__Introduzione_ai_form ****** 5. Introduzione ai form ****** In questo capitolo illustrerò il concetto di form. Il programma di esempio del capitolo precedente vi aiuterà sicuramente a comprendere meglio questo concetto. Userò indifferentemente i termini form e finestra. 5. 1 Cos'è un form? Un form (o finestra) è un contenitore generico che può essere visualizzato nel vostro desktop. È come un pannello (vedi QPANEL). Un form può avere diversi aspetti. In Rapid-Q, gli unici form ammessi sono i seguenti (potete anche definire formati personalizzati per i vostri form, utilizzando il metodo SHAPEFORM): TR> [http://www.rapidq.it/ [http:// [http://www.rapidq.it/public/hell_editor/homepages/images/chap5d1.gif] public/hell_editor/ www.cajino.50megs.com/ homepages/images/ rapidq/chap5d3.gif] chap5d2.gif] [http:// [http://www.rapidq.it/ [http://www.rapidq.it/public/hell_editor/homepages/images/chap5d4.gif] www.cajino.50megs.com/ public/hell_editor/ rapidq/chap5d5.gif] homepages/images/ chap5d6.gif] Il form di default è bsSizeable. A cosa serve esattamente bsNone? Giochi:-) Esatto, se il form è massimizzato, si può utilizzare l'intero schermo per il gioco. Può servire anche ad altri scopi... MSIE lo utilizza per un Web browser a pieno schermo. In ogni caso ha un aspetto orribile. Se non avete capito da dove vengono tutte queste variabili, dato un'occhiata a RAPIDQ.INC bsNone = 0, bsSingle = 1, etc... queste variabili rendono semplicemente più facile la programmazione, evitandovi la necessità di ricordare dei numeri, sostituendoli con i nomi delle variabili. $INCLUDE 'RAPIDQ.INC' DIM Form AS QFORM Form.BorderStyle = bsDialog Form.ShowModal Utilizzando bsSingle, il form appare esattamente come bsSizeable, a parte il fatto che non si può ridimensionarlo. Nella maggior parte dei casi gli unici due form utilizzati saranno bsSizeable e bsDialog. 5.2 Aggiungere componenti ad un form Seguendo l'esempio nel capitolo precedente, si possono aggiungere componenti al form semplicemente assegnando ai componenti stessi la proprietà Parent. DIM Form AS QForm DIM Button AS QButton Button.Parent = Form '' Aggiunti un pulsante al form Se vi state domandando perché, considerate che un programma può avere più form. Tutti i componenti visibili devono avere una proprietà Parent. Componenti come QMENUITEM, o QTIMER non hanno la proprietà parent. Nonostante QMENUITEM sia considerato un componente 'visibile', può avere come parent (elemento principale) soltanto un QMAINMENU o QPOPUPMENU1. Invece di assegnare una proprietà Parent, dovrete aggiungere o inserire gli articoli al menù. Se non viene formta la proprietà Parent, il componente rimane nascosto. Nel caso di QCANVAS o QIMAGE, avrete dei messaggi di errore se tentate di disegnare sui componenti. Ciò perché non è possibile disegnare su qualcosa che non è visibile. Nella maggior parte dei casi, la proprietà Parent dovrebbe essere la prima proprietà assegnata ad un componente. Per nascondere componenti, è possibile utilizzare la proprietà Visible. 5.3 Identificare la posizione del mouse su un form È possibile utilizzare MouseX e MouseY per identificare la posizione del mouse su un form, ma questi due metodi stanno cadendo in disuso. È consigliabile utilizzare l'evento OnMouseMove piuttosto che passare le coordinate X e Y della posizione del mouse in relazione al componente. 5.4 Eventi speciali per i form Esistono alcuni eventi speciali che sono associati solo ai form. Il più importante è l'evento OnResize. Questo si verifica ogni volta che l'utente ha cliccato sul bottone Ingrandisci o ha ridimensionato manualmente il form. Un programma dovrebbe quasi sempre intercettare questo evento ed aggiornare la forma dei controlli in modo appropriato. Immaginate che la finestra del vostro browser MSIE sia 320x200, e quando ridimensionate l'applicazione a 640x480, la finestra del browser sia ancora 320x200. Sembra orribile, perché lo è. Se non volete che il form si possa ridimensionare, utilizzate semplicemente un diverso BorderStyle, come spiegato in precedenza. Un altro evento speciale è la pressione di un tasto. Suggerisco di usare OnKeyDown piuttosto che OnKeyPress. La differenza è che OnKeyDown può gestire tasti particolari, ed anche Shift, Alt, e Ctrl. Se il vostro programma non richiede tasti particolari, potete usare tranquillamente OnKeyPress. La gestione della tastiera è utile per molti programmi che la richiedono, come programmi di dattilografia, giochi, ecc.. L'unica cosa strana è il fatto che OnKeyPress e OnKeyDown restituiscono parametri extra che possono essere utilizzati. Questo è diverso da quanto abbiamo fin qui compreso degli eventi. Finora abbiamo solo parlato di eventi semplici che non richiedono procedure particolari. SUB AddButtonClick '' Fai qualcosa END SUB AddButton.OnClick = AddButtonClick Un semplice clic passa soltanto un semplice messaggio al nostro controllo pulsante, dicendogli che è stato ricevuto un clic. Per quanto riguarda la tastiera questo è più complicato. Non è sufficiente dire che un tasto è stato premuto, dobbiamo sapere qual'era il tasto, perciò dobbiamo rilevare questo ulteriore messaggio. SUB KeyPressed(Key AS WORD) '' Fai qualcosa PRINT Key END SUB Form.OnKeyPress = KeyPressed Il tasto premuto viene restituito nella variabile Key. Potete nominarlo in qualunque modo, ma la vostra SUB deve avere almeno quel parametro. Rapid-Q vi permetterà di aggiungere più parametri, e anche di non fornirne alcuno. Dipende da voi. Per OnKeyDown vengono passati due parametri: SUB KeyDown(Key AS WORD, Shift AS INTEGER) '' Fai qualcosa PRINT Key;' ';Shift END SUB Form.OnKeyDown = KeyDown Esistono tre stati di shift: ShiftDown, AltDown, e CtrlDown. Fate attenzione allo stato ShiftDown. A differenza di OnKeyPress che ha gestito tutti gli stati di shift per voi, OnKeyDown non lo farà . Ciò significa che se premete SHIFT+i dovrete usare UCASE$(Key). I tasti speciali in Rapid-Q sono molto diversi da ciò che vi aspettereste in un programma QBasic. Per esempio, in QBasic, le frecce sono facili da decodificare: DO A$=INKEY$ IF A$=CHR$(0)+'H' THEN PRINT 'Premuto tasto freccia in alto' LOOP Utilizzando OnKeyDown viene restituito il codice virtuale del tasto, che non è un codice a due byte. La freccia in alto è 38, freccia a sinistra 37, freccia a destra 39 e freccia in basso 40. 5.5 Finestre di dialogo Un tipo particolare di form è la semplice finestra di dialogo. Le finestre di dialogo sono normalmente interfacce extra del form principale. Normalmente non si usa una finestra di dialogo come form principale. Per esempio, considerate un form principale con tre scelte: [http://www.cajino.50megs.com/rapidq/chap5d7.gif] Per ciascuna scelta (tranne l'ultima), dovreste creare finestre di dialogo per gestire l'input dell'utente. Quando l'utente clicca suo primo pulsante, dovrebbe apparire una finestra di dialogo come questa: [http://www.rapidq.it/public/hell_editor/homepages/images/chap5d8.gif] I bottoni sono personalizzati. Vedi RAPIDQ.INC per i dettagli. OKButton1.Kind = bkOK CancelButton1.Kind = bkCancel Bene, ma come fate a sapere se l'utente ha premuto OK o CANCEL? Ci sono due modi, ed entrambi comportano l'uso della proprietà ModalResult. Ricordate come avete chiamato a vostra finestra di dialogo: IF Dialog1.ShowModal = mrOK THEN '' L'utente ha premuto OK ELSE '' L'utente ha cancellato END IF La proprietà ModalResult appartiene sia a QButton che a QForms. Quando abbiamo fatto questo: OKButton1.Kind = bkOK Automaticamente abbiamo fatto anche questo: OKButton1.ModalResult = mrOK Questo significa che ogni volta che viene premuto il pulsante OK, il ModalResult restituito è mrOK. Questo risultato automaticamente chiude il vostro form Dialog1. Un altro approccio, meno elegante, consiste nell'assegnare al form il ModalResult. Per esempio, supponiamo questo caso: SUB ButtonClick Dialog1.ModalResult = mrOK END SUB OKButton1.ModalResult = mrNone '' Nessun risultato OKButton1.OnClick = ButtonClick In questo caso, cliccando sul pulsante si trasferirà il controllo alla SUB ButtonClick. In questa SUB, viene stabilita la proprietà ModalResult del form Dialog1, esattamente come nell'esempio precedente. 5.6 Utilizzo del metodo CREATE Nella maggior parte dei casi, l'utilizzo di CREATE è preferibile a DIM, in quanto evita parecchia digitazione, e dà un aspetto più ordinato al codice. Per cominciare, vediamo quanta digitazione può risparmiarvi: DIM MainForm AS QForm MainForm.Left = 100 MainForm.Top = 50 MainForm.Height = 300 MainForm.Width = 400 MainForm.Caption = 'Hello world!' Ecco come appare lo stesso codice utilizzando CREATE: CREATE MainForm AS QForm Left = 100 Top = 50 Height = 300 Width = 400 Caption = 'Hello world!' END CREATE Come potete notare, non è necessario digitare MainForm ogni volta, dal momento che il compilatore saprà esattamente come volete che vengano interpretati i campi. 5. 7 Ramificazione di CREATE In questo caso l'utilizzo del metodo CREATE anziché DIM vi farà risparmiare tempo e fare meno confusione. Questo è ciò che definisco 'incapsulare' i controlli: CREATE MainForm AS QForm Center CREATE Button1 AS QButton Left = 10: Top = 10: Height = 20: Width = 20 END CREATE ShowModal END CREATE Avrete notato che non c'è bisogno della proprietà Parent. Questo è dovuto al fatto che il compilatore capisce che volete inserire un pulsante nel MainForm (in quanto è presente CREATE all'interno), così genera automaticamente Button1.Parent = MainForm. Inoltre, potete notare che ha un aspetto molto migliore, e potete vedere quali componenti appartengono a ciascun form/contenitore. Rapid-Q può gestire fino a 25 strati, nell'esempio precedente abbiamo utilizzato un suo strato. Non credo che avete mai bisogno di più di quattro o cinque strati (al massimo), ma ho stabilito il limite a 25 solo per far piacere a quel 1% di persone che realmente lo volevano. Come avrete capito, i componenti che non hanno una proprietà Parent (componenti non visibili) non sono validi all'interno di CREATE. 5.8 Creazione di menù La creazione di menù utilizzando il metodo CREATE è uguale: CREATE MainForm AS QForm Center CREATE MainMenu AS QMainMenu CREATE FileMenu AS QMenuItem Caption = '&File' CREATE OpenItem AS QMenuItem Caption = '&Open' END CREATE CREATE SaveItem AS QMenuItem Caption = '&Save' END CREATE END CREATE END CREATE ShowModal END CREATE Oltre alla proprietà Parent, stiamo risparmiando anche l'uso di AddItems. Questo è sicuramente più facile da capire che l'utilizzo di DIM per definire i vostri menù. ' =============================================================================== ' 2003 Holyguard.net - 2007_Abruzzoweb