-
| .
|
|
|
I campi editabili del dialogo "Input dei carichi" devono poter accettare esclusivamente numeri decimali, direi anche positivi avvertendo con questo di predisporre uno schema per il tracciamento delle isobare a partire dallo zero. Per la quota di applicazione del carico escludiamo di poter inserire carichi sollevati dal piano limite.
Per evitare errori ed eventuali crash del programma a causa din un tapino inserimento per una ascissa pari alla stringa "afazio" anziche il valore numerico, applichiamo il filtro dell'input (vedere 3d "il controllo del controllo") che accetta solo numeri ed una sola virgola decimale.
Il filtro: la funzione solo_numeri_e_virgola()
CODICE Function solo_numeri_e_virgola(tEsto_origine As String) As String
Dim lunGhezza_Testo As Integer Dim count As Integer Dim Carattere As String Dim NuoVoTesto As String Dim esiste_virgola As Boolean Dim codice_Ascii As Integer
NuoVoTesto = ""
esiste_virgola = False lunGhezza_Testo = Len(tEsto_origine)
For count = 1 To lunGhezza_Testo Carattere = Mid(tEsto_origine, count, 1) codice_Ascii = Asc(Carattere) Select Case codice_Ascii Case 44 ' il codice ascii 44 è la virgola. Se già esiste nel testo non la si considera If Not esiste_virgola Then Carattere = "," esiste_virgola = True Else Carattere = "" End If Case 46 ' il codice ascii 46 è il punto. If Not esiste_virgola Then Carattere = "," esiste_virgola = True Else Carattere = "" End If Case 48 To 57 Carattere = Carattere Case Else Carattere = "" End Select NuoVoTesto = NuoVoTesto & Carattere
Next
solo_numeri_e_virgola = NuoVoTesto
End Function
Con una immagine ne illustrerò l'uso. Intanto copiamo ed incolliamo questa funzione nel modulo "gestione"
|
|
| .
|
-
| .
|
|
|
Ecco l'immagine:
Basta un doppio clik su ciascuno dei controlli presenti nel dialogo di input dei carichi, si apre la pagina del codice privato (di questo dialogo) con già predisposta la sub che intercetta e gestisce l'evento on_clik di quel textBox, cambiamo l'evento in On_Change (scegliendolo dalla finestrella a discesa posta in alto a destra) e inseriamo semplicemente il codice:
CODICE Private Sub x_i_Change() x_i.Text = solo_numeri_e_virgola(x_i.Text) End Sub
stessa cosa facciamo per i rimanente TextBox del dialogo mentre al tasto "annulla" associamo semplicemente il codice che ci fa uscire dal dialogo senza operare alcunchè lasciando tutto inalterato.
CODICE Private Sub Carichi_annulla_Click() Me.Hide End Sub
La variabile Me altro non è che l'oggetto che contiene quel codice, in questo caso il dialogo di input dei carichi. QUindi la variabile Me assume sempre valore diverso in funzione dell'oggetto che contiene il codice.
IL tasto "Conferma dovra essere trattato in maniera diversa, dovendo modificarsi la variabile che contiene tutti i carichi fino a quel punto inseriti e dovendo di conseguenza aggiornare il contenuto della listBox che ho chiamato "BoxCarichi" e presente nel dialogo principale. Lo vedremo meglio a seguire.
NOTA. L'evento On_Click si compone di due eventi separati che sono: On_MouseDown e On_MouseUP (banale no?). Volendo potremmo gestire l'uno o l'altro. Inoltre, proprio relativamente ad un controllo EditBox esistono altri eventi che potremmo gestire allo scopo come per esempio On_KeyPress (ma io ormai ho usato l'evento On_Change e non lo cambio più), composto anche questo da due distinti eventi On_KeyDown e ON_KeyUp di facile ed immediata comprensione. L'evento On_KeyPress oltre da inviare notifica di avvenuto evento (al gestore degli eventi) passa un parametro che consiste nel codice ASCII del tasto premuto.
CODICE Private Sub q_i_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) ' qui potremmo mettere il codice che ci interessa avendo presente ' che la variabile KeyAscii passata è proprio il codice Ascii ' del tasto che è stato premuto all'interno del TextBox End Sub L'evento On_change viene sollevato ed inviato solo se il contenuto del TExtBox viene cambiato. Quindi non è opportuno fare ricorso all'evento On_click (dato che un clik sul text box non implica per forza una variazione del suo contenuto). La sub verrebbe chiamata inutilmente parecchie volte. Stessa cosa vale per L'evento On_keyPress. La pressione di un tasto non implica per forza la viariazione del contenuto; pensnte per esempio a selezionare un carattere del textBox e quindi ridigitare lo stesso carattere. L'evento viene sollevato e la sub viene chiamata inutilmente.
Dite che le cose iniziano a complicarsi? Ma no!!! Intanto penso che chi è stato paziente ed è riuscito a seguire fin qui ed applicare anche incorrendo in una serie stressante di messaggi di errore, quanto ho illustrato in maniera molto confusa, ha fatto il primo importante passo nella scalata di quella famosa scala di cui si parlava con ZAX.
Edited by afazio - 2/8/2012, 20:38
|
|
| .
|
-
| .
|
|
|
Oddio Afazio. Stai facendo uno sforzo titanico. riesco solo ad esprimere ammirazione e smisurata riconoscenza per l'impegno didattico. Meno male che sta tutto scritto qui al bar e che lo si potrà rileggere.
Per dire, io ho da poco scoperto questa:
https://bar-ingegneria.forumfree.it/?t=7396208
Sono un po' indietrino ... e poi mi perdo quando vedo che si può fare anche questo (che per me è quasi magia nera)
www.oaltd.co.uk/DLCount/DLCount.asp?file=FormFun.zip
CITAZIONE FormFun.zip (11 January 2005, 36k, 83003 downloads) Updated This download demonstrates all the fun you can have with an Office userform. The example form is modeless, sizeable and with or without a caption, icon, maximize, minimize and close buttons! Thanks to Tim Clem for working out how to set the userform's window style and get Excel to notice. This update fixes a problem when showing the userform's icon in the task bar and adds some usage notes as comments in the code.
|
|
| .
|
-
| .
|
|
|
Come già detto, il codice del tasto "conferma" relativo all'inserimento di un nuovo dato deve aggiornare la variabile dei carichi ma prima deve condurre quel minimo di controlli di cui avevamo discusso. Intanto deve controllare la congruenza tra l'ascissa di inizio carico e l'ascissa di fine carico con la limitazione
xf > xi
se il controllo è positivo allora aggiungiamo i dati letti dagli editBox del dialogo Input Carichi
Ma dove li mettiamo?
Ripartiamo allora dall'inizio. - Dobbiamo definire il tipo del record della variabile che conterrà i carichi - Dobbiamo stabilire un massimo numero dei carichi inseribili - Dobbiamo quindi inizializzare la variabile dei carichi. - Inoltre abbiamo bisogno di altra variabile che tenga conto del numero dei carichi inseriti
Queste variabili devono essere pubbliche, cioè accessibili da qualsiasi modulo e da qualsiasi punto o sub del progetto. Sottolineo questo fatto perchè una variabile definita in una sub, se non altrimenti specificato, resta visibile solo nell'ambito di quella sub ed il contenuto viene perso appena il controllo passa ad altra sub. Ovviamente noi non possiamo depositare i dati di un carico in una variabile che poi verrà persa non appena torniamo nel dialogo principale.
Le dichiarazioni delle variabili pubbliche e dei tipi va fatta in testa ad un modulo, nel nostro caso nel modulo "gestione". Nello stesso modulo metteremo pure il cocdice che chiama l'apertura del dialogo principale
CODICE Option Explicit
'Definisco il record tipo del carico Public Type CaricoType xi As Double ' ascissa d'inizio carico qi As Double ' intensità iniziale del carico xf As Double ' ascissa di fine carico qf As Double ' intensità finale del carico z0 As Double ' quota di applicazione del carico End Type
Public Const MaxCarichi = 12 'numero massimo di carichi ammessi
Public Carichi(MaxCarichi) As CaricoType 'variabile che contiene i carichi inseriti Public Num_tot_caRichi As Integer 'variabile che contiene il numero dei carichi inseriti
Sub avvia() ' prima inizializo a zero tutti i record dei carichi Dim i As Integer For i = 1 To MaxCarichi Carichi(i).xi = 0 Carichi(i).xf = 0 Carichi(i).qi = 0 Carichi(i).qf = 0 Carichi(i).z0 = 0 Next 'inizialmente il numero dei carichi inseriti è zero Num_tot_caRichi = 0 ' finalmente apro il dialogo principale Main.Show End Sub
Ecco il codice da inserire in testa al modulo "gestione" E' abbastanza commentato, ma se avete dubbi chiedete pure.
Edited by afazio - 3/8/2012, 19:36
|
|
| .
|
-
| .
|
|
|
Bene. La variabile dove inserire un nuovo carico si chiama Carichi() ed il numero totale dei carichi è contenuto nella variabile Num_tot_caRichi Abbiamo chiamato il dialogo principale con Main.Show ed in questo dialogo abbiamo premuto il bottone "Aggiungi Carichi" pervenendo nel dialogo "Input Carichi".
Qui abbiamo riempito i campi editabili coi dati richiesti e adesso premiamo il tasto "Conferma". Leghiamo all'evento On_clik di quest'ultimo bottone il seguente codice:
CODICE Private Sub Carichi_Conferma_Click()
Dim inDice As Integer
' prima controllo se xf è maggiore di xi ' se non è verificato do il messaggio di alert ed esco dalla sub If CDbl(x_f.Value) <= CDbl(x_i.Value) Then MsgBox ("L'ascissa finale di applicazione del carico" & vbCr & "deve essere maggiore dell'ascissa iniziale") Exit Sub End If
inDice = Num_tot_caRichi + 1
Carichi(inDice).xi = CDbl(x_i.Value) Carichi(inDice).qi = CDbl(q_i.Value) Carichi(inDice).xf = CDbl(x_f.Value) Carichi(inDice).qf = CDbl(q_f.Value) Carichi(inDice).z0 = CDbl(z_0.Value) Num_tot_caRichi = Num_tot_caRichi + 1
' nascondo la finestra di input dei carichi e torno al dialogo principale Me.Hide End Sub
Qui c'e' da notare la funzione CDbl (vedere l'help on line per maggiori dettagli e per conoscere le altre Funzioni di conversione del tipo) che trasforma una stringa in un Double. Il risultato sarà zero se la stringa è alfanumerica mentre sarà un Double se quella stringa è formata da numeri decimali o interi. IL separatore decimale atteso da questa funzione è la virgola (e non il punto).
I campi editabile del dialogo di input dei carichi si chiamano: x_i, q_i, x_f, q_f e z_0
Notare anche che dopo aver inserito il carico, imposto la variabile Num_tot_caRichi al nuovo valore di carichi inseriti (e cioè il valore che aveva in precedenza piu' uno).
Tutto a posto. Ma ancora nessuno e niente puo aggiornare la list box del dialogo principale destinata a contenere i carichi per poterli visualizzare e successivamente anche editare o cancellare.
|
|
| .
|
-
| .
|
|
|
L'aggiornamento della lista box contenenti i dati dei carichi.
Considerato che questa operazione la si deve compiere ogni volta che variamo la variabile dei carichi e che la variazione può provenire da diverse parti (dall'inserimento di un nuovo carico, dalla eliminazione di un carico esistente, dall'edit di un carico esistente, dalla selezione di un carico) conviene delegare l'aggiornamento della list box (che avevo chiamato col nome BoxCarichi) ad una sub. Nella lista voglio che il primo rigo (quindi il record zero del controlo listBox) sia dedicato a contenere l'intestazione di ciascuna colonna. Ecco la sub
CODICE Sub Aggiorna_carichi() Dim i As Integer
With Main
' pulisco la lista .BoxCarichi.Clear
' aggiungo l'intestazione alla lista .BoxCarichi.AddItem ("xi [m]") .BoxCarichi.List(.BoxCarichi.ListCount - 1, 1) = "qi [kN/m²]" .BoxCarichi.List(.BoxCarichi.ListCount - 1, 2) = "xf [m]" .BoxCarichi.List(.BoxCarichi.ListCount - 1, 3) = "qf [kN/m²]" .BoxCarichi.List(.BoxCarichi.ListCount - 1, 4) = "zo [m]"
' inserisco i valori contenuti nella variabile carichi() For i = 1 To Num_tot_caRichi .BoxCarichi.AddItem (Carichi(i).xi) .BoxCarichi.List(.BoxCarichi.ListCount - 1, 1) = Carichi(i).qi .BoxCarichi.List(.BoxCarichi.ListCount - 1, 2) = Carichi(i).xf .BoxCarichi.List(.BoxCarichi.ListCount - 1, 3) = Carichi(i).qf .BoxCarichi.List(.BoxCarichi.ListCount - 1, 4) = Carichi(i).z0 .BoxCarichi.Selected(.BoxCarichi.ListCount - 1) = False 'deseleziono tutte le righe Next
End With
End Sub
Questa deve essere richiamata nei seguenti casi: - ogni volta che si attiva il dialogo Main - ogni volta che si modifica la variabile dei carichi
L'aggiornamento dei carichi avviene attraverso l'istruzione: Call Aggiorna_carichi che metteremo in: nel codice dell'evento On_Activate del form Main
CODICE Private Sub Main_Activate() Call Aggiorna_carichi End Sub
in coda al codice relativo al pulsante "Conferma" del dialogo di input di nuovi carichi:
CODICE Private Sub Carichi_Conferma_Click()
Dim inDice As Integer ' prima controllo se xf è maggiore di xi ' se non è verificato do il messaggio di alert ed esco dalla sub If CDbl(x_f.Value) <= CDbl(x_i.Value) Then MsgBox ("L'ascissa finale di applicazione del carico" & vbCr & "deve essere maggiore dell'ascissa iniziale") Exit Sub End If ' inserisco i dati letti dal dialogo nella variabile Carichi() inDice = Num_tot_caRichi + 1 Carichi(inDice).xi = CDbl(x_i.Value) Carichi(inDice).qi = CDbl(q_i.Value) Carichi(inDice).xf = CDbl(x_f.Value) Carichi(inDice).qf = CDbl(q_f.Value) Carichi(inDice).z0 = CDbl(z_0.Value) Num_tot_caRichi = Num_tot_caRichi + 1
'devo aggiornare la listbox dei carichi Call Aggiorna_carichi
Me.Hide End Sub
Andando avanti sentiamo la necessità di aver visualizzato da qualche parte il numero totale dei carichi inseriti, eventualmente anche l'indice del carico che seleziuoneremo e forse anche qualcosa di altro.
Intanto metto a disposizione quanto fin qui fatto.
Edited by afazio - 3/8/2012, 21:25
|
|
| .
|
-
| .
|
|
|
Ecco il progetto allo stato attuale di sviluppo.
https://www.box.com/s/aed67ffaae09c8d0e0c4
Scaricatelo ovunque nel vostro PC. Aprite autocad, un nuovo documento e quindi da menu Strumenti "carica applicazione". Scegliete il file che avete scaricato e caricatelo in Autocad. Per eseguire il codice, ALT+F8 e scegliete la macro "Avvia".
Edited by afazio - 4/8/2012, 09:40
|
|
| .
|
-
| .
|
|
|
Eseguiamo la macro e proviamo ad inserire qualche carico. Dopo averne inseriti due e in procinto di inserire il terzo, avremo una situazione simile a questa
Dopo aver confermato anche quest'ultimo, ci rendiamo conto di voler modificare o cancellare il carico n° 2. Il controllo listBox ha gia in se tutto il codice che permette la selezione di una qualsiasi delle sue righe, e per questo non serve scrivere proprio nulla. Selezioniamo la seconda riga ed avremo una cosa del genere:
I pulsanti "Edita" ed "Elimina" dovrebbero agire proprio su questo carico selezionato. Abbiamo quindi bisogno di un codice che ci determini il rigo selezionato (che poi corrisponde col carico selezionato) e magari lo scriva da qualche parte in una etichetta. Abbiamo anche visto che sarebbe opportuna anche una etichetta che ci indicasse il numero totale dei carichi inseriti.
|
|
| .
|
-
| .
|
|
|
Allo scopo, riorganizzo il form inserendo una cornice, spostando all'interno di questa cornice i due bottoni "Edita" ed "Elimina", inserendovi anche una etichetta che ho chiamato "Car_sEL" destinata a contenere il numero del carico selezionato ed aggiungendo altra etichetta che ho chiamato "N_tot_carichi" destinata a contenere il numero totale dei carichi inseriti.
Per il numero dei carichi totali inseriti abbiamo gia definito una variabile pubblica, definiamone una anche per contenere il numero del carico selezionato:
Public NCaricoSel As Integer
questa istruzione la mettiamo nel modulo gestione laddove abbiamo anche definito le altre variabili pubbliche. Inoltre all'interno della sub Avvia(), prima di chiamare l'apertura del dialogo, inizializziamo a zero il valore del numero del carico selezionato:
NCaricoSel = 0
Adesso non ci resta che aggiornare le due etichette ogni volta che serve. - all'attivazione della dialogo - ogni volta che inseriamo un nuovo carico - ogni volta che ne cancelliamo uno - ogni volta che ne editiamo uno - ogni volta che facciamo click all'interno della lista dei carichi.
|
|
| .
|
-
| .
|
|
|
Per trovare il carico selezionato scriviamo una sub dedicata a questo scopo:
CODICE Sub Trova_carico_sel() Dim count As Integer ' definisco un contatore count = 0 'lo inizializzo a zero
' avvio un loop che sarà eseguito fin quando il contatore è minore o uguale ' all'ultimo indice delle righe della listBox dei carichi (ricordarsi che la listbox è zero-based
While count <= BoxCarichi.ListCount - 1
' controllo lo stato "selected" del rigo "count-esimo" e se è Vero imposto la ' variabile NCaricoSel al valore del contatore If BoxCarichi.Selected(count) = True Then NCaricoSel = count
' inremento il contatore altrimenti non uscirei mai dal ciclo While...Wend count = count + 1 Wend End Sub
Questa sub dobbiamo chiamarla con l'istruzione:
Call Trova_carico_sel
ogni volta che si fa un click all'interno della listbox e quindi legarla all'evento On_click della list box
CODICE Private Sub BoxCarichi_Click() Call Trova_carico_sel Car_sEL.Caption = NCaricosel End Sub
subito dopo aver chiamato la sub, aggiorniamo la caption del numero di carico selezionato
Inoltre aggiungiamo le due righe
.Car_sEL.Caption = NCaricosel .N_tot_carichi.Caption = Num_tot_caRichi
nella sub che aggiorna i carichi. In questo modo oltre ad aggiornare la listbox dei carichi aggiorniamo anche i valori del numero del carico selezionato e del numero dei carichi inseriti.
Edited by afazio - 4/8/2012, 10:23
|
|
| .
|
-
| .
|
|
|
Eliminare un carico già inserito
Dopo aver inserito una serie di carichi, ne vogliamo eliminare uno. Lo selezioniamo dalla lista e premiamo il tato "Elimina" Alla pressione del tasto, devono essere eseguite le seguenti operazioni: - controllare che il numero del carico da eliminare sia valido, cioè un numero compreso tra 1 ed il numero dei carichi inseriti - traslare di un posto sotto nella lsita dei carichi, a partire dal carico che vogliamo eliminare, tutti i carichi che seguono il carico da eliminare - aggiornare sontestualmente la variabile che contiene i carichi - diminuire di uno il numero dei carichi inseriti - impostare a zero il nuovo numero del carico selezionato - aggiornare la lista dei carichi - aggiornare le etichette del numero di carico inseriti e del numero del carico selezionato.
Leghiamo pertanto all'evento On_Click del pulsante "Elimina" il seguente codice:
CODICE Private Sub Carichi_delete_Click() ' elimina il carico selezionato, aggiornato la variabile carichi() ' deseleziona le righe della list box ed aggiorna il contenuto
Dim count As Integer
' controllo che il carico selezionato sia valido If NCaricoSel = 0 Or NCaricoSel > Num_tot_caRichi Then ' selezione non valida MsgBox ("Nessun carico da eliminare") Else ' la selezione è valida
' inizializzo un ciclo che parte dal numero del carico selezionato count = NCaricoSel If BoxCarichi.Selected(count) Then ' traslo di uno i record della variabile carichi() For count = NCaricoSel To Num_tot_caRichi - 1 Carichi(count).xi = Carichi(count + 1).xi Carichi(count).qi = Carichi(count + 1).qi Carichi(count).xf = Carichi(count + 1).xf Carichi(count).qf = Carichi(count + 1).qf Carichi(count).z0 = Carichi(count + 1).z0 Next ' decremento di uno il valore dei carichi totali assegnati Num_tot_caRichi = Num_tot_caRichi - 1 End If Call Aggiorna_carichi End If
End Sub
|
|
| .
|
-
| .
|
|
|
Editare un carico già inserito
Dopo aver inserito una serie di carichi, ne vogliamo editare uno. Lo selezioniamo dalla lista e premiamo il tasto "Edita"
Dvrebbe apparici un altro dialogo simile, se non uguale, a quello usato per l'input dei carichi, in cui vengono riproposti i valori del carico da editare pronti per essere modificati e i due bottoni "Annulla" e "Conferma".
Il tasto "Annulla" avrebbe la stessa funzione dell'omologo del dialogo di input carichi, cioè lasciare tutto inalterato, mentre il tasto "conferma" avrebbe la funzione di aggiornare il campo di indice "NcarSel" anzichè il campo "Num_tot_caRichi". Stessa cosa per la variabile carichi().
Ma perchè non utilizzare lo stesso dialogo? Basterebbe sapere se lo stiamo chiamando in modalità "Input" o in modalità "Edit" e quindi inserire una condizione IF che fa fare al tasto "conferma" due cose leggermente diverse.
Definiamo quindi una nuova variabile pubblica che chiamiamo" moDo" e che puo assumere i seguenti due valori: 1 modalità dialogo in input 2 modalità dialogo in edit
impostiamone il valore inizialmente a 1
Public moDo As Integer da inserire nel modulo "gestione"
moDo = 1 da inserire nella sub Avvia( prima di chiamare l'apertura del dialogo "main"
Modifichiamo il codice legato al clik del bottone "Aggiungi Carico" in:
CODICE Private Sub CArichi_New_Click() If Num_tot_caRichi = MaxCarichi Then MsgBox (" raggiunto il numero massimo dei carichi" & "(max " & MaxCarichi & ")") Exit Sub End If moDo = 1 ' <------------------------------ con questo stiamo chiamando il dialogo in modalità input InputCarichi.Show Call Aggiorna_carichi End Sub
e modifichiamo il codice legato al bottone "conferma" del dialogo di "input/modifica carico" nel seguente
CODICE Private Sub Carichi_Conferma_Click()
Dim inDice As Integer ' prima controllo se xf è maggiore di xi ' se non è verificato do il messaggio di alert ed esco dalla sub If CDbl(x_f.Value) <= CDbl(x_i.Value) Then MsgBox ("L'ascissa finale di applicazione del carico" & vbCr & "deve essere maggiore dell'ascissa iniziale") Exit Sub End If 'stbilisco quale campo modificare/aggiungere in funzione del valore della variabile "moDo"
If moDo = 1 Then inDice = Num_tot_caRichi + 1 Num_tot_caRichi = Num_tot_caRichi + 1 Else inDice = NCaricoSel End If
' inserisco i dati letti dal dialogo nella variabile Carichi() Carichi(inDice).xi = CDbl(x_i.Value) Carichi(inDice).qi = CDbl(q_i.Value) Carichi(inDice).xf = CDbl(x_f.Value) Carichi(inDice).qf = CDbl(q_f.Value) Carichi(inDice).z0 = CDbl(z_0.Value)
' imposto a zero il numero del carico selezionato NCaricoSel = 0
Me.Hide End Sub
Infine all'evento On_click del tasto "edita" leghiamo il codice:
CODICE Private Sub Carichi_Edit_Click() If NCaricoSel = 0 Or NCaricoSel > Num_tot_caRichi Then MsgBox ("Nessun carico da editare") Else moDo = 2 ' <------------------------------ con questo stiamo chiamando il dialogo in modalità edit InputCarichi.Show End If Call Aggiorna_carichi End Sub
Di sostanziale abbiamo fatto quasi tutto, ma dobbiamo curare ancora i dettagli. - vogliamo che il titolo del dialogo di input/modifica dei carichi vari da "input Carichi" a "Modifica carichi" a seconda della modalità - vogliamo che nell'etichetta presente nel dialogo input/modifica ci sia riportato il numero del carico sul quale stiamo agendo - vogliamo che, nel caso di modalità edit, siano riproposti i dati già inseriti per il carico che stiamo modificando.
vedremo come fare nel prossimo post
|
|
| .
|
-
| .
|
|
|
Nel dialogo di input/modifica dei carichi avevo predisposto una etichetta col nome LabelCaricoN
Per far si che il dialogo si adatti al modo (input o edit) basta agire con l'evento On_Activate del form. Doppio clik sul form "inputCarichi", selezioniamo l'evento "On_activate" e scriviamo il seguente codice:
CITAZIONE Private Sub UserForm_Activate() If moDo = 1 Then InputCarichi.Caption = "Input Carichi" LabelCaricoN.Caption = " Inserimento Carico n° " & Str(Num_tot_caRichi + 1) Else InputCarichi.Caption = "Modifica Carichi" LabelCaricoN.Caption = " Edit Carico n° " & NCaricoSel x_i.Value = Carichi(NCaricoSel).xi q_i.Value = Carichi(NCaricoSel).qi x_f.Value = Carichi(NCaricoSel).xf q_f.Value = Carichi(NCaricoSel).qf z_0.Value = Carichi(NCaricoSel).z0 End If
End Sub fatto.
con questo avremmo concluso la GESTIONE DEI CARICHI
ed ecco la versione aggiornata del progetto .dvb
https://www.box.com/s/5a2d2d300581bae138a2
da qui a seguire sarò piu spedito, curando superficialmente l'input dei rimanenti dati (definizione griglia di calcolo, calcolo tensioni indotte, definizione isolivelli e disegno delle isobare) mirando diritto alla conclusione del progetto. Nel seguito io apporterò tutti i controli che riterro' necessari, funzionaliàa aggiuntive nell'input della griglia e degli isolivelli, ed ognuno potrà modificare a piacimento il progetto che pubblicherò
saluti
Edited by afazio - 4/8/2012, 12:39
|
|
| .
|
-
| .
|
|
|
Predisponiamo i controlli necessari per l'input dei dati per costruirci la maglia di calcolo. Ho pensato per adesso alla seguente.
Ho inserito i campi editabili:
Box_L destinato a contenere la lunghezza (secondo x) del semispazio da discretizzare Box_H destinato a contenere la profondità (secondo z) del semispazio da discretizzare
N_x destinato a contenere il numero delle suddivisioni secondo x N_z destinato a contenere il numero delle suddivisioni secondo z
una etichetta
NpunTi destinata a contenere il numero totale dei punti della griglia, cioè il prodotto (N_x+1)*(N_z+1)
un pulsante
Points_geneRate alla pressione del quale mi deve generare le seguenti matrici/vettore:
matrice Quote(i, j) contenente le tensioni verticali indotte (sigmaZ) nei punti della griglia vettore colonna Ascisse() contenente la lista delle verticali della griglia (lista delle ascisse x) vettore colonna Ordinatee() contenente la lista delle orizzontali della griglia (lista delle ordinate z)
mi serve pertanto definire le seguenti variabili pubbliche:
Public Quote() As Double Public Ascisse() As Double Public orDinate() As Double
Public NPointX As Integer Public NPointZ As Integer Public Num_tot_Punti As Integer
Ai campi editabili pplichiamo i filtri per accettare solo numeri
CODICE Private Sub Box_H_Change() Box_H.Text = solo_numeri_e_virgola(Box_H.Text) End Sub
Private Sub Box_L_Change() Box_L.Text = solo_numeri_e_virgola(Box_L.Text) End Sub
Private Sub N_x_Change() N_x.Text = solo_numeri(N_x.Text) End Sub
Private Sub N_z_Change() N_z.Text = solo_numeri(N_z.Text) End Sub
In particolare applichiamo il filtro Solo_numeri_e_virgola ai due campi destinati a contenere le dimensioni del semispazio ed il filtro solo numeri ai due campi destinati a contenere i numeri di suddivisione
Edited by afazio - 4/8/2012, 13:39
|
|
| .
|
-
| .
|
|
|
Al pulsante Points_Generate leghiamo il codice che segue:
CODICE Private Sub Points_geneRate_Click() Dim i As Integer Dim j As Integer Dim k As Integer
Dim DeltaX As Double Dim DeltaZ As Double Dim L As Double Dim h As Double
L = Val(Box_L.Value) h = Val(Box_H.Value) NPointX = Val(N_x.Value) NPointZ = Val(N_z.Value) DeltaX = L / NPointX DeltaZ = h / NPointZ Num_tot_Punti = (NPointX+1) * (NPointZ+1)
' scrivo la matrice delle ascisse da passare alla routine per le isobare ReDim Ascisse(0 To NPointX) As Double For i = 0 To NPointX Ascisse(i) = i * DeltaX Next
' scrivo la matrice delle ordinate da passare alla routine per le isobare
ReDim orDinate(0 To NPointZ) As Double For i = 0 To NPointZ orDinate(i) = i * DeltaZ Next
' calcolo le tensioni indotte in tutti i punti della maglia ReDim Quote(0 To NPointX, 0 To NPointZ) As Double siGma_min = 100000 siGma_max = -100000 For i = 0 To NPointX For j = 0 To NPointZ For k = 1 To Num_tot_caRichi Quote(i, j) = Quote(i, j) + _ sigmaZ(Ascisse(i), orDinate(j), _ Carichi(k).xi, Carichi(k).xf, Carichi(k).qi, Carichi(k).qf, Carichi(k).z0) Next Next j Next i MsgBox ("creati " & Num_tot_Punti & " punti") NpunTi.Caption = "N° P.ti " & Num_tot_Punti
End Sub
|
|
| .
|
37 replies since 30/7/2012, 22:08 4646 views
.