Autore Topic: Modificare proprietà di una form  (Letto 2208 volte)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Modificare proprietà di una form
« il: 07 Febbraio 2009, 23:26:30 »
Nel mio progetto di contabilità familiare ho inseriro una form (Form1) per la scelta della data contabile da registrare. All'avvio della classe relativa viene cercata e preparata automaticamente una data che può essere anche quella di una giornata non chiusa, cioé non completamente definita. Ho allora previsto una listbox in cui elencare tutte le eventuali date di giornate non chiuse. Però qualora non dovessero essere presenti giornate non chiuse (quindi aperte), vorrei ridurre l'ampiezza della Form1, modificandone la proprietà "width", senza eliminare la listbox che si trova nella parte destra della Form. Spero di essere stato chiaro. Per fare capire meglio il concetto allego la schermata, comprensiva dell listbox delle giornate aperte.
Poiché tale modifica viene fatta all'interno di una classe dinamica creata all'uopo per la costruzione della data automatica da proporre all'operatore, quindi in una classe diversa di quella della Form1.class, ho scritto il seguente codice di modifica della width di cui ho detto sopra:
Citazione

NomeRec = DB_Connection.edit("GGAperte")  'collega il campo di memoria NopmeTab alla Tabella GGAperte in modalità lettura record
   i_NumElem = NomeRec.Count     'estrae il n° di record presenti nella tabella GGAperte
IF i_NumElem <> 0 THEN      'Tabella  "GGAperte" -->  POPOLATA
      NomeRec.MoveFirst          ' Legge il primo record utile della tabbella
      $StriMia = NomeRec!DtCoGGAp
Codice: [Seleziona]

         Form1.width = [600]       ' allarga la grandezza della Form per rendere visibile la ListBox con le date delle giornate aperte

      FOR i_Ind = 0 TO i_NumElem - 1
        $StriMia = NomeRec!DtCoGGAp
        i_Mese = Val(Mid$($StriMia, 5, 2)) - 1    'il valore stringa viene trasformato in valore numerico per prelevare il mese in chiaro dalla Combobox "DtContMM"
        Form1.List_GGAp.i_Ind = [Right$($StriMia, 2) & "-" & Form1.DtContMM.i_Mese & "-" & Left$($StriMia, 4)]
        NomeRec.MoveNext
        INC i_Ind
      NEXT
   ELSE
Codice: [Seleziona]

    Form1.width = [392]    ' riduce la visibilità della Form per l'inesistenza di giornate aperte da rendere visibile la ListBox relativa



Ecco, l'esecuzione dell'istruzione  "Form1.width = [392]" blocca il programma con:
Citazione

l'Errore

Not enough arguments


che tradotta in parole povere dovrebbe corrispondere a: "Argomenti insufficienti".
 :-(

Ho riportato tutto il codice scritto per pura completezza, ma come é facile intuire la precednte istruzione di "modifica width" non viene ancora eseguita per la mancanza di elementi nella tabella GGAperte. Devo dire che nonostante che per consuetudine dalle mie parti c'é sole per gran parte dell'anno (per ora però c'é solo luce, però bagnata dalla pioggia), personalmente mi trovo nel buio più nero!
Evidentemente ho qualche rotella arrugginita dall'acqua piovuta da gennaio fino ad oggi. :-)
Rido da incosciente, ma il buon umore serve per andare sempre avanti. :-)
 :ciao:
:ciao:

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Modificare proprietà di una form
« Risposta #1 il: 07 Febbraio 2009, 23:40:33 »
Ma perché usi le parentesi []?
Non dovresti mettere Form1.Width = 382?
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Modificare proprietà di una form
« Risposta #2 il: 08 Febbraio 2009, 00:15:56 »
Infatti....il problema sono le parentesi....basta assegnare il valore semplicemente digitando il numero o una variabile adeguatamente dichiarata dopo il simbolo =

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Modificare proprietà di una form
« Risposta #3 il: 08 Febbraio 2009, 19:28:53 »
Citazione

leo72 ha scritto:
Ma perché usi le parentesi []?
Non dovresti mettere Form1.Width = 382?


Anch'io pensavo così; ibnfatti iniziamente non avevo messo le parentesi e, poiché ho ricevuto l'errore ho aggiunto le parentesi che, nella formulazione del messaggio, ho dimenticato a togliere. Il risultato é sempre lo stesso --> "Not enough  arguments".

Se disattivo la riga "Form1.Width = 382?" la form compare regolarmente nella schermata, ma nella sua dimensione massima, cioé quella di disegno della form. L'allegato al mio messaggio di partenza é stato ottenuto disattivando appunto l'istruzione incriminata. :-?
 :ciao:
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Modificare proprietà di una form
« Risposta #4 il: 08 Febbraio 2009, 20:39:01 »
non è che hai qualche altra variabile o elemento che per errore hai chiamato width?

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Modificare proprietà di una form
« Risposta #5 il: 08 Febbraio 2009, 22:30:54 »
Citazione

fsurfing ha scritto:
non è che hai qualche altra variabile o elemento che per errore hai chiamato width?

Ho controllato: non esistono conflitti del tipo suggerito. Ho fatto un'altra prova che riguarda sempre la form1:
Codice: [Seleziona]

 ' Form1.width = 392  'istruzione disabilitata
Form1.List_GGAp.Visible = FALSE

Dopo avere disabiltato la prima istruzione  ed avere inserito la seconda, il messaggiio di errore é cambiato:
Citazione

unknown symbol 'List_GGAp'in class 'Form1'.Form

Il problema investe tutti gli elementi interni alla Form1, però l'identificatore 'Form1' é riconosciuto.
E' strana però una cosa: dopo l'esplosione dell'errore, dando OK, posso vedere l'istruzione che ha determinato l'errore. Se ora faccio doppio click su "List_GGAp" dentro la stessa istruzione, vedo comparire una finestra dal titolo "List_GGAp (ListBox), dove sono elencate tutte le proprietà della ListBox in questione. Io non ci capisco niente!
 :-?  :cry:
Ciao a tutti.
:ciao:

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Modificare proprietà di una form
« Risposta #6 il: 08 Febbraio 2009, 23:50:46 »
Il comando che hai dato tu (la sintassi pare molto simile a quella di visual basic):

Form1.List_GGAp.Visible = FALSE

devi darlo in questo modo:

List_GGAp.Visible = FALSE

in quanto gambas sa già che tu ti trova nel form1 e che la listbox appartiene a quel form. Se invece vuoi comandare elementi di un form da un altro form se non erro non si può fare..dovresti ricorrere alle variabili pubbliche inserite in un modulo....

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Modificare proprietà di una form
« Risposta #7 il: 09 Febbraio 2009, 00:24:19 »
Come già scritto in altre discussioni, ripeto che tocca fare attenzione a come vengono dichiarati i metodi e i controlli all'interno di una Form.
Nelle proprietà di progetto, cartella Opzioni, sono presenti due checkbox, con cui definire PUBLIC, o meno, i simboli e i controlli interni alla Form.
Di default, queste impostazioni sono FALSE, ovvero i simboli non possono essere chiamati o puntati dall'esterni; questo è valido anche dagli stessi metodi della Form. In questo caso, il controllo viene definito PRIVATE, e può essere acceduto solo tramite il suo nome, senza precederlo dal nome del contenitore, e solo dall'interno della Form.
Se i simboli e i controlli sono dichiarati PUBLIC, la cosa cambia aspetto, ovvero, i nomi diventano proprietà visibili della Form, per cui visibili da qualsiasi parte vengono chiamati (l'intera applicazione), anteponendo il nome della form contenitore:
Codice: [Seleziona]

Form1.Control1.Text

oppure, dall'interno della stessa classe Form:
Codice: [Seleziona]

ME.Control1.Text

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Modificare proprietà di una form
« Risposta #8 il: 09 Febbraio 2009, 09:29:00 »
Citazione

md9327 ha scritto:
Nelle proprietà di progetto, cartella Opzioni, sono presenti due checkbox, con cui definire PUBLIC, o meno, i simboli e i controlli interni alla Form.
Di default, queste impostazioni sono FALSE. . . .

Grazie per il suggerimento; purtroppo non avevo ancora letto quello che mi hai sapientemente indicato nella tua risposta. Ho applicato l'opzione "PUBLIC TRUE" a tutti e due i checkbox ed il messaggio di errore "unknown symbol 'List_GGAp'in class 'Form1'.Form" non é più comparso. Resta però sempre il problema dell'errore
Citazione

Not enough arguments

legato alla riga
 
Codice: [Seleziona]

Form1.width = 392

L'istruzione appartiene ad una classe diversa dalla Form1.class. Però se invece eseguo:
 
Codice: [Seleziona]

ME.width = 392

dentro la Form1.class, l'esecuzione va di filato alla presentazione della Form1, senza provocare l'errore "Not enough arguments", oggetto del mio incubo. Sembra che manchi qualche opzione in qualche altra parte del progetto o qualche parametro nell'istruzione.
 :roll:

  :ciao:
:ciao:

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Modificare proprietà di una form
« Risposta #9 il: 09 Febbraio 2009, 19:41:53 »
La cosa è legata, appunto, all'impostazione PUBLIC/PRIVATE dei simboli.

Come per gli altri linguaggi, anche se con construtti diversi, il puntamento fatto all'oggetto stesso, dall'interno dei suoi metodi, può essere fatto con la parola chiave "ME". In C++ si usa "this", in Python "self", e così via; la differenza stà nelle impostazioni che si danno a livello di compilazione, come ho descritto nel post precedente.
La parola "ME", però, deve puntare ad un'oggetto pubblico, ovvero visibile al mondo, per cui è necessario che il controllo che fà parte (ed è di proprietà) della Form, sia un nome PUBLIC; in caso contrario, l'unico modo per accedere ad oggetti privati, è quello di chiamarli direttamente con il proprio nome (come definito nella dichiarazione), ma dato che sono dichiarati automaticamente PRIVATE, sono visibili solo all'interno della classe che li contiene.

Un giochetto che, almeno per me, è venuto spontaneo, e solo nei casi di debba costruire qualcosa in modo dinamico, è  quello di dichiarare una variabile privata, e di definire un metodo PUBLIC per la lettura di quell'oggetto:
Codice: [Seleziona]

'Classe Form1

PROPERTY READ MyCombo AS COMBOBOX

PRIVATE $combo1 AS COMBOBOX

PUBLIC SUB _new()
  $combo1 = NEW ComboBox(ME)
END

PRIVATE FUNCTION MyCombo_Read()
  RETURN $combo1
END

a) con la riga con Property dichiaro un metodo della form, che mi ritorna il puntatore all'oggetto combobox;
b) dichiaro una variabile privata, nella form, di tipo ComboBox;
c) nel metodo di costruzione della classe Form, creo dinamicamente una combobox, e il puntamento lo metto nella variabile precedente.

In questo modo, alternativo, e anche se con qualche riga di codice in più, ho un maggior controllo degli oggetti, perchè posso definirli in modo dinamico; inoltre, la possibilità di creare un metodo di lettura (MyCombo_Read), mi permette di fare anche altre cose, oltre al ritornare il valore della variabile.
Ad esempio, posso dichiarare una nuova proprietà della Form:
Codice: [Seleziona]

PROPERTY Contatore AS Integer

PRIVATE $contatore AS Integer

PUBLIC SUB _new()
  $contatore = 0
END

PRIVATE FUNCTION Contatore_Read()
  RETURN $contatore
END

PRIVATE SUB Contatore_Write(Value AS Integer)
  $contatore = Value * 100
END

in questo caso Contatore ha due metodi virtuali, uno in lettura e uno in scrittura, e tutti e due agiscono sulla variabile nascosta $contatore; se noi usiamo questa classe, come ad esempio:
Codice: [Seleziona]

DIM oForm as NEW Form1
oForm1.Contatore = 10
PRINT oForm1.Contatore
> 1000

come puoi vedere, Contatore si comporta come se fosse una variabile della Form, però quando gli viene impostato un valore (10), nel metodo che si occupa della sua gestione (Write), questo valore viene moltiplicato (x100). Il metodo di lettura (Read) ti ritornerà il suo valore, però moltiplicato per 100.
Tutto ciò è avvenuto, utilizzando la variabile privata $contatore, non accessibile dall'esterno, per cui protetta da eventuali errori; questo per dire che, se vogliamo, possimo inserire nel metodo di scrittura un controllo sulla validità del dato immesso, prima che questo venga realmente memorizzato nella proprietà.

Io spero di non averti incasinato le idee; forse ho allungato un pò troppo la broda, ma mi sembrava il caso di portare il discorso ad un ragionamento, più che al seguire la sola logica sintattica.

  • Visitatore
Re: Modificare proprietà di una form
« Risposta #10 il: 10 Febbraio 2009, 12:22:16 »
Ciao
visto che sei in vena di spiegazioni e  visto che lo hai usato  :
Non ho mai capito a cosa serve il $, visto che lo trovo spesso in funzioni come left ( che può essere anche left$ ) ....

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Modificare proprietà di una form
« Risposta #11 il: 10 Febbraio 2009, 16:30:13 »
E' un retaggio del vecchio Basic. Sintatticamente in Gambas non c'è differenza fra Left() e Left$(), Mid() e Mid$() ecc...

Una volta si usava il segno $ per le variabili di tipo stringa, e probabilmente si postponeva il $ nei nomi delle funzioni che operavano sulle stringhe forse per ricordarsi su che tipo di dati lavoravano.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Modificare proprietà di una form
« Risposta #12 il: 10 Febbraio 2009, 22:12:59 »
Citazione

md9327 ha scritto:
La cosa è legata, appunto, all'impostazione PUBLIC/PRIVATE dei simboli.
..............................................

Innanzitutto ti ringrazio per il supporto che mi hai offerto e mi dispiace dover chiedere, continuamente ...chiedere, però avendo già modificato le proprietà del progetto relativamente ai simboli dei Moduli e dei Controlli dei Form rendendoli PUBLIC non capisco perché una proprietà di un form (oggetto statico) non possa essere referenziata da una classe esterna. Non capisco perché un Errore di Sintassi debba essere risolto con arzigogolazioni da "Ginnastica Mentale" che nel mio status di apprendista in erba non riesco a digerire.
Perciò, considerato che alla fine il mio problema é quello di passare alla Form1.class un numero per il ridimensionamento della Form, ho pensato di aggiungere un parametro a quelli già preparati nell'istruzione di richiamo della classe dinamica di ricerca di giornate aperte:
Citazione

Nella Form1.class:
Codice: [Seleziona]

PUBLIC SUB _new(GGDtCont AS String, MMDtCont AS String, AADtCont AS String, Datacont AS String)
 
  DIM $TipoRich AS String
  DIM $LegDtCont AS CercaDtContAutom  
 
  $TipoRich = "Autom"
  $LegDtCont = NEW CercaDtContAutom($TipoRich, GGDtCont, MMDtCont, AADtCont, Datacont, i_LarghForm) 'richiamo classe dinamica di gestione delle Giornate aperte


Nella CercaDtContAutom:
Codice: [Seleziona]

PRIVATE Lungh AS Integer

PRIVATE DB_Connection AS NEW Connection  
PRIVATE DBname AS String  'Nome del Database'''
PRIVATE DB_path AS String 'Percorso di ricerca del Database ContabFam.db
PRIVATE sql AS String
PRIVATE NomeRec AS Result
PRIVATE sqlDtConAperta AS Result


PUBLIC SUB _new(sTipoRich AS String, GGDtCont AS String, MMDtCont AS String, AADtCont AS String, Datacont AS String, Lungh AS Integer)


   
  DBname = "ContabFam.db"  'imposto i parametri di connessione
  DB_path = Application.path & "/ContabFam_DB"        
  WITH
      DB_Connection
      .Type = "sqlite3"
      .Host = DB_path
      .Name = DBname
      .OPEN    'Apro il DB
      .Login = ""
      .Password = ""
  END WITH
  DB_Connection.Begin
  SELECT sTipoRich
    CASE "Autom"
        ME.Leg_Dt_Autom()    'modulo interno alla classe nel quale --> Lungh=392
  END SELECT  
END      

A questo punto ho accertato che la variabile Lungh contenesse il valore 392.
Rientrando, dopo l'istruzione END, in gioco la classe Form1.class:
Codice: [Seleziona]

 WITH
    ME
    .width = i_LarghForm      'il valore contenuto é '0'
    .Show
  END WITH

La variabaile  i_LarghForm non prende in carico il valore determinato nella CercaDtContAutom.class, come se non fosse tornato niente.

E tutti imiei sfoprzi sono stati inutili; sono sempre al punto di partenza.
 :fuso:

Ciao a tutti.
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Modificare proprietà di una form
« Risposta #13 il: 10 Febbraio 2009, 22:37:21 »
se potessi postare il programma come allegato ti potremmo aiutare meglio

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Modificare proprietà di una form
« Risposta #14 il: 11 Febbraio 2009, 12:53:52 »
Citazione

fsurfing ha scritto:
se potessi postare il programma come allegato ti potremmo aiutare meglio


Per la verità non pensavo di impegnare la comunità fino a questo punto, ma non ho alcuna difficoltà a farlo. Chiedo perdono l'utilizzo di nomi particolari, ma sono abitudine prese quando, lavorando, ero costretto ad utilizzare nomi lunghi al massimo 8 crt ed ho imparato a comporli così per renderli parlanti. Era importante riprenderli al volo in occasioni di rivisitazioni ai programmi a distanza di tempo dalla loro stesura. Mi rendo conto che codesto metodo rende meno agevole la lettura a persone diverse da me.
Spero solo di essere riuscito a costruire bene l'allegato.
 :ciao:
:ciao: