Android Tutorial Variablen und Objekte in Basic4android

klaus

Expert
Licensed User
Longtime User
Types / Arten

Das Basic4android Typesystem ist direkt vom Java-Typ abgeleitet.
Es gibt zwei Arten von Variablen: Primitive und Nicht-Primitive Types.
Primitives enthalten die numerischen Types: Byte, Short, Int, Long, Float und Double.
Primitives enthalten auch: Boolean und Char.
Liste der Types mit ihren Bereichen:
http://www.b4x.com/forum/basic...html#post45511

Primitive Types werden immer mit 'passed by value' an Subroutinen übergeben und auch wenn sie anderen Variablen zugewiesen werden.
'passed by value' = Wert übergeben
'passed by reference' = Referenz (Adresse) ügergeben
Zum Beispiel:
B4X:
Sub S1
  Dim A As Int
  A = 12
  S2(A)
  Log(A) 'Prints 12
End Sub
 
Sub S2(B As Int)
  B = 45
End Sub
Alle anderen Types, einschließlich Arrays von Primitive Types und Strings (Zeichenketten) sind den Nicht-Primitive Types zugeordnet.
Wenn man eine Nicht-Primitive in eine Subroutine übergibt oder wenn man sie einer anderen Variablen zuordnet, wird eine Kopie der Referenz übergeben.
Das heißt, daß die Daten selbst nicht dupliziert werden.
Es ist etwas anders als eine 'passing by reference' Übergabe da man die Referenz der ursprünglichen Variablen nicht ändern kann.

Alle Types können als Objekte behandelt werden.
Collections (Sammlungen) wie Listen und Maps arbeiten mit Objekten und können daher jeden Wert enthalten.
Hier ist ein Beispiel von einem häufigen Fehler, wo der Entwickler versucht, mehrere Arrays einer Liste hinzuzufügen:
B4X:
Dim arr(3) As Int
Dim List1 As List
List1.Initialize
For i = 1 To 5
  arr(0) = i * 2
  arr(1) = i * 2
  arr(2) = i * 2
  List1.Add(arr) 'Add the whole array as a single item
Next
arr = List1.Get(0) 'get the first item from the list
Log(arr(0)) 'What will be printed here???
Man könnte erwarten, dass 2 angibt. Allerdings wird es gibt es 10 an.
Wir haben ein einzelnes Array erstellt und haben 5 Referenzen dieses Arrays der Liste angefügt.
Die Werte in dem einzelnen Array sind die Werte die in der letzten Iteration festgelegt wurden.
Um dies zu beheben, müssen wir in jeder Iteration ein neues Array erstellen.
Dies geschieht durch den Aufruf von Dim in jeder Iteration:
B4X:
Dim arr(3) As Int 'This call is redundant in this case.
B4X:
[FONT=Verdana][COLOR=black]Dim List1 As List[/COLOR][/FONT]
[FONT=Verdana][COLOR=black]List1.Initialize[/COLOR][/FONT]
[FONT=Verdana][COLOR=black]For i = 1 To 5[/COLOR][/FONT]
[FONT=Verdana][COLOR=black]Dim arr(3) As Int[/COLOR][/FONT]
[FONT=Verdana][COLOR=black]arr(0) = i * 2[/COLOR][/FONT]
[FONT=Verdana][COLOR=black]arr(1) = i * 2[/COLOR][/FONT]
[FONT=Verdana][COLOR=black]arr(2) = i * 2[/COLOR][/FONT]
[FONT=Verdana][COLOR=black]List1.Add(arr) 'Add the whole array as a single item[/COLOR][/FONT]
[FONT=Verdana][COLOR=black]Next[/COLOR][/FONT]
[FONT=Verdana][COLOR=black]arr = List1.Get(0) 'get the first item from the list[/COLOR][/FONT]
[FONT=Verdana][COLOR=black]Log(arr(0)) 'Will print 2[/COLOR][/FONT]
Tipp: man kann Agraham's CollectionsExtra Library benutzen um ein Array zu kopieren.

Casting / Typumwandlung
Basic4android wandelt Types bei Bedarf automatisch um. Es wandelt auch Zahlen in Strings und automatisch um und umgekehrt.
In vielen Fällen muß man ein Objekt explizit in einem bestimmten Type festlegen.
Dies kann durch die Zuweisung des Objekts auf eine Variable des gewünschten Typs durchgeführt werden.
Zum Beispiel, das Sender Stichwort gibt ein Objekt zurück, das ist das Objekt das das Event (Ereignis) ausgelöst hat.
Der folgende Code ändert die Farbe des gedrückten Buttons. Beachten Sie, daß die gleiche Event-Routine mehrere Buttons behandelt.
B4X:
Sub Globals
    Dim Btn1, Btn2, Btn3 As Button
End Sub
Sub Activity_Create(FirstTime As Boolean)
    Btn1.Initialize("Btn")
    Btn2.Initialize("Btn")
    Btn3.Initialize("Btn")
    Activity.AddView(Btn1, 10dip, 10dip, 200dip, 50dip)
    Activity.AddView(Btn2, 10dip, 70dip, 200dip, 50dip)
    Activity.AddView(Btn3, 10dip, 130dip, 200dip, 50dip)
End Sub
 
Sub Btn_Click
    Dim b As Button
    b = Sender 'Cast the Object to Button
    b.Color = Colors.RGB(Rnd(0, 255), Rnd(0, 255), Rnd(0, 255))
End Sub
Der obige Code kann auch eleganter geschrieben werden:
B4X:
Sub Globals
End Sub
Sub Activity_Create(FirstTime As Boolean)
    For i = 0 To 9 'create 10 buttons
        Dim Btn As Button
        Btn.Initialize("Btn")
        Activity.AddView(Btn, 10dip, 10dip + 60dip * i, 200dip, 50dip)
    Next
End Sub
 
Sub Btn_Click
    Dim b As Button
    b = Sender
    b.Color = Colors.RGB(Rnd(0, 255), Rnd(0, 255), Rnd(0, 255))
End Sub
Scope / Anwendungsbereich

Variablen, die in Sub Globals oder in Sub Process_Globals deklariert werden, sind global und können aus allen Subs aufgerufen werden.
Die anderen Variablen sind lokal und können nur in der Subroutine aufgerufen werden in der sie deklariert wurden.
Mehr Informationen über Globals und Process_Globals Variablen befinden sich im Android Prozesse und Activities Lebensdauer Tutorial.

Tipps

Alle View Types können als Views behandelt werden. Dadurch kann man gemeinsame Eigenschaften von verschiedenen Views leicht ändern.
Beispiel: folgender Code deaktiviert alle Views, die direkte Kinderobjekte der Activity sind:
B4X:
For i = 0 To Activity.NumberOfViews - 1
    Dim v As View
    v = Activity.GetView(i)
    v.Enabled = False
Next
Falls Sie nur Buttons deaktiviert wollen:
B4X:
For i = 0 To Activity.NumberOfViews - 1
    Dim v As View
    v = Activity.GetView(i)
    If v Is Button Then 'check whether it is a Button
        v.Enabled = False
    End If
Next

Das Type Schlüsselwort erlaubt eigene Objekt-Types zu erstellen. Maßgeschneiderte Types verhalten sich genau wie andere Nicht-Primiteve Types.

Das Englische Originaltutorial.
 
Last edited:

android2303

New Member
Licensed User
Longtime User
Hallo Klaus,
habe es geschafft, sowohl mein HTC-Wildfire als auch m ein Touchlet x2g anzuschließen läuft schnell und gut.
Nun will ich das Tutorialbeispiel "Zahlenraten" mal ausprobieren und um
eine Rate-Versuchsanzahl erweitern habe da einige Fragen:
Wieso gibts bei anzs=""+anzahl einen Typenkonflikt?
(anzs as string und anzahl as int deklariert)
Ich dachte strings werden einfach nach int konvertiert und umgekehrt?
Fehlermeldung aufm Androidgerät: Paused on line 20 .....
Wieso kommt die Fehlermeldung erst nach dem Kompilieren und ausführen?
Wie kann man denn nun int nach string konvertieren?
Fragen über Fragen .........
 

klaus

Expert
Licensed User
Longtime User
B4X:
anzs = "" + anzahl
Das funktioniert nicht. Weil Du einen leeren String hast und der hat keinen Wert !
"" ist nicht 0 !

B4X:
anzs = "1" + anzahl
anzs = 1 + anzahl
anzs = anzahl
Alle drei funktionieren, je nach dem was Du machen willst.
Warum benutzt Du eigentlich einen Sring in der Gleichung und nicht direkt eine Zahl ?

Ich würde die erste Möglichkeit nicht benutzen, sondern zwei Zahlen addieren und das Resultat in einen String umwandeln.

Beste Grüsse.
 

xray12

New Member
Kann nur Klaus beipflichten

Hallo Klaus,
habe es geschafft, sowohl mein HTC-Wildfire als auch m ein Touchlet x2g anzuschließen läuft schnell und gut.
Nun will ich das Tutorialbeispiel "Zahlenraten" mal ausprobieren und um
eine Rate-Versuchsanzahl erweitern habe da einige Fragen:
Wieso gibts bei anzs=""+anzahl einen Typenkonflikt?
(anzs as string und anzahl as int deklariert)
Ich dachte strings werden einfach nach int konvertiert und umgekehrt?
Fehlermeldung aufm Androidgerät: Paused on line 20 .....
Wieso kommt die Fehlermeldung erst nach dem Kompilieren und ausführen?
Wie kann man denn nun int nach string konvertieren?
Fragen über Fragen .........

Wenn du mitzählen möchtest wie beim Beispiel zahlen raten für die Anzahl der Versuche einfach folgendes:

dim anzahl as int

irgendwo mal initialisieren anzahl = 0

dann an geeigneter Stelle

anzahl = anzahl + 1

LG
 
Top