ListBox addfolder -> me.AddExpandableRow

Ich hatte alles prima am Laufen mit addfolder. Ein vollständiges Inhaltsverzeichnis aller 2739(!) Einträge von Texttiteln in Gottfried Kellers Werken (inkl Briefe).
Jetzt suche ich verzweifelt nach einem Beispiel mit einer Tiefe > 2 mit der neuen Methode. Es gelingt mir zwar, die untergeordneten Titel anzuzeigen, aber die Hierarchie wird nicht durch Leerraum zu Beginn angezeigt. Alles wird einfach unten addiert und zum Zusammenklappen findet man nur Bahnhof etc.

Hat jemand ein funktionierendes Beispiel?

If you want to discuss in German, there’s a section for that in this forum you can also use :wink:

Ist es das was du willst ?

Wenn ja, fügen Sie in Erweitern… Ihren Text in CellAt(1) ein, nicht in CellAt(0).

Ist es o.k ?

Oder dieses…

Hinweis Ich weiß nicht, wie ich in diesem Fall die zweite Ebene erweitern soll…
image

Das ist genau das Problem. Ich weiss das mittlerweile, und es kann so gehen:
(Ich arbeite mit einer Valentina-Datenbank,
myRids sind die Keys einer Tabelle mit den Texttiteln.
Diese Tabelle enthält neben den Titeln auch Keys von Parents der gleichen Tabelle.)

getChildren sucht nach den Keys des aktuellen Eintrags in der Tabelle (also den Keys, die auf den aktuellen Eintrag verweisen)
Wenn die Suche 0 ergibt, dann existieren keine Children und die Einträge werden ‘normal’ ( me.AllowExpandableRows = False). Das funktioniert mehr schlecht als recht, denn es erscheinen keine Einzüge vor den jeweils nächsten Einträgen (kann man vielleicht sekundär mit Leerzeichen hineinschustern?)

Diese Routine steckt Rowexpanded-Event:

Var myRids() as UInt32
myRids = me.getChildren(val(me.CellTextAt(row, 1)))
for i as Integer = 1 to myRids.count
tblInhalt.RecID = myRids(i-1)
Var tmp() as UInt32 = getChildren(myRids(i-1))
if tmp.count > 0 then
me.AllowExpandableRows = True
var s as string = tblInhalt.VarCharField(“fldTitel”).Value
me.AddExpandableRowAt(row+i, s)
me.cellTextAt(i, 1) = str(myRids(i-1))
me.cellTextAt(i, 2) = tblInhalt.VarCharField(“fldETextFile”).Value
else
me.AllowExpandableRows = false
var s as string = tblInhalt.VarCharField(“fldTitel”).Value
me.AddRowAt(row+i, s)
me.cellTextAt(row+i, 1) = str(myRids(i-1))
me.cellTextAt(row+i, 2) = tblInhalt.VarCharField(“fldETextFile”).Value
end if
next

Möglich, dass da etwas noch nicht korrekt ist, das Resultat genügt jedenfalls nicht. Wie es in einem Programm 2013 aussah, kann man unter www.ehkka.ch nachschauen (Dt. Seminar der Uni Zürich) - funktioniert, aber ziemlich archaische Installation, sollte aber immer noch funktionieren.

Ich habe nicht überprüft, wie man die zweite Ebene entwickelt, weil ich ein Projekt geändert habe, um den Test durchzuführen, und ich habe meine Änderungen schnell verworfen, bevor ich sie gespeichert und Zwietracht in meinem Projekt gesät habe.

Vielleicht solltest du das Design überdenken:
Ebene 1 zeigt die zweite Ebene an,
Ein Doppelklick (oder einfach?) zeigt die zweite Ebene an, die die erste ersetzt

und Sie können fortfahren.

Über eine Schaltfläche gelangen Sie zurück zur ersten Ebene.

Beachten Sie, dass die beiden abgebildeten Bildschirmebenen mich nicht ansprechen. Ich habe den Text in Spalte 1 geschrieben, aber das > bleibt in Spalte 0 …

Denken Sie über eine neue Schnittstelle nach … vielleicht.

Ich verstehe kein Deutsch; Ich gehe translate.Google.com durch… es ist nicht einfach.Ich habe die App heruntergeladen, aber auf dem m1 MacBook Pro habe ich sie nicht bekommen, sie wurde beendet.

Ebene 1 in Event: Opening:

if tblInhalt = NIL then tblInhalt = DB.Table(“tblInhalt”)

#if DebugBuild then
me.ColumnWidths = “60%,10%,10%,10%”
#else
me.ColumnWidths = “100%,0,0,0”
#endif

me.AllowExpandableRows = True
Var myRids() as UInt32 = me.getInhaltRidsNull
for i as Integer = 0 to myRids.LastIndex
Var tmp() as UInt32 = me.getChildren(myRids(i))
tblInhalt.RecID = myrids(i)
if tmp.Count > 0 then
var s as string = tblInhalt.VarCharField(“fldTitel”).Value
me.AddExpandableRow(s)
me.cellTextAt(me.LastAddedRowIndex, 1) = str(myRids(i))
me.cellTextAt(me.LastAddedRowIndex, 2) = tblInhalt.VarCharField(“fldETextFile”).Value
me.cellTextAt(me.LastAddedRowIndex, 3) = str(i)
else
me.AddRow tblInhalt.VarCharField(“fldTitel”).Value
me.cellTextAt(me.LastAddedRowIndex, 1) = str(myRids(i))
me.cellTextAt(me.LastAddedRowIndex, 2) = tblInhalt.VarCharField(".fldETextFile").Value
me.cellTextAt(me.LastAddedRowIndex, 3) = str(i)
end if
next

Ebenen 1 - : in Event RowExpanded:

if me.RowExpandedAt(row) = False then return
me.AllowExpandableRows = True
Var myRids() as UInt32
myRids = me.getChildren(val(me.CellTextAt(row, 1)))
for i as Integer = 1 to myRids.count
tblInhalt.RecID = myRids(i-1)
Var tmp() as UInt32 = getChildren(myRids(i-1))
if tmp.count > 0 then
var s as string = tblInhalt.VarCharField(“fldTitel”).Value
me.AddExpandableRowAt(row+i, s)
me.cellTextAt(row+i, 1) = str(myRids(i-1))
me.cellTextAt(row+i, 2) = tblInhalt.VarCharField(“fldETextFile”).Value
else
var s as string = tblInhalt.VarCharField(“fldTitel”).Value
me.AddRowAt(row+i, s)
me.cellTextAt(row+i, 1) = str(myRids(i-1))
me.cellTextAt(row+i, 2) = tblInhalt.VarCharField(“fldETextFile”).Value
end if
next

Das funktioniert, ergibt aber das folgende Resultat (ScreenShot:

Die 2. Ebene 1 ist natürlich 2.

In dieser Form ist das Resultat unbrauchbar.
2013 sah das so aus:

You can write in English. I can understand.

1 Like

I Thin that I found a solution:

Project: TeileTest

page1image27172352|20.507080x2.000000 page1image27172736|91.492590x2.000000

Date: Sunday, 3 July 2022 12:00:53

HierarchicalListBox

Class HierarchicalListBox

Inherits Desktoplistbox

Constants
Const Leer As String = " "

Events

Sub Opening()
if tblInhalt = NIL then tblInhalt = DB.Table(“tblInhalt”)

#if DebugBuild then
me.ColumnWidths = “60%,10%,10%,10%”

#else
me.ColumnWidths = “100%,0,0,0”

#endif

me.AllowExpandableRows = True
Var myRids() as UInt32 = me.getInhaltRidsNull for i as Integer = 0 to myRids.LastIndex

Var tmp() as UInt32 = me.getChildren(myRids(i)) tblInhalt.RecID = myrids(i)
if tmp.Count > 0 then

var s as string = tblInhalt.VarCharField(“fldTitel”).Value
me.AddExpandableRow(s)
me.cellTextAt(me.LastAddedRowIndex, 1) = str(myRids(i)) me.cellTextAt(me.LastAddedRowIndex, 2) = tblInhalt.VarCharField(“fldETextFile”).Value me.cellTextAt(me.LastAddedRowIndex, 3) = Leer

else
me.AddRow tblInhalt.VarCharField(“fldTitel”).Value me.cellTextAt(me.LastAddedRowIndex, 1) = str(myRids(i)) me.cellTextAt(me.LastAddedRowIndex, 2) = tblInhalt.VarCharField(".fldETextFile").Value me.cellTextAt(me.LastAddedRowIndex, 3) = Leer

end if next

End Sub

Sub RowExpanded(row As Integer)
if me.RowExpandedAt(row) = False then return
Var myLeer as string = me.cellTextAt(row, 3) me.AllowExpandableRows = True
Var myRids() as UInt32
myRids = me.getChildren(val(me.CellTextAt(row, 1)))

page1image27172928|163.000000x2.000000

-1-

for i as Integer = 1 to myRids.count
tblInhalt.RecID = myRids(i-1)
Var tmp() as UInt32 = getChildren(myRids(i-1)) if tmp.count > 0 then

varsasstring= tblInhalt.VarCharField(“fldTitel”).Value me.AddExpandableRowAt(row+i, Leer + myLeer + s) me.cellTextAt(row+i, 1) = str(myRids(i-1))
me.cellTextAt(row+i, 2) = tblInhalt.VarCharField(“fldETextFile”).Value me.cellTextAt(row+i, 3) = Leer + myLeer

else
var s as string = tblInhalt.VarCharField(“fldTitel”).Value me.AddRowAt(row+i, Leer + myLeer + s)
me.cellTextAt(row+i, 1) = str(myRids(i-1))
me.cellTextAt(row+i, 2) = tblInhalt.VarCharField(“fldETextFile”).Value

end if next

End Sub

Methods
Function getChildren(ParentRid as UInt32) As UInt32()

Var myRids() as UInt32
Var mySet as VSet
mySet = tblInhalt.ObjectPtrField(“ptrToParent”).FindValue(parentRid) if mySet = NIL then

return myRids else

Var myiter as VSetIterator = mySet.MakeNewIterator Var r as UInt32 = myiter.FirstItem
While r > 0

myRids.Add r

r = myiter.NextItem wend

if r = 0 then return myRids end if

End Function

Function getInhaltRidsNull() As UInt32()
Var myRids() as UInt32
Var mySet as VSet
mySet = tblInhalt.ObjectPtrField(“ptrToParent”).FindNulls if mySet = NIL then

return myRids else

Var myiter as VSetIterator = mySet.MakeNewIterator Var r as UInt32 = myiter.FirstItem
While r > 0

myRids.Add r

r = myiter.NextItem wend

if r = 0 then return myRids end if

End Function
Function getParents(actRid as UInt32) As UInt32()

-2-

Var myRids() as UInt32
Var mySet as VSet
mySet = tblInhalt.ObjectPtrField(“RecID”).FindValue(actRid) if mySet = NIL then

return myRids else

Var myiter as VSetIterator = mySet.MakeNewIterator Var r as UInt32 = myiter.FirstItem
While r > 0

myRids.Add r

r = myiter.NextItem wend

if r = 0 then return myRids end if

End Function End Class

1 Like

The collaps was missing. This should work: Hierarchical is a subclass of listbox

Project: TeileTest

page1image26897664|20.507080x2.000000 page1image26892096|91.492590x2.000000

Date: Sunday, 3 July 2022 12:30:29

HierarchicalListBox

Class HierarchicalListBox
Inherits Desktoplistbox

Constants
Const Leer As String = " "

Events

Sub Opening()
if tblInhalt = NIL then tblInhalt = DB.Table(“tblInhalt”)

#if DebugBuild then
me.ColumnWidths = “60%,10%,10%,10%”
#else
me.ColumnWidths = “100%,0,0,0”
#endif

me.AllowExpandableRows = True
Var myRids() as UInt32 = me.getInhaltRidsNull for i as Integer = 0 to myRids.LastIndex

Var tmp() as UInt32 = me.getChildren(myRids(i)) tblInhalt.RecID = myrids(i)
if tmp.Count > 0 then

var s as string = tblInhalt.VarCharField(“fldTitel”).Value
me.AddExpandableRow(s)
me.cellTextAt(me.LastAddedRowIndex, 1) = str(myRids(i)) me.cellTextAt(me.LastAddedRowIndex, 2) = tblInhalt.VarCharField(“fldETextFile”).Value me.cellTextAt(me.LastAddedRowIndex, 3) = Leer

else

me.AddRow tblInhalt.VarCharField(“fldTitel”).Value me.cellTextAt(me.LastAddedRowIndex, 1) = str(myRids(i)) me.cellTextAt(me.LastAddedRowIndex, 2) = tblInhalt.VarCharField(".fldETextFile").Value me.cellTextAt(me.LastAddedRowIndex, 3) = Leer

end if
next
End Sub

Sub RowCollapsed(row As Integer)
Var myRids() as UInt32
myRids = me.getChildren(val(me.CellTextAt(row, 1))) for i as Integer = row + myrids.count DownTo row+1

me.RemoveRowAt(i) next

page1image26893632|163.000000x2.000000

End Sub

Sub RowExpanded(row As Integer)
if me.RowExpandedAt(row) = False then return
Var myLeer as string = me.cellTextAt(row, 3) me.AllowExpandableRows = True
Var myRids() as UInt32
myRids = me.getChildren(val(me.CellTextAt(row, 1))) for i as Integer = 1 to myRids.count

tblInhalt.RecID = myRids(i-1)
Var tmp() as UInt32 = getChildren(myRids(i-1)) if tmp.count > 0 then

varsasstring= tblInhalt.VarCharField(“fldTitel”).Value me.AddExpandableRowAt(row+i, Leer + myLeer + s) me.cellTextAt(row+i, 1) = str(myRids(i-1))
me.cellTextAt(row+i, 2) = tblInhalt.VarCharField(“fldETextFile”).Value me.cellTextAt(row+i, 3) = Leer + myLeer

else
var s as string = tblInhalt.VarCharField(“fldTitel”).Value me.AddRowAt(row+i, Leer + myLeer + s)
me.cellTextAt(row+i, 1) = str(myRids(i-1))
me.cellTextAt(row+i, 2) = tblInhalt.VarCharField(“fldETextFile”).Value

end if next

End Sub

Methods
Function getChildren(ParentRid as UInt32) As UInt32()

Var myRids() as UInt32
Var mySet as VSet
mySet = tblInhalt.ObjectPtrField(“ptrToParent”).FindValue(parentRid) if mySet = NIL then

return myRids else

Var myiter as VSetIterator = mySet.MakeNewIterator Var r as UInt32 = myiter.FirstItem
While r > 0

myRids.Add r

r = myiter.NextItem wend

if r = 0 then return myRids end if

End Function

Function getInhaltRidsNull() As UInt32()

Var myRids() as UInt32
Var mySet as VSet
mySet = tblInhalt.ObjectPtrField(“ptrToParent”).FindNulls if mySet = NIL then
return myRids
else
Var myiter as VSetIterator = mySet.MakeNewIterator
Var r as UInt32 = myiter.FirstItem
While r > 0
myRids.Add r
r = myiter.NextItem
wend

if r = 0 then
return myRids
end if

End Function

Function getParents(
actRid as UInt32) As UInt32()

Var myRids() as UInt32
Var mySet as VSet
mySet = tblInhalt.ObjectPtrField(“RecID”).FindValue(actRid) if mySet = NIL then

return myRids else

Var myiter as VSetIterator = mySet.MakeNewIterator Var r as UInt32 = myiter.FirstItem
While r > 0

myRids.Add r

r = myiter.NextItem wend

if r = 0 then
return myRids
end if

End Function
End Class

@Karl_Grob
Please use the ‘</>’ icon from the toolbar when adding source code to your reply. This makes it much more readable.

if tblInhalt = NIL then tblInhalt = DB.Table("tblInhalt")

#if DebugBuild then
    me.ColumnWidths = "60%,10%,10%,10%"
#else
    me.ColumnWidths = "100%,0,0,0"
#endif

me.AllowExpandableRows = True
Var myRids() as UInt32 = me.getInhaltRidsNull for i as Integer = 0 to myRids.LastIndex

Var tmp() as UInt32 = me.getChildren(myRids(i)) tblInhalt.RecID = myrids(i)
if tmp.Count > 0 then
 ...
1 Like

Sorry - lack of experience

HierarchicalListBox

Class HierarchicalListBox
Inherits Desktoplistbox

Constants
Const Leer As String = " "

Events

Sub Opening()
if tblInhalt = NIL then tblInhalt = DB.Table(“tblInhalt”)

#if DebugBuild then
me.ColumnWidths = “60%,10%,10%,10%”
#else
me.ColumnWidths = “100%,0,0,0”
#endif

me.AllowExpandableRows = True
Var myRids() as UInt32 = me.getInhaltRidsNull

for i as Integer = 0 to myRids.LastIndex
Var tmp() as UInt32 = me.getChildren(myRids(i)) tblInhalt.RecID = myrids(i)

if tmp.Count > 0 then
var s as string = tblInhalt.VarCharField(“fldTitel”).Value
me.AddExpandableRow(s)
me.cellTextAt(me.LastAddedRowIndex, 1) = str(myRids(i))
me.cellTextAt(me.LastAddedRowIndex, 2) = tblInhalt.VarCharField(“fldETextFile”).Value
me.cellTextAt(me.LastAddedRowIndex, 3) = Leer
else
me.AddRow tblInhalt.VarCharField(“fldTitel”).Value
me.cellTextAt(me.LastAddedRowIndex, 1) = str(myRids(i))
me.cellTextAt(me.LastAddedRowIndex, 2) = tblInhalt.VarCharField(".fldETextFile").Value
me.cellTextAt(me.LastAddedRowIndex, 3) = Leer
end if

next
End Sub

Sub RowCollapsed(row As Integer)
Var myRids() as UInt32
myRids = me.getChildren(val(me.CellTextAt(row, 1)))
for i as Integer = row + myrids.count DownTo row+1
me.RemoveRowAt(i)
next
End Sub

Sub RowExpanded(row As Integer)
if me.RowExpandedAt(row) = False then return

Var myLeer as string = me.cellTextAt(row, 3)
me.AllowExpandableRows = True

Var myRids() as UInt32
myRids = me.getChildren(val(me.CellTextAt(row, 1)))
for i as Integer = 1 to myRids.count
tblInhalt.RecID = myRids(i-1)
Var tmp() as UInt32 = getChildren(myRids(i-1))

if tmp.count > 0 then
var s asstring= tblInhalt.VarCharField(“fldTitel”).Value
me.AddExpandableRowAt(row+i, Leer + myLeer + s)
me.cellTextAt(row+i, 1) = str(myRids(i-1))
me.cellTextAt(row+i, 2) = tblInhalt.VarCharField(“fldETextFile”).Value
me.cellTextAt(row+i, 3) = Leer + myLeer
else
var s as string = tblInhalt.VarCharField(“fldTitel”).Value
me.AddRowAt(row+i, Leer + myLeer + s)
me.cellTextAt(row+i, 1) = str(myRids(i-1))
me.cellTextAt(row+i, 2) = tblInhalt.VarCharField(“fldETextFile”).Value
end if
next
End Sub

Methods

Function getChildren(ParentRid as UInt32) As UInt32()
Var myRids() as UInt32
Var mySet as VSet
mySet = tblInhalt.ObjectPtrField(“ptrToParent”).FindValue(parentRid)
if mySet = NIL then
return myRids
else
Var myiter as VSetIterator = mySet.MakeNewIterator
Var r as UInt32 = myiter.FirstItem
While r > 0
myRids.Add r
r = myiter.NextItem
wend
if r = 0 then
return myRids
end if
End Function

Function getInhaltRidsNull() As UInt32()
Var myRids() as UInt32
Var mySet as VSet
mySet = tblInhalt.ObjectPtrField(“ptrToParent”).FindNulls
if mySet = NIL then
return myRids
else
Var myiter as VSetIterator = mySet.MakeNewIterator
Var r as UInt32 = myiter.FirstItem
While r > 0
myRids.Add r
r = myiter.NextItem
wend
if r = 0 then
return myRids
end if

End Function

Function getParents(actRid as UInt32) As UInt32()
Var myRids() as UInt32
Var mySet as VSet
mySet = tblInhalt.ObjectPtrField(“RecID”).FindValue(actRid)
if mySet = NIL then
return myRids
else
Var myiter as VSetIterator = mySet.MakeNewIterator Var r as UInt32 = myiter.FirstItem
While r > 0
myRids.Add r
r = myiter.NextItem
wend
if r = 0 then
return myRids
end if
End Function

End Class

It seems that i dont get it. I had the code formatted with </>. On the right side everything was ok. Where can I find the manual for this?

It may sound weird but maybe it has to do with the curly double quotes instead of straight double quotes in your source code.