Fehler bei OpenFileRequester()

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Fehler bei OpenFileRequester()

Beitrag 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

Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Fehler bei OpenFileRequester()

Beitrag 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
a²+b²=mc²
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Beitrag von Blackskyliner »

Ich denke ich überspringe den nur wenn ich sage
File$ = NextSelectedFileName()
Ok da muss ich halt sagen:

If File$ <> ""
[...]
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag von benpicco »

du knnst das <> "" weglassen und einfach if file$ schreiben
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Slut-Hunter
Beiträge: 40
Registriert: 05.06.2006 12:38

Beitrag 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.
Jilocasin
Beiträge: 665
Registriert: 13.05.2006 16:04
Kontaktdaten:

Beitrag 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
Bild
Slut-Hunter
Beiträge: 40
Registriert: 05.06.2006 12:38

Beitrag von Slut-Hunter »

Ah Danke dir, klappt super :allright:
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
Slut-Hunter
Beiträge: 40
Registriert: 05.06.2006 12:38

Beitrag 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:
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag 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) 
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Antworten