German Wieso werden die Routinen von unten nach oben abgearbeitet?

klaus

Expert
Licensed User
Longtime User
Drehen eines Bildes: ist doch schon drin.
Speichern des Bildes / Abspeichern eines Thumbs : ist auch schon drin, schau doch mal in die btnSpeichern_Click Routine.
Du musst die Grösse der Bilder Bitmap definieren und dann speichern.
In der btnSpeichern_Click Routine wird bmpFoto gespeichert, dieses Bild ist schon eine Art Thumb. Es hat die Masse FotoB / FotoH.
Du musst dieses Vorgehen an Deine Bedürfnisse anpassen.
Erstellen einer ordentlichen grafischen Oberfläche : das ist persönliche Geschmacksache.
 

Lothar Kriegerow

Active Member
Hallo Klaus,

oh, da habe ich wohl gestern Abend echt was übersehen. Ich komme erst heute Abend wieder zum Weitermachen. Das Drehen weiß ich. Hab es ja in meinem Projekt verwendet. Wenn ich ein Bild speichern kann, ist das Problem auch erledigt. Danke.
Das Erstellen einer grafischen Oberfläche: Ja, das ist Geschmackssache. Ja, aber die paar Views kann es doch bei diesem Programmumfang nicht sein. Z.B EditText. So wie ich das sehe, ist der für meine Zwecke absolut ungeeignet. Eine farbliche Trennung vom Untergrund finde ich nicht. Auch bei einem Button ist eine grafische Einbindung für mich nicht erkennbar.

Sicher kommt irgendwann ein AHA-Effekt.

Gruß Lothar
 

Lothar Kriegerow

Active Member
Hallo Klaus,

ich habe mir mal erlaubt, die Routine noch etwas zu verbessern.


B4X:
Sub Foto_oeffnen
    Private BNr  = 0 As Int
    Dim Bild As String
    For i = 0 To ImvAnz - 1
        BNr = Bildnummer + i
      
        If BNr < MaxAnz Then
            Bild=Dateiliste.Get(BNr)
            bmpFoto = LoadBitmapResize(Verzeichnis,Bild, FotoB, FotoH, True)    'rechteckig
            ivs(i).SetBitmap(bmpFoto)
            ivs(i).Width = FotoB
            ivs(i).Height = FotoH
            ivs(i).Tag = i
        Else
            btndown.Enabled=False
            ivs(i).Width = 0dip
            ivs(i).Height = 0dip
            ivs(i).Tag = ""
        End If
    Next
End Sub

Durch die kleine Anpassung stürzt die Routine am Ende nicht mehr ab. So wie es ist, reicht es mir vollkommen (Fürs erste)

Beim Abspeichern der Bilder habe ich mir überlegt: Ich speichere nur das Thumb als neues Bild. Das Original kopiere ich in den App-Folder.
Dadurch bleibt mir die Größe und Qualität erhalten. Das Thumb dagegen speichere ich aus der View. Gibt es eine Möglichkeit, das Bild mithilfe eines Tricks so anzuzeigen, wie es z.B. auch die Galerie tut? In dem View kann ich das Bild nicht größer ziehen.

Gruß Lothar
 

klaus

Expert
Licensed User
Longtime User
EditText. So wie ich das sehe, ist der für meine Zwecke absolut ungeeignet. Eine farbliche Trennung vom Untergrund finde ich nicht. Auch bei einem Button ist eine grafische Einbindung für mich nicht erkennbar.
In diesem Bereich kannst Du machen was du willst.
Den Hintergrund von Buttons kann man im Designer anpassen.
EditText Hintergrund kann man nicht im Designer anpassen den muss man im Code ändern.
Das Alles ist HIER erklährt.

Beiliegend ein kleines Testprogramm.

Das Problem in Deinem Programm könntest Du besser in den btndown_Click und btnup_Click Routinen lösen.
Du hast da doch schon eine Kontrolle eingebunden. Du brauchst nur die Zahlen durch ImvAnz ersetzen.

B4X:
Sub btndown_Click
    If Bildnummer + ImvAnz > MaxAnz Then
        Bildnummer = MaxAnz - ImvAnz
        btndown.Enabled=False
    Else
        Bildnummer = Bildnummer + ImvAnz
    End If
    
    If Bildnummer + ImvAnz <MaxAnz Then
        Foto_oeffnen
        btnUp.Enabled=True
    Else
        btndown.Enabled=False
    End If
    
End Sub

Sub btnUp_Click
    Bildnummer = Bildnummer - ImvAnz
    If Bildnummer <=0 Then
        Bildnummer=0
        btnUp.Enabled=False
    End If
    btndown.Enabled=True
    Foto_oeffnen
End Sub
 

Attachments

  • ButtonLayout.zip
    133 KB · Views: 156

Lothar Kriegerow

Active Member
Hallo Klaus,

ich bin fassungslos! DANKE, Das bringt mich echt weiter. Ich habe mir das Beispiel angesehen, weiß aber ums Verr... nicht, wie du das machst. Also hier muss ich echt mal richtig Zeit investieren, um zu begreifen was da passiert. Ich hatte ca. 1,23 Km Code erwartet, nachdem ich das Beispiel zuerst gestartet habe. Ich sehe zwar, dass Du 3 Bilder verwendest und Farben setzt, aber wie und warum genau, dass muss ich erst mal für mich austesten.

Wäre die gesamte Stilisierung der Buttons nicht etwas für eine Klasse, welche man von allen Activities aufrufen kann?
Oder kann das in ein Codemodul?

Das Problem in Deinem Programm könntest Du besser in den btndown_Click und btnup_Click Routinen lösen
Ja, aber da bleiben die altern Bilder stehen. Da stürzt das Programm beim Klicken auf ein altes ab.

Vielen Dank - Lothar

Schüttelst Du das alles aus dem Ärmel???

(Jetzt sehe ich gerade, dass man in den Properties noch eine Menge einstellen kann. GREAT!)
 

klaus

Expert
Licensed User
Longtime User
Wäre die gesamte Stilisierung der Buttons nicht etwas für eine Klasse, welche man von allen Activities aufrufen kann?
Oder kann das in ein Codemodul?
Die Stilisierung aller Buttons im Testprogramm wurden im Designer eingestellt.
Wenn Du einen Button mit einer spezifischen Einstellung im Designer erstellt hast kannst Du ihn duplizieren.
Rechtklick auf den Button und Duplicate.
Klasse oder Code Module sind auch eine Lösung.

Das Problem in Deinem Programm könntest Du besser in den btndown_Click und btnup_Click Routinen lösen
Ja, aber da bleiben die altern Bilder stehen. Da stürzt das Programm beim Klicken auf ein altes ab.

Ich hatte es nicht komplett getestet.

Mit diesen Routinen funktioniert es.
B4X:
Sub btndown_Click
    Bildnummer = Min(Bildnummer + ImvAnz, MaxAnz - ImvAnz)
   
    Foto_oeffnen
   
    If Bildnummer + ImvAnz <MaxAnz Then
        btnUp.Enabled = True
    Else
        btndown.Enabled = False
    End If
End Sub

Sub btnUp_Click
    Bildnummer = Max(0, Bildnummer - ImvAnz)
   
    Foto_oeffnen
   
    If Bildnummer <=0 Then
        btnUp.Enabled = False
    Else
        btndown.Enabled = True
    End If
End Sub


Schüttelst Du das alles aus dem Ärmel???
Nein, ich benutze B4X seit dem Anfang, das heisst seit fast 10 Jahren (B4A), und Programmieren ist mein Hobby seit 40 Jahren.
 
Last edited:

Lothar Kriegerow

Active Member
Hallo Klaus,

hier muss ich dir mal widersprechen!
Ich habe in meinem Verzeichnis 84 Bilder.
In meiner App werden 84 Bilder angezeigt. 5X15 und als Rest noch 9.

In deiner App werden 60 Bilder angezeigt. (3x getestet)
(Aber einen Daumenhoch hast du ja bekommen. )

Gruß Lothar
 

Lothar Kriegerow

Active Member
Hallo B4A Profis,

ich habe noch einige Probleme - (Auch mit B4A :p)

Ich poste mal mein kleines Projekt.
Im Moment würde ich gern ein im Diary gespeichertes Programm mittels Klick im Vollbildmodus anzeigen. Es soll den gesamt Screen ausfüllen. (Soweit das Format des Bildes stimmt)
Perfekt wäre, wenn man es so zoomen könnte, als würde man es in der Galerie öffnen. Des Weiteren würde ich die ganze Geschichte scrollen können. So dass ich am Ende durch die Einträge scrollen könnte.

Vielleicht bekomme ich ja noch den einen oder anderen Tipp. Bis jetzt ist das Ganze ja noch eine einzige Baustelle. Auch der Sourcecode ist sicher noch an 1000 Stellen optimierbar. (Leider bringe ich es noch nicht besser)

Gruß Lothar
 

Attachments

  • MyDiary.zip
    286.8 KB · Views: 156

klaus

Expert
Licensed User
Longtime User
In deiner App werden 60 Bilder angezeigt. (3x getestet)
Ohne zu sehen was Du genau gemacht hast und wie kann ich mich hier nicht äussern.
Bei mir funktionierte es, am Ende werden die 15 letzten Bilder angezeigt und nicht der Rest der Bilder.

Ich noch mal kurz in dein letztes Projekt reingeschaut.
In der Bildergalerie, mit den Up und Down Buttons erhöhst und verminderst Du die BilderNummer um den Wert 8.
Warum? Du hat doch 15 Bilder auf dem Bildschirm.
In meinem Vorschlag ist das mit einbezogen.

In Deinen Layouts hast Du eine komische spezielle Variante 330 * 730?
 

Lothar Kriegerow

Active Member
Hallo Klaus,

In der Bildergalerie, mit den Up und Down Buttons erhöhst und verminderst Du die BilderNummer um den Wert 8.
Asche auf mein Haupt. Die 8 stand von meinem Projekt noch drin. SORRY!!

1. Die Variante 330 * 730 habe ich empirisch ermittelt. Mit diesen Dimensionen werden alle Views auf dem Handy so angezeigt, wie ich es im Designer platziere.
Wie ich das richtig machen muss, weiß ich nicht. Jedenfalls passt das auf einem S20plus und auf einem S9 Plus von Samsung. Ich frage mich eh, wie ihr das macht.
Mit dem internen Emulator habe ich auch so meine Not. Selbst Dort habe ich alles probiert. Ich sehe nicht alle Views.

2. Gibt es eine Möglichkeit, die Bilder Chronologisch einzulesen? Das wäre von großem Vorteil.

3. Ich habe dein Tutorial "ScrollView" durchgearbeitet. In dem Projekt wird noch "DoEvents" verwendet. Wenn ich das durch Sleep(0-X) ersetze, funktioniert nichts mehr.
Was muss ich da tun?


Gruß Lothar
 

klaus

Expert
Licensed User
Longtime User
1. Ich benutze die standard Variante 320 * 480 und 'spiele' mit AutoScale, Anchors und Designer Script und auch mit ScrollView.
2. Wie speicherst Du das Datum?
Du könntest die Daten eines Bildes, oder Teile davon, in einer Type Variable setzten, diese in eine List speichern und die kann man nach Type Komponenten sortieren.
3. Von welchem "ScrollView" Tutorial sprichst Du?
 
Last edited:

Lothar Kriegerow

Active Member
Hallo Klaus,

Zu 1. Sicher sollte ich alle Views dynamisch nach den Screenparametern setzen. Soweit bin ich noch nicht.
zu 2. Die Bilder lese ich aus dem CAM-Ordner ein (Mit Deiner Routine). Die Camera speichert die Bilder mit Datum korrekt in das Verzeichnis Für heute also 20201018_133010.jpg. Also Jahr, Monat Tag Stunde Minute.
zu 3. Ich habe es dir angefügt.

Deutsche Dokumentationen

Es steht unter Deutsche Dokumentationen - von Dir verfasst. Spitzen Leistung übrigens.
Ich brauche noch 2 Leben um das durchzuarbeiten.

Gruß Lothar
 

Attachments

  • ScrollView.zip
    8 KB · Views: 145

Lothar Kriegerow

Active Member
Hallo Klaus,

ich versuche schon den ganzen Tag ein Layout zur Laufzeit zur erstellen. Auf dieses ein Label, 2 Buttons und eine Checkbox zu setzen. Nun fehlen mir dazu absolut die Grundlagen.

Da ich nirgends eine Beschreibung zu so was finde, habe ich mir ein Projekt gesucht, wo so was gemacht wird. Das Projekt ist aber für mich nicht richtig durchschaubar.

Finde ich in Deinen Ausführungen irgend wo etwas darüber?
Wenn ich erst mal begriffen hätte, wie das korrekt gemacht wird, wäre ich schon echt weiter.
Natürlich könnte ich das mit dem Designer tun, aber das kann ich jetzt - ich wollte einfach meinen Horizont erweitern. Ich möchte einfach für mein Programm einen Kalender programmieren, der mir gleich anzeigt, an welchen Tagen ich Einträge habe.

Das mit den Tagen und Berechnen des Kalenders ist sicher kein Problem für mich. Am Ende müsste ich nur die Click_Events der Views erfassen. Aber da denke ich, da kann ich mir aus anderen Skripten was herleiten.

Über Hilfe würde ich mich sehr freuen,

Gruß Lothar
 

Midimaster

Active Member
Licensed User
Du kannst das Datei-Datum in diesem Fall aus zwei Quellen herstellen. Zum einen kannst Du aus dem Namen mit String-Manipulationen das Datum herausisolieren. Zum anderen könntest Du das Datum mit der Funktion File.LastModified bei jedem Bild abfragen. Daraus baust Du einen String der ziemlich genauso aussieht wie der Dateiname jetzt schon: 8 Stellen: J-J-J-J-M-M-T-T also z.b. 20191029. Sowas lässt sich später gut sortieren bzw. zum Vergleich des Datums nehmen, da ja mit steigendem Datum auch dieser
"Wert" immer größer wird. Da sind dann zwar Sprünge drin aber es gilt immer: das Datum von morgen ist größer als das Datum von heute.

Und nun musst Du eigentlich nur noch die Dateinamen in der gewünschte Reihenfolge als Liste speichern. Später kannst du immer wieder die Bilder in genau dieser Reihenfolge anzeigen.

Der Kalender ist alles andere als trivial. Sicherlich findet sich irgenwo eine fertige Klasse oder ein Code-Sniplet. Zum besseren Lernen kannst Du das aber auch selbst programmieren. Ich würde Dich dabei unterstützen. Allerdings lernt mannix, wenn man code vorgesetzt bekommt also beginne mal und ich werdeDich dann immer wieder auf den richtigen Weg lenken.

Der Kalender ist ein Rechteck (Panel) mit 6 Zeilen für jede Woche. Ja! Eine Monat kann 6 Wochen enthalten: 4 volle Wochen und vorne unten hinten jeweils eine unvollständige.
Jede Woche enthält 7 Tage (Buttons oder Labels oder ImageViews) also 42 Buttons. Jder Button bekommt eine fortlaufende Nummer in seinem TAG-Feld. Alle Buttons bekommen den gleichen Eventnamen. Jeder Kalender braucht eine weitere Zeile mit 7 Labels mit den Wochentagsnamen. Mo Di Mi Do Fr Sa So

Sowas baust Du am besten im Designer zusammen und speicherst es als eigenes Layout. Später laden wir es in ein Panel auf der Hauptlayout nach.

Beim Laden des Layouts werden nun mit einer FOR EACH Schleife die Children des Panels durchgegangen und die Texte jedes Buttons entsprechend dem Monat gesetzt.
 

Lothar Kriegerow

Active Member
Hallo MidiMaster,

hm, Ich lese ja die Dateien vom Foto-Verzeichnis ein. Dort sind die Dateinamen genau so hinterlegt.
Die Anzeige ist eh schon so grottenlangsam, da muss ich mir irgend etwas neues einfallen lassen.

Auf Dein Angebot komme ich gern zurück, will aber erst mal sehen, wieweit ich allein komme. Trotzdem interessiert es mich brennend, wie man das zur Laufzeit erstellt.
Klar gibt es schon fertiges Zeugs, aber hier will ich das selber machen. Es sollen z.B. im Monatskalender für den Tag andere Pictures geladen werden, wenn es einen Eintrag im Tagebuch gab.

Ich stehe im Moment vor einem echten Problem
Ich versuche gerade aus meiner Standard-App in eine B4XPages App umzuarbeiten.
Dazu habe ich ein neues B4XPages erstellt.
Schrittweise übernehme ich nun meine Routinen aus dem Standard-Projekt in das B4XPages. Zum Test lasse ich mir die fertigen Abschnitte mit dem Emulator auf dem Handy anschauen.
Bei dem Erstellen des Projekts kommt nun dieser Fehler beim Kompilieren und austesten.

B4A Version: 10.2
Java Version: 11
Parse den Code. (0.04s)
Building folders structure. (0.03s)
Führe individuellen Aktion aus. (0.06s)
Kompiliere den Code. (0.07s)
Kompiliere Layoutcode. (0.00s)
Organisiere Libraries. (0.00s)
(AndroidX SDK)
Generiere R Datei. (0.00s)
Kompiliere Debugger-Code Error
B4A line: 11
Private Activity As Activity
shell\src\b4a\example\b4xmainpage_subs_0.java:39: error: cannot find symbol
b4xmainpage._activity = RemoteObject.createNew ("anywheresoftware.b4a.objects.ActivityWrapper");__ref.setField("_activity",b4xmainpage._activity);
^
symbol: variable _activity
location: class b4xmainpage
1 error

Wenn ich nun den Schritt wieder zurückgehe, bleibt der Fehler. Ich versuche nun schon seit 8:00 Uhr den Fehler zu ergründen.
Ich hänge mal das Ganze als ZIP an.(Da ich die Frage eh erwarte). Da gibt es noch eine Menge Hinweise im Protokollmanager, aber keine Fehler. Wie gesagt - es is nur ein Bruchteil des Programms.

Gruß Lothar

(Ist es ratsam, das gesamte Programm umzuarbeiten, oder genügt es, nur die B4X Views einzusetzen?)
 

Attachments

  • MyDiaryBaA.zip
    276 KB · Views: 147
Last edited:

Midimaster

Active Member
Licensed User
ich kenn mich mit B4X-Pages gar nicht aus... Aber könnte es sein, dass der Variablen-Name Activity nicht erlaubt ist? Ist ja auch eine View-Bezeichnung
 

Lothar Kriegerow

Active Member
Hallo Midimaster,

wenn man in B4A ein neues Projekt erstellt, wird es ja so erstellt. Im Moment bin ich gescheitert und arbeite an meinem normalen Projekt weiter.

Ist irgendwie zu viel aufs' Mal.

Gruß Lothar
 

Midimaster

Active Member
Licensed User
Layouts zur Laufzeit sind nicht so schwierig.

Du Definierst einen View, Initialisierst ihn und fügst ihn dann als Child einem bereits bekannten view zu:
B4X:
Sub Globals
    Private MyPanel as Panel 'das gibt es schon aus dem Designer'
    Private MyButton(42) As Button 'die sollen neu dazukommen'
End Sub



Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("Main")
    dim WoX, WoY as INT
    For i= 0 To 41
        MyButton(i).Initialize("ButtonEvent")
        MyButton(i).Tag=i
        MyButton(i).Text = i
        MyButton(i).TextSize=18
        WoX= i mod 7
        WoY= i / 7
        MyPanel.AddView(MyButton(i), WoX*14%x, WoY*14%y, 12%x, 12%y)
    Next
....

Sub ButtonEvent_Click()
    dim locButton as Button=Sender
    log("Wer=" & locButton.Tag)
....
 

Lothar Kriegerow

Active Member
Hallo MidiMaster,

DANKE DAS IST SAUSTARK.

Durch diesen "einfachen Code" habe ich es jetzt endlich begriffen. Ich weiß, wenn man es einmal drauf hat, ist es einfach. Wieso verwendest Du ein Panel?
Als Container für eine Optionbox verstehe ich das, aber in dem Fall wäre es doch nicht zwingend nötig gewesen - Oder?
Gruß Lothar
 

Midimaster

Active Member
Licensed User
naja, so kannst du den gesamten Kalender auf einmal verschwinden lassen. Du schaltest einfach mit MyPanel.Visible=False alle Buttons gleichzeitig weg.

Generell ist es ziemlich oft sinnvoll, wenn mehrere Objekte die irgendwie zusammengehören immer in einem gemeinsamen Panel untergebracht sind. Geh mit Panels ruhig verschwenderisch um. z.b. um sinnvolle optische Gruppen am Bildschirm zu erstellen. Etwa wenn 8 Buttons senkrecht untereinander am rechten bildschirmrand stehen sollen. Dann 2 Panels erstellen Rechts das für die 8 Button mit den Ankern H=rechts und V=zentriert und der zweite Button mit dem Rest des Bildschirms mit den Ankern L=zentriert und V=zentriert. Dann hast Du auf allen Geräten die buttons immer schön rechts.
1603110278374.png
 
Top