German Programmablauf zu schnell?!?

Zerberus

Member
Licensed User
Longtime User
Hallo,

ich erhalte in folgendem Programmabschnitt einen Fehler:

B4X:
    Abspielliste.Initialize
    raf.Initialize(File.DirInternal,Main.pllWahl, False)
    listePlay=raf.ReadObject(0)
    Log(listePlay)
    For i = 0 To listePlay.Size-1
    Dim Lied As TitelPlay
    Lied = listePlay.Get(i)
    Abspielliste.Add(Lied.Pfad)
    Abspielliste.Add(Lied.Datei)
    Next

Der Fehler lautet "...cannot be cast to..." und weist auf die Zeile

B4X:
Lied = listePlay.Get(i)

hin.

Wenn ich allerdings in diese Zeile einen Breakpoint setze und per Einzelschaltung fortfahre, funktioniert es. Auch, wenn ich mit einer kleinen Routine
B4X:
wait(1)
jeweils eine Sekunde Pause vor die beanstandete Zeile setze, klappt es. Bei einer längeren Liste mit 30 Einträgen aber eine halbe Minute zu warten, ist sicherlich nicht die Ideallösung.

Hat Jemand einen Tip für mich?

Grüße

Zerberus
 

KMatle

Expert
Licensed User
Longtime User
Die Fehlermeldung bedeutet, dass Die Quell- und Zielvariablen unterschiedlich definiert sind. Wahrscheinlich fängt der Debugger das mit Breakpoint irgendwie ab.

Ich würde mal die Variablen prüfen. String muss wieder in eine String Variable, eine Liste in eine Liste etc.

Wie ist denn "TitelPlay" definiert?

B4X:
Dim Lied As TitelPlay

Wenn Du einen (wahrscheinlich) String aus der Liste "ListePlay" in eine eigene Struktur "TitelPlay" packst, dann geht das schief.
 

DonManfred

Expert
Licensed User
Longtime User
Helfen würde es sicherlich auch, die KORREKTE und KOMPLETTE Fehlermeldung zu sehen. Klaus Antwort ist sicher korrekt.

Aber

Der Fehler lautet "...cannot be cast to..."
Die genaue Meldung würde hier nämlich nun helfen genaueres sagen zu können.

Hilfreich wäre auch ein Beispielcode
 

Zerberus

Member
Licensed User
Longtime User
Danke Euch Beiden.

B4X:
Type TitelPlay(Datei As String, Pfad As String)

TitelPlay ist ein Object mit zwei Attributen (String), welches aus ListePlay gelesen und als jeweils zwei Strings in Abspielliste geschrieben wird.

Die komplette erste Zeile der Fehlermeldung lautet:

java.lang.ClassCastException: b4a.mp3player.playlisten$_titel cannot be cast to b4a.mp3player.player$_titelplay

Übrigens: Wenn die Pause vor der "Fehlerzeile" 100 ms lang ist, kommt der Fehler. Ist die Pause 110 ms lang, funktioniert es...

Gruß

Zerberus
 

DonManfred

Expert
Licensed User
Longtime User
Ist ein Anfang. Aber unkar ist
.playlisten$_titel cannot be cast to b4a.mp3player.player$_titelplay
wie titel definiert it. Es scheint also kein Typ titelplay aus der liste zu kommen sondern ein typ titel (der Fehlermeldung nach zu urteilen).
 

DonManfred

Expert
Licensed User
Longtime User
Wenn Du ein Lied in die Liste packen willst, dann solltest Du vermutlich nicht einzelne Strings sondern das Lied an sich komplett in der Liste ablegen um es später wieder zu holen.

B4X:
Abspielliste.Initialize
    raf.Initialize(File.DirInternal,Main.pllWahl, False)
    listePlay=raf.ReadObject(0)
    Log(listePlay)
    For i = 0 To listePlay.Size-1
        Dim Lied As TitelPlay
        Lied = listePlay.Get(i)
        Abspielliste.Add(Lied)
    Next

Ohne jedoch wirklich deinen kompletten Code zu sehen (also was Du da genau speicherst z.b.) ist es schwer hier konkrete Hinweise zu geben.

Kannst Du ein kleines Beispielprojekt erstellen welches dieses "Fehlverhalten" zeigt?
 

Zerberus

Member
Licensed User
Longtime User
B4X:
Type Titel(Datei As String, Pfad As String)
stammt aus der Activity "playlisten".

B4X:
Type TitelPlay(Datei As String, Pfad As String)
stammt aus dem Servicemodul "player".

EDIT: Deine zweite Antwort sah ich erst nach diesem Beitrag.
 

DonManfred

Expert
Licensed User
Longtime User
Wieso benutzt du zwei Typen mit scheinbar identischem Inhalt?

In diesem Fall musst du Dir wohl eine bzw. zwei Hilfsroutinen schreiben, die aus einer TitelPlay ein Titel macht. Oder umgekehrt.

B4X:
Sub Titel2Play(src As Titel) As TitelPlay
    Dim dst As TitelPlay
    dst.Initialize
    dst.Datei = src.Datei
    dst.Pfad = src.Pfad
    Return dst
End Sub
Sub Play2Titel(src As TitelPlay) As Titel
    Dim dst As Titel
    dst.Initialize
    dst.Datei = src.Datei
    dst.Pfad = src.Pfad
    Return dst
End Sub

Und dann würde dein Code ungefähr so anwendung finden

B4X:
Lied = Titel2Play(listePlay.Get(i))

Oder du benutzt gleich für beides nur einen Type. Das würde Dir solche umwege der Hilfsroutinen um zwei Objekte umzuwandeln.

Auch, wenn die zwei properties des Type identisch sind, sind es zwei verschiedene Objekte weil die Basis (die Type-definition) unterschiedlich ist.

Meines erachtens ist es unsinnig hier so vorzugehen.

Benutze lieber NUR den Type Titel.

Du machst Dir das Leben nur unnötig schwer (wie du ja jetzt erfolgreich festgestellt hast ;-))
 
Last edited:
Top