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!!