Here are some suggestions:
At the top add another array variable to hold the rowids from the query you get your values from. Just add the last line. The first line helps you to see where to add it:
dim listboxValues() as string
dim arrRecordRowIDs() as Integer
You have to fill this array with the rowids of the records in the NodeList procedure:
redim listboxValues(nrows)
Redim arrRecordRowIDs(nrows)
for i = 1 to tableinfo("lstValues",tab_info_nrows)
fetch rec i from lstValues
listboxValues(i) = lstValues.lname
arrRecordRowIDs(i) = lstValues.ROWID
Next
Next step is to change your current way to insert a new record slightly in the AddItemDialog procedure. Instead of calling AlterMainDialog when you have inserted the new record, you call editlistDialog to reload all the elements and create a new query. When you do this you donøt have to add the element to the array of values first. The reason for doing this is that you need to be able to update it later on, potentially, and you can only do this if the value is in the query:
If CommandInfo(CMD_INFO_DLG_OK) Then
insert into subn (lname)
values (strAddItem)
Call editlistDialog
End If
Now we need to get you listbox_edit procedure finished:
Sub listbox_edit
Dim sValue as String
Dim nItem As Integer
If CommandInfo(CMD_INFO_DLG_DBL) = TRUE Then
'**Get the currently selected record
nItem = ReadControlValue(1)
sValue = listboxValues(nItem)
print nItem & " = " & sValue
'**Shop the value in the dialog and read what the user changed it to
Dialog Title "Change Item Dialog"
Control EditText Width 100
Value sValue
Into sValue
Control OkButton
Title "Update"
Control CancelButton
If CommandInfo(CMD_INFO_DLG_OK) Then
'**Update the array
listboxValues(nItem) = sValue
'**Update the record in the query (and so in the base table)
Update lstValues
Set lname = sValue
Where ROWID = arrRecordRowIDs(nItem)
'**Refresh the list in the dialog
Call AlterMainDialog
End If
End If
End Sub