Hängde tyvärr inte med alls i den första halvan av frågan. Tror det skulle hjälpa med några rader kod.... Tack Beezo för att du svarar på mina frågor! Jag är nybörjare på VB, med har Smalltalk-bakgrund, så därför är kanske inte min vokabulär helt VB-mässig.-hmm?!..
Jag har en form med massor av boxar, knappar mm. Dessutom har jag en klass som är en variant på Collection, konstruerad enligt beskrivning för detta i MSDN Library. En sådan "SCollection" befolkas med ett tjugotal objekt, instanser av en klass där en av instansvariablerna är en Array med plats för 32 strängar (i de flesta fall används endast den första).
I en sub som går igång vid Form.load sätts värden på de flesta av b
oxarna och knapparna, värden som hämtas från Arrayerna i de här objekten i nämnda SCollection.
När, och om, värdet i en viss checkbox sätts till = 1, så ändras samtidigt en sträng (den första) i Arrayen i ett av de andra objekten, som inte är berört av frågan om den aktuella checkboxens värde, till "0" (noll, inte stora O), ett värde som förekommer i åtminstone något annat objekt av samma klass. Om jag lägger checkboxändringen i en separat sub, men kallar på den från samma ställe där den låg, inträffar samma sak, men om jag flyttar den kallande raden till en annan position så inträffar inte den mystiska ändringen (frågan är vad som i ett visst läge kan ändras istället, utan att jag råkar märka det !?).
Jag har haft en annan liknande ändring i samband med en annan Checkbox, som jag kringgick på annat sätt.
Hur kan detta komma sig????
En sak som jag kommer att tänka på när jag skriver detta, är VB's förhållande till Sant/falskt och 1/0. Jag gick på pumpen när jag trodde att Boolean är en egen typ skild från Integer, så att jag kan testa på om en variant variabel har ett numeriskt värde, inklusive 0, eller om det är (i det här fallet) Falskt. Var värdet 0 så gav testen om det var = Falskt, resultatet Sant.
Varför anger VB värdet på Checkbox.value som 1 eller 0, men samtidigt
Radiobutton.value som Sant eller Falskt??? Kan man använda Boolean på Checkbox också?
-HansSv: -hmm?!..
>En sak som jag kommer att tänka på när jag skriver detta, är VB's förhållande till Sant/falskt och 1/0.
När du går från något numeriskt värde till Boolean så är 0 falskt, allt annat sant. När du går åt andra hållet ger falskt 0, och sant -1.
>Varför anger VB värdet på Checkbox.value som 1 eller 0, men samtidigt Radiobutton.value som Sant eller Falskt???
Därför att en Checkbox kan ha tre lägen; 0 (vbUnchecked), 1 (vbChecked) och 2 (vbGrayed). Alltså kan inte Boolean användas, som bara kan hålla två olika lägen. För en OptionButton räcker det dock bra.
> Kan man använda Boolean på Checkbox också?
Du kan skriva
Check1.Value = Abs(DinBooleanVariabel)
eftersom Abs(True) = Abs(-1) = 1 och Abs(False) = Abs(0) = 0
~ beezoSv: -hmm?!..
"Några rader kod" är väl inte så enkelt att välja ut här, det hela uppstår i ett sammansatt sammanhang. Själva stället där det händer ser ut såhär:
If cmdObject("hopsah").Name <> "" Then
CHK_HOPSAH.value = 1
Else: CHK_HOPSAH.value = 0
End If
Det är när raden CHK_HOPSAH.value = 1 körs som det händer.
Objektet det händer i är av samma klass som objektet man får med cmdObject("hopsah"), men det är inte samma objekt. Klassens instansvariabler och initiering ser ut såhär:
Option Explicit
Private m_cName As String
Private m_args() As String
Private m_side As String
Private m_nargs As Integer
Private m_storeKey As String
Private Sub Class_Initialize()
ReDim m_args(1 To 32)
m_nargs = 0
m_cName = ""
m_side = ""
End Sub
Det värde som oavsiktigt ändras ligger i m_args(1) i ett av objekten, de övriga platserna i m_args i det objektet är oanvända, men VB sätter dom ju till tomsträngar.
Det förekommer ca 20 sådana objekt, alla lagrade i samma Collection, indexerade med varsin sträng (som också återfinns i m_storeKey). Denna Collection ligger i sin tur i ett objekt tillhörande en hemgjord klass SCollection:
Option Explicit
Private m_collection As Collection
Private m_position As Integer
Private m_sortMode As Integer
Private m_keyTemp
Private Sub Class_Initialize()
Set m_collection = New Collection
End Sub
Public Function NewEnum() As IUnknown
' OBS I tools-procedure attributes har markerats "hide" och ID satt till -4
Set NewEnum = m_collection.[_NewEnum]
End Function
(I båda de här nämnda klasserna finns förstås också en massa funktioner mm)
När cmdObject("hopsah") körs händer i detta fall att ett objekt lagrat med index "hopsa" tas bort ur samlingen och försvinner, och istället skapas två stycken nya som lagras med respektive index "hopsah" och "hopsav". Båda tilldelas namnet "hopsa", så cmdObject("hopsah").Name <> "" blir sant.
I detta skede händer ännu ingenting med objektet som ändras, det sker först i nästa steg: CHK_HOPSAH.value = 1. Vad som däremot kan ha betydelse är att det ursprunliga objektet "hopsa" ligger före (men inte närmast före) det objekt som störs, i samlingen ("collectionen"). Det betyder att alla efterföljande så att säga byter plats ett steg mot början. Objektet efter det störda har värdet "0" i sin m_arg(1), samma värde som "hoppar" in och sätter sig i det störda objektet. Men det finns ett par andra med detta värde också. Inga andra objekt ändras. Och om jag flyttar anropet till rutinen som utlöser felet, så händer heller inget fel. (Jag har inte provat alla upptänkliga varianter här, men några).
Hoppas att det är lite begripligare såhär!
- Hans