[Neue Frage ganz hinten] Bilder anzeigen wie Windows Diashow

Übersicht BlitzBasic BlitzPlus

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

Neue Antwort erstellen

Silver_Knee

BeitragDi, Dez 08, 2009 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich hoffe mal du hast debug an. Dann kriegste wahrscheinlich bessere Fehlermeldungen.

Chr(34) gibt ein " als Zeichenkette zurück. Das klebste dann wie

a$="Hallo "
b$="Welt"

Print a+b

zusammen sodass Zitat:
Hallo Welt
da steht.

Wenn du jetzt

a$="C:\Dokumente und Einstellungen\"

Print Chr(34)+a+Chr(34)

schreibst, steht Zitat:
"C:\Dokumente und Einstellungen\"
auf dem bildscherm

Sereyanne

BeitragDi, Dez 08, 2009 18:50
Antworten mit Zitat
Benutzer-Profile anzeigen
hm, das hatte ich mir nach deinem letzten Post schon gedacht.
Vielen Dank für die ausführliche Erklärung, jetzt weiß ich, dass es geht.
Bloß schmiert mir wie gesagt alles ab... weiß nicht was ich dagegen tun soll. mal auf nem Rechner mit mehr ram probieren...

Midimaster

BeitragDi, Dez 08, 2009 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
am besten den ganzen Code hier wieder reinstellen....

Ist bestimmt nur noch ein Flüchtigkeitsfehler, an zuwenig RAM glaub ich nicht. Ist ja immer nur 1 Bild im Speicher und die Pfad-Datei braucht so gut wie gar nichts.

mpmxyz

BeitragDi, Dez 08, 2009 19:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du etwas in eine Datei schreiben möchtest, dann brauchst du keine Anführungszeichen für den Pfad.

Eine Sache, die du unbedingt kennen solltest:
Nutze den Debugger, wenn das Programm aus unbekannten Gründen abstürzt! (IDEal: F9 drücken)

Da du in dem Dateipfad Anführungszeichen stehen hast oder dieser zumindest falsch angegeben wird, vermute ich, dass der Debugger beim ersten "Read..."/"Write..."-Befehl "Stream does not exist!" meldet und dir die Stelle fehlerhafte markiert. (Da muss aber nicht der eigentliche, logische Fehler existieren!)

Und da ich die Vermutung habe, dass es da ein Verständnisproblem gibt, gibt es noch eine Information zum Schluss:
Die Anführungszeichen im Code sagen dem Compiler nur, dass das zwischen jeweils zwei Anführungszeichen, kein "richtiger" Code sondern eine Zeichenkette bzw. ein String ist.

mfG
mpmxyz
P.S.: Was für die Dateibefehle gilt, gilt entsprechend auch für die Ordnerbefehle.
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Silver_Knee

BeitragDi, Dez 08, 2009 23:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Das stimmt: Die File und Dir Befehle von Blitz erwarten kein Anführungszeichen und auch beim Abspeichern mittels WriteLine ist keins von nöten. Das Anführungszeichen im String wird soweit ich weiß eigentlich nur von ExecFile zum Abtrennen von Befehlen und umgekehrt von Commandline beim Öffnen mit Befehl angegeben.

Sereyanne

BeitragMi, Dez 09, 2009 14:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Midimaster hat Folgendes geschrieben:
am besten den ganzen Code hier wieder reinstellen....

Mein Code steht auf der ersten Seite recht weit unten.

Code: [AUSKLAPPEN]
Wenn du etwas in eine Datei schreiben möchtest, dann brauchst du keine Anführungszeichen für den Pfad.

OK, dann liegt es wohl doch nicht daran.

Code: [AUSKLAPPEN]
Eine Sache, die du unbedingt kennen solltest:
Nutze den Debugger, wenn das Programm aus unbekannten Gründen abstürzt!

Mein Debugger ist an, aber der sagt nix.
Das ist der Fehler:
http://www.bilder-hochladen.ne...1-jpg.html
Mehr hat nicht aufs Bild gepasst.
Wie man aber sieht, ist der Debugger leer.

Ich hab die " jetzt weggemacht, das Problem bleibt bestehen.

D2006

Administrator

BeitragMi, Dez 09, 2009 14:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Eben dieser Code ist ziemlich seltsam.

Lade doch vor der Hauptschleife alle Bildpfade in das Array und mach beim Timertick einfach nur das SetPanelImage. Jetzt lädst du bei jedem ticken eine neue Datei aus dem Verzeichnis öhm und dann machst du zwei Bildwechsel. Wobei beim ersten Mal ein Pfad geladen wird, der mutmaßlich leer ist (zumindest wird er in DEM code nich belegt) und beim zweiten Mal der aktuelle Pfad.

Übrigens solltest du nach dem Auslesen oder Erstellen der pfad.txt das Dateihandle mit CloseFile freigeben.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Sereyanne

BeitragMi, Dez 09, 2009 15:57
Antworten mit Zitat
Benutzer-Profile anzeigen
D2006 hat Folgendes geschrieben:
Lade doch vor der Hauptschleife alle Bildpfade in das Array

Würd ich ja gern. Ich kriegs einfach nicht hin. Dabei hat mir ozzi789 doch so einen schönen Anfang geliefert. Crying or Very sad
Code: [AUSKLAPPEN]
Dim pic$(500) ; einen Dim erstellen mit max 500 Einträgen

pfad$="C:\Dokumente und Einstellungen\DR\Desktop\data\" ;Pfad festlegen must den ändern

Verz = ReadDir(pfad$) ;Verzeichniss einlesen

Datei$ = NextFile$(Verz);Nächstes File im Verzeichniss
   
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

CloseDir Verz

Egal, was ich mit Loadimage und DrawImage mache, ich krieg immer nur n Invalid Image Handle.
Wie arbeite ich damit, wie lade ich die Bilder mit unbekanntem Namen im dim und lese sie hinterher wieder aus?

Zitat:
Übrigens solltest du nach dem Auslesen oder Erstellen der pfad.txt das Dateihandle mit CloseFile freigeben.

Ja, das habe/hatte ich ja. War nur im reinkopierten Code nicht mehr drin, sorry.

D2006

Administrator

BeitragMi, Dez 09, 2009 16:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei dir weiß man nie, ob die hier eingebrachten Codes nur Auszüge oder komplett sind. Bei dem jetztigen zum Bespiel fehlt jedwede Schleife, wodurch nur ein einziges Bild eingelesen wird. Mal eben trocken dahinprogrammiert:

Code: [AUSKLAPPEN]
Dim bilder$(100)
pfad$ = "C:\Bilder\"
dir% = ReadDir(pfad$)
i% = 0
Repeat
    datei$ = NextFile(dir%)
    typ$ = Lower$(Right$(datei$,3))
    If FileType(pfad$+datei$)=1 And (typ$="jpg" Or typ$="png" Or typ$="bmp") Then
        bilder(i) = pfad$+datei$
        i% = i% + 1 
    EndIf
Until file$ = "" Or i%>100
CloseDir dir%


Das ist mit Prüfung, ob die Datei tatsächlich Bilder sind. Du hast nämlich einfach jede Datei genommen, was das Invalid Image Handle erklären könnte. Vorrausgesetzt in dem Verzeichnis waren auch andere Dateien als Bilder.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Sereyanne

BeitragMi, Dez 09, 2009 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für deine Lösung. Ich hab jetzt nur keinen Schimmer, wie ich das verarbeite.

D2006 hat Folgendes geschrieben:
Das ist mit Prüfung, ob die Datei tatsächlich Bilder sind. Du hast nämlich einfach jede Datei genommen, was das Invalid Image Handle erklären könnte. Vorrausgesetzt in dem Verzeichnis waren auch andere Dateien als Bilder.

Nein, in dem Verzeichnis sind nur 4 Bilder, sonst nichts.

Okay, habt mich überredet. Ich habe jetzt neu angefangen und den ganzen Firlefanz, der eh nicht funzt, rausgenommen.
Kompletter Code:
Code: [AUSKLAPPEN]
win=CreateWindow("test",200,200,200,200,Desktop(),3)
canvas=CreateCanvas(0,0,200,140,win)

bild=LoadImage("C:\Dokumente und Einstellungen\DR\Desktop\data\bfb.bmp")

SetBuffer CanvasBuffer (canvas)

timer = CreateTimer(1) ; zum Testen kürzer eingestellt
 
i=0

Repeat
   WaitEvent()
   Select EventID()
      Case $803
         End
      Case $4001 ;Timer Event
      DrawImage bild,0,0
   End Select
FlipCanvas canvas
Forever

So funzt es ja einwandfrei. Jetzt muss ich "nur" das Dim da reinstellen, alle Bilder laden und da rein speichern und dann nach dem Timer wieder ausgeben.
Ich weiß bloß nicht, wie ich das anstellen soll.... Embarassed

Ich hab auch noch ein zweites Problem. Grundstruktur ist die gleiche, aber ich stell euch gern den ganzen Code rein (wenn es euch dann besser gefällt Very Happy )
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)

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

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

panel=CreatePanel(0,0,200,140,trayWnd)

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

;hier kommt später das Speichern des Pfades rein

bpfad$="C:\Dokumente und Einstellungen\DR\Desktop\data\" ;Pfad festlegen must den ändern

Verz = ReadDir(bpfad$) ;Verzeichnis einlesen

If FileType(cIconStart)<>1
   Notify("you must set the icon path",True)
Else
   ; show the initial icon
   ggTrayCreate(QueryObject(trayWnd,1))
   
   ; set the icon
   ggTraySetIconFromFile(cIconStart$)
   
   ; show the icon with the updated text
   ggTrayShowIcon()
   
   timer = CreateTimer(1) ; zum Testen schnell eingestellt
   i=0
   
   halt=0 ;soll anhalten wenn im hide

   ; main loop to handle events
   Repeat
   
      WaitEvent(100)
      ;die Klammer:Zeit in Millisekunden, für die ein Programm maximal angehalten werden soll.
      ;Standard ist -1 (=unbegrenzt), da ich die Klammern leer lasse, wartet Blitz so lange, bis irgendwas geschieht
      ;hier auf 100, damit es auch ohne Ereignis weitergeht

         Select EventID() 
            Case $803 ;WindowClose
               End
            Case $401: ;GadgetAction, Eingabe   
               If EventSource() = hide Then
                  HideGadget trayWnd
                  halt=1
               EndIf
            Case $4001 ;Timer Event
            ;Erstell dir ein Array mit den Bildern, die angezeigt werden sollen und erhöhe den Index
                ;Nächstes Bild anzeigen
               If halt=0 ;nur anzeigen wenn nicht im hide
                  Datei$ = NextFile$(Verz);Nächstes File im Verzeichnis
                     If Datei$ = "" Then ;Falls es keine Files mehr hat, von vorne
                     Verz = ReadDir(bpfad$) ;Verzeichnis einlesen
                     i=i+1
                     pic$(i)=bpfad$ + Datei$ ;in Dim Schreiben
                     For a=0 To i
                        SetPanelImage panel, pic$(a)
                     Next
                     i=0
                  EndIf
                     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
                  EndIf
                 EndIf
         End Select

      ; 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
   
   CloseDir Verz
   
   ; clean up the tray
   ggTrayDestroy()   
EndIf

; free the invisible tray window
FreeGadget trayWnd   

Funktioniert einwandfrei. Ich versuche nun, den Pfad in einer Datei abzuspeichern, damit man ihn leichter ändern kann:
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
      WriteLine 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$=ReadLine$(save)
EndIf

bpfad$=bp$ ;Pfad festlegen musst den ändern
CloseFile(save)

Verz = ReadDir(bpfad$) ;Verzeichnis einlesen

Das ist jetzt nur ein Auszug, der, wenn man ihn im oberen Code an der gekennzeichneten Stelle einfügt, leider nicht funktioniert.
Ich kann den Ordner auswählen, er wir auch im pfad.txt abgespeichert, aber es werden einfach keine Bilder angezeigt.
Woran kann das liegen?
Vielen Dank schon mal.
Würde mich echt freuen, wenn ichs mit eurer Hilfe noch hinkriegen würde!

mpmxyz

BeitragMi, Dez 09, 2009 21:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Da der Debugger nichts sagt, habe ich das Gefühl, dass zwischen den ganzen "ggTray"-Befehlen der Fehler steckt.
Du solltest mal alle Stellen, an denen die aufgerufen werden, auskommentieren, wenn diese ggTray-Funktionen nicht zu wichtig sind.
Ansonsten solltest du mal die Stelle des Absturzes mit Hilfe der Befehle Stop/Print etc. ermitteln.

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Nicdel

BeitragMi, Dez 09, 2009 22:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, ggTray kann zu Fehlern führen. Ich hatte mal das selbe Problem, da hat sich ggTray mit einer anderen DLL nicht vertragen und hat zum Absturz des Programmes geführt...
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Midimaster

BeitragDo, Dez 10, 2009 3:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Tipp:
Zerlege Deinen Code in mehrere abgeschlossene Funktionen, die immer nur 1 Aktion (z.b das Einlesen der vorhandenen Bilder, z.b. das Festlegen des Quell-Ordners, z.B. die Anzeige der Bilder) beinhalten. Sonst wirst Du später nie mehr blicken, was schon funktioniert und was nicht. Es ist sehr hilfreich, wenn man weiss auf welche der Funktionen man sich bereits 100% verlassen kann.

Du kannst so auch einzelne Funktionen auf Herz und Nieren testen, bevor Du sie mit anderen Funktionen zusammenbringst und sie dort zum Absturz führen. Füge immer ein DEBUGLOG kurz vor dem Ende der Funktion ein, damit Du im Debugger sehen kannst, ob das Ergebnis erwartungsgemäß war.

Du erstellt die einzelnen Funktionen zunächst mit "gefaketen" Werten, damit Sie erst einmal "funktionieren". Ich zeig Dir das mal am Beispiel Deiner Bilderpfad-Geschichte:

zunächst nur einige fakes:
Code: [AUSKLAPPEN]

Dim Pic$(99), DefaultBilderPfad$

;main:
graphics 800,600
DirectoryEinlesen
Repeat
   BilderAufsPanel
Forever
end

Function DirectoryEinlesen()
       Pic(1)="Hundi.png"
end function


Function BilderPfad$()
     DefaultBilderPfad= "C:\test\Bilder\"
     Return DefaultBilderPfad
End function


Function BilderAufsPanel()
    Local Nummer%
    Nummer=1
    DEBUGLOG "Versuche " + BilderPfad + Pic(Nummer) + " aufs Panel zu bringen"
    SetPanelImage panel, BilderPfad + Pic(Nummer)
End function


Damit kannst Du jetzt nach Herzenslust testen. z.B. in der Hauptroutine mit..

DEBUGLOG " so ist der Pfad von bild 1: " + BilderPfad + Pic(1)

..prüfen, ob der Dateinamen schlüssig ist. Oder bereits ein erstes Bild anzeigen lassen.


In einem zweiten Schritt verfeinerst Du immer nur 1 Routine und testet sie gleich auf Herz und Nieren. Die DirectoryEinlesen wir auf alle Files eines Ordners erweitert:

Code: [AUSKLAPPEN]

Function DirectoryEinlesen()
    DEBUGLOG  "Function Directory einlesen aus diesem Pfad: " + BilderPfad()
    local Verzeichnis, Datei$, i%
    Verzeichnis = ReadDir( BilderPfad() )
    Repeat
        Datei = NextFile( Verzeichnis )
        i=i+1
        Pic(i)=Datei
        DEBUGLOG  "nehme in die picsliste auf : " + Pic(i)
    Until Datei=""
    CloseDir Verzeichnis
    DEBUGLOG  "Anzahl gefundene Dateien: " + i
end function


der Test dazu wäre ein...

For i=1 to 99
DEBUGLOG Pic(i)
Next i

... in der Hauptschleife.

Dann gibt Dir jemand den Tipp, Du sollst mit "FileType" bei der Erstellung der Liste arbeiten und Du baust es ein und prüfst ob die Pic()-Liste nur noch Dateien enthält.

Code: [AUSKLAPPEN]

Function DirectoryEinlesen()
    local Verzeichnis, Datei$, i%
    Verzeichnis = ReadDir( BilderPfad() )
    Repeat
        Datei = NextFile( Verzeichnis )
        If FileTyp(BilderPfad() + Datei)=1 then
             i=i+1
             Pic(i)=Datei
        Else
            DEBUGLOG " Diese Datei wurde nicht aufgenommen: " + Datei
        Endif
    Until Datei=""
    CloseDir Verzeichnis
end function



jetzt willst Du alle Bilder der Reihe nach sehen, das machst Du in der BilderAufsPanel

Code: [AUSKLAPPEN]

Function BilderAufsPanel()
    Local Nummer%
    Nummer=0
    Repeat
        Nummer=Nummer+1
        If Pic(Nummer)="" Then Exit
        DEBUGLOG "Versuche " + BilderPfad + Pic(Nummer) + " aufs Panel zu bringen"
        SetPanelImage panel, BilderPfad + Pic(Nummer)
   Forever
End function


So, nun soll der Bilderpfad flexibler werden:

Code: [AUSKLAPPEN]

Function BilderPfad$()
    If DefaultBilderPfad= "" then
       DEBUGLOG "BilderPfad war leer"
        DefaultBilderPfad=RequestDir()
        DEBUGLOG "BilderPfad ist jetzt: " + DefaultBilderPfad
    Endif
    Return DefaultBilderPfad
End function


Und noch was wichtiges:

Lass den Schnickschack erst mal raus aus deinem Programm, bis die Kern-Routinen laufen. Einfache Buttons, keine Icons, keine unnötigen Events, Gadgets, Tooltipps, etc. -> zu viele zusätzliche Fehlerquellen.

Sereyanne

BeitragDo, Dez 10, 2009 9:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Uih.... Shocked Shocked
Mit so einer Antwort hab ich jetzt nicht gerechnet.
Vielen Dank für die Mühe!!!
Werde mich gleich mal dran setzen.

Ich hatte doch im oberen Code allen Firlefanz rausgenommen, um das mit dem Dim auszuprobieren. Aber ihr wolltet ja so gern den ganzen Code... Ich arbeite momentan schon an mehreren bb-Dateien, um jede Funktion einzeln zu testen. Und es funktioniert ja auch alles, nur das mit dem Dim und das Speichern krieg ich nicht hin.

Ich werde mich jetzt mal durch deine Antwort durcharbeiten. Falls ich noch Fragen habe, ändere ich wieder den Titel des Threads, damit ihr mich findet Wink

Herzlichen Dank!!!

LG,
Sereyanne

Midimaster

BeitragDo, Dez 10, 2009 10:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Du braucht nicht mehrere Dateien, um den Code zu testen. Mehrere Funktionen wären ausreichend. Allerdings habe ich auch immer ein zweites Editor-Fenster offen, in dem ich die neuen Funktionen schreibe. Dadurch kommt man nicht in Versuchung, sie verteilt in den alten Code zu quetschen. Man kann sie da gut testen und am Ende werden Sie auf die erste Editor-Seite übernommen.

Ich wollte Dir ja eigentlich da bei dem Saven helfen, habe aber das große Durcheinander im Code gesehen und wollte Dir erst mal das Schreiben. Man merkt einfach, das da immer wieder was verändert wurde und oft sind dann Zeilen, die eigentlich thematisch zusammengehören auseinandergerissen worden.

Hier wird die Fehlersuche oder die Hilfe durch Dritte dann sehr schwierig.

Das Speichern des Pfades in einer Datei ist ja in meinem Bespiel gar nicht mehr nötig. Die Funktion BilderPfad$() liefert Dir den Pfad zurück und zwingt den User einen Pfad anzugeben, wenn noch kein Pfad bekannt ist.

In einer Slidshow ist es auch nicht sehr sinnvoll mit einem einzigen festen Pfad zu arbeiten. Damit schränkst Du sie ein und es läßt sich dann nur noch mit Bildern in einem einzigen Ordner arbeiten. Besser ist, das bei jeden Start einmal nach dem heutigen Pfad gefragt wird, und dann aber die gesamte Zeit in diesem Pfad geblieben wird.

Nun trotzdem das Speichern. Du ahnst es, es wird neue Funktionen geben:

Code: [AUSKLAPPEN]
Function BilderPfad$()
    If DefaultBilderPfad= "" then
        DefaultBilderPfad=HolDenPfadAusDerIni()
    endif
    If DefaultBilderPfad= "" then
        DEBUGLOG "BilderPfad war leer"
        DefaultBilderPfad=RequestDir()
        SchreibDenPfadInDieIni(DefaultBilderPfad)
        DEBUGLOG "BilderPfad ist jetzt: " + DefaultBilderPfad
    Endif
    Return DefaultBilderPfad
End function


Function  HolDenPfadAusDerIni$()
    local Eintrag$, Save
    If FileType ("pfad.txt")=1
        save=ReadFile ("pfad.txt")
            Eintrag=ReadLine$(save)
        CloseFile save
        DEBULOG "Ini-Datei gelesen. Eintrag: " + Eintrag
    Endif
    Return Eintrag
End Function



Function SchreibDenPfadInDieIni(Eintrag$)
    local Save
    save=WriteFile("pfad.txt")
        WriteLine save,Eintrag
    CloseFile save
    DEBULOG "Ini-Datei geschrieben. Eintrag: " + Eintrag
End Function



Durch die vielen DEBUGLOG kannst Du nun besser verfolgen, was schon gelaufen ist und ob es erfolgreich war.

Noch'n Tipp: Benne Deine Variablen sinnvoll, "bp$" ist nur für Dich und im Moment erkennbar. In einem Jahr sagt es Dir nichts mehr. Nenne es doch was es ist: "BilderPfad".

Sereyanne

BeitragDo, Dez 10, 2009 17:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Code: [AUSKLAPPEN]
Dim Pic$(99), DefaultBilderPfad$

;main:
graphics 800,600
DirectoryEinlesen
Repeat
   BilderAufsPanel
Forever
end

Function DirectoryEinlesen()
       Pic(1)="Hundi.png"
end function


Function BilderPfad$()
     DefaultBilderPfad= "C:\test\Bilder\"
     Return DefaultBilderPfad
End function


Function BilderAufsPanel()
    Local Nummer%
    Nummer=1
    DEBUGLOG "Versuche " + BilderPfad + Pic(Nummer) + " aufs Panel zu bringen"
    SetPanelImage panel, BilderPfad + Pic(Nummer)
End function


Du schreibst ja, dass es nur Fakes sind...
Aber war das gedacht, dass der Code gar nicht lauffähig ist?
Ich wollte nur zum Verständnis mal deinen ersten Code ausprobieren, da kommt sofort:
"Expecting '('" hinter der Erstellung des Dims.
Schade... denn ich würde es gerne ausprobieren um es verstehen zu können.
Außerdem wollte ich eigentlich nicht über Graphics arbeiten, dann hätte ich auch BB3D nehmen können.
Aber egal, so lange es zum gewünschten Ergebnis führt.... Wink

Midimaster

BeitragDo, Dez 10, 2009 18:46
Antworten mit Zitat
Benutzer-Profile anzeigen
dieser code sollte auch doch nur symbolisch sein. Die Zeilen sind ja fast alle so aus Deinem code übernommen.

Die erste Zeile müßte wahrscheinlich so geändert werden:
Code: [AUSKLAPPEN]
Dim Pic$(99)
Global DefaultBilderPfad$


Die Graphics hab ich bloß so dahin geschrieben, da soll natürlich Dein Festercode hin. Wahrscheinlich alles das:

Code: [AUSKLAPPEN]
win=CreateWindow("test",200,200,200,200,Desktop(),3)
canvas=CreateCanvas(0,0,200,140,win)
SetBuffer CanvasBuffer (canvas)


leider kann ich kein BlitzPlus ausprobieren, da müssen wir beide halt immer ein bißchen kommunizieren, wenn mir wieder mal was "BlitzMax-iges" reinrutscht.

Deine Main-Schleife müßte etwa so ausehen:
Code: [AUSKLAPPEN]
Repeat
    WaitEvent()
    Select EventID()
        Case $803
           End
        Case $4001 ;Timer Event
           BilderAufsPanel
    End Select
    FlipCanvas canvas
Forever

Sereyanne

BeitragDi, Dez 15, 2009 15:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
ich kam ne ganze Weile nicht mehr dazu, sorry. Ich hab meinen Code jetzt erst mal in Einzelteile zerlegt.
Und da möchte ich noch mal auf dies hier zurückkommen:
ozzi789 hat Folgendes geschrieben:
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

Bei mir sieht das jetzt im Ganzen so aus:
Code: [AUSKLAPPEN]
gfxhoehe=ClientHeight(Desktop())
gfxbreite=ClientWidth(Desktop())
;clientheight und -width ermittelt die Bildschirmauflösung

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

panel=CreatePanel(0,0,200,140,trayWnd)

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

bpfad$="data\" ;Pfad festlegen musst den ändern

Verz = ReadDir(bpfad$) ;Verzeichnis einlesen
   
   timer = CreateTimer(1) 
   i=0
   
   ; main loop to handle events
   Repeat
   
      WaitEvent(100)
      ;die Klammer:Zeit in Millisekunden, für die ein Programm maximal angehalten werden soll.
      ;Standard ist -1 (=unbegrenzt), da ich die Klammern leer lasse, wartet Blitz so lange, bis irgendwas geschieht
      ;hier auf 100, damit es auch ohne Ereignis weitergeht

         Select EventID() 
            Case $803 ;WindowClose
               End
            
            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 Datei$ = "" Then ;Falls es keine Files mehr hat, von vorne
                     Verz = ReadDir(bpfad$) ;Verzeichnis einlesen
                     i=i+1
                     pic$(i)=bpfad$ + Datei$ ;in Dim Schreiben
                     For a=0 To i
                        ;ResizeImage pic$(a),200,140
                        SetPanelImage panel, pic$(a)
                     Next
                     i=0
                  EndIf
                     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
                        ;ResizeImage pic$(a),200,140
                        SetPanelImage panel, pic$(a)
                     Next
                     i=0
                  EndIf
         End Select
   Forever   
   CloseDir Verz    

Ich würde jetzt gerne mal das Resize zum Laufen kriegen. Am sinnvollsten erscheint es mir an der Stelle, wo ichs im Code erst mal auskommentiert hab, weil es nicht funzt. Und zwar krieg ich ein "Invalid image handle" wegen resize. Was mach ich da falsch?
Freue mich auf Hilfe....
LG,
Sereyanne

Nicdel

BeitragDi, Dez 15, 2009 15:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Um es zu resizen musst du es auch laden, also LoadImage. Im Array ist nur ein String Wink
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Sereyanne

BeitragDi, Dez 15, 2009 15:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, ich weiß, dass in der Hilfe steht:
Zitat:
Bild Identität des Bildes (z.B. ermittelt mit LoadImage)

Ich hatte halt gedacht, wegen "z.B.", vielleicht reichts ja wenn das Bild im Dim gespeichert ist...
Okay, danke, und wie stell ich das dann genau an?
Code: [AUSKLAPPEN]
p=LoadImage (bpfad$+Datei$)

funzt nicht...

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

Neue Antwort erstellen


Übersicht BlitzBasic BlitzPlus

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group