[Neue Frage ganz hinten] Bilder anzeigen wie Windows Diashow

Übersicht BlitzBasic BlitzPlus

Gehe zu Seite Zurück  1, 2, 3, 4

Neue Antwort erstellen

ozzi789

BeitragDi, Dez 22, 2009 14:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Sereyanne

Wahrscheinlich liegt es drann das mein Code auch nicht Bilder lädt!
Könnte sein das in deinem Bilder Ordner auch andere Dateien drinne sind?

Am besten du baust noch ne Abfrage ein, also im Sinne von
if right(pfad$,3)="jpg"
so bist zu vor anderen nicht Bild Dateien sicher, aber nicht vor korrupten Bilder.. aber das sollte es nicht geben Wink

Grüsse Ozzi Smile


Edit:
habs getestet, wenn du zmb ne Textdatei als Bild lädst bekommt man den Fehler beim Zeichnen, wird also so was sein!
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Midimaster

BeitragDi, Dez 22, 2009 15:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich vermute eher, dass das Programm versucht das 5.Bild anzuzeigen. Das gibt es ja nicht und dann kommt der Crash.

Wie sieht denn momentan die Routine aus die die einzelnen Bilder nacheinander aufruft und wie sieht die Stelle aus, wo es wieder zum Anfang zurückgehen soll?

Sereyanne

BeitragDi, Dez 22, 2009 15:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Mensch ich hab doch nichts verändert. Es sind 4 Bilder im Ordner und sonst nichts!
Er beklagt sich, weil er das fünfte laden will, was nicht da ist.
Es geht um den Code:
ozzi789 hat Folgendes geschrieben:
So habs noch etwas mehr auskommentiert, hoffe es ist verständlich, sonst zögere nicht zu fragen!

Code: [AUSKLAPPEN]
gfxhoehe=ClientHeight(Desktop())
gfxbreite=ClientWidth(Desktop())
;clientheight und -width ermittelt die Bildschirmauflösung

Global trayWnd=CreateWindow("DiaShow", gfxbreite-200,gfxhoehe-230,200,200,Desktop(),3)
canvas=CreateCanvas(0,0,200,140,trayWnd)

;Einen Dim erstellen mit max 100 Einträgen
Dim pic$(100)

;Pfad festlegen musst den ändern
bpfad$="C:\Users\ozzi\Pictures\"
;Verzeichnis einlesen, sodass wir nacher mit nextfile die Datien/Verzeichnisse ausgeben können die dort drinn sind
Verz = ReadDir(bpfad$)

DebugLog "LESE FILES!"

Repeat ;schleifen anfang
   ;So jetzt lesen wir die Daten im Ordner aus
   Datei$ = NextFile$(Verz)    If Datei$ = "" Then Exit ;Falls es keine Files mehr hat (also Netxfile() nichts zurückgab
   ;sind wir also fertig -> schleife verlassen mit exit
   If FileType(bpfad$+ Datei$) = 1 Then ;Filetype liefert 0/1/2 zurück, wenn es 1 ist war es eine Datei (und kein Ordner)
      i = i + 1 ;Index erhöhen, also den ersten Pfad den wir eingelesen haben können wir mit pic$(1) ausgeben
      pic$(i)=bpfad$+Datei$ ;Pfad also C:\Users\blabla\ und die Variable Datei$ (die wir ausgelesen haben, also zmb lol.jpg) in den Dim speichern
      DebugLog pic$(i) ;ausgeben zur kontrolle (dort wird dann was wie C:\Users\blabla\lol.jpg sthen
   End If
Forever ;für immer wiederholen -> oder per exit, siehe oben
CloseDir Verz ;da wir alles ausgelesen haben, können wir es jetzt wieder schön schliessen


SetBuffer CanvasBuffer (canvas)

timer = CreateTimer(1) ; war auf 0.1 < 0.1 Schläge pro Sekunde --> 1 Schlag alle 10 Sekunden
max=i ;Der Wert von I ist gleich wieviele Bilder wir eingelesen haben (siehe oben) den speichern Wir jetzt in Max nur der Übersichthalber


Repeat
Cls ;Clearscreen, weil wir sonst die Bilder übereinander Zeichnen

WaitEvent

Select EventID()
Case $803 ;WindowClose
End

Case $4001 ;Timer Event

;anmerkung, wir haben jetzt ja den Dim namens Pic$ welcher die Pfade zu den Bildern enthält, nun müssen wir ja alle durchgehen, also den eintrag 1 von Pic, den eintrag 2 usw
;das übernimmt unsere Variable Counter, welche sich um eins erhöht bis er grösser wird als max (also mehr als alle Bilder die wir reingeladen haben
;nun würden wir eine Fehlermeldung bekommen, da pic$(eine zahl zu gross) leer wäre und bei Loadimage einen Mist laden, und spätestens bei Drawimage nen Fehler werfen würde

counter=counter+1 ;Unseren counter erhöhen,
   If counter>max Then counter=0 ;falls unser counter wert grösser ist als die anzahl bilder die wir geladen haben, wieder auf null setzen (fängt von vorne an(also beim ersten Bild)
   If temp<>0 Then FreeImage (temp)  ;Weil wir alle Bilder unter dem Namen temp speichern, schauen wir ob wir schon ein Bild geladen haben, wenn dem so ist, löschen wir es und laden dann das nächste
      temp=LoadImage (pic$(counter)) ;Pfad aus dem Dim verwenden, nämlich den Eintrag mit dem Wert counter
      DebugLog "HABE GELADET:" ;Details ausgeben
      DebugLog pic$(counter)
      DebugLog temp
      DrawImage temp,0,0 ;So jetzt können wir zeichnen

End Select


FlipCanvas canvas
Forever

ozzi789

BeitragDi, Dez 22, 2009 15:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Jep habs gesehne, ein Fehler meiner Seits, habe es nie zu ende laufen lassen (habe viele Bilder)

Kümmer mich drum, halt die Ohren steif! Smile

Edit:
Problem gefunden, ich fange an den Dim zu füllen beim ersten Eintrag, beim Bilder ansprechen setze ich counter jedoch auf 0, und im eintrag 0 ist nix! (dank dem Debuglog rausgefunden)

Lösung:
Code: [AUSKLAPPEN]
   If FileType(bpfad$+ Datei$) = 1 Then ;Filetype liefert 0/1/2 zurück, wenn es 1 ist war es eine Datei (und kein Ordner)
      pic$(i)=bpfad$+Datei$ ;Pfad also C:\Users\blabla\ und die Variable Datei$ (die wir ausgelesen haben, also zmb lol.jpg) in den Dim speichern
      i = i + 1 ;Index erhöhen, also den ersten Pfad den wir eingelesen haben können wir mit pic$(1) ausgeben
     DebugLog pic$(i) ;ausgeben zur kontrolle (dort wird dann was wie C:\Users\blabla\lol.jpg sthen
   End If


Das i=i+1 nach dem Dim befüllen einfügen, so wird ab dem nullten Eintrag eingeschrieben und nicht dem ersten Wink

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

Sereyanne

BeitragDi, Dez 22, 2009 16:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Und jetzt klappts bei dir?
Komisch, bei mir nicht....

aber du musst dann auch den Debuglog nach oben ziehen:
Code: [AUSKLAPPEN]
 If FileType(bpfad$+ Datei$) = 1 Then ;Filetype liefert 0/1/2 zurück, wenn es 1 ist war es eine Datei (und kein Ordner)
      pic$(i)=bpfad$+Datei$ ;Pfad also C:\Users\blabla\ und die Variable Datei$ (die wir ausgelesen haben, also zmb lol.jpg) in den Dim speichern
      DebugLog pic$(i) ;ausgeben zur kontrolle (dort wird dann was wie C:\Users\blabla\lol.jpg sthen
      i = i + 1 ;Index erhöhen, also den ersten Pfad den wir eingelesen haben können wir mit pic$(1) ausgeben
End If


Aber das Invalid Image handle kommt immer noch.

Edit: Ich glaub ich habs.
Code: [AUSKLAPPEN]
If counter>max Then counter=0

muss heißen:
Code: [AUSKLAPPEN]
If counter=max Then counter=0

Cool ich darf mal auch mal einen Fehler finden Shocked
Der Counter fängt bei 0 an zu zählen, deswegen ist er nach 4 Bildern auf 3, und kann 4 nicht ausgeben, weil kein fünftes Bild da ist.

Wobei noch schöner ist es natürlich, ein Counter=0 vor der zweiten Repeat-Schleife und dann den Counter am Ende der Schleife erhöhen, damit er auch beim ersten Bild anfängt (Nummer 0).
  • Zuletzt bearbeitet von Sereyanne am Di, Dez 22, 2009 16:28, insgesamt 2-mal bearbeitet

ozzi789

BeitragDi, Dez 22, 2009 16:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei mir klappts, nachdem ich ein GIF und ein TIF gelöscht hat, diese konnte ich nicht laden!

Achja und das mit dem Debuglog stimmt Wink


Kannst mal sagen was im Debuglog als letzes steht?
Wenn ein Pfad steht doch kein Handle (also der Int, zmb 495229) ist es einfach ein Bild das nicht geladen werden konnte, sei es das es kein Bild war, oder ein nicht unterstütztes Bild Format, dem kann man abhilfe schaffen in dem wir nach dem Laden prüfen

temp=LoadImage (pic$(counter)) ;Pfad aus dem Dim verwenden, nämlich den Eintrag mit dem Wert
if temp<>0
drawimage
else
debuglog "ERROR"
endif


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

Sereyanne

BeitragDi, Dez 22, 2009 16:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hhhmmmm hab im gleichen Moment oben editiert als du gepostet hast... Problem steht oben erklärt, mit Lösung Wink
  • Zuletzt bearbeitet von Sereyanne am Di, Dez 22, 2009 16:31, insgesamt 2-mal bearbeitet

ozzi789

BeitragDi, Dez 22, 2009 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah super Very Happy
tschuldige war wohl "brain afk"

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

Sereyanne

BeitragDi, Dez 22, 2009 16:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Macht ja nix. Mein brain war auch afk, in der letzten Zeit, mit dem ganzen Ärger hier zuhause.

So, jetzt klappt das natürlich auch mit dem Resizen... Vielen Dank!

Heute nacht träume ich von Debuglogs.... Laughing

Eine Frage noch zum Verständnis: Wenn ich mit der Maus über dem Fenster herum fahre, bleibt es schwarz. Hat wohl was mit dem BackBuffer und Windows zu tun?

ozzi789

BeitragDi, Dez 22, 2009 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Das CLS vor das Drawimage setzen!
Dann funkts, sonst wird beim Mouseover ein Event ausgelöst, das führt dazu das es ein CLS gibt wenn wir keines wollen Wink

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

Sereyanne

BeitragDi, Dez 22, 2009 16:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Na prima!

Recht haste, Danke!!

Damit wäre dieses Problem wohl gelöst.

Danke @ all!

Ach ja, ich habs jetzt im Ganzen wieder zusammen gefriemelt. Das mit den Decls und Dlls läuft einwandfrei.

Nur falls das jemand von euch brauchen sollte:

Code: [AUSKLAPPEN]
gfxhoehe=ClientHeight(Desktop())
gfxbreite=ClientWidth(Desktop())
;clientheight und -width ermittelt die Bildschirmauflösung

Local cAppDir$=CurrentDir$() ;für Icon

Global cIconStart$=cAppDir$+"usergrp.ico"

;create a window
Global trayWnd=CreateWindow("DiaShow", gfxbreite-200,gfxhoehe-230,200,200,Desktop(),3)
;Werte abziehen, um die Bildschirmecke zu treffen

hWnd = GetActiveWindow()
USER32_SetWindowPos(hWnd,-1,0,0,0,0,$1+$2) ;Always on top

hide=CreateButton("hide",80,145,40,20,trayWnd)

canvas=CreateCanvas(0,0,200,140,trayWnd)

;Einen Dim erstellen mit max 500 Einträgen
Dim pic$(500)

;Pfad festlegen musst den ändern
bpfad$="C:\Dokumente und Einstellungen\DR\Desktop\data\"
;Verzeichnis einlesen, sodass wir nacher mit nextfile die Dateien/Verzeichnisse ausgeben können die
;dort drin sind
Verz = ReadDir(bpfad$)

;DebugLog "LESE FILES!"

; show the initial icon
ggTrayCreate(QueryObject(trayWnd,1))
   
; set the icon
ggTraySetIconFromFile(cIconStart$)
   
; show the icon with the updated text
ggTrayShowIcon()

Repeat ;schleifen anfang
   ;So jetzt lesen wir die Daten im Ordner aus
   Datei$ = NextFile$(Verz)   
   If Datei$ = "" Then Exit ;Falls es keine Files mehr hat (also Netxfile() nichts zurückgab
   ;sind wir also fertig -> schleife verlassen mit exit
   If FileType(bpfad$+ Datei$) = 1 Then ;Filetype liefert 0/1/2 zurück, wenn es 1 ist war es eine Datei
                              ;(und kein Ordner)
      pic$(i)=bpfad$+Datei$ ;Pfad also C:\Users\blabla\ und die Variable Datei$ (die wir ausgelesen
                     ;haben, also zmb lol.jpg) in den Dim speichern
   ;DebugLog pic$(i) ;ausgeben zur kontrolle (dort wird dann was wie C:\Users\blabla\lol.jpg sthen
     i=i+1 ;Index erhöhen, also den ersten Pfad den wir eingelesen haben können wir mit pic$(1)
            ;ausgeben
   ;DebugLog "i="+i
   ;Stop
    End If
Forever ;für immer wiederholen -> oder per exit, siehe oben
CloseDir Verz ;da wir alles ausgelesen haben, können wir es jetzt wieder schön schließen

SetBuffer CanvasBuffer (canvas)

timer = CreateTimer(1) ; war auf 0.1 < 0.1 Schläge pro Sekunde --> 1 Schlag alle 10 Sekunden
max=i ;Der Wert von I ist gleich wieviele Bilder wir eingelesen haben (siehe oben) den
   ;speichern wir jetzt in Max nur der Übersichthalber
;DebugLog "i="+i
;DebugLog "max="+max
counter=0
halt=0 ;soll anhalten wenn im hide

Repeat
   WaitEvent

      Select EventID()
      Case $803 ;WindowClose
         End
      Case $401: ;GadgetAction, Eingabe   
         If EventSource() = hide Then
            HideGadget trayWnd
            halt=1
         EndIf
      Case $4001 ;Timer Event

;anmerkung, wir haben jetzt ja den Dim namens Pic$ welcher die Pfade zu den Bildern enthält, nun
;müssen wir ja alle durchgehen, also den eintrag 1 von Pic, den eintrag 2 usw
;das übernimmt unsere Variable Counter, welche sich um eins erhöht bis er grösser wird als max
;(also mehr als alle Bilder die wir reingeladen haben)
;nun würden wir eine Fehlermeldung bekommen, da pic$(eine zahl zu groß) leer wäre und bei Loadimage
;einen Mist laden, und spätestens bei DrawImage nen Fehler werfen würde
      If halt=0 ;nur anzeigen wenn nicht im hide
         If counter=max Then counter=0 ;falls unser counter wert größer ist als die anzahl bilder die wir
         ;geladen haben, wieder auf Null setzen (fängt von vorne an(also beim ersten Bild)
         If temp<>0 Then FreeImage (temp)  ;Weil wir alle Bilder unter dem Namen temp speichern, schauen
         ;wir ob wir schon ein Bild geladen haben, wenn dem so ist, löschen wir es und laden dann das nächste
         temp=LoadImage (pic$(counter)) ;Pfad aus dem Dim verwenden, nämlich den Eintrag mit dem Wert counter
         ;DebugLog "HABE GELADEN:" ;Details ausgeben
         ;DebugLog pic$(counter)
         ;DebugLog "temp="+temp
         ;DebugLog "i="+i
         ;DebugLog "max="+max
         ;DebugLog "counter="+counter
         Cls ;Clearscreen, weil wir sonst die Bilder übereinander Zeichnen
         ResizeImage temp,200,140
         DrawImage temp,0,0 ;So jetzt können wir zeichnen
         counter=counter+1 ;Unseren counter erhöhen,
      EndIf
      End Select

FlipCanvas canvas

; check for a left doubleclick
If ggTrayPeekLeftDblClick()>0
   ; check the tooltip to see what status we are currently at
   If Instr(ggTrayGetToolTip(),"Stopped")>0
      ; set the icon
      ggTraySetIconFromFile(cIconStart$)
                        
   Else
      ; set the icon
      ggTraySetIconFromFile(cIconStop$)
      halt=0         
   EndIf
         
   ; TODO: show your menu here at the event mousex,mousey
   ShowGadget trayWnd

   ; clear out the events
   ggTrayClearEvents()
EndIf
   
; check for a right click
If  ggTrayPeekRightClick()>0
   Exit
EndIf

Forever

; clean up the tray
   ggTrayDestroy()   

; free the invisible tray window
FreeGadget trayWnd   

End

Sereyanne

BeitragDo, März 03, 2016 13:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich muss meinen Beitrag mal wieder ausbuddeln, hoffe das ist in Ordnung.

Hab jetzt seit dem Umstieg auf Win 7 nicht mehr viel programmiert und stelle nun fest, dass das Programm sofort abstürzt mit der typischen Fehlermeldung "DiaShow.exe funktioniert nicht mehr" bzw wenn ich aus Plus direkt starte, dann funktioniert eben dieses nicht mehr.

Die dlls hab ich ins Userlib Verzeichnis kopiert. War da noch mehr was ich kopieren muss?

Irgendwelche Ideen?

Gehe zu Seite Zurück  1, 2, 3, 4

Neue Antwort erstellen


Übersicht BlitzBasic BlitzPlus

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group