German Wieso werden die Routinen von unten nach oben abgearbeitet?

Lothar Kriegerow

Active Member
Hallo MidiMaster,

ich habe das soweit hinbekommen. Ich stelle Dir das MiniProjekt mal rein. Später, wenn die Form läuft, will ich das in mein Diary integrieren. (Hast Du dir das schon mal wieder
angesehen?) Funktioniert an vielen Ecken schon prima, finde ich.

So, nun tun sich mir schon wieder Fragen auf.
In der Routine Clearbutton weiße ich jedem Button ein standard-Hintergrundbild zu.

Das Bild hat eine Größe von 30x30 Pixeln.
Um eine ordentliche Darstellung zu erhalten, muss ich den Button auf so komische Art positionieren.
Dabe gehe ich 40 und 100 vom Rand weg. Keine Ahnung, was 40 und 100 bedeuten.


B4X:
Sub ClearButtons
    Dim bX, bY As Int
    Private bW As BitmapDrawable
    bW.Initialize(LoadBitmap(File.DirAssets, "b1.jpg"))
    For i= 0 To 34
        butDay(i).Initialize("btn")
        butDay(i).Tag=i
        butDay(i).Text = i
        butDay(i).TextSize=8
        butDay(I).Background = bW
        'MyButton(i).Background =
        bX= i Mod 7
        bY= i /7
        Pan1.AddView(butDay(i), bX*140+40, bY*110+100, 130, 100)
    Next

Wenn ich im Designer einen NORMALEN Button platziere, und dem die Größe/ Breite 30 gebe, passt das.


Da das Pic eine feste Größe hat, uss ich mit absoluten Daten arbeiten, oder? Relative jätten ja stets eine andere Größe-

Gruß Lothar
 

Attachments

  • Erster Test.zip
    9.8 KB · Views: 159

Lothar Kriegerow

Active Member
Nachtrag - Ich habe die Routine Clearbutton überarbeitet, Diese Routine wird nun nur bei der Erstinitialisierung verwendet (Geschwindigkeit)
 

Midimaster

Active Member
Licensed User
wieso jetzt doch bloß 35 button? schau dir mal den -August 2020 an. Das sind 6 Zeilen:
1603112782271.png


Das mit den seltsamen Werten könnte mit den DIPs vom Handy zu tun haben. Verwende mal dip als Einheit statt fixer werte. Vielleicht kannst Du dann wieder mit Zahlen so um die 30 herum arbeiten. Da kenn ich mich nicht 100% aus....
B4X:
Pan1.AddView(butDay(i), bX*40dip+40dip, bY*40dip+40dip, 30dip, 30dip)

Nur aus Interesse.. Was ergab sich für eine Darstellung bei Verwendung meiner Prozent-Angaben?

Werden die Bilder später echte Bilder oder bleiben das nur farbige Hintergründe? Dann würde ich keine jpgs laden sondern die Button lieber mit Farbe füllen lassen.
 

Lothar Kriegerow

Active Member
Hallo Midimaster,

35 - da hab ich nicht zu Ende gedacht. :cool: (Wäre mir aber noch aufgefallen.)

Mit Deinen Prozentangaben sah ich nicht alle Buttons. Die waren weit auseinander gezogen.

Werden die Bilder später echte Bilder oder bleiben das nur farbige Hintergründe? Dann würde ich keine jpgs laden sondern die Button lieber mit Farbe füllen lassen.

Du bewegst mich zum Umdenken. Eigentlich hast Du recht. Für die Darstellung von leeres Feld, ausgewähltes Feld und Tag mit Eintrag reicht es wirklich, nur die Farben zu setzen. Alles andere wären zu viele Informationen.

Gruß Lothar
 

Lothar Kriegerow

Active Member
Hallo MidiMaster,

Schau mal, dimensioniert hab ich die Buttons schon bis 41. Hatte nur die Schleife noch nicht angepasst.

Gruß Lothar
 

Lothar Kriegerow

Active Member
Hallo MidiMaster,

mein Kalender funktionier jetzt auf MEINEM Smartphone ganz ordentlich. Sicher hat der Code noch 100 Ecken und Kanten, aber fürs 1. genügt mir das so.
Für Optimierungsvorschläge bin ich natürlich ganz offen. Die primitive Lösung resultiert aus meiner Unkenntnis.

Ich habe den Kalender mal angehängt.
Ohne Dich und Klaus wäre das nie so schnell vonstatten gegangen. DANKE.
Mich würde interessieren, ob der Kalender bei Dir sichtbar ist, oder sind Teile außerhalb? Auch die Implementierung der Einträge konnte ich nicht posten, da Ihr ja die DB nicht habt.

Gruß Lothar
 

Attachments

  • MyKalender.zip
    11.8 KB · Views: 157

Lothar Kriegerow

Active Member
Hallo MidiMaster und Klaus,

(Ich höre leider gar nichts mehr von Euch. Ich hoffe, ich habe niemanden verärgert.?)

Ich habe mein Diary nun schon so, dass man da was anfangen kann. Gern würde Ich euch das ganze Projekt mal zum Test schicken.
Das meist funktioniert bei mir zur Zufriedenheit, trotzdem hätte ich noch die eine und andere Frage.


Gruß Lothar
 

Midimaster

Active Member
Licensed User
ich helfe gerne immer bei Fragen, aber teste ungern anderer Leute App auf meinem Smartphone. Da würde ich an Deiner Stelle einen neuen Thread starten und darin um Rückmeldungen bitten.
 

Lothar Kriegerow

Active Member
Hallo Midimaster,

schade. Ich dachte, Du schaust Dir wenigstens den Kalender an... Da habe ich weiter oben wohl was missverstanden.
Als ich das letzte Mal nur Code postete, schrieb man mir :poste doch mal das ganze Projekt.
Na gut, vielleicht schaut es sich Klaus ja mal an.
Nur mal so - wenn man auf einem Smartphone ein Programm deinstalliert, wird doch eigentlich alles gelöscht. Zum Anschauen müßtest Du es ja nicht laufen lassen.


Ciao Lothar
 

Midimaster

Active Member
Licensed User
kann schon sein, dass Klaus dazu Lust hat. Das ganze Projekt braucht man oft um den Fehler zu verstehen. Dazu muss ich aber die App nicht aufs Handy übertragen.

Frag doch einfach mit einem neuen Post ins Forum hinein. Da wirst Du auf jeden Fall jemanden finden. Bin ja nur ich, der das nicht so gerne macht.
 

Lothar Kriegerow

Active Member
Hallo MidiMaster,

ich will das Projekt gar nicht posten. Die App läuft super. Ich wollte dir eigentlich nur zeigen, was in 1,5 Wochen B4A geworden ist.

Gruß Lothar
 

klaus

Expert
Licensed User
Longtime User
Ich habe mir dein MyKalender Projekt angesehen.
1. In dem Programm ist der erste Tag im Oktober 2020 Samstag aber der sollte Donnertag sein !?
Der erste Tag ist um zwei Tage versetzt.
Die Werte in GetDayOfWeek gehen von 1 bis 7 und der erste Tag ist Sonntag.
2. Du solltest für den Kalender eine CustomView machen. Dann könntest Du den in anderen Programmen wieder verwenden.
Und besser daraus eine b4xlib Library machen. Dann brauchst Du nur die Library anhaken und hast alles parat.
3. Ich würde das Kalender Layout in einem Panel erstellen und dann das Panel horizontal zentrieren.
Auf meinem Gerät ist der Kalender nicht zentriert.
 

Lothar Kriegerow

Active Member
Hallo Klaus,

danke für Deine Tipps.
Dass der Kalender nicht stimmt, habe ich gar nicht bemerkt, so überzeugt war ich von meinem Tun. :)

CustomView da fehlen mir noch ein paar Wochen Einarbeitung, schaffe ich abe irgendwie.. Von der Lib. habe ich gar keine Ahnung. Wäre schon eine erste Frage, wie übergebe und übernehme ich das Datum?
Gut, beim Übergeben könnte man noch das aktuelle Datum immer ansetzen. Wie aber frage ich das Datum aus einer Libary ab?
Meinst Du, die jetzigen Panels noch einmal in ein Panel setzen? Gute Idee. Ich muss erst mal sehen, wie das überhaupt auf anderen Geräten aussieht. Ich kann mir da noch kein Bild machen.

Ich habe da noch ein anderes kleines Problem. Ich lade in meinem Diary für jeden Tag einige Thumbnails in ein Layout.
B4X:
            Activity.AddView(imv, Left, Top, FotoB, FotoH)
 
End Sub

Wenn ich den Tag wechsle, versuche ich die vorher geladenen Bilder zu zerstören:


[CODE
imv(i).Width = 0dip
imv(i).Height = 0dip
[/CODE]

Manchmal funktioniert das und manchmal habe ich 2 Bilder im imv. Ich denke, ich weiß hier noch nicht richtig, was ich tun muss.

DANKE FÜRs ANSCHAUEN!

Gruß Lothar
 

klaus

Expert
Licensed User
Longtime User
CustomViews kann man in Libraries kompilieren.
CustomViews können Properties (Eigenschaften) haben eine davon könnte das Datum sein.

Warum ?
imv(i).Width = 0dip
imv(i).Height = 0dip

Und nicht einfach:
imv(i).Visible = False

CustomViews sind im Detail im B4X CustomViews Booklet erklärt.
 

Lothar Kriegerow

Active Member
Hallo Klaus,

ich speichere am Montag 5 Bilder und am Dienstag 3.

Wenn ich nun den Montag anschaue, sehe ich 5 Bilder. Jetzt blättere ich auf Dienstag vor.
Ich sehe 3 Bilder. Aber unter den Bildern liegen die 3 anderen Bilder. Die werden nicht gelöscht. Das Komische - mal geht es und mal nicht. Sleep(xx) hat nicht geholfen.
Irgendwie - so kenne ich das aus VB, müssen die Views wieder entladen werden.

Das gleiche Problem habe ich bei den Texten.

Das ist irgendwie blöd zu erklären.

Gruß Lothar
 

Midimaster

Active Member
Licensed User
Geht denn das von Klaus vorgeschlagene imv(i).Visible = False nicht?

Da gibt es noch die Möglichkeite dort ein "weißes" Bild zu laden, oder?
 

Lothar Kriegerow

Active Member
Hallo,
da es wirklich schwer zu beschreiben ist, habe ich mal ein NICHT FUNKTIONIERENDES Beispiel geschrieben.
Der Effekt zeigt sich leider nur, wenn man den Code laufen läßt.

Sicher fehlt nur eine Re-Initialisierung. Ich werde im Netzt aber nicht fündig. Ich war schon am bis am Ende des Internets. (2 Mal!)

Für alle, die den Code nicht runter laden wollen:

B4X:
#Region Module Attributes
    #FullScreen: False
    #IncludeTitle: True
    #ApplicationLabel: Text zum Bild
    #VersionCode: 2
    #VersionName:
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: True
#End Region

Sub Process_Globals
    Private xui As XUI
    Private rp As RuntimePermissions
    Dim Bitmaps As List
    Public Verz As String
End Sub

Sub Globals
    Dim bText As String
    Dim Scv As ScrollView
    Private Button1 As Button
    End Sub

Sub Activity_Create(FirstTime As Boolean)
    rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
    Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
    If Result = True Then Verz= File.DirRootExternal
    Log("Zugriff auf Verzeichnisstruktur: " & Result)
    If Result=False Then xui.MsgboxAsync("Der Zugriff auf den Bildpfad ist fehlerhaft.","Fehler")
    Verz =  "storage/0096-1800/DCIM/Camera" ' An eigene Gegebenheiten anpassen!
    bText="Das ist der Text, welcher beim 1. Start unter dem Bild zu lesen ist ."
    Activity.LoadLayout("Scroll")
    BilderLaden
    Show
End Sub


Sub Show
    Scv.Panel.Height = 300dip * Bitmaps.Size
    For i = Bitmaps.Size - 1 To 0 Step -1
        Dim iv As ImageView
        Dim LB As Label
        iv.Initialize("IVC")
        LB.Initialize("LBC")
        LB.Text =bText & I
        LB.Tag="TAG Nr: " & I
        Dim bd As BitmapDrawable
        bd.Initialize(Bitmaps.Get(i))
        iv.Background = bd
        iv.Tag ="HUHU"& I
        Scv.Panel.AddView(iv, 5dip, 5dip + i * 300dip, Scv.Width - 10dip, 190dip)
        Scv.Panel.AddView(LB, 5dip, 205dip + i *300dip, Scv.Width - 10dip, 100dip)
    Next
End Sub


Sub BilderLaden
    Bitmaps.Initialize
    Dim Bilder As List
    Dim BildOrdner As String
    BildOrdner = Verz
    If File.Exists(BildOrdner, "") = False Then
        ToastMessageShow("Bildpfad fehlerhaft: " , False)
        Return
    End If
    Bilder.Initialize
    Bilder = File.ListFiles(BildOrdner)
    For i = 0 To Bilder.Size - 1
       
        Dim f As String
        f = Bilder.Get(i)
        If f.ToLowerCase.EndsWith(".jpg") Then
            Dim b As Bitmap
            b.InitializeSample(BildOrdner, f, 200dip, 200dip)
            Bitmaps.Add(b)
            If Bitmaps.Size > 10 Then Exit
        End If
    Next
End Sub

Sub Activity_Resume
End Sub

Sub Activity_Pause (UserClosed As Boolean)
End Sub


Sub Button1_Click
    bText="Das ist ein neuer Text"
    BilderLaden
    Show
    ToastMessageShow ("Hm funktioniert nicht",True)
End Sub

Der Button symbolisiert die Rückkehr aus einem übergeordneten Modul.

Gruß Lothar
 

Attachments

  • Scroll.zip
    8.3 KB · Views: 144

Midimaster

Active Member
Licensed User
Du hast da eine ScrollView für eine bestimmte Anzahl an Bildern.

Jedesmal, wenn du Show() aufrufst werden weitere ImageViews hinzugefügt. Die Positionen beginnst Du zwar immer wieder von 5dip+i*300dip an, aber natürlich sind trotzdem die alten Views auch noch in der ScrollView. Das ist kein gutes Konzept!

Jetzt kannst Du entweder jedesmal den gesamte Scrollview-Inhalt löschen, wenn du auf einen neues Datum wechselst... Dazu müsstest Du alle Children dieses Views removen.

Oder du verwendest die alten Imageviews erneut und ersetzt wirklich die Bildinformation darin durch die neue. Dazu musst Du 10 Imageviews Image(0) bis Images(9) in die ScrollView einmalig mit AddView (oder im Designer) einbauen. Wenn Du jetzt auf einen neues Datum wechselst dann verwendest Du z.b. die ersten 3 dieser 10 Imageviews für die neuen Bilder und die restlichen 7 schaltest Du einfach Visible=False. Also gar nicht mehr mit AddView sondern Image(3).BackGround=bd

Hier mal hingerotzter Code ohne Garantie, um die Idee zu verdeutlichen:

B4X:
Public iv(10) as ImageView
Public LB(10) as Label

Sub InitAlle10
    Scv.Panel.Height = 300dip * 10
    For i=0 to 9
        Dim iv(i) As ImageView
        Dim LB(i) As Label
        iv(i).Initialize("IVC")
        LB(i).Initialize("LBC")
        LB(i).Text ="leer" & I
        LB(i).Tag="TAG Nr: " & I
        Dim bd As BitmapDrawable
        bd.Initialize(Bitmaps.Get(0))
        iv(i).Background = bd
        iv(i).Tag ="HUHU"& I
        Scv.Panel.AddView(iv(i), 5dip, 5dip + i * 300dip, Scv.Width - 10dip, 190dip)
        Scv.Panel.AddView(LB(i), 5dip, 205dip + i *300dip, Scv.Width - 10dip, 100dip)
    Next
End Sub


Sub Show
    Scv.Panel.Height = 300dip * Bitmaps.Size
    For i = 0 to Bitmaps.Size-1
        bd.Initialize(Bitmaps.Get(i))
        iv(i).Background = bd
        iv(i).Visible=True 
    Next
    For i = Bitmaps.Size  To 9
        iv(i).Visible=False
    Next
End Sub
 
Last edited:

Lothar Kriegerow

Active Member
Hallo Midimaster,

das Beispiel was ich gepostet habe funktioniert doch ein klein wenig anders.
Das wird aber nur verdeutlicht, wenn man es sich ansieht.
Der Hintergrund. Es werden im Tagebuch alle Einträge mit Bild und dem Anfangstext gezeigt. Da können X Einträge zustande kommen. Wenn in einem Eintrag XYZ nachträglich Text geändert wird, soll der Eintrag beim Zurückkehren in das Modul aktualisiert werden. Dazu - so habe ich gedacht, ich könne den Text in dem Label einfach überschreiben.

In meinem Beispiel breche ich das Einladen bei 10 Bildern ab. Das habe ich deshalb gemacht, weil ich nicht weiß, wie viele Bilder ihr in der Galerie habt. Ich dachte, mein Problem wird bei max. 10 Bildern deutlich. Ich lade in Wirklichkeit die Bilder aus einer Datenbank.

Das Komische ist, dass es von 10 Mal 1x funktioniert. Ich muss es irgendwie schaffen, die geladenen Views zu "zerstören", oder anderswie zu aktualisieren.
Sicher ist mein Versuch mit AddView wirklich ungeeignet.

Eine View einfach mit Visible=False abzuschalten, erscheint mir eher ungeeignet.
Ich habe das Thema erst mal hinten angestellt, da es eher trivial ist. Mein konkreter Fall kommt ja eher selten vor und nach einem Neustart ist ja auch alles wieder IO.

Gruß Lothar
 
Top