[Neue Frage ganz hinten] Bilder anzeigen wie Windows Diashow

Übersicht BlitzBasic BlitzPlus

Gehe zu Seite 1, 2, 3, 4  Weiter

Neue Antwort erstellen

Sereyanne

Betreff: [Neue Frage ganz hinten] Bilder anzeigen wie Windows Diashow

BeitragDo, Dez 03, 2009 16:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
ich möchte, dass mein Plus-Proggi ein paar Bilder lädt und in einer Schleife unendlich lange anzeigt.
Hab mit mehreren Grafik-Befehlen rumprobiert. Was ich nicht möchte, ist mit Plus ein 3D Fenster erzeugen (über Graphics).
Am geeignetesten scheint mir Canvas und dann Panel.
Hab den Code auszugsweise aus dem Tutorial:
Code: [AUSKLAPPEN]
;Fenster erstellen
Window = CreateWindow("Canvas und Panels",100,100,500,400,0,15)
;Canvas erstellen
can = CreateCanvas(0, 40, 150,150, Window)
;Die Grafikausgabe auf den Canvas einstellen
SetBuffer CanvasBuffer(can)
;Panel erstellen
panel = CreatePanel(180, 0, 100, 100, Window,1)
button = CreateButton("Hier wäre ein Bild", 0, 0, 100, 50, panel) ;button in unserem Panel erstellen
SetPanelImage panel, "C:\Dokumente und Einstellungen\data\test.bmp" ;Bild in das Panel zeichnen, wird getilet wenn das Bild zu klein ist

Nun will ich ja mehrere Bilder anzeigen.
Ich habe zwei Möglichkeiten probiert:
Timer stellen, in der Schleife dann timer abwarten, nächstes Bild anzeigen.
Code: [AUSKLAPPEN]
Repeat
WaitEvent()
SetPanelImage panel, "C:\Dokumente und Einstellungen\data\test2.bmp"
WaitTimer timer
SetPanelImage panel, "C:\Dokumente und Einstellungen\data\test3.bmp"

Wenn ich es so mache, funktioniert das Anzeigen, aber ich kann keine Buttons mehr klicken oder das Fenster schließen (Zeit reicht eben nicht).
Wenn ich es über delay laufen lasse, dann wird nur das letzte Bild angezeigt, das heißt die Schleife geht nicht wieder bei Repeat los! Dafür kann ich das Fenster wenigstens schließen.

Vielleicht findet ihr ja heraus, was ich falsch mache...
Embarassed Embarassed Embarassed

Vielen Dank im Voraus.
LG,
Sereyanne
  • Zuletzt bearbeitet von Sereyanne am Do, März 03, 2016 13:58, insgesamt 10-mal bearbeitet

blackgecko

BeitragDo, Dez 03, 2009 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist, dass das Programm bei Waittimer nur noch auf den Timer wartet und Buttons ignoriert. Timer-Schläge fragt man in so einem Fall am besten mit Event $4001 ab:

Code: [AUSKLAPPEN]
timer = createtimer(0.1) ; 0.1 Schläge pro Sekunde --> 1 Schlag alle 10 Sekunden
Repeat
  select waitevent()
    case $803
      End
    case $401 ;Was immer du machen willst, wenn ein Button geklickt wird
    case $4001 ;Timer Event
       ;Nächstes Bild anzeigen

  end select
Forever


So würde ich das machen.
Erstell dir ein Array mit den Bildern, die angezeigt werden sollen und erhöhe bei
Code: [AUSKLAPPEN]
;Nächstes Bild anzeigen

den Index.
So long and thanks for all the fish.
Fedora 17 | Windows 7 || BlitzPlus | BlitzMax
Rechtschreibflame GO!!! Deppenapostroph | SeidSeit | Deppenakzent | DassDas | Deppenleerzeichen | TodTot | enzigste.info - Ja, ich sammel die.

Midimaster

BeitragDo, Dez 03, 2009 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Du machst das Ganze zeitgesteuert und setzt die Zeit einfach auf 0, wenn eine Taste gedrückt ist. (Da ich kein BlitzBasic habe, weiß ich nicht genau, wie hier die Tastenabfrage geht, aber das kannst Du ja sicher selbst.)

netter Nebeneffekt: durch das laufende i% werden die Dateinamen verändert.

Code: [AUSKLAPPEN]

Repeat
    If Zeit<Millisecs()
         Zeit=Millsecs()+Timer
         i=i+1
         SetPanelImage panel, "C:\Dokumente und Einstellungen\data\test"+ i + ".bmp"   
    Endif
    If TastenDruck=1 then
       Zeit=0
    Endif
    TastenDruck=KeyHit(1)
Forever

Sereyanne

BeitragFr, Dez 04, 2009 8:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Uih, so schöne brauchbare Antworten! Shocked

Und der Threadstarter hat sich einfach aus dem Staub gemacht Twisted Evil

Nee, Spaß beiseite, ich war gestern nicht mehr on, sorry.

blackgecko hat Folgendes geschrieben:
Das Problem ist, dass das Programm bei Waittimer nur noch auf den Timer wartet und Buttons ignoriert.

Ja, genau die Erfahrung hab ich ja gestern gemacht.
Vielen Dank für deine Lösung, die werd ich mir gleich mal zu Gemüte führen.

Midimaster hat Folgendes geschrieben:
netter Nebeneffekt: durch das laufende i% werden die Dateinamen verändert.

Auch dafür herzlichen Dank, das kann ich gebrauchen.

Danke schön!!! Very Happy

LG,
Sereyanne

PS:
Kann ich eigentlich einfach nur einen Pfad angeben, und Blitz lädt dann alle Bilder, die da drin sind, ohne dass ich den Namen extra angeben muss? "bild1" und "bild2" waren nur Platzhalter, die Bilder haben ganz verschiedene Namen.
Danke im Voraus.

ozzi789

BeitragFr, Dez 04, 2009 9:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Dim pic$(500) ; einen Dim erstellen mit max 500 Einträgen

pfad$="C:\Users\idcsadm\Pictures\" ;Pfad festlegen must den ändern

Verz = ReadDir(pfad$) ;Verzeichniss einlesen
Repeat ;Schleife anfang
   Datei$ = NextFile$(Verz);Nächstes File im Verzeichniss
   If Datei$ = "" Then Exit ;Falls es keine Files mehr hat Schleife verlassen
   If FileType(pfad$ + Datei$) = 1 Then;Wenn es ein File und KEIN Ordner war
   i=i+1 ;Index erhöhen
   pic$(i)=pfad$ + Datei$ ;in Dim Schreiben
   End If

Forever
CloseDir Verz


For a=1 To i
   Print pic$(a)
Next


So nun kannst du alle Bilder durchgehen schön mit 1,2,3,4, usw
(bsp aus der Onlinehilfe angepasst)

Es wird NUR der Inhalt im Ordner pfad$ durchsucht, wenn du es rekursiv willst, musst du das noch einbauen (rekursiv= auch Ordner die tiefer in der Hirarchie verankert sind zmb Bilder\LOL Bilder\Cool Bilder\Cool\Super)


mfg
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Sereyanne

BeitragFr, Dez 04, 2009 18:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank!

Damit kann ich arbeiten. Hab erst ma was zu tun... Very Happy

LG,
Sereyanne

edit: @ozzi789: wie starte ich die schleife wieder von vorne? stell mich grad ziemlich blöd an... Embarassed

blackgecko

BeitragFr, Dez 04, 2009 19:02
Antworten mit Zitat
Benutzer-Profile anzeigen
@ozzi789:
Dein Code fängt aber bei Array-Stelle 1 an, die Bilder zu speichern, also beim 2. Array-Speicherplatz. Mach das besser so und fang bei Stelle 0 an:
Code: [AUSKLAPPEN]
i = 0
;...
   If FileType(pfad$ + Datei$) = 1 Then;Wenn es ein File und KEIN Ordner war
      pic$(i)=pfad$ + Datei$ ;in Dim Schreiben
      i=i+1 ;Index erhöhen
   End If
;...
For a=0 To i
   Print pic$(a)
Next



@Sereyanne: Was meinst du damit? Eine Schleife startet sich normalerweise selbst von vorne.
So long and thanks for all the fish.
Fedora 17 | Windows 7 || BlitzPlus | BlitzMax
Rechtschreibflame GO!!! Deppenapostroph | SeidSeit | Deppenakzent | DassDas | Deppenleerzeichen | TodTot | enzigste.info - Ja, ich sammel die.

ozzi789

BeitragSa, Dez 05, 2009 9:16
Antworten mit Zitat
Benutzer-Profile anzeigen
blackgecko
ja stimmt, hab ich verpennt


Sereyanne
Du willst einfach wieder das erste Bild ausgeben?
(hoffe hab dich richtig verstanden)

Beispiel
Code: [AUSKLAPPEN]

i=10
For a=0 To i
   Print a
   ;Zeichnen
   If a=i Then a=0
Next




mfg
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Sereyanne

BeitragMo, Dez 07, 2009 12:01
Antworten mit Zitat
Benutzer-Profile anzeigen
blackgecko hat Folgendes geschrieben:
Eine Schleife startet sich normalerweise selbst von vorne.

Hab ich auch gedacht... aber meinst du, ich würde dann fragen? Wink
Irgendwie ist nach dem letzten Bild aber Schluss, er fängt nicht wieder von vorne an.
Problem ist jetzt gelöst, vielen Dank!

ozzi789

BeitragMo, Dez 07, 2009 13:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie hast du es gelöst? Smile

mfg
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Sereyanne

BeitragDi, Dez 08, 2009 12:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Indem ich das Dim erneut ausgebe...
einfach a=0 tuts nämlich nicht, dann bleibt er trotzdem stehen.

Edit: Ich würde den Pfad gerne in eine txt-Datei abspeichern.
Kann es sein, dass der Befehl
Code: [AUSKLAPPEN]
pfad$="C:\Users\idcsadm\Pictures\"

unbedint die " vor und dahinter braucht?
Wenn ja, wie krieg ich die mit abgespeichert?
Ich kann ja nicht einfach
Code: [AUSKLAPPEN]
pfad$="""+bp$+"""

schreiben, weil das ja zuviele " sind....

DAK

BeitragDi, Dez 08, 2009 12:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Chr(34)
Gewinner der 6. und der 68. BlitzCodeCompo

Sereyanne

BeitragDi, Dez 08, 2009 12:53
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, das hab ich doch schon mal für irgendwas gebraucht...
wie konnte ich das nur vergessen Embarassed
Danke schön!

DAK

BeitragDi, Dez 08, 2009 12:57
Antworten mit Zitat
Benutzer-Profile anzeigen
gerne gerne, keine sache
Gewinner der 6. und der 68. BlitzCodeCompo

Sereyanne

BeitragDi, Dez 08, 2009 13:15
Antworten mit Zitat
Benutzer-Profile anzeigen
wie krieg ich das denn jetzt in den Pfad rein???
Code: [AUSKLAPPEN]
bpfad$=chr$(34)+bp$+chr$(34) ;Pfad festlegen

geht ja nun nicht....

außerdem: wie krieg ich das vernünftig hin, wenn das Bild größer ist als das Panel? Dann wird mir ja nur ein Ausschnitt angezeigt. Soll ich jetzt alle Bilder verkleinern, oder gibts da nich ne bessere Lösung?

Silver_Knee

BeitragDi, Dez 08, 2009 16:52
Antworten mit Zitat
Benutzer-Profile anzeigen
kannt n canvas nehmen und mit Resizeimage arbeiten.

und den pfad kannste natürlich so aufstellen. Chr ist ne ganz normale Funktion mit rückgabewert

Sereyanne

BeitragDi, Dez 08, 2009 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
alles klar, dann seh ich mir den canvas nochmal näher an. schade dass der resize nicht mit panel geht, jetzt muss ich alles umschreiben.

aber mit dem chr komm ich einfach nicht weiter.
Code: [AUSKLAPPEN]
Dim pic$(100) ; einen Dim erstellen mit max 100 Einträgen

If FileType ("pfad.txt")=0 Then ;ermittelt, ob eine bestimmte Datei existiert, falls nicht,
   Notify("Bitte Bilderpfad auswählen!",True)
   bp$=RequestDir$()
   If bp$="" Then End
   save=WriteFile("pfad.txt") ;erstellt eine Datei für einen Schreibzugriff
      WriteString(save,bp$) ;Dieser Dateibefehl speichert den Pfad in eine Datei
ElseIf FileType ("pfad.txt")=1 Then ;falls die Datei existiert
      save=ReadFile ("pfad.txt")
      bp$=ReadString(save)
EndIf

bpfad$=Chr(34)+""+bp$+""+Chr(34) ;Pfad festlegen wie klappt das richtig??

Verz = ReadDir(bpfad$) ;Verzeichnis einlesen


und in der hauptschleife
Code: [AUSKLAPPEN]
Case $4001 ;Timer Event
            ;Erstell dir ein Array mit den Bildern, die angezeigt werden sollen und erhöhe den Index
                ;Nächstes Bild anzeigen
               Datei$ = NextFile$(Verz);Nächstes File im Verzeichnis
                  If FileType(bpfad$ + Datei$) = 1 Then;Wenn es ein File und KEIN Ordner war
                  i=i+1 ;Index erhöhen
                  pic$(i)=bpfad$ + Datei$ ;in Dim Schreiben
                  For a=0 To i
                     SetPanelImage panel, pic$(a)
                  Next
                  i=0
               End If
                
         End Select

Vielleicht findet ja jemand den Fehler.... Crying or Very sad

Starwar

BeitragDi, Dez 08, 2009 18:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Beschreibe mal den Fehler genauer... Zeile und Fehlermeldung?
MFG

DAK

BeitragDi, Dez 08, 2009 18:12
Antworten mit Zitat
Benutzer-Profile anzeigen
wozu machst du [bpfad$=Chr(34)+""+bp$+""+Chr(34)]? mach doch lieber [bpfad$=Chr(34)+bp$+Chr(34)]
Gewinner der 6. und der 68. BlitzCodeCompo

Sereyanne

BeitragDi, Dez 08, 2009 18:19
Antworten mit Zitat
Benutzer-Profile anzeigen
DAK hat Folgendes geschrieben:
wozu machst du [bpfad$=Chr(34)+""+bp$+""+Chr(34)]? mach doch lieber [bpfad$=Chr(34)+bp$+Chr(34)]


Danke, genau diese Zeile ist mein Problem.
Warum ich das so mache? Weil ichs irgendwie nicht blicke und rumprobiert hab wien Doofer.
Das Dumme ist nur, dass mir das ganze jetzt abschmiert. "hat ein problem festgestellt blabla"....
Ich könnte kotzen....

also das roblem ist, dass in der txt-Datei
U C:\Dokumente und Einstellungen\DR\Eigene Dateien\CyberLink\PowerDVD\temp\proggen\data
drinsteht. Und ich anscheinend dasselbe in "" brauche, um damit arbeiten zu können. Also wie krieg ich die " davor und dahinter?

Gehe zu Seite 1, 2, 3, 4  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic BlitzPlus

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group