Il Bar dell'Ingegneria

Progetto Sovratensioni e tracciamento ISOBARE in autocad

« Older   Newer »
 
  Share  
.
  1.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    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"
     
    Top
    .
  2.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    Ecco l'immagine:

    filtro001

    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
     
    Top
    .
  3.     +1   -1
     
    .
    Avatar

    Member

    Group
    Member
    Posts
    885
    Reputation
    +41

    Status
    Offline
    Oddio Afazio. Stai facendo uno sforzo titanico.
    riesco solo ad esprimere ammirazione :woot: 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.

     
    Top
    .
  4.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    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
     
    Top
    .
  5.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    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.
     
    Top
    .
  6.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    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
     
    Top
    .
  7.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    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
     
    Top
    .
  8.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    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

    avvio001

    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:

    avvio002

    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.
     
    Top
    .
  9.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    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.

    selezionecarico001

    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.
     
    Top
    .
  10.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    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
     
    Top
    .
  11.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    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


     
    Top
    .
  12.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    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
     
    Top
    .
  13.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    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
     
    Top
    .
  14.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    Predisponiamo i controlli necessari per l'input dei dati per costruirci la maglia di calcolo.
    Ho pensato per adesso alla seguente.

    discretizzazione

    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
     
    Top
    .
  15.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    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
     
    Top
    .
37 replies since 30/7/2012, 22:08   4646 views
  Share  
.