[Neue Frage ganz hinten] Bilder anzeigen wie Windows Diashow
Übersicht BlitzBasic BlitzPlusGehe zu Seite Zurück 1, 2, 3, 4
ozzi789 |
Di, Dez 22, 2009 14:58 Antworten mit Zitat |
|
---|---|---|
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 Grüsse Ozzi 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 |
Di, Dez 22, 2009 15:18 Antworten mit Zitat |
|
---|---|---|
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 |
Di, Dez 22, 2009 15:26 Antworten mit Zitat |
|
---|---|---|
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 |
Di, Dez 22, 2009 15:44 Antworten mit Zitat |
|
---|---|---|
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! 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 mfg |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
Sereyanne |
Di, Dez 22, 2009 16:08 Antworten mit Zitat |
|
---|---|---|
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 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 |
Di, Dez 22, 2009 16:20 Antworten mit Zitat |
|
---|---|---|
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 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 |
Di, Dez 22, 2009 16:23 Antworten mit Zitat |
|
---|---|---|
Hhhmmmm hab im gleichen Moment oben editiert als du gepostet hast... Problem steht oben erklärt, mit Lösung | ||
- Zuletzt bearbeitet von Sereyanne am Di, Dez 22, 2009 16:31, insgesamt 2-mal bearbeitet
ozzi789 |
Di, Dez 22, 2009 16:30 Antworten mit Zitat |
|
---|---|---|
Ah super
tschuldige war wohl "brain afk" mfg |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
Sereyanne |
Di, Dez 22, 2009 16:32 Antworten mit Zitat |
|
---|---|---|
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.... 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 |
Di, Dez 22, 2009 16:50 Antworten mit Zitat |
|
---|---|---|
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 mfg |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
Sereyanne |
Di, Dez 22, 2009 16:55 Antworten mit Zitat |
|
---|---|---|
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 |
Do, März 03, 2016 13:57 Antworten mit Zitat |
|
---|---|---|
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
Übersicht BlitzBasic BlitzPlus
Powered by phpBB © 2001 - 2006, phpBB Group