Traduzione in italiano di Antonio Campagna - agosto 1999

Beginning Forms (HOW TO)
(Visual dBASE 7.01)

Last Modified: March 21, 1999
Ken Mayer, dBVIPS

Lo scopo principale di questo documento è familiarizzare con il modulo impostazione scheda e con i molti concetti coinvolti nella progettazione delle schede.


Menu


Cos'é una scheda (Form)?

Una scheda è una finestra nell'ambiente Windows. Qualsiasi posto, dove un utente può interagire con o ottenere informazioni su un'applicazione, é fatto attraverso una finestra.

In Visual dBASE versione italiana, queste finestre si chiamano schede. Una scheda può essere usata per interagire con i dati, per richiedere ad un utente specifiche opzioni per un report, per ottenere informazioni su quale nome dare ad un file, o semplicemente, per mostrare lo stato di una lunga operazione. Se hai bisogno di un modo per interagire con l'utente, userai molto probabilmente una scheda.

Come sviluppatore, "spenderai" molto tempo con il modulo impostazione scheda, e questo documento HOW TO è mirato ad aiutarti. Se sei neofita di Visual dBASE, sei qui per una discussione, questo ambiente di sviluppo è abbastanza stupefacente. Se arrivi a Visual dBASE 7 da versioni precedenti di dBASE (dBASE/DOS o Visual dBASE 5.x) devi imparare alcune cose e contemporaneamente dimenticarne altre.

Per favore, considera che questo documento HOW TO, non dedica molto spazio a discutere di tutti i possibili controlli che si possono mettere in una scheda (vedi CONTROL.ZIP e GRID.ZIP nel mio sito Web). Stesso discorso vale per le schede a pagine multiple e le schede custom (vedi CUSTFORM.ZIP e MULTPAGE.ZIP). Inoltre questo documento non è fatto per insegnarti come realizzare applicazioni in Visual dBASE benché necessariamente alcuni concetti coinvolti in questo documento saranno trattati. (C'è un Visual dBASE 7 Tutorial al sito web dell'autore che puoi eventualmente scaricare ed utilizzare...)

Torna al Menu


Concetti di Programmazione

Ci sono alcuni concetti che hanno bisogno di essere trattati per capire quello che discuteremo nel resto di questo documento.

Multiple Document Interface? Single Document Interface? Altro?

Uno dei concetti più interessanti dello sviluppo di una applicazione é quello delle applicazioni "MDI" o "SDI".

Se hai lavorato con un Word Processor (Word, wordPerfect, ecc.), hai potuto lavorare con più di un documento contemporaneamente. Questa è un'applicazione "Multiple Document". S'intende che hai diversi documenti aperti e puoi commutare tra loro. Ci sono alcune caratteristiche di comportamento delle applicazioni MDI che discuteremo brevemente.

Ci sono altre applicazioni chiamate "Single Document Interface." Questo significa, normalmente (benché non sempre) che hai una singola scheda aperta, con la quale lavori. Quando hai finito, ne puoi aprire un'altra.

Ci sono anche alcune applicazioni che sono una sorta di ibridi -- una combinazione di MDI e SDI.

Primo confrontiamo applicazioni MDI e SDI:

Applicazioni

MDI

SDI

Contenute nella finestra struttura di Visual Dbase( _app.frameWin ) Si No
Menubar Window su ciascuna scheda? No Si
Menubar Window sulla cornice applicazione? Si No
Toolbar Window su ciascuna scheda? No Si
Toolbar Window sulla cornice applicazione? Si No
Window Menu applicabile? Si No
Le schede appaino nella taskbar? No Si
Riducendo/ingrandendo le schede l'effetto si riflette su tutte le schede aperte? Si No
Ciascuna scheda è trattata separatemente quando si ingrandiscono/riducono? No Si
Windows offre sempre la possibilità di ridimensionare,ridurre e ingrandire? Si No

Informazioni fornite da Gary White

La tabella precedente è una rapida veduta d'insieme, ma dovrebbe darti una idea delle differenze generali. Quando giungeremo alle proprietà delle schede, vedremo perché questa tabella può essere importante.

Impostazione Scheda

Il modulo "Impostazione scheda" è discusso in dettaglio in "DESIGNERS.ZIP" al mio sito web (nella sezione HOW TO). Piuttosto che trattare tutto di nuovo, per favore leggi quel documento. In esso si discute anche della Tavolozza dei Componenti, della Tavolozza dei Campi, e del modulo Ispezione. Questo documento presume che tu abbia familiarità con tali strumenti.

Torna al Menu


Proprietà delle Schede, Eventi e Metodi

In Visual dBASE una scheda é un oggetto, e come tale ha proprietà, eventi e metodi. Diamogli un occhiata...

Proprietà

Le proprietà, sono gli attributi dei controlli (oggetti) ed includono fra gli altri font, identificazione, dimensioni e proprietà visuali. Il valore di una proprietà può essere cambiato tanto da programma quanto da impostazione scheda. Il contenuto di una proprietà è normalmente un valore singolo, per esempio, una stringa, numero o un riferimento ad un altro oggetto.

activeControl: è un riferimento oggetto al controllo (leggi anche oggetto) che attualmente ha il fuoco sulla scheda.

autoCenter: è un valore logico, se è impostata a vero, quando la scheda sarà aperta, automaticamente sarà centrata sullo schermo.

autoSize: per impostazione predefinita é impostata a falso, se è messa a vero ignorerà le proprietà relative all'altezza e alla larghezza e dimensionerà la scheda in modo tale che tutti i controlli(oggetti) siano visualizzati. Questa proprietà, apparentemente utile, può produrre alcuni effetti non desiderati.

background: è un riferimento ad una immagine di sfondo che può essere messa sulla scheda. Questa è una nuova caratteristica di Visual dBASE 7 ed è molto simile al posizionamento di un immagine di sfondo in un documento HTML. La scheda verrà "ricoperta" dall'immagine, non importa quanto essa sia grande. Se usi questa caratteristica puoi impostare a vero la proprietà transparent dei tuoi controlli testo (e degli altri controlli che hanno questa proprietà).

className: è a sola lettura, restituisce il nome della classe della scheda. Potresti aspettarti che restituisca "FORM," ma dipende su dove sei quando la chiami, può restituire qualche cosa come "MYFORMFORM", ad ogni modo sarà qualunque cosa che é nella dichiarazione CLASS dove comincia la definizione della scheda nel codice sorgente della scheda stessa.

clientEdge: quando é messa a vero indica se una scheda deve apparire con un bordo interno smussato. Questo può essere utile per rendere differente una scheda che é una finestra di dialogo da un'altra contenente dati, ma essenzialmente non c'è bisogno di fare questo tipo di distinzione. (infatti alcuni sviluppatori preferiscono usare il bordo smussato per tutte le loro schede altri no...).

colorNormal: determina il colore dello sfondo della scheda.

designView: è un holdover da dBASE 5.x se usi OODML, (oggetti dati, queries, rowsets, …) non usare questa caratteristica!! confonderai solo dBASE e te stesso. Se stai "migrando" le tue schede, realizzate con Visual dBASE 5.x, a Visual dBASE 7, questo può essere il posto dove usarla…

elements: è un array che può essere usato per lavorare attraverso gli elementi di una scheda. Nota comunque che se usi un oggetto container (oppure un oggetto Notebook, che è un contenitore specializzato) i controlli che sono sul container non sono nell'array elements (e che gli oggetti container e notebook non hanno un proprio array elements).

enabled: determina se una scheda può essere accessibile dall'utente.

escExit: è usata per determinare se pressando il tasto < Esc> si chiuderà la scheda.

first: è un riferimento oggetto al primo componente di una scheda nello Z-Order. Questa può essere utile per sviluppare del codice che effettui un loop attraverso gli oggetti disposti in una scheda (hai bisogno di un punto iniziale, e combinandolo con la proprietà first la maggior parte degli oggetti sono davanti, ed essi a loro volta, puntano al prossimo oggetto nello z-ordine, permettendoti cosi di effettuare un loop fino a ritornare al primo... ).

height: è l'altezza della scheda.

helpFile:è un riferimento al file di help (se usi help stile Windows).

helpId: è l'id usato nel file di help, se l'utente pigia < F1> questo ID è usato per trovare la posizione corretta nel file help di Windows che hai designato sopra.

hWnd: è L'handle dell'oggetto Windows per l'oggetto scheda. Questo è usato soprattutto per chiamate alle API di Windows.

hWndClient: è l'handle per la finestra genitore che contiene i controlli di una scheda.

icon: può essere usata per impostare un'icona sulla scheda. Nella barra del titolo della maggior parte delle applicazioni Windows c'è un'icona, questo dipende da come hai impostato questa proprieta. L'icona può essere una risorsa o un file esterno.

inDesign: è un valore logico usato per determinare se la scheda é stata creata per il modulo impostazione scheda (vero) o per l'esecuzione. Se è stata creata per impostazione scheda restituisce un valore 'true'. Questo potrebbe essere utile nell'evento onOpen di una scheda, se sei in impostazione scheda potresti non volere che venga eseguito alcun codice, o potresti volere che sia eseguito un codice diverso. Tu puoi anche controllare questa proprietà in un evento onOpen di un oggetto.

left: determina dove la scheda è in relazione con il bordo sinistro della applicazione (nel caso di una applicazione MDI) o con il lato sinistro dello schermo.

maximaze: determina se il pulsante "ingrandisci" è visibile sulla barra del titolo della scheda. Nota che se una scheda é di tipo MDI, impostare a falso questa proprietà non ha effetto.

mdi: è usata per determinare se una scheda è MDI o SDI.

menuFile: è un puntatore ad un menu. Nel caso di una scheda SDI s'intende che il menu sarà messo in cima alla scheda sotto la barra del titolo.

metric: è l'unità di misura che hai usato sulla scheda. Per impostazione predefinita è caratteri. NOTA: quando usi controlli custom su una scheda, questa proprietà é molto importante. Se un controllo custom è davvero un contenitore che contiene altri controlli, se la proprietà metric dei controlli contenuti non è simile a quella della scheda, i risultati saranno.. strani... (questo è un bug noto).

minimize: è simile alla proprieta maximaze vista sopra.

mousePointer: determina a che cosa somiglia il puntatore del mouse quando è sulla scheda.

moveable: determina se l'utente può muovere la scheda quando è aperta (nota che questo non ha effetto se la scheda è MDI).

nextObj: è un riferimento all'oggetto successivo che riceverà il fuoco (ad es., quando l'utente pigia il tasto < Tab>).

pageNo: è un riferimento numerico al numero di pagina, è possibile creare schede multi pagina (vedi MULTPAGE.ZIP al mio sito Web).

popupMenu: è un riferimento ad un file il popupMenu file, questo apparirà se l'utente clicca il tasto destro sulla scheda.

refreshAlways: è un valore logico che è usato per determinare se la scheda sarà sempre aggiornata dopo una navigazione, aggiornamento, ecc..

rowset: è un riferimento ad un rowset (OODML). Molti controlli custom cercano "form.rowset" per determinare quale rowset gestire. In una scheda con più di un rowset questo è di solito il primo rowset inserito nella scheda. (è possibile da programma cambiare questo rowset, ciò può essere utile nelle schede multi tabella.)

scaleFontbold: determina se il font usato per il carattere metrico è grassetto o no. (vedi la guida in linea per maggiori dettagli)

scaleFontName: è il font di base, per l'unita di misura (metric) Caratteri di una scheda. (vedi guida in linea per maggiori dettagli)

scaleFontSize: è dimensione del font di base in punti per l'unità di misura(metric) caratteri.

scrollBar: è usata per determinare se una barra di scorrimento deve essere usata se la scheda non è grande abbastanza da esporre tutti gli oggetti che sono contenuti in essa.

showSpeedTip: è un valore logico per determinare se, quando il mouse è trascinato sopra un oggetto di una scheda, l'utente vedrà uno speedTips.

sizeable: determina se una scheda é dimensionabile oppure no (questo non ha effetto se la scheda e di tipo MDI).

smallTitle: determina se la scheda ha una barra del titolo in stile tavolozza. Nessuna icona appare su questa barra del titolo, ed un effetto lato è che la scheda non ha un'entrata nel taskbar se è una scheda modale (normalmente una scheda modale ha una propria entrata taskbar). Nota che se la scheda é aperta con la proprietà mdi impostata a vero, allora questa proprietà non ha effetto.

statusMessage: è il testo visualizzato nella barra di stato sul fondo dello schermo.

sysMenu: determina se una scheda ha un menu controllo e un'icona di chiusura quando non è MDI.

text: è il testo visualizzato nella barra del titolo.

top: è l'ubicazione del bordo superiore della scheda in relazione al bordo della applicazione se é una applicazione MDI altrimenti é il bordo superiore dello schermo.

topMost: determina se la scheda compare in primo piano rispetto a tutte le altre (questo non ha effetto su schede MDI ).

useTablePopup: determina se usare il popup prededinito, nel caso non sia stato assegnato alla scheda alcun popup. Il popup predefinito contiene comandi di navigazione ed altri comandi che hanno effetto sul rowset assegnato alla proprietà rowset della scheda.

view: è un vecchio comando di XBase DML usato per definire i .QBE usati per una scheda. Se stai usando OODML ignora questa proprietà.

visible: determina se una scheda è visibile o no sullo schermo.

width: è la larghezza della scheda basata sulla proprietà metric della scheda.

windowState: può essere usata per impostare lo stato della scheda (Ridotta, ingrandita normale) o per consultare lo stato corrente.

Wow. Molte proprietà. Con un po’ di fortuna alcune cose possono cominciare gelificare nella tua mente!!!.

Torna al Menu


Eventi

Gli eventi sono qualcosa a cui i controlli possono rispondere, un clic del mouse, una scheda che ottiene il fuoco, un cambiamento di posizione delle schede ecc.

Gli eventi sono sempre "all’erta". Comunque, al verificarsi dell'evento perché accada qualche cosa, devi agganciare del codice all'evento. (Windows è davvero simile ad un grande gestore di "eventi" -- non fa niente fino a quando qualche evento è attivato, come il movimento del mouse o il tasto della tastiera che é stato pressato.)

Gli eventi il cui nome comincia con on, come onOpen, si verificano dopo l'azione alla quale si riferiscono. Così, l'evento onOpen si verifica dopo che la scheda é aperta. Gli eventi che cominciano con can, come canClose, devono restituire un valore logico che determinerà se l'azione indicata può procedere. Così, l'evento canClose di una scheda deve restituire vero prima che la scheda possa essere chiusa. Restituendo un valore falso preverrà la chiusura della scheda. La mancata restituzione di un valore Booleano può produrre risultati imprevedibili.

canClose: può essere usato per determinare se all'utente è permesso chiudere la scheda. Deve ritornare un valore vero o falso.

canNavigate: può essere usato per determinare se l'utente può navigare in un rowset. (Questo evento non lavora con l'OODML rowsets)

onAppend: é attivato dopo che un nuovo record é stato creato. Questo può essere usato per memorizzare valori predefiniti (questo evento non lavora con l'OODML rowsets).

onChange: é attivato dopo lo spostamento su un altro record se il record precedente é stato modificato, ma prima dell‘evento onNavigate (questo metodo non lavora con rowsets OODML ).

onClose: é attivato dopo che la scheda é stata chiusa.

onDesignOpen: é attivato dopo che la scheda é aperta in impostazione scheda.

onGotFocus: é attivato dopo che la scheda ha ricevuto il fuoco (cliccando su di essa, selezionando Window menu, se una applicazione MDI.)

onHelp: è attivato quando il tasto < F1> è pigiato.

onLeftDblClick, onLeftMouseDown ed onLeftMouseUp: sono tutti attivati con il pulsante sinistro del mouse. Se hai messo del codice per gli eventi onLeftMouseDown e/o onLeftMouseUp, nota che questi saranno attivati cosi come onLeftDblClick. Così se hai bisogno di questi eventi per fare diverse cose sei sfortunato.

onLostFocus: é attivato quando il fuoco va su un'altra scheda.

onMiddleDblClick, onMiddleMouseUp ed onMiddleMouseUp: sono attivati con un mouse che ha il pulsante centrale e sono simili agli eventi left detti sopra.

onMouseMove: é attivato quando il mouse si sposta sulla scheda. Con questo evento hai la possibilità di ottenere le coordinate.

onMove: é attivato quando muovi la scheda.

onNavigate: é attivato quando l'utente naviga in un rowset. Questo lavora tanto con l'OODML quanto con l'XDML.

onOpen: é attivato quando si apre una scheda.

onRightDblClick, onRightMouseDown ed onRightMouseUp: sono attivati come gli eventi onLeftMouse visti sopra.

onSelection: é attivato dopo che la scheda è stata "Inoltrata" (chiusa). Questo evento è stato scritto con l'assunzione che un utente pigerebbe < Enter> per chiudere una scheda (Ciò può essere fatto impostando a "vero" la proprietà default di un pulsante). Vedi la guida in linea per maggiori dettagli.

onSize: é attivato dopo che le dimensioni della scheda sono cambiate, ciò include se é cambiata la proprietà windowState (benché c'è al meno un difetto - riducendo una scheda non causa l'attivazione dell'evento).

Suggerimento: Vuoi sperimentare un poco con questi eventi per vedere quello che succede quando si attivano. Un modo semplice per farlo è aggiungere un piccolo codeblock a ciascuno di essi.(a quegli eventi che cominciano con "can", aggiungete "; return true" alla fine codeblock prima della parentesi di chiusura):

{; ? "nome evento attivato" }

Fai questo per ciascuno evento che desideri esaminare su una scheda di esempio. Manda in esecuzione la scheda, ed allora prova a muovere il mouse, oppure a fare un doppio clic (nota quando fai doppio clic gli eventi onxxxMouseUp e onMousexxxDown sono anche attivati!),ecc.. E' un esercizio interessante...

Torna al Menu


Metodi

I metodi sono codice che compiono un'azione. Le schede hanno una quantità di metodi i quali sono chiamati attraverso la parola riservata form, ad esempio form.close(). Il codice che risponde all'evento di una scheda è anch'esso un metodo.

Una cosa che va tenuta presente e' che, se si usano i metodi predefiniti per inserire il proprio codice (over-riding del metodo), si dovra' quasi sempre chiamare il metodo predefinito, prima, dentro o dopo il proprio codice (Ciò' può' essere ottenuto inserendo SUPER::methodname() nel codice...).

abandonRecord(): abbandona le modifiche apportate sul record attivo, è usato nel XBase DML. Questo metodo non è usato con l'OODML, ma l'oggetto rowset ha un proprio metodo abandon.

beginAppend(): crea un buffer temporaneo in memoria per un record basato sulla struttura della tabella attiva, permettendo all'utente di immettere dati nel record senza aggiungerlo automaticamente alla tabella.

close(): è come quello che si ottiene dalla chiusura della scheda (form.close() ).

isRecordChanged(): Restituisce un valore che indica se i dati presenti nel buffer del record attivo sono stati modificati.

move(): é un modo per muovere da programma una scheda. Puoi chiamare questo metodo con dei parametri che denotano la posizione top e left e la scheda si muoverà in conformità.

open(): è come quando apri una scheda MDI (ad es. form.open() ).

pageCount(): restituisce il valore pageno più alto usato dai controlli della scheda.

print(): può essere usato per stampare la scheda. Nota che i suoi risultati possono variare.

readModal(): è come quando apri una scheda SDI . Per lavorare con questo metodo, la

proprietà mdi DEVE essere impostata a falso.

refresh(): ridisegna la scheda.

release(): rilascia l'oggetto scheda dalla memoria. Nota che non dovresti includere questo evento nell'evento onClose della scheda in quanto spesso causerà un GPF.

saveRecord(): Salva le modifiche apportate al record attivo nella tabella al momento attiva.

setFocus(): può essere usato per impostare il fuoco su una scheda, questo è utile se sono aperte schede multiple.

showFormatBar(): può essere usato per visualizzare o nascondere la barra degli strumenti Format.

Torna al Menu


Tipi di schede

Ci sono tre principali "tipi" di schede che riesco a pensare:

Schede Dati queste sono le uniche che interagiscono con i dati, queste avranno datamodules, databasi, queries , rowsets, ecc., ed oggetti che sono disegnati specificamente per interagire con i rowset e gli oggetti field. Ci sono moltissimi, modi per progettare schede dati, ma queste sono le uniche che tu vedi nella maggior parte delle applicazioni, cosi sono le più importanti per l'applicazione. Questi schede possono essere modali o non modali (aperte con i metodi della scheda readModal() o open(). Le schede dati dovrebbero usare la proprietà rowset della scheda se usi l'OODML (se stai migrando delle schede da versioni precedenti di Visual dBASE , allora userai la proprieta view e/o la proprietà designView). La ragione per usare la proprietà rowset è che è molto più facile lavorare con un riferimento oggetto di:

form.rowset.next()

ad uno che somiglia al seguente:

form.query1.rowset.next()
// oppure:
form.datamodref1.ref.query1.rowset.next()

Ci sono alcuni trucchi per usare quanto discusso sotto, e più nel documento HOW TO "MISCCODE.ZIP" al mio sito web.

Schede Dialogo queste sono schede che interagiscono con l'utente per ottenere una specifica informazione. Tali schede possono interagire con i dati (oggetti rowset/field), ma meglio di no. Nella maggior parte dei casi le schede di dialogo sono modali (aperte con il metodo readmodal() della scheda).

MsgBox(): ti permette di chiedere all'utente di fare una scelta; semplicemente lasci loro conoscere qualche cosa (avvertimento, errore.); e reagire con il codice basato in funzione del pulsante che l'utente ha cliccato.

GetFont(): permette a te o all'utente di selezionare un font ed gli attributi del font. In gran parte questo non è veramente utile nella maggior parte delle applicazioni, ma come sviluppatore potrebbe venirti utile ottenere informazione circa un font specifico.

GetColor(): Chiama una finestra di dialogo in cui è possibile definire un colore personalizzato o selezionare un colore dalla relativa tavolozza. Restituisce una stringa di caratteri contenente i valori red, green e blue per il colore selezionato.

GetDir(): seleziona una directory/cartella (questo metodo chiama finestre di dialogo nello standard Windows).

GetFile(): seleziona un file da aprire (vedi precedente).

PutFile(): seleziona un file per salvarlo a (questo metodo chiama finestre di dialogo nello standard Windows).

ChoosePrinter(): seleziona la stampante, ed imposta alcune proprietà per un report (o per tutta l'applicazione, non necessariamente é una buona idea). puoi usare questa finestra di dialogo dall'oggetto report: reportName.printer.choosePrinter(), piuttosto che usarla dall'oggetto applicazione: _app.choosePrinter(). Usandola dall'oggetto applicazione imposterai la stampante predefinita (default) per la tua applicazione, usandola dall'oggetto report imposterai la stampante definita per quel report.

Schede di Comunicazione/ Informazione queste schede di solito non sono disegnate per interagire direttamente con l'utente, ma per lasciare sapere loro che un processo è in fase di avanzamento (o in esecuzione).Questo lascia comprendere all'utente che qualche cosa realmente accade, e, che il loro computer non è "gelato."

Questo è un buon posto per mettere una progress bar (barra di avanzamento) se i tuoi utenti hanno bisogno di un indizio visuale.

Torna al Menu


Consigli e Suggerimenti

Problemi nella progettazione delle Schede

Come potrai immaginare ci sono sempre una tonnellata di concetti quando progettiamo una scheda. Progetta le tue schede con il minimo comune denominatore per la risoluzione dello schermo. Molti sviluppatori, progettano le loro schede ad alta risoluzione (1024 x 768, per esempio), ma trovano che i loro clienti, hanno i loro monitor impostati a bassa risoluzione (spesso 800 x 600). Non esiste un buon modo per costruire la tua scheda, "adattabile" alle differenti risoluzioni, usando le schede in Visual dBASE. (Molti hanno provato, e l'ammontare del codice è notevole con risultati meno che soddisfacenti.) Per non sbagliare sin dal principio, vedi quale è la più bassa risoluzione che i tuoi utenti useranno, e fai in modo che le tue schede siano progettate per quella risoluzione.

In merito a tale problema, il modulo impostazione scheda visualizza un paio di linee, che ti danno un luogo per "tagliare" le tue schede per la più bassa risoluzione predefinita (640 x 480). Se fai in modo che nessuna delle tue schede è più grande di quelle linee guida (non sono visualizzate quando la scheda é eseguita), il risultato dovrebbe essere eccellente.

Oggetti testo

Gli oggetti testo possono usare molte risorse.Gli oggetti testo in Visual dBASE possono interpretare alcuni degli standard HTML 3.0 come tags standard. Questo significa che quando lanciate una scheda, ciascuno oggetto testo deve valutare i contenuti della sua proprietà testo per vedere se c'è qualche tags HTML, ed in tal caso, li esegue (per configurare il testo).

Molta gente, ha trovato che il migliore modo per superare questa limitazione, è usare oggetti entryfield con il bordo impostato a "None" (nessuno) e vari altri cambiamenti fatti per l'apparenza, così che, guardandoli sono simili agli oggetti testo. Se vuoi usare questo modo assicurati di impostare l'evento when a falso ({; return false}) altrimenti il tuo utente può trovare alcuni risultati non buoni sulla scheda.

Puoi desiderare di mettere un controllo custom (o di più se hai bisogno di differenti tipi di controlli testo).

Quando disegni schede dovresti evitare di usare la scorta controlli il più possibile. Ciò è discusso in ogni documento HOW TO. Ho creato a tal fine un tutorial per Visual dBASE 7, vedi al mio sito web perché è così importante.

Se hai un'applicazione con 30 schede, ed il tuo utente decide improvvisamente, che ciascun entryfield deve comportarsi in modo lievemente differente, o usare un font diverso, sei costretto a "passare" attraverso ciascuna scheda per effettuare le modifiche. A meno che, hai usato controlli custom, in tal caso puoi fare le modifiche nel file dei controlli custom, ed ogni scheda sarà aggiornata automaticamente. (Vedi CONTROLS.ZIP al mio sito web).

Come sopra, devi, per le stesse ragioni, usare schede custom il più possibile. Per questo ci sono alcune linee guida e suggerimenti in CUSTFORM.ZIP al mio sito web.

Usando la proprietà Rowset delle Schede

Quando lavori con schede dati, devi, usare la nuova proprietà del rowset della scheda.

Molti dei controlli custom presumono che hai impostato questa proprietà, e tenteranno di lavorare su quel rowset particolare.

Se hai aperto tabelle multiple per una scheda, puoi commutare avanti ed indietro tra loro, e cambiare la proprietà rowset della scheda per puntare ad un rowset diverso. Ciò permetterà ad ogni pulsante custom o ad altri controlli che lavorano sul rowset della scheda di lavorare su un rowset diverso da quello che ha aperto la scheda.

Un esempio di questo genere, potrebbe essere una scheda dove hai il master e il detail rowsets (collegato l'uno all'altro con masterRowset e masterFields o con le proprietà del masterSource). Normalmente il master rowset, dovrebbe essere l'unico controllo assegnato alla proprietà rowset della scheda. Comunque, piuttosto che avere due insiemi di pulsanti per la navigazione (per muovere il puntatore di riga attraverso i records), potresti, invece, avere un insieme di pulsanti che lavorano sul rowset della scheda, ed alternare il riferimento al rowset. Questo è affrontato in dettaglio in MISCCODE.ZIP al mio sito, con diversi differenti esempi.

Eseguendo una scheda

Ci sono due modi principali per eseguire una scheda. Il primo è eseguirlo come programma:

do myform.wfm

Con questo si ha il vantaggio che è facile lavorare, ma ha anche alcuni svantaggi.
Quando esegui una scheda con il comando visto sopra si assume per default che la scheda sia non modale. Puoi forzare questo a scheda modale tramite:

do myform.wfm with true

Questo permette di impostare il codice di avvio standard sopra il codice costruttore (la dichiarazione che legge "CLASS myformForm OF FORM") in modo che la proprietà mdi della scheda sia messa a falso, ed aprire la scheda con il metodo readModal(), piuttosto che con il metodo open() predefinito.
Quando esegui una scheda in questo modo, il riferimento alla scheda è "locale" al programma, significa che non puoi accedere a esso da fuori del codice della scheda. Se hai bisogno di comunicare con la scheda in qualche modo, non puoi comunicare. Se hai bisogno di controllare la scheda da fuori della definizione della scheda, non puoi farlo.

Il secondo metodo di eseguire una scheda è più complesso, ma ti permette di ottenere alcuni controlli sulla scheda che il primo metodo non poteva offrirti:

set procedure to myform.wfm additive
fMyForm = new MyFormForm()
 // seleziona una delle seguenti:
fMyForm.open() // se la scheda é aperta non modale (MDI)
fMyForm.mdi := false // scheda modale 
fMyForm.readModal() // scheda modale (dialogo)

Una volta aperta la scheda possono accadere una o due cose. Se hai aperto la scheda con il metodo open(), quel codice che hai destinato ad essere eseguito dopo l'apertura della scheda sarà eseguito ORA. In altre parole, una scheda non modale è adesso una finestra aperta in attesa di interagire con l'utente, e ogni codice dopo la chiamata al metodo open() continuerà ad essere eseguito.

Se la scheda é aperta come una scheda modale (con readModal()), il codice che è dopo la chiamata al metodo readModal() sarà eseguito quando la scheda sarà chiusa.

Come puoi vedere, questo pone alcune interessanti domande di progettazione quando sviluppi la tua applicazione. Nella maggior parte casi se apri una scheda "non modale," semplicemente stabilisci che non c'è alcun codice che vuoi eseguire dopo che la scheda é stata aperta nel codice che è usato aprire la scheda.

Schede che comunicano con altre schede

Piuttosto che riscrivere l'eccellente lavoro di Alan Katz, dovresti andare al suo sito web e scaricare "FORMVARS.HOW." Questo documento HOW TO è stato scritto per VdBASE 5.5, ma la maggior parte o tutte le tecniche discusse sono valide in Visual dBASE 7.

   Visual dBASE Newsletter 

Alan ha tutti i documenti HOW TO di Visual dBASE 5.x a questo sito web, ed anche suo uno Visual dBASE 7 HOW TO: OODML.HOW.

Disattiva il tuo oggetto dati

Se hai una applicazione che ha bisogno di usare le stesse tabelle in schede diverse (o istanze multiple della stessa scheda), o hai un programma di utilità per compattare le tabelle ecc.., tu o i tuoi utenti avete potuto vedere un errore che messo in parole somiglia a qualcosa di simile:

Riga in uso da un altro... Riprova....

Il problema è, la riga è in uso o no?

Se una scheda non disattiva le tabelle, e qualche volta anche l'oggetto database (se uno è in uso), allora la tabella può essere considerata davvero dal programma come " in uso," ed una riga singola (l'unica che tu o il tuo utente avevi visto/editata ) può davvero ancora essere "bloccata".

Come risolvere questa situazione?

Il miglior modo è disattivare il tuo oggetto dati. Il massimo livello degli oggetti dati (datamodref, database e query) possiedono una proprietà active se la imposti a falso, risolverai il problema.

Il miglior posto dove fare questo è nell'evento canClose della scheda:

function form_canClose
 form.datamodref1.active := false // se usi un modulo dati
 // se non usi un datamodule:
 form.query1.active := false   
 form.database1.active := false

In alcuni casi questo non sempre risolve il problema, comunque di solito la situazione dove questo trucco non funziona è quando usi le proprietà masterRowset e masterFields del rowset per una tabella figlio/dettaglio. In quei casi puoi avere bisogno di aggiungere una chiamata al (figlio o al dettaglio) metodo unLock del rowset, il quale rimuoverà questo problema particolare.

function form_canClose
  // se usi un datamodule:
  form.datamodref1.childquery1.rowset.unlock()
  form.datamodref1.active := false
  // se non usi un datamodule:
  form.query1.active := false
  form.childquery2.rowset.unlock()
  form.childquery2.active := false
  form.database1.active := false

Non ti garantisco al 100 % che questo trucchetto risolverà il problema, ma dai test da me effettuati sembra che funzioni...

Così, Cosa posso fare con tutto questo?

La tua migliore possibilità, se non sei sicuro, è guardare le applicazioni di esempio di Visual dBASE, gli altri documenti HOW TO, con il relativo codice di esempio. In più ti ricordo il mio Tutorial...

Torna al Menu


Sommario

Questo documento è molto simile ad una "guida per principianti" al modulo di impostazione scheda di Visual dBASE 7, così non ogni argomento è stato trattato in dettaglio come potrebbe meritare (o come potresti averne bisogno specificamente).

Come con molti dei documenti HOW TO, l'idea è darti la partenza. Puoi trovare altri documenti HOW TO , inclusi documenti su schede custom, schede multi pagina, ed un particolareggiato HOW TO della maggior parte dei vari controlli che possono essere usati sulle schede a:

http://www.mindspring.com/~hirschv/dbase/dbase.htm

Per assistenza specifica per favore usa il Newsgroups di Visual dBASE (vedi: http://www.dbase2000.com per più dettagli). Per favore non contattare l'autore direttamente tramite la posta elettronica...

AVVISO: l'autore e' membro del dBVIPS (dBASE Volunteer Internet Peer Support) -- un gruppo di volontari che fornisce supporto tecnico per dBase Inc. sui newsgroup del Visual dBase (news.dbase2000.com). Se si hanno quesiti da porre riguardanti questo documento .HOW, o sul Visual dBase si puo' comunicare direttamente con l'autore e con i dBVIPS negli appropriati newsgroup su internet. Il supporto tecnico non e' generalmente fornito per mezzo di e-mail privati inviati dai membri del dBVIPS.

.HOW files sono creati come un servizio gratuito dai membri del dBVIPS per aiutare gli utenti ad usare in maniera piu' completa il Visual dBase. Essi sono curati sia dai membri del dBVIPS che dal Supporto Tecnico di dBASE, Inc. (per assicurare qualita'). Questo .HOW NON PUO' ESSERE PUBBLICATO senza il permesso esplicito dell'autore, che conserva tutti i diritti sul documento.

Copyright 1999, Kenneth J. Mayer. All rights reserved.

Informazioni su Dbase Inc. possono essere trovate all’indirizzo:

		http://www.dbase2000.com

EoHT: BEGFORM.HTM -- Marzo 21, 1999 -- KJM

Torna al Menu