VB: Globala variabler? + Samma kod för olika plattformar?

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Användarvisningsbild
JimmyAndersson
Inlägg: 26577
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

VB: Globala variabler? + Samma kod för olika plattformar?

Inlägg av JimmyAndersson »

Tankade ner "Visual Basic 2005 Express Edition" idag för att friska upp minnet lite.

Första testprogrammet blir 8st kryssrutor som styr D0-D7 i parallellporten.

Nu till problemet och lite kod:

Kod: Markera allt

Public Class Form1
    Dim Box_1 As Byte

    Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As
    System.EventArgs) Handles MyBase.Load
    End Sub

    Public Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, 
    ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
        If CheckBox1.Checked = True Then
            Box_1 = 1
        Else
            Box_1 = 2
        End If
    End Sub

    Public Sub TextBox1_TextChanged(ByVal sender As System.Object, 
    ByVal e As System.EventArgs) Handles TextBox1.TextChanged

    ' Här vill jag kunna läsa av vilket värde Box_1 fick i förra sub-delen
    ' och skriva värdet i text-rutan.
    ' Alternativt läsa av kryssrutan (CheckBox1)

    End Sub

End class

Vad är det som saknas för att det (kommentarerna i koden) ska fungera?
Jag har läst bl.a på den här sajten och sökt efter exempel-kod med google, men inte hittat något som fungerar.


Om jag byter ut kommentarerna i koden mot:

If CheckBox1.Checked = True Then
TextBox1.Text = "sju"
Else
TextBox1.Text = Box_1
End If

..så står det bara 0 i textrutan oavsett om jag markerar kryssrutan eller inte.


Det jag är ute efter är inte bara att lösa det här problemet, så fråga inte "Vad är det du vill göra?". :)
Jag vill lära mig hur man kan läsa av t.ex kryssrutor och variabler mellan olika Sub'er eller Functions. När jag bytte "Sub" mot "Function så fungerade inte koden pga "Handles" och jag har inte hittat hur man ska göra istället.


En till fråga:
Som det är nu så har jag en "Public Sub" för varje kryssruta.
Kan man inte lägga alla kryssrutor i samma Sub eller Function? Hur?


Någon som kan räta ut alla frågetecknen? :oops:

edit 1: Ändrade rubriken.
edit 2: Skrev edit-raderna.
Senast redigerad av JimmyAndersson 1 juli 2008, 17:29:33, redigerad totalt 2 gånger.
Användarvisningsbild
kifkroker
Inlägg: 405
Blev medlem: 15 september 2006, 01:22:46
Ort: Oslo

Inlägg av kifkroker »

om du vill hantera alla kryssrutor med samma sub kan du fylla på där det står

Kod: Markera allt

handles CheckBox1.CheckedChanged
så att det står

Kod: Markera allt

handles CheckBox1.CheckedChanged, CheckBox2.CheckedChanged, CheckBox3.CheckedChanged
sedan har du tilltång till controllen som kör suben genom exempelvis

Kod: Markera allt

if sender.checked then
 'kod
end if
det är svar på din senaste fråga, ska kika på den tidigare. Det ser bra ut i texten iaf, du skall ha tillgång till allt som finns i samma form

update: nytt projekt, lade dit en textbox och en checkbox, klistrade in din kod och det fungerade som förväntat. Så vad har du gjort snett tro?

update2: Ursäkta om jag är lite rörig, men här är en sub som förtydligar hur jag menade med att hantera flera boxar

Kod: Markera allt

 Public Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles CheckBox1.CheckedChanged, CheckBox2.CheckedChanged
        With DirectCast(sender, CheckBox)
            If .Checked Then
                Select Case .Name
                    Case "CheckBox1"
                        'checkbox1 har blivit förbockad
                        MsgBox("Check 1")
                    Case "CheckBox2"
                        'checkbox2 har blivit förbockad
                        MsgBox("Check 2")
                End Select
            Else
            End If
        End With
    End Sub
hh
Inlägg: 322
Blev medlem: 9 maj 2006, 12:37:32
Ort: Karis, Finland

Inlägg av hh »

Jag kan inte VB, men problemet tycker jag verkar vara att du försöker lägga visningen av texten i den sub som skall hantera ändringar av texten i boxen. Om du sätter in en brytpunkt någonstans i funktionen TextBox1_TextChanged så borde du vad jag kan förstå se att den aldrig startas.

Det du till exempel kan göra är att i slutet av suben som hanterar förändringar av checkboxars tillstånd t ex kalla på en funktion (sub eller vad det n må heta, t ex update). Det är helt enkelt en logisk fråga, när du gör något med en checkbox så är det funktionen som triggas av ändringen som skall innehålla koden för att sätta texten i rutan. Om textrutan är enabled så borde din kod fungera om du skriver något i textrutan (eftersom textbox_textchanged då triggas).

Med reservation för VB-okunnighet då alltså, men det borde inte vara så stor skillnad mot C#
hh
Inlägg: 322
Blev medlem: 9 maj 2006, 12:37:32
Ort: Karis, Finland

Inlägg av hh »

Här är hur jag menar, i min tolkning av VB :D

Kod: Markera allt

Public Class Form1
    Dim Box_1 As Byte

    Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As
    System.EventArgs) Handles MyBase.Load
    End Sub

    Public Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, 
    ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
        If CheckBox1.Checked = True Then
            Box_1 = 1
        Else
            Box_1 = 2
        End If

        update()

    End Sub

private sub update()
    'Här hanterar gör du vad du vill att skall hända när någon box har ändrats
' denna är onödig om du samlar alla checkboxhanteringar i en sub 
'men du ville ju kolla hur variabler går att använda mellan olika funktioner
't ex
            If CheckBox1.Checked = True Then
                 TextBox1.Text = "sju"
            Else
                    TextBox1.Text = Box_1
            End If



end sub

    Public Sub TextBox1_TextChanged(ByVal sender As System.Object, 
    ByVal e As System.EventArgs) Handles TextBox1.TextChanged

    ' Här kan du skriva in kod som hanterar grejer som händer när texten i boxen ändras t ex
         if Box_2  == 1 then 
               textbox1.bgcolor = color.red
                 

    End Sub

End class
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Angeånde koden i Jimmy's första inlägg...

När körs "Public Sub TextBox1_TextChanged" ?

Det finns inget explicit anrop till den, så det bårde vara när
händelsen "TextBox1_TextChanged" inträffar. Och det är väl
när användaren skriver något i text-boxen. Och det har ingenting
med check-boxen att göra...

TextBox1_TextChanged kommer aldrig att köras, om man inte
skriver något till TextBox1 !
Eller (som i hh's exempel) att en annan Sub skriver direkt till TextBox1.

Du kan direkt i CheckBox1_CheckedChanged gör det som ska göras med
TextBox1. Du kommer ju alltid åt alla object från alla Sub'ar.

D.v.s att t.ex "textbox1.bgcolor = color.red" enklast görs direkt i
CheckBox1_CheckedChanged (eller i update(), om det blir enklare så).
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Inlägg av Jeppsson »

Khaki
Inlägg: 268
Blev medlem: 12 januari 2007, 01:04:13
Ort: Mölndal

Inlägg av Khaki »

Ja, varför tanka ner 2005 och sedan sitta och kolla på en sida där det står:
This page is specific to
Microsoft Visual Studio 2008/.NET Framework 3.5 :)

Kifkroker´s variant är väl den kortaste och enklaste, bara att ersätta msg-boxen med textbox eller whatever.
hh
Inlägg: 322
Blev medlem: 9 maj 2006, 12:37:32
Ort: Karis, Finland

Inlägg av hh »

sodjan skrev:Angeånde koden i Jimmy's första inlägg...


Du kan direkt i CheckBox1_CheckedChanged gör det som ska göras med
TextBox1. Du kommer ju alltid åt alla object från alla Sub'ar.

D.v.s att t.ex "textbox1.bgcolor = color.red" enklast görs direkt i
CheckBox1_CheckedChanged (eller i update(), om det blir enklare så).
Du har ju förstås rätt, men jag tyckte det var bra att visa hur _textchanged fungerar. Om texten kan ändras från flera olika ställen blir det genast mycket vettigare att göra på mitt sätt (men det är förstås en annan historia).
Användarvisningsbild
JimmyAndersson
Inlägg: 26577
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Stort tack för all hjälp! :tumupp: :tumupp:
Nu har jag fått betydligt mer koll på hur man ska göra. :)

Jag har lött ihop en lysdiodsmatris som nu styrs med ett VB-program.
Kul när man lär sig nya grejjer. :)


Khaki:
Microsoft verkar ha gjort så att man kommer till 2008-versionen när man klickar på någon länk. Men det är ju bara att klicka på 2005 istället, vilket jag gjort när jag snurrat runt på den sajten.

Jeppsson:
Jag läste om skillnaderna mellan 2005 och 2008 och kom fram till att 2005-versionen räcker för mina behov. Simple as that.



Vad tycker ni annars om Visual Basic i jämförelse med t.ex Visual C# och liknande?
Det var jättelänge sedan jag programmerade i VB och Visual C#. Båda har ju ändrats mycket de senare åren. Att jag valde VB berodde mest på att jag kikat lite på det för något år sedan. Men det kunde lika gärna ha blivit något annat.

Det jag främst ville ha var något där man enkelt och snabbt kan göra GUI'et och koncentrera sig på resten av koden.

Nackdelen med Basic är att man får göra om nästan hela koden ifall man vill göra en version av programmet som ska köras på en GNU/Linux-burk. Så någon C-variant hade nog egentligen varit bättre. Såg att Visual Studio (2005 och framåt) kan användas ihop med t.ex GTKmm och GCC (C++).
Måste testa det någon gång.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Med tanke på hur vitt skiljt det är att styra parallellporten mellan Windows och Linux så är det nog ingen större vinst att skriva det i C(++).
Användarvisningsbild
JimmyAndersson
Inlägg: 26577
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Så sant. :)
Min tanke var bara att det vore trevligt om man rent allmänt kunde använda samma kod (med mindre modifieringar) för att kompilera och få två versioner (Win32 och GNU/Linux) av 'samma' program. Inte nödvändigtvis för att styra parallellporten alltså.

När det gäller det specifika fallet med parallellporten och Linux så löste jag det med PHP. Det blev ganska kul att använda ihop med 1wire-nätet. T.ex att öppna balkongdörren när inomhus-temperaturen blir för hög och liknande. :)

Nu håller jag mest på att testa lite idéer som ska slås ihop till ett automationsprojekt när vi flyttat. Då dyker det troligen upp en projekt-tråd.
Zäta
Inlägg: 181
Blev medlem: 22 september 2006, 08:25:21
Ort: Borlänge

Inlägg av Zäta »

Jag skulle satsa på C# av den enkla anledningen att MS själva verkar köra hårdast med det. Nästan allt nytt och alla exempel komemr först i C# sedan i VB.....

Däremot för att kunna kompilera .NET kod under Linux ska du kika på Mono-projektet. Det är ett opensource projekt för att implementera en Linux variant av .Net framework.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Jag skulle isåfall rekommendera Python eftersom det är helt plattformsoberoende. Använder du t.ex. pyParallel så får du stöd för parallellporten i både Windows och Linux med samma program. Resten av koden går att köra på Mac också.
BJ
Inlägg: 8864
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Inlägg av BJ »

Jag har visual c++ till windows. Men det är ju samma med det. Mina program där går ju inte heller att använda
om man ska göra linux-program. (Och det är nog bra...)

Vad finns det för bra grafik-grejer att använda om man vill göra grafiska linux-program?
Zäta
Inlägg: 181
Blev medlem: 22 september 2006, 08:25:21
Ort: Borlänge

Inlägg av Zäta »

Det beror nog på om du skriver managed c++ eller inte. All managed kod borde ju gå att köra mha av mono.
Skriv svar