Autore Topic: Gestionale Perseo  (Letto 7536 volte)

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Gestionale Perseo
« Risposta #45 il: 19 Ottobre 2010, 15:07:36 »
milio sei il re delle classi

devo farti una richiesta e non so se vado off topic (nel caso mi prendo una ramanzina da ceskho  :'()

il codice che ho postato per golia lo uso su vari form per farli adattare alle varie risoluzioni, solo che lo inserisco in ogni form, si può creare una classe?

Sei offtopic....veramente tutto il topic sta andando fuori dai binari iniziali...su su su ragazzi...in riga....

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Gestionale Perseo
« Risposta #46 il: 19 Ottobre 2010, 15:11:50 »
Grazie Millo,

quella di CPersona è un esempio di una delle classi che vorrei costruire.

In sostanza vorrei, attraverso un ciclo (tipo FOR EACH... IN CPersona) sapere se ogni campo è stato dichiarato.

Ti simulo un processo logico:
Nel form vengono inserite delle Textbox per specificare alcuni campi (per definire stringhe, boolean e date) della classe CPersona. Ogni TextBox si riferisce ad una proprietà di della classe CPersona. Quindi avrò la txtCognome per CPersona.cognome, txtNome per CPersona.nome, btnSesso per CPersona.sesso, txtDatadiNascita per Cpersona.datadinascita.

Quando richiamo la funzione Calcola_Codice_Fiscale... se ci fosse una proprietà di CPersona non specificata, la funzione mi restituisce errore. quindi la mia domanda è: esiste un modo per controllare che tutte le proprietà di CPersona siano state dichiarate?

Vorrei evitare di fare questo controllo sia sui Controlli TextBox, sia tramite IF CPersona.[proprietà] = "" THEN..., perché questo tipo di controllo dovrò farlo su tanti altri form di immissione dati. Quindi per ognuno dovrei scrivere dei controlli personalizzati.
Invece mi chiedevo se c'era un metodo generico, in cui specificando solo il nome della classe, la funzione mi esegua il controllo su tutte le sue proprietà (senza sapere quali e quante siano).
In pratica questa soluzione, se possibile, credo che mi risolverebbe un casino di tempo e renderebbe il codice molto più snello.

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: Gestionale Perseo
« Risposta #47 il: 19 Ottobre 2010, 17:51:04 »
Bhe sicuramente il codice fiscale puoi inserirlo come una proprietà della classe CPersona:

Codice: vb.net [Seleziona]
Property Read CodiceFiscale as String

Private Function CodiceFiscale_Read() As String

  ...
   ' Codice di calcolo codice fiscale

   ' se uno o piu' elementi che compongono il codice fiscale non sono dichiarati dai un bel Return ""
   ' altrimenti ritorni il codice fiscale calcolato

End


La proprietà rimane in sola lettura e soltanto quando le varie proprietà da te scelte sono settate, restituisce il codice... Naturalmente il 'vedere' se ogni proprietà e' settata e' una procedura che metterai all'interno della classe stessa, in modo da essere sempre disponibile in qualsiasi punto del tuo programma che richiama il codice fiscale della classe...

Se vuoi mi scarico il tuo programmino che hai postato la volta scorsa e ti faccio una bozza di classe, cosi' almeno ci capiamo meglio ;)


@ dex

ci do un'occhiata e ti dico (naturalmente in un altro post, appena l'avrai aperto ;) )

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Gestionale Perseo
« Risposta #48 il: 19 Ottobre 2010, 19:43:21 »
Certo Millo,

se vuoi dargli un'occhiata ne sarei felice.

Intanto, come suggeritomi anche da Ceskho, ho abbozzato un modulo per il calcolo del codice fiscale... ed ho aggiunto la soluzione "form_resize" consigliata da dex. Te lo allego qui.

 :)

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: Gestionale Perseo
« Risposta #49 il: 19 Ottobre 2010, 22:44:31 »
eccoti un esempio di classe Persona con evento su calcolo di codice fiscale....

e' sicuramente migliorabile  :-[ ,  se hai dubbi chiedi pure :)

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Gestionale Perseo
« Risposta #50 il: 20 Ottobre 2010, 11:01:51 »
Millo, non ho parole!
Riscrivendomi il codice mi hai dato tanti spunti che ignoravo.

Le cose che mi sembra di aver capito sono che:
1) Le proprietà della classe che vengono create hanno dei metodi _read() e _write() che vengono invocati quando si legge o si scrive una di queste proprietà della classe. Quindi sono ottimi quando si vuol fare un controllo oppure quando si vuol tentare il calcolo di una funzione, ecc.
La proprietà CodiceFiscale è l'unica di sola lettura... perché giustamente deve essere calcolata (e non inserita a mano).

2) La funzione CalcoloCodiceFiscale() restituisce un booleano... quindi se tutti i termini sono stati specificati, calcola il $CodiceFiscale e restituisce un TRUE, altrimenti se ci sono errori restituisce FALSE ed invoca la funzione NoCodice() --> questa attribuisce "" a $CodiceFiscale e... (qui ho un grosso dubbio) con RAISE richiama CalculateCode della FMain?

3) La funzione CalculateCode della FMain attribuisce $CodiceFiscale (ossia Persona.CodiceFiscale) alla txtCodiceFiscale... e se Persona.CodiceFiscale è vera (ossia diversa da "" ???) allora inserisce i .Caption alle Label della tessera sanitaria.

4) Ogni volta che viene editata una proprietà in scrittura (cognome, nome, datanascita, ecc.), se il CalcoloCodiceFiscale() è TRUE, allora invoca CalculateCode della FMain... e si torna al punto 3).

5) Chiaramente quando viene chiesto se CalcoloCodiceFiscale è TRUE o FALSE implicitmente viene fatto eseguire... quindi assegnerebbe $CodiceFiscale se fosse TRUE...

Questo è quello che sono riuscito a capire, e spero sia corretto.  :-[

Ho anche una grossa lacuna quando nella FMain dichiari:
Codice: [Seleziona]
Private Persona As CPers
...che vuol dire che l'istanzi con...
Codice: [Seleziona]
Persona = NEW CPers As "Persona"
???

PS: vedi la parte di codice quando comincia la funzione CalcoloCodiceFiscale()...
Codice: [Seleziona]
  If $Cognome = "" Then Return NoCodice()
  If $Nome = "" Then Return NoCodice()
  If IsNull($DataNascita) Then Return NoCodice()
  If $CodiceIstat = "" Then Return NoCodice()
  If $Sesso = "" Then Return NoCodice()

Io mi chiedevo se esiste una funzione che esegua il controllo tipo:
FOR EACH proprietà IN CPers
  IF proprietà = "" then Return NoCodice()
NEXT

Se i campi da controllare fossero tanti sarebbe un buona alternativa a tutti gli IF...
« Ultima modifica: 20 Ottobre 2010, 11:17:19 da perseo »

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: Gestionale Perseo
« Risposta #51 il: 20 Ottobre 2010, 13:49:40 »
1)  :ok:

2) il comando Raise scatena l'evento dichiarato con l'istruzione Event, all'interno della classe contenitore (in questo caso in FMain)

3)  :ok:

4) No, in questo caso l'Evento CalculateCode viene comunque scatenate anche se il CodiceFiscale non puo' essere calcolato. In pratica l'evento mi serve solamente per tener aggiornato la textbox che contiene il codice. Se il calcolo del codice genera errore, la textbox assumerà  un valore nullo. Questo e' un punto che volendo si puo' anche riscrivere, facendo in modo che l'evento si scateni una sola volta se il calcolo del codice e' errato; allo stato attuale l'evento viene scatenato ogni qualvolta ci sia un aggiornamento nelle proprietà della classe

5) vedi punto 4 :)

Citazione
Ho anche una grossa lacuna quando nella FMain dichiari:
Codice:
Private Persona As CPers
...che vuol dire che l'istanzi con...
Codice:
Persona = NEW CPers As "Persona"
Quando scrivo:

Private Persona As CPers

dichiaro che la variabile Persona e' di tipo CPers, ma l'oggetto vero e proprio ancora non esiste in memoria.

Persona = NEW CPers As "Persona"

qui invece istanzio l'oggetto in memoria, quindi creo 'fisicamente' l'oggetto Persona e gli assegno una 'etichetta' dopo l'istruzione As che identifica nella classe contenitore i vari eventi dell'oggetto creato.
Diciamo che Persona puo' essere tante Persone, ma alla fine le caratteristiche sono sempre quelle della classe CPers
Quindi io posso anche avere:

Persona1 = NEW CPers As "Persona1"
Persona2 = NEW CPers As "Persona2"
Persona3 = NEW CPers As "Persona3"
Persona4 = NEW CPers As "Persona4"


ogni persona a nome, cognome .... e codice fiscale diversi, ma proprietà, metodi ed eventi uguali...

Citazione
PS: vedi la parte di codice quando comincia la funzione CalcoloCodiceFiscale()...
Codice:
 If $Cognome = "" Then Return NoCodice()
  If $Nome = "" Then Return NoCodice()
  If IsNull($DataNascita) Then Return NoCodice()
  If $CodiceIstat = "" Then Return NoCodice()
  If $Sesso = "" Then Return NoCodice()

Io mi chiedevo se esiste una funzione che esegua il controllo tipo:
FOR EACH proprietà IN CPers
  IF proprietà = "" then Return NoCodice()
NEXT

Se i campi da controllare fossero tanti sarebbe un buona alternativa a tutti gli IF...

Sinceramente non mi sono mai posto il problema, anche perche' il codice di controllo lo scrivi solamente una volta...
Con l'oggetto Class, dandogli come riferimento la classe CPers, puoi richiedere quali siano le sue proprietà, metodi ed eventi e con Object.GetProperty fai il controllo in questione es.:

Codice: vb.net [Seleziona]
Dim x As Class
Dim Txt As String

  x = Object.Class(Me)

  For Each txt In x.Symbols
    If x[txt].Kind = x.Property Then
      If IsString(x[txt].Value) Then Print Object.GetProperty(Me, txt)
    End If
  Next


Il codice e' sotto inteso che sia scritto nella classe CPers.


Ps.
Per spiegare certe cose non sono tanto bravo, non ho studiato informatica e uso un linguaggio terra terra, diciamo che certe cose le ho capite e altre le intuisco... per tutto il resto c'e' mastercard... :)

ti rimando anche a questo link per una spiegazione piu' esauriente ;) http://it.wikipedia.org/wiki/Oggetto_(informatica)
« Ultima modifica: 20 Ottobre 2010, 13:52:35 da milio »

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Gestionale Perseo
« Risposta #52 il: 20 Ottobre 2010, 14:03:26 »
milio sei il re delle classi

Ora capisco perché!  :ok: :ok:

Ho sostituito il controllo della "sequenza degli IF" con questo codice (mettendo i commenti delle cose che penso di aver capito  :-[ ):
Codice: VB.net [Seleziona]
Dim x As Class 'x è un oggetto classe
Dim txt As String 'txt è una stringa

  x = Object.Class(Me) 'Object.Class(Me) che cos'è?

  For Each txt In x.Symbols 'x.Symbols che cos'è?
    If x[txt].Kind = x.Property Then 'x[txt].Kind restituisce in formato numerico il tipo: "2" è una proprietà, "4" è una funzione, "3" è riferita a _new, ecc...; mentre x.Property restituisce il tipo in formato numerico delle proprietà dell'oggetto x (sempre 2)... PS: potrei sostituire direttamente x.Property con "2", visto che a me interessano le proprietà, in scrittura?
      If x[txt].name <> "CodiceFiscale" Then 'x[txt].name credo restituisca il nome della proprietà della classe
        If IsNull(Object.GetProperty(Me, txt)) Then Return NoCodice() 'Object.GetProperty(Me, txt) restituisce il valore della proprietà...
      End If
    End If
  Next


Non ho ancora capito bene il funzionamento, però è proprio ciò che cercavo!!! Fantastico Milio!  :)
Ora dovrò studiarmelo bene, approfondendo i vari argomenti.
« Ultima modifica: 20 Ottobre 2010, 16:15:44 da perseo »

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: Gestionale Perseo
« Risposta #53 il: 20 Ottobre 2010, 20:19:38 »
Object.Class(ME) e' un metodo dell'oggetto Object (Me si riferisce alla classe in cui stai scrivendo il codice e vale per qualsiasi classe) e vuol dire:

Dell'oggetto (me stesso) dimmi a che classe appartiene.

In questo caso restituisce la classe CPers

x.Symbol (sarebbe Class.Symbol) restituisce un oggetto String[] contenenti i nomi di tutte le proprietà, metodi ed eventi.


Per il discorso della costante Class.Property non fa una grinza il tuo ragionamento, ma quando rileggi il codice vien piu' facile riconoscerne il tipo.

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Gestionale Perseo
« Risposta #54 il: 27 Ottobre 2010, 19:33:59 »
In questo periodo non ho tantissimo tempo da dedicare alla programmazione, però appena posso sto dando un'occhiata a GOSH, il gestionale per alberghi di fsurfing. E' un bel lavoro e trovo molti spunti interessanti: ad esempio l'organizzazione degli utenti e del LOG, oppure l'utilizzo della classe gb.settings (molto molto utile), ed altre cose che man mano vengono fuori...

Davvero un bel lavoro!  :ok:

Spero di cominciare presto a buttar giù qualcosa anch'io...  :)

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Gestionale Perseo
« Risposta #55 il: 27 Ottobre 2010, 21:25:56 »
Citazione
n questo periodo non ho tantissimo tempo da dedicare alla programmazione, però appena posso sto dando un'occhiata a GOSH, il gestionale per alberghi di fsurfing. E' un bel lavoro e trovo molti spunti interessanti
sto gongolando!  :2birre: