German Verständnisproblem Panel.GetView

psciga

Active Member
Licensed User
Longtime User
Hallo zusammen,

bitte helft mir, ein Tutorial zu verstehen. Konkret handelt es sich um um wenige Zeilen Code in diesem Beispiel (Creating a table view based on ScrollView):

B4X:
Sub GetView(Row As Int, Col As Int) As Label
    Dim l As Label
    l = Table.GetView(Row * NumberOfColumns + Col)
    Return l
End Sub

Kann mir bitte jemand versuchen zu erklären, wie sich der Index von GetView berechnet? Oder allgemein gefragt, wie ist die Methode Panel.GetView(Index) zu verstehen?

Ich frage bewußt hier im dt. Forum, weil ich Angst habe auf Grund mangelhafter Englischkenntnisse die Antwort nicht zu verstehen.

Vielen Dank im Voraus!

Grüße aus dem mittlerweile dunklen Sachsen - Peter
 

klaus

Expert
Licensed User
Longtime User
Der Index ist einfach.
Die erste View die in ein Panel (oder in eine Activity) einfügt wird hat Index 0.
Der Index wird mit jeder neuen View die hinzugefügt wird um 1 erhöht.
Wenn man, zum Beispiel, ein Panel in eine Activity hinzufügt ist das Panel eine 'Kinderview' der Activity mit seinem Index.
Wenn man dann Views in dieses Panel hinzufügt, bekommen sie ihren eignen Index in diesem Panel und nicht in der Activity.
In einem ScrollView.Panel kann man zum Beispiel für jede Zeile ein Panel einfügen welches dann x Views für jede Zeile enthält.
Die Panels haben den Index der Zeilen im ScrollView.Panel und die Views in den Panels habe den Index in der Reihenfolge in der sie in das Panel eingefügt wurden.
Beispiel : eine ScrollView mit einem Panel pro Zeile und drei Views pro Panel einem Label, einer EditText View und einer CheckBox.
Zeile 0 : Panel 0 : Label 0 : EditText 1 : CheckBox 2
Zeile 1 : Panel 1 : Label 0 : EditText 1 : CheckBox 2
Zeile 2 : Panel 2 : Label 0 : EditText 1 : CheckBox 2
Zeile 3 : Panel 3 : Label 0 : EditText 1 : CheckBox 2

Wenn man die CheckBox aus Zeile2 bekommen will, muss man:
Das Panel bekommen mit:
Dim pnl As Panel
pnl = ScrollView.Panel.GetView(2)

und dann bekommt man mit:
Dim lbl as Label
lbl = pnl.GetView(0)
Dim edt as Label
edt = pnl.GetView(1)

Dim cbx As CheckBox
cbx = pnl.GetView(2)


EDIT.
Sorry, Ich hatte die Frage nicht genau gelesen.
Meie Antwort ist eine generelle Antwort.
DonManfred gibt die gaue Antwort zur gestellten Frage.
 
Last edited:

DonManfred

Expert
Licensed User
Longtime User
Im Grunde ganz einfach.

Eine Tabelle mit 4 Spalten (Colums) und 5 Zeilen (Rows) hat 20 Views

+++++++++++++++++++++
+ 0 + 1 + 2 + 3 + Row 0
+++++++++++++++++++++
+ 4 + 5 + 6 + 7 + Row 1
+++++++++++++++++++++
+ 8 + 9 + 10 + 11 + Row 2
+++++++++++++++++++++
+ 12 + 13 + 14 + 15 + Row 3
+++++++++++++++++++++
+ 16 + 17 + 18 + 19 + Row 4
+++++++++++++++++++++

die in dieser "Grafik" verwendeten Zahlen sind jeweils der Index der Zelle. 0-19 = 20 Stück.
B4X:
Sub GetView(Row As Int, Col As Int) As Label
    Dim l As Label
    l = Table.GetView(Row * NumberOfColumns + Col)
    Return l
End Sub

GetView(0,3) liefert also den View aus Zeile 1 und Spalte 4. Da die Views bei 0 beginnen ist das also View-.Nr 3. In diesem Falle die rechte Spalte aus der Headerzeilen in dem Beispiel

GetView(4,3) liefert also den View aus Zeile 5 und Spalte 4. Da die Views bei 0 beginnen ist das also View-.Nr 19

PS: Dieses Wissen gehört aber zum Grundwissen. Quasi Programmieren in der 1. Klasse der Grundschule. Mit anderen Worten solltest du dich nochmal mit den Grundlagen der Programmierung beschäftigen.
 
Last edited:

psciga

Active Member
Licensed User
Longtime User
Vielen Dank Klaus und Manfred! Das habe ich soweit gerafft.

Es hatte mich nur verwirrt, diesen Weg zu gehen, weil in dem konkreten Beispiel das angeklickte Label (Cell_Click) ja schon im Tag Zeile und Spalte mitbringt und darüber die Eigenschaften des Labels manipulierbar sind.

@Manfred - WO gibt es diese Grundschule??? Hatte mir extra das B4A Buch gekauft aber das beginnt anscheinend bei Klasse 2

Um von der Vorschule in die erste Klasse zu kommen bin ich nun dabei Beispiele zeilenweise nachzuvollziehen. Daher kommt auch die Frage.

Nochmals herzlichen Dank!

VG - Peter
 

DonManfred

Expert
Licensed User
Longtime User
Beispiel aus der Realität:
Wenn jemand zu dir sagen würde "Zähl mal bis 10" dann würdest du spontan mit "1, 2, 3, 4, 5, 6, 7, 8, 9, 10" antworten. Ist im Realen Leben und der gültigen Mathematik auch richtig so.
Anm: Du hast 10 Zahlen als Antwort gegeben.

Ein Computer beginnt jedoch mit 0 beim zählen (0 ist für den Computer die erste Zahl.
Mensch: "Liste mir mal alle Zahlen bis 10 auf"
Computer: "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10"
Anm: Der Computer hat 11 Zahlen als Antwort gegeben.

Und dieses Verhalten setzt sich - zumindest beim Computer - immer weiter fort. Vermutlich durch alle Programmiersprachen hinweg.

Wenngleich es vermutlich auch in dem b4a-Buch es beiläufig stehen wird das Arrays, Lists, Maps, Views, usw. alle bei 0 beginnen so ist diese Info für einen Neuling jedoch ÄUSSERST WICHTIG. Ohne dieses Wissen wirst Du sonst in diverse Fallen Tappen.

Ein Beispiel

Gedanke: "Ich brauch ein Array mit 5 Einträgen..."
B4X:
Dim Freunde(5) as string

Gedanke: "Ich muss die Liste meiner Freunde aufzählen"
B4X:
for i = 1 to 5
  log(freunde(i))
next

Log-Ausgabe:

Erel
Informatix
agraham
psciga
ERROR: Listindex out of bounds "log(freunde(5))"




Da Dir das bisher SO nicht bewusst war wird es Dir jetzt mit der kleinen Erklärung helfen.

Ich glaube das Du nun, wann immer Du die Meldung "Listindex out of bounds" zu sehen bekommst an diesen Thread hier denken wirst und Du dann gleich deine Programmierung daraufhin überprüfen wirst ob Du da wieder wie ein Mensch gedacht hast beim zählen oder nicht.

Wenn das der Fall ist dann hat sich meine Erklärung rentiert, gelohnt

MÖGE DIE MACHT MIT DIR SEIN
 

psciga

Active Member
Licensed User
Longtime User
Nochmal vielen Dank für Eure Bemühungen. Das mit dem Index habe ich verstanden.

Aber auch auf die Gefahr Euch zu nerven, mein eigentliches Problem: Der Activity wird ein ScrollView (SV) hinzugefügt. Dem SV wiederum ein Panel und an das Panel n Label's (siehe Bild).

Beim Erzeugen der Label werden diese mit "Cell" initialisiert:

B4X:
Dim l As Label
l.Initialize("cell")

Somit könnte doch eine Routine

B4X:
Sub cell_Click
    Dim rc As RowCol
    Dim l As Label
    l = Sender
    ......
End Sub

schon alle Infos die an das Label gebunden sind (Text, Tag,...) auslesen. Oder(1)?

Folgt man dem eingangs genannten Tutorial, kann auf die von Euch erklärte Weise der Index ermittelt werden. Allerdings setzt das voraus, dass die Label wirklich in der im Beispiel programmierten Reihenfolge einfügt werden. Denn wenn ich Klaus richtig verstehe werden ohne mein Zutun alle eingefügten Child-Elemente eines übergeordneten Parent-Views bei 0 beginnend indiziert. Oder(2)?

Mein Fehler. Vermutlich hätte ich den kompletten Quelltext posten sollen, denn das was auf der Tutorial-Seite beschrieben ist sieht ja auch genau so aus. Dagegen geht der Quelltext in der zip-Datei die ich mir dann runter geladen und analyiert habe den Weg über die Indexberechnung.

Viele Grüße - Peter
 

Attachments

  • forumfrage_01.jpg
    30.3 KB · Views: 311
Cookies are required to use this site. You must accept them to continue using the site. Learn more…