Domanda:
Aiuto visual basic 6!?
Dario
2010-06-02 06:03:39 UTC
devo fare una lista con tante voci (come se fosse un database con codice nome e quantità) ma come faccio a fare in modo che posso aumentare o diminuire la quantità senza dover ricompilare il programma? e come posso fare poi a stampare il resoconto con il codice il nome e la quantità?? grazie 1000 in anticipo!
Quattro risposte:
Mui
2010-06-05 15:37:58 UTC
Non è chiarissimo se per lista tu intenda qualcosa in memoria o una visualizzazione su GUI. Dalla frase "senza dover ricompilare il programma" intuisco che tu alluda alla dichiarazione della dimensione degli array, quindi a questo rispondo. In ogni caso basta poi un ciclo for per compilare una listbox o una flex grid con il contenuto dell'array!



Userei un solo array di strutture in luogo di 3 array; in ogni caso invece di dichiararne la dimensione lascialo come array dinamico e quando occorre ridimensionare usa una redim preserve

Il problema è che una redim con clausola preserve (che conserva il contenuto dell'array) è parecchio onerosa, quindi va usata con cautela. Per l'aggiunta una buona tecnica è quella di non aggiungere il solo record necessario ma di incrementare "a lotti" in modo da ridurre le volte in cui questa operazione viene eseguita: si aggiungono più slot di quelli necessari, solo quando sono esauriti tutti quelli disponibili. Per la rimozione per salvaguardare le performance bisognerebbe pensare a qualcosa di più raffinato. Con il meccanismo dei lotti non ha senso rimuovere lo slot, basta nullare i campi!



Ti scrivo un esempio con le due soluzioni di aggiunta (aggiunta del solo slot necessario e a aggiunta a lotti) e la procedura di rimozione (che nel caso "a lotti" non ha senso). NON L'HO RICONTROLLATO NE' TESTATO perchè è mezzanotte e mezza e ho troppo sonno. Forse c'è qualche vaccata (ad esempio non ho controllato di non aver fatto cavolate nel conteggio dei puntatori array sulla rimozione), ma almeno dà l'idea di base. Spero sia utile





------------------------------------VB6 CODE -----------------------------------------------------------------



'Dichiariamo una struttura, che rende il tutto molto più comodo da gestire!

Private Type udtRecord

szCode As String 'Codice alfanumerico

szName As String 'Nome

iQty As Integer 'Quantità

End Type





Private m_tData() As udtRecord 'Array di strutture... Nota che non specifichiamo la dimensione



Private m_iRecCnt As Long 'conteggio record effettivi - serve solo con ADD soluzione 2



Private Sub pRemove(iIdxToRemove As Integer)

'NOTA: non ottimizzato... con molti elementi abbatte la performance!!!



Dim i As Integer



'Sposta tutti i record in su di 1 posizione a partire dalla posizione eliminata

For i = iIdxToRemove To UBound(m_tData) - 1

m_tData(i).szName = m_tData(i + 1).szName

m_tData(i).szCode = m_tData(i + 1).szCode

m_tData(i).iQty = m_tData(i + 1).iQty

Next i



ReDim Preserve m_tData(0 To UBound(m_tData) - 1)

End Sub





Private Sub pAdd_Soluzione1(tNewRecord As udtRecord)

'Aggiunta del solo elemento che serve - poco performante!

'la RedimPreserve è onerosa!



Dim iLastIdx As Integer

iLastIdx = UBound(m_tData) + 1



ReDim Preserve m_tData(0 To iLastIdx)



m_tData(iLastIdx).szCode = tNewRecord.szCode

m_tData(iLastIdx).szName = tNewRecord.szName

m_tData(iLastIdx).iQty = tNewRecord.iQty





End Sub





Private Sub pAdd_Soluzione2(tNewRecord As udtRecord)

'Aggiunta a batch: alla prima necessità di nuovo spazio

'alloca un "tot" di celle in più: in tal modo le operazioni

'di redim preserve, molto onerose, non sono fatte ogni volta ma

'solo "ogni tot elementi".

'Il numero di elementi non è più desumibile dal numero di elementi nell'array,

'quindi ci serve una variabile di appoggio. Nel caso in cui sia caricato all'avvio

'un array già compilato occorrerà inizializzare opportunamente questo puntatore al

'caricamento e, ovviamente, salvarlo all'uscita!





Const BATCH_SIZE = 10 'il "tot" di record aggiunti



On Error GoTo ErrHandler



m_iRecCnt = m_iRecCnt + 1



m_tData(iLastIdx).szCode = tNewRecord.szCode

m_tData(iLastIdx).szName = tNewRecord.szName

m_tData(iLastIdx).iQty = tNewRecord.iQty



Exit Sub



ErrHandler:

If Err.Number = 9 Then 'IndexOutOfRange

ReDim Preserve m_tData(0 To UBound(m_tData) + BATCH_SIZE)

Resume

Else

'Gestione di altri errori

'...

End If



End Sub



----------------------------------------------------------------------------------------





Per inciso, la DataGridView di cui si parla in una delle risposte NON ESISTE in VB6: è un componente (peraltro pessimo) di .NET!!
giova.mill
2010-06-02 18:22:41 UTC
Innanzi tutto dovresti usare tre array paralleli da una dimensione paralleli. Li dichiari e gli dai un valore massimo abbastanza grande

codice(1 to 10000) as string; al quale assoceremo la lista listc

nome(1 to 10000) as string; al quale assoceremo la lista listn

quantita`(1 to 10000) as string al quale assoceremo la lista listq

all'avvio del programma chiederai con una inputbox quante voci si vuole avere nel "database"; chiameremo questa variabile IMAX. Per caricare i prodotti (o quello che sono, non ho ben capito a che ti serve °_°) farai partire una for che vada da 1 a IMAX

for i=1 to IMAX

codice(i)=inputbox("Inserire il codice del prodotto")

nome(i)=inputbox("Inserire il nome del prodotto")

quantita`(i)=inputbox("Inserire la quantità del prodotto")

listc.additem codice(i)

listn.additem nome(i)

listq.additem quantita`(i)



Infine devi inserire nel programma due bottoni, uno per aggiungere ed uno per rimuovere un elemento dalla lista;

per aggiungere un elemento basterà scrivere nel comando:

IMAX=IMAX+1

codice(IMAX)=inputbox("Inserire il codice del prodotto")

nome(IMAX)=inputbox("Inserire il nome del prodotto")

quantita`(IMAX)=inputbox("Inserire la quantità del prodotto")

listc.additem codice(IMAX)

listn.additem nome(IMAX)

listq.additem quantita`(IMAX)



Per eliminare l'ultimo elemento della lista basterà mettere nel comando



listc.removeitem IMAX

listn.removeitem IMAX

listq.removeitem IMAX
?
2010-06-02 20:23:05 UTC
Credo che la persona che ha risposto prima di me non abbia letto attentamente la domanda. Comunque ti sconsiglio di utilizzare una listbox o una listview a meno che poi non vuoi complicarti la vita...



Per fare quello che chiedi ti consiglierei di utilizzare una semplice DataGridView vedrai risolvi facilmente...
anonymous
2010-06-02 13:11:47 UTC
bo


Questo contenuto è stato originariamente pubblicato su Y! Answers, un sito di domande e risposte chiuso nel 2021.
Loading...