Seite 1 von 3

Fehler bei OpenFileRequester()

Verfasst: 28.07.2005 22:54
von Blackskyliner
Hallo, ich... mal wieder....
ähm ich habe Folgendes Problem.
Ich habe hier Folgenden Code

Code: Alles auswählen

File$ = OpenFileRequester("Lied auswählen", "c:\","MpegLayer3 (*.mp3)|*.mp3",0,#PB_Requester_MultiSelection)
          
          If NextSelectedFileName() <> ""
            While File$ 
              File$ = NextSelectedFileName() 
              ListID.l = CountGadgetItems(#Playlist)
              If File$ <> ""
                  AddGadgetItem(#Playlist,ListID,File$,0) 
              EndIf
            Wend  
          Else
            ListID.l = CountGadgetItems(#Playlist)
            If ListID <> 0
              AddGadgetItem(#Playlist,ListID,File$,0)
            Else
              AddGadgetItem(#Playlist,0,File$,0)
            EndIf
          EndIf 
So wenn ich nun bei dem Fenster, was da entsteht, mehrere Files auswähle, dann fehlen immer ein oder ewei Einträge, warum? liegt das daran das ich so mistig programmiere? Kann ja nix dafür bin ja immerhin Anfänger.. hab auch schon viele Probleme alleine gelöst aber das bekomme ich mal wieder nicht hin... das ist wie das ReSizen der einzelnen Gadgets wenn sich das Fenster ReSized..... aber das ist ja jetzt nicht das Thema.

Danke für jede hilfe

EDIT
Hier mal der ganze Source

Code: Alles auswählen

; PureBasic Visual Designer v3.90 build 1361


;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Playlist
  #LOAD
  #PLAY
  #PAUSE
  #RESUME
  #STOP
  #QUIT
  #TIME_Total
  #Slash
  #TIME_Current
EndEnumeration

;- Audio Constants
;
Enumeration
  #AUDIO_ID
EndEnumeration
; BalloonTip Constants
#TOOLTIP_NO_ICON      = 0
#TOOLTIP_INFO_ICON    = 1
#TOOLTIP_WARNING_ICON = 2
#TOOLTIP_ERROR_ICON   = 3

Procedure BalloonTip(WindowID, Gadget, Text$ , Title$, Icon)
  
  ToolTip=CreateWindowEx_(0,"ToolTips_Class32","",#WS_POPUP | #TTS_NOPREFIX | #TTS_BALLOON,0,0,0,0,WindowID,0,GetModuleHandle_(0),0)
  SendMessage_(ToolTip,#TTM_SETTIPTEXTCOLOR,GetSysColor_(#COLOR_INFOTEXT),0)
  SendMessage_(ToolTip,#TTM_SETTIPBKCOLOR,GetSysColor_(#COLOR_INFOBK),0)
  SendMessage_(ToolTip,#TTM_SETMAXTIPWIDTH,0,180)
  Balloon.TOOLINFO\cbSize=SizeOf(TOOLINFO)
  Balloon\uFlags=#TTF_IDISHWND | #TTF_SUBCLASS
  Balloon\hWnd=GadgetID(Gadget)
  Balloon\uId=GadgetID(Gadget)
  Balloon\lpszText=@Text$
  SendMessage_(ToolTip, #TTM_ADDTOOL, 0, Balloon)
  If Title$ > ""
    SendMessage_(ToolTip, #TTM_SETTITLE, Icon, @Title$)
  EndIf
  
EndProcedure

If OpenWindow(#Window_0, 270, 233, 359, 204,  #PB_Window_SizeGadget | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_WindowCentered , "MP3-Player")
  ;AdvancedGadgetEvents(#True) 
  If CreateGadgetList(WindowID())
    ButtonGadget(#LOAD, 0, 180, 60, 25, "Laden")
    BalloonTip(WindowID(), #LOAD, "Musikstück laden", "", #TOOLTIP_NO_ICON)
    ListViewGadget(#Playlist, 0, 0, 360, 165)
    BalloonTip(WindowID(), #Playlist, "PlayList", "", #TOOLTIP_NO_ICON)
    ButtonGadget(#PLAY, 60, 180, 60, 25, "Abspielen")
    BalloonTip(WindowID(), #PLAY, "Musikstück abspielen", "", #TOOLTIP_NO_ICON)
    ButtonGadget(#PAUSE, 120, 180, 60, 25, "Anhalten")
    BalloonTip(WindowID(), #PAUSE, "Musikstück anhalten", "", #TOOLTIP_NO_ICON)
    ButtonGadget(#RESUME, 180, 180, 60, 25, "Fortsetzen")
    BalloonTip(WindowID(), #RESUME, "Musikstück fortsetzen", "", #TOOLTIP_NO_ICON)
    ButtonGadget(#STOP, 240, 180, 60, 25, "Stop")
    BalloonTip(WindowID(), #STOP, "Musikstück stoppen", "", #TOOLTIP_NO_ICON)
    ButtonGadget(#QUIT, 300, 180, 60, 25, "Beenden")
    BalloonTip(WindowID(), #QUIT, "Player Beenden", "", #TOOLTIP_NO_ICON)
    TextGadget(#TIME_Total, 55, 165, 45, 15, "00:00:00")
    BalloonTip(WindowID(), #TIME_Total, "Zeit Total", "", #TOOLTIP_NO_ICON)
    TextGadget(#Slash, 45, 165, 10, 15, "/")
    BalloonTip(WindowID(), #Slash, "Slash ? O.o  :D ;)", "", #TOOLTIP_NO_ICON)
    TextGadget(#TIME_Current, 0, 165, 45, 15, "00:00:00")
    BalloonTip(WindowID(), #TIME_Current, "Verstrichene Zeit", "", #TOOLTIP_NO_ICON)
  EndIf
  
  w = WindowWidth ()
  h = WindowHeight() 
  
  Repeat
    EventID.l = WindowEvent()
    
    If EventID = #PB_Event_SizeWindow
      fx.f = WindowWidth()  / w
      fy.f = WindowHeight() / h
      ResizeGadget(#Playlist, GadgetX(#Playlist)*fx , GadgetY(#Playlist)*fy, GadgetWidth(#Playlist)*fx, GadgetHeight(#Playlist)*fy)
      For i=#LOAD To #TIME_Current 
      ResizeGadget(i, -1 , GadgetY(i)*fy, -1, -1)
      Next
      w = WindowWidth ()
      h = WindowHeight()
    EndIf 
    
    If EventID = #PB_Event_CloseWindow
      Quit.l = 1
    EndIf
    If EventID = #WM_KEYDOWN
      If EventwParam() = #VK_Escape
        Quit.l = 1
      EndIf 
    EndIf
    
    If IsAudioZPlaying(#AUDIO_ID) = #False
      Delay(25)
    EndIf 
    
    If IsAudioZPlaying(#AUDIO_ID)
      SetGadgetText(#TIME_Current, PositionAudioZTime(Current))
      Delay(25)
    EndIf 
    Current.l = GetAudioZState(#AUDIO_ID)
    If Current=Total And Play = 1
      StopAudioZ(#AUDIO_ID)
      FreeAudioZ(#AUDIO_ID)
      If CountGadgetItems(#Playlist)=GetGadgetState(#Playlist)
        SetGadgetState(#Playlist,0)
      Else
        SetGadgetState(#Playlist,GetGadgetState(#Playlist)+1)
      EndIf
      OpenAudioZ(#AUDIO_ID,GetGadgetItemText(#Playlist,GetGadgetState(#Playlist),0))
      PlayAudioZ(#AUDIO_ID)
      Total.l = GetAudioZLength(#AUDIO_ID)
      SetGadgetText(#TIME_Total, PositionAudioZTime(Total))
      Play.l = 1
    EndIf
    
    If EventID = #PB_Event_Gadget
      Select EventGadgetID()
        Case #LOAD
          File$ = OpenFileRequester("Lied auswählen", "c:\","MpegLayer3 (*.mp3)|*.mp3",0,#PB_Requester_MultiSelection)
          
          If NextSelectedFileName() <> ""
            While File$ 
              File$ = NextSelectedFileName() 
              ListID.l = CountGadgetItems(#Playlist)
              If File$ <> ""
                  AddGadgetItem(#Playlist,ListID,File$,0) 
              EndIf
            Wend  
          Else
            ListID.l = CountGadgetItems(#Playlist)
            If ListID <> 0
              AddGadgetItem(#Playlist,ListID,File$,0)
            Else
              AddGadgetItem(#Playlist,0,File$,0)
            EndIf
          EndIf 
        Case #QUIT
          Quit.l = 1
        Case #PLAY
          If IsAudioZPlaying(#AUDIO_ID)
            MessageRequester("Fehler","Es wird zuzeit noch ein Lied gespielt.")
          Else 
            OpenAudioZ(#AUDIO_ID,GetGadgetItemText(#Playlist,GetGadgetState(#Playlist),0))
            PlayAudioZ(#AUDIO_ID)
            Total.l = GetAudioZLength(#AUDIO_ID)
            SetGadgetText(#TIME_Total, PositionAudioZTime(Total))
          EndIf 
          Play.l = 1
        Case #STOP
          Play.l = 0
          StopAudioZ(#AUDIO_ID)
          FreeAudioZ(#AUDIO_ID)
        Case #RESUME
          Play.l = 1
          ResumeAudioZ(#AUDIO_ID)
        Case #PAUSE
          Play.l = 0
          PauseAudioZ(#AUDIO_ID)
        Case #Playlist
          If #PB_EventType_LeftDoubleClick=EventType()
            RemoveGadgetItem(#Playlist,GetGadgetState(#Playlist))
          EndIf
      EndSelect
    EndIf
  Until Quit=1
  
EndIf


Re: Fehler bei OpenFileRequester()

Verfasst: 28.07.2005 23:09
von Kiffi
Blackskyliner hat geschrieben: So wenn ich nun bei dem Fenster, was da entsteht, mehrere Files auswähle, dann fehlen immer ein oder ewei Einträge, warum?
Der Fehler liegt in der Abfrage

Code: Alles auswählen

If NextSelectedFileName() <> ""
OpenFileRequester() liefert Dir eine Liste der ausgewählten Dateien
zurück, die Du mit NextSelectedFileName() durchwandern kannst. Mit
Deiner ersten Abfrage überspringst Du also die erste Datei.
Blackskyliner hat geschrieben: liegt das daran das ich so mistig programmiere?
ja
Blackskyliner hat geschrieben: Kann ja nix dafür bin ja immerhin Anfänger.. hab auch schon viele
auch 'ne nette Ausrede :-)

Grüße ... Kiffi

Verfasst: 29.07.2005 16:56
von Blackskyliner
Ich denke ich überspringe den nur wenn ich sage
File$ = NextSelectedFileName()
Ok da muss ich halt sagen:

If File$ <> ""
[...]

Verfasst: 29.07.2005 22:46
von benpicco
du knnst das <> "" weglassen und einfach if file$ schreiben

Verfasst: 19.06.2006 13:08
von Slut-Hunter
So ein ähnliches Problem hab ich hier auch^^

Das Ding zählt falsch, wähle ich eine Datei aus, wird gar nichts eingelesen.
Wähle ich mehrere aus, wird die Letzte nicht geaddet, stattdessen kommt ne leere letzte Zeile.
Was auch den leeren 2xMessage Requester am Ende erklärt.

Benutzte ich bei AddGadgetItem als Position 0 ist die Erste Zeile leer, und die zuletzt gwählte Datei fehlt auch.

Hab PB 3.94

Code: Alles auswählen

If OpenWindow(0,0,0,800,600,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered,"BlaBla ")
  
  UseJPEGImageEncoder()
  UseJPEGImageDecoder()
  
  CreateGadgetList(WindowID(0))
  
  ButtonGadget(20,200,10,100,20,"Start")
  ButtonGadget(90,10,10,100,20,"Files Auswählen")
  
  StringGadget(25,110,10,40,20,"200",#PB_String_Numeric)
  
  ListViewGadget(80, 10, 70, 380, 400) 
  
  ListViewGadget(81, 400, 70, 380, 400) 
  
  
  Repeat
    
    EventID = WaitWindowEvent()
    
    If EventID = #PB_Event_Gadget
      
      If EventGadgetID()=90
        
        Tomate$ = OpenFileRequester("Select Pictures", "C:\*.jpg", "Pictures | *.jpg", 0,#PB_Requester_MultiSelection) 
        
        While Tomate$
           Tomate$ = NextSelectedFileName() 
           Pfad$ = GetPathPart(Tomate$)
           DateiName$ = GetFilePart(Tomate$)
           AddGadgetItem(80, -1, Pfad$+DateiName$, ImageID)
        Wend
      EndIf
      
      
      If EventGadgetID()=20
        
        NewList Number.s()
        
        New_W = Val(GetGadgetText(25))
        
        For i = 0 To CountGadgetItems(80)
          BLA$ = GetGadgetItemText(80, i, 0)
           AddElement(Number.s())
          Number.s() = BLA$
        Next
        
        ForEach Number.s()
          MessageRequester("Bla", Number.s(),#PB_MessageRequester_Ok)
          AddGadgetItem(81, -1, Number.s(), ImageID)
          
          ;LoadImage(150, Number.s())
          ;UseImage(150)
          ;W_1.f = ImageWidth()
          ;H_1.f = ImageHeight()
          ;New_H1.f = H_1.f / W_1 * New_W
          ;CopyImage(150, 170)
          ;ResizeImage(170, New_W, New_H1.f )
          ;SaveImage(170, "C:\BLUB\"+DateiName$, #PB_ImagePlugin_JPEG, 10)
        Next
        
      EndIf
    EndIf
    
  Until EventID = #PB_Event_CloseWindow
  
EndIf
 
End

Hab jetzt paar Stunden da rumprobiert, und nach dem Fehler gesucht, aber nichts finden können.

Hoffe ihr wisst weiter.

Verfasst: 19.06.2006 14:50
von Jilocasin
Also:
Die erste Datei wird übersprungen, da der FileRequester (bei Tomate$) sofort die erste Datei zurückgibt. Du müsstest das "NextSelectedFileName" als letzes schreiben.. also so:

Code: Alles auswählen

        While Tomate$
           Pfad$ = GetPathPart(Tomate$)
           DateiName$ = GetFilePart(Tomate$)
           AddGadgetItem(80, -1, Pfad$+DateiName$, ImageID)
           Tomate$ = NextSelectedFileName()
        Wend

Verfasst: 19.06.2006 19:42
von Slut-Hunter
Ah Danke dir, klappt super :allright:

Verfasst: 19.06.2006 19:47
von Kiffi
@Slut-Hunter:

gibt es einen besonderen Grund, warum Du Pfad und Dateiname von
Tomate$ auseinanderdröselst um sie dann sofort wieder zusammenzubauen?

Andernfalls kannst Du nämlich folgendes schreiben:

Code: Alles auswählen

While Tomate$
  AddGadgetItem(80, -1, Tomate$, ImageID)
  Tomate$ = NextSelectedFileName()
Wend
Grüße ... Kiffi

Verfasst: 19.06.2006 20:04
von Slut-Hunter
Yup danke dir für den Tip, hab das vorhin beim rumprobieren irgendwann aus Zufall bemerkt das man das GetFilePart und GetPathPart weglassen kann, wollte es dann ohne machen, nur brauch ich das, wollte es so machen, daß die geschrumpften Bilder die Selben Dateinamen zugewiesen bekommen.

Nur klappt das leider generell nicht so wie ich das vorhabe.

Code: Alles auswählen

ForEach Number.s()
  ;MessageRequester("Bla", Number.s(),#PB_MessageRequester_Ok)
  
  AddGadgetItem(81, -1, Number.s(), ImageID)
  
  LoadImage(150, Number.s())
  UseImage(150)
  CopyImage(150, 170)
  
  w.f = ImageWidth()
  h.f = ImageHeight()
  New_H.f = h.f / w.f * New_W
  
  ResizeImage(170, New_W, New_H.f )
  SaveImage(170, "C:\BLUB\"+DateiName$, #PB_ImagePlugin_JPEG, 10)
Next
Der Debugger meint bei Use Image währe kein Input, und das auch nur wenn ich versuche das Image zu Resizen.

Code: Alles auswählen


ForEach Number.s()
  w.f = ImageWidth()
  h.f = ImageHeight()
  New_H.f = h.f / w.f * New_W
  
  ResizeImage(170, New_W, New_H.f )
Falls ich das per Semikolon deaktivere, wird nur eine Datei gespeichert.

Aber der Message Requester arbeitet korrekt, daher kann ich mir nicht erklären was ich falsch hab.


:freak:

Verfasst: 19.06.2006 20:10
von roherter
Das Handle wird durch resizeimage geändert:
Auszug aus der PB-Hilfe:
Resizeimage:
Diese Funktion verändert das Handle des benutzten Bildes. Es muss deshalb z.B. einem ImageGadget() mittels SetGadgetState() neu zugewiesen werden.

Versuch es mal so:

Code: Alles auswählen

bild=ResizeImage(170, New_W, New_H.f )
  SaveImage(bild, "C:\BLUB\"+DateiName$, #PB_ImagePlugin_JPEG, 10)