Hej! Så här ungefär skulle jag lösa det. Tackar så mycket för detta! Du får en pluskula för att du beskrivit din fråga klart och redigt. Haha, tackar! Hej igen!Hjälp att ta bort post från en ListBox (VB6)
Jag har ett projekt i VB6 där jag har en ListBox (lstCombo) där jag önskar kunna lägga till och ta bort 4-tecken långa kombinationer.
Jag har en CommandButton (cmdAdd) som fungerar och ser ut enl. nedan:
----------------------------------------
'Add a combination to the list.
Private Sub cmdAdd_Click()
Dim strToAdd As String
strToAdd = InputBox("Combination to include: ", "Enter Combination")
If Len(Trim$(strToAdd)) > 0 Then
If Not ListItemExists(strToAdd) Then
lstCombo.AddItem strToAdd
End If
End If
End Sub
----------------------------------------
Jag har sedan en CommandButton (cmdRemove) som jag vill kunna ta bort kombinationer med, men denna lyckas jag inte få att fungera. Mitt (felaktiga) försök så ut:
----------------------------------------
'Remove a combination from the list.
Private Sub cmdRemove_Click()
Dim strToRemove As String
strToRemove = InputBox("Combination to remove: ", "Enter Combination")
If Len(Trim$(strToRemove)) > 0 Then
If ListItemExists(strToRemove) Then
lstCombo.RemoveItem strToRemove
End If
End If
End Sub
----------------------------------------
Kan man kanske isället göra så att man klickar och markerar en post för att sedan klicka på "remove"?
Jag skulle också vilja ha en CommandButton (cmdRemoveAll) som rensade listan helt.
Är det någon som har något bra förslag hur jag skulle kunna lösa detta skulle jag vara mycket tacksam!
MVH
/MSv: Hjälp att ta bort post från en ListBox (VB6)
Kanske det behövs någon liten justering som jag inte tänkt på.
<code>
Option Explicit
Dim Cboidx As Long
'Add a combination to the list.
Private Sub cmdAdd_Click()
Dim strToAdd As String
strToAdd = InputBox("Combination to include: ", "Enter Combination")
If Len(Trim$(strToAdd)) > 0 And Not ListItemExsist(strToAdd) Then _
lstCombo.AddItem strToAdd
End Sub
'Remove a combination from the list.
Private Sub cmdRemove_Click()
Dim strToRemove As String
strToRemove = InputBox("Combination to remove: ", "Enter Combination")
If Len(Trim$(strToRemove)) > 0 And ListItemExsist(strToRemove) Then _
lstCombo.RemoveItem (Cboidx)
End Sub
'Remove All
Private Sub cmdRemoveAll_Click()
lstCombo.Clear
lstCombo.Text = "Mina Data"
End Sub
Function ListItemExsist(testStr As String) As Boolean
For Cboidx = 0 To lstCombo.ListCount - 1
If InStr(lstCombo.List(Cboidx), testStr) Then
ListItemExsist = True
Exit For
End If
Next 'i
End Function
</code>Sv:Hjälp att ta bort post från en ListBox (VB6)
Det ser ju strålande bra ut! Ska testa detta ikväll!
Jag förstår nu att AddItem och RemoveItem inte fungerar helt på samma sätt som jag först trodde!
MVH
/MSv: Hjälp att ta bort post från en ListBox (VB6)
Önskar att fler tar lärdom av detta.
Ha detSv:Hjälp att ta bort post från en ListBox (VB6)
Ha dé bra själv. Jag lär återkomma om jag stöter på fler frågetecken!Sv: Hjälp att ta bort post från en ListBox (VB6)
Mitt första projekt (som efter hjälp fungerade perfekt) har nu utvecklats en del och blivit aningen mer komplext. Mina kunskaper är tyvärr för begränsade för att klara av detta nya problem, så därför undrar och ber jag om hjälp igen.
Jag ska nedan försöka förklara min önskan på ett bra sätt.
-------------------------------------------------------------------
Från start så kommer jag att ha två textfiler med någon form av databas och en (eller ett par) SPN-nummer som jag är intresserad av.
Det första jag vill göra är att välja en eller ett par SPN-nummer (t.ex. SPN190) som jag vill söka efter. Sedan vill jag göra en sökning i en databas jag har i form av en textfil enl. nedan:
===================================================
SPN190 PGNF004 4 2 0,125 0 rpm/bit Engine Speed
SPN513 PGNF004 3 1 1 -125 % Actual Engine - Percent Torque
SPN512 PGNF004 2 1 1 -125 % Driver's Demand Engine - Percent Torque
===================================================
Textfilen innehåller 8 kolumner, ett mellanslag mellan varje (förutom sista som innehåller en beskrivning av vad just denna SPN är för något).
Kolumnerna har rubrikerna:
1. SPN-nummer
2. PGN-nummer
3. PGN-position
4. Data Length
5. Resolution
6. Offset
7. Unit
8. Description
Om mitt (mina) SPN-nummer finns med i “databasen” så kanske man skall spara denna/dessa rader i en lista eller liknande. Jag kommer dock inte att behöva se dessa.
Nu kommer jag till den lite mer komplexa delen.
Vi har nu alltså den/de rader till det SPN-nummer som jag valde (en filtrerad lista).
Låt oss säga att vi valde ett nummer, nämligen SPN190, då har vi nu listan:
====================================
SPN190 PGNF004 4 2 0,125 0 rpm/bit Engine Speed (1)
====================================
Varje SPN-nummer hör till ett PGN-nummer (varje PGN innehåller 8 SPN)
Nu vill jag göra den slutliga processen. Jag vill här ta den 4-tecken långa kombinationen direkt efter PGN i vår filtrerade lista (4 sista tecknen i kolumn 2), i detta fall F004, och sedan söka i vår andra textfil. Denna kan se ut enl:
=============================================
0CF00400 X 8 F8 7D 7D 00 00 FF FF FF 2218.401 R
00EFD100 X 8 3D 3D 3D 3D 3D 3D 3D 3D 2218.400 R
00EFD200 X 8 3D 3D 3D 3D 3D 3D 3D 3D 2218.399 R (2)
0CFF5800 X 8 07 00 00 01 67 01 06 00 2218.399 R
0C000011 X 8 00 00 00 FA 00 00 00 00 2218.397 R
0CF00400 X 8 F8 7D 7D 00 00 FF FF FF 2218.391 R
=============================================
Denna är uppbyggd enl:
Först kommer tre mellanslag.
Sedan den 8 tecken långa "identifieraren".
Ett mellanslag.
Ett X.
Tre mellanslag.
En 8.
Tre mellanslag.
Därefter följer 8st 2-tecken långa grupper med två mellanslag mellan varje grupp.
Tre mellanslag.
Kombination "4 siffror.3 siffror"
Ett mellanslag.
R
(Jag tror man kan ha bra användning av mitt första projekt för sökning här).
Vår kombination F004 som vi vill ”matcha” eller söka efter, finns som de fyra mittersta bitarna i den 8 tecken långa första identifieraren. Denna kan förekomma flera gånger.
Om vi får en träff vill jag nu göra en uträkning och en utskrift i ett ”resultatfönster” som är vad vi egentligen är intresserade av.
Jag vill här ha:
• SPN-numret
• PGN-numret
• Resultatet av: datan i den specifiserade positionen PGN-position (kolumn 3 i första textfilen), i vårt fall pos. 4, alltså värdet 00, konvertera denna från hexadecimal till decimal, gånger “resolution” (kolumn 5), som i vårt fall har värdet 0,125), plus offset värdet (det i kolumn 6) 0.
• Enheten som finns under 7de kolumnen, unit.
• Och slutligen ”description” som finns under 8de kolumnen, här Engine Speed.
Uträkningen av resultatet blir alltså i vårt fall: 00 (hex) = 0 (dec), 0 * 0,125 + 0 = 0
Ojoj, det här blev komplicerat, men jag hoppas verkligen ni förstår vad jag menar, annars försöker jag gärna förklara ytterligare...
Mitt första projekt fungerade ju alldeles utmärkt för att söka i den andra textfilen (2) och jag tror man kan ha stor nytta av denna här. Jag bifogar därför den koden här nedan.
Tack på förhand!
/M
----------------------------
<code>Option Explicit
Dim Cboidx As Long
'Array of combinations to search for.
'Faster/better than comparing to stuff directly from the ListBox.
Private strCombos() As String
'The actual sub that will search the file for the combinations in strCombos().
Private Sub FindCombo(FilePath As String)
Dim lonLoop As Long, intFF As Integer
Dim strLine As String, lonSpacePos As Long
Dim lonLineCounter As Long
With lvResults
.ListItems.Clear
'Get available file handle.
intFF = FreeFile
'Open file.
Open FilePath For Input As #intFF
'Clear any previous items.
.ListItems.Clear
'Keep looping until we get to End Of File (EOF).
Do While Not EOF(intFF)
'Get the current line from file and put it into strLine.
Line Input #intFF, strLine
lonLineCounter = lonLineCounter + 1
lonLineCounter = lonLineCounter + 1
'Check 4 middle characters to (3,4,5,6) and compare.
If Len(strLine) > 0 Then 'Make sure it isn't an empty line.
strLine = LTrim$(strLine) 'Trim spaces off left part.
'Get text from start to before the first space (X).
'This will give us the combination.
lonSpacePos = InStr(1, strLine, " ")
If lonSpacePos > 0 Then
strLine = Mid$(strLine, 1, lonSpacePos - 1)
'MsgBox strLine
'We now have the combination in strLine.
'Check if it is in the list.
If ComboInList(strLine) Then
'It is. Add it to the results.
.ListItems.Add , , strLine
.ListItems(.ListItems.Count).ListSubItems.Add , , Str$(lonLineCounter)
End If
End If
End If
Loop
Close #intFF
End With
End Sub
'Add a combination to the list.
Private Sub cmdAdd_Click()
Dim strToAdd As String
strToAdd = InputBox("Combination to include: ", "Enter Combination")
If Len(Trim$(strToAdd)) = 4 And Not ListItemExsist(strToAdd) Then
lstCombo.AddItem strToAdd
End If
End Sub
'Checks if a combination exists in the array.
Private Function ComboInList(Combination As String) As Boolean
Dim lonLoop As Long, lonUB As Long
Dim strToComp As String
strToComp = LCase$(Mid$(Combination, 3, 4))
lonUB = SafeUBString(strCombos())
For lonLoop = 0 To lonUB
If LCase$(strCombos(lonLoop)) = strToComp Then
ComboInList = True
Exit For
End If
Next lonLoop
End Function
'##################################################################
'# Basic general functions not really related to the actual code. #
'##################################################################
'Check if an item exists in the ListBox.
Private Function ListItemExists(ItemText As String) As Boolean
Dim intLoop As Integer, strToComp As String
strToComp = LCase$(ItemText)
With lstCombo
For intLoop = 0 To .ListCount - 1
If LCase$(.List(intLoop)) = strToComp Then
ListItemExists = True
Exit For
End If
Next intLoop
End With
End Function
Private Sub cmdFind_Click()
On Error GoTo ErrorHandler
If lstCombo.ListCount = 0 Then
MsgBox "Please enter some combinations to search for", vbExclamation
Exit Sub
End If
With objCD
.CancelError = True
.DialogTitle = "Open File"
.Filter = "Text Files (*.txt)|*.txt"
.ShowOpen
InitCombos
If Len(.FileName) > 0 Then
FindCombo .FileName
End If
End With
Exit Sub
ErrorHandler:
End Sub
'ListBox to strCombos() array.
Private Sub InitCombos()
Dim intLoop As Integer
ReDim strCombos(0 To lstCombo.ListCount - 1) As String
For intLoop = 0 To lstCombo.ListCount - 1
strCombos(intLoop) = lstCombo.List(intLoop)
Next intLoop
End Sub
'Get the UBound of a string array without an error.
Private Function SafeUBString(TheArray() As String) As Long
On Error GoTo ErrorHandler
SafeUBString = UBound(TheArray())
Exit Function
ErrorHandler:
End Function
'Remove a combination from the list.
Private Sub cmdRemove_Click()
Dim strToRemove As String
Dim Cboidx As Integer
strToRemove = InputBox("Combination to remove: ", "Enter Combination")
If Len(Trim$(strToRemove)) = 4 And ListItemExsist(strToRemove) Then
lstCombo.RemoveItem (Cboidx)
End If
End Sub
'Remove all combinations from the list.
Private Sub cmdRemoveAll_Click()
lstCombo.Clear
lstCombo.Text = "Mina Data"
End Sub
Function ListItemExsist(testStr As String) As Boolean
Dim Cboidx As Integer
For Cboidx = 0 To lstCombo.ListCount - 1
If InStr(lstCombo.List(Cboidx), testStr) Then
ListItemExsist = True
Exit For
End If
Next 'i
End Function
'Clear the result window
Private Sub cmdClear_Click()
lvResults.ListItems.Clear
End Sub</code>