suche stoppen, wie?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von sen-me »

aber wie soll ich da shier bitteschön mit rückgabe wert machen

Code: Alles auswählen

Global a
Procedure Sing()
 a+1
 AddElement(daten())
 daten()=a
 If a<>10 : Sing() : EndIf
EndProcedure
Sing()
Bild
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

So z.B.:

Code: Alles auswählen

Global a 
Procedure Sing()
 ;Hier z.B. auf einen AbbruchButton testen:

 If WindowEvent() = #PB_Event_Gadget And EventGadgetID() = #DEIN_ABBRUCH_BUTTON
   ProcedureReturn #True
 EndIf
 
 a+1 
 AddElement(daten()) 
 daten()=a 
 If a<>10
   If Sing() = #True
   	 ProcedureReturn 1
 	 EndIf
 EndIf
 ProcedureReturn 0

EndProcedure 
Sing()
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von sen-me »

jagut das problem ist das ich es aus einer toolbar steuer, wenn ich auf toolbar button start gehe, bleibt dieser eingedrückt (ich wollt ihn aber disablen -.-)

und der stop toolbarbutton kommt erst gar nicht O.o
Bild
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Ich bin mir ziemlich sicher, dass du mein Beispiel nicht wirklich verinnerlicht hast.
Das eingebaute WindowEvent() hat nämlich auch den netten Nebeneffekt dein Fenster am Leben zu erhalten, weil es immer brav anstehende Events aus der Queue schaufelt (allerdings eher unbeaufsichtigt, was aber nicht Teil der Aufgabenstellung war).

Also kann es eigentlich gar nicht sein, dass der Button eingedrückt bleibt.
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von sen-me »

ich hab im normalen program

Code: Alles auswählen

repeat
eventid=windowevent()
if eventid=#pb_eventmenu
 select eventmenuid()
  case 1 : searchfile(path)
 endselect
endif
until eventid=#pb_eventwindowclose
Bild
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Die Schleife ist ja ganz nett, aber hier sehe ich beim besten Willen nicht, wie dein geschilderter Effekt zustande kommen soll.
Nummer5 hat geschrieben:Ich brauche mehr Input
z.B. deine TATSÄCHLICHE searchfile() Procedure.
Ausserdem dachte ich, du wolltest den Button disablen ? Wieso seh ich dann in deiner Schleife nix davon ?
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von sen-me »

ok ich schneid mal was raus

Code: Alles auswählen

Procedure SearchFile(Folder.s)
 Protected Search.s,Type.b,result.b
 Static DirID.l
 If ExamineDirectory(DirID,Folder,"")
  DirID+1
  Repeat
   Type=NextDirectoryEntry()
   If Type : Search=Trim(DirectoryEntryName()) : EndIf
   If Type=2
    If Search<>"." And Search<>".."
     result=IsEmpty(Folder+Search+"\")
     UseDirectory(DirID-1)
     If result=0
      Search=Folder+Search+"\"
      StatusBarText(0,1,"Durchsucht: "+Search)
      SearchFile(Search)
      UseDirectory(DirID-1)
     ElseIf result=1
      AddElement(files())
      files()\path=Folder
      files()\name=Search+" (Ordner)"
     EndIf
    EndIf
   ElseIf Type=1
    If DirectoryEntrySize()=0
     AddElement(files())
     files()\path=Folder
     files()\name=Search+" (Datei)"
    EndIf
   EndIf
  Until Type=0 Or stop=1
  DirID-1
 EndIf
EndProcedure

Code: Alles auswählen

toolbar=CreateToolBar(0,WindowID())
If toolbar=0
 Error("Konnte das Programm nicht initialisieren!",1,10)
EndIf
ImageList_Destroy_(SendMessage_(toolbar,1073,0,0))
imgl=ImageList_Create_(32,32,#ILC_COLOR8|#ILC_MASK,0,1)
SendMessage_(toolbar,1072,0,imgl)
ToolBarImageButton(0,UseImage(0))
ToolBarImageButton(1,UseImage(1))
ToolBarSeparator()
ToolBarImageButton(2,UseImage(2))
ToolBarImageButton(3,UseImage(3))
DisableToolBarButton(0,1)
DisableToolBarButton(1,1)
status=CreateStatusBar(0,WindowID())
If status=0
 Error("Konnte das Programm nicht initialisieren!",1,10)
EndIf
AddStatusBarField(100)
AddStatusBarField(500)
Dim Tooltext.s(4)
Tooltext(0)="Starte Suche"
Tooltext(1)="Stoppe Suche"
Tooltext(3)="Version-Info"
Tooltext(4)="Hilfe"
ToolBarToolTip(0,Tooltext(0))
ToolBarToolTip(1,Tooltext(1))
ToolBarToolTip(2,Tooltext(3))
ToolBarToolTip(3,Tooltext(4))

Code: Alles auswählen

Repeat
 EventID=WindowEvent()
 If EventID=0
  hot=SendMessage_(toolbar,1095,0,0)
  If hot<>oldhot
   oldhot=hot
   If hot=-1 : StatusBarText(0,0,"") : Else : StatusBarText(0,0,Tooltext(hot)) : EndIf
  EndIf
  Delay(5)
 ElseIf EventID=#PB_EventMenu
  Select EventMenuID()
   Case 0
    DisableToolBarButton(1,0)
    DisableToolBarButton(0,1)
    ClearList(files())
    ClearGadgetItemList(2)
    stat.w=0
    stop=0
    SearchFile(result)
    StatusBarText(0,1,"Bereit")
    ResetList(files())
    ForEach files()
     AddGadgetItem(2,stat,files()\name+Chr(10)+files()\path)
     SetGadgetItemState(2,stat,#PB_ListIcon_Checked)
     stat+1
    Next
    DisableToolBarButton(0,0)
   Case 1
    stat.w=0
    ClearList(files())
    ClearGadgetItemList(2)
    stop=1
  EndSelect
 EndIf
Until EventID=#PB_EventCloseWindow
Ende()
Bild
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Genau so hab ichs mir vorgestellt!
Ich hab also gegen ne Wand geredet, oder wo ist denn das von mir vorgeschlagene WindowEvent() in deiner SearchRoutine ?

Hier die Routine extra für dich (auch wenn ich #PB_Any benutzt hätte anstatt dieser statischen Variable):

Code: Alles auswählen

Procedure.l SearchFile(Folder.s)
 Protected Search.s,Type.b,result.b
 Static DirID.l
 If ExamineDirectory(DirID,Folder,"")
  DirID+1
  Repeat
   Type=NextDirectoryEntry()
   If Type : Search=Trim(DirectoryEntryName()) : EndIf
   
   ;NEW
   If WindowEvent() = #PB_EventMenu And EventMenuID() = 1
     ProcedureReturn 1
   EndIf
   ;NEW END
   
   If Type=2
    If Search<>"." And Search<>".."
     result=IsEmpty(Folder+Search+"\")
     UseDirectory(DirID-1)
     If result=0
      Search=Folder+Search+"\"
      StatusBarText(0,1,"Durchsucht: "+Search)
      
      ;CHANGED
      If SearchFile(Search)
      	ProcedureReturn 1
	    EndIf
    	;CHANGED END
	    
      UseDirectory(DirID-1)
     ElseIf result=1
      AddElement(files())
      files()\path=Folder
      files()\name=Search+" (Ordner)"
     EndIf
    EndIf
   ElseIf Type=1
    If DirectoryEntrySize()=0
     AddElement(files())
     files()\path=Folder
     files()\name=Search+" (Datei)"
    EndIf
   EndIf
  Until Type=0 Or stop=1
  DirID-1
 EndIf
 
 ;NEW
 ProcedureReturn 0
 ;NEW END
 
EndProcedure
Dann musst nur noch in deiner Hauptschleife abchecken, ob die Procedure 1 zurückgibt und entsprechend deine List löschen.
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von sen-me »

aber sie wird doch aufgerufen, und wenn ichw a szurück gebe, ohne stop zu drücken gehts ja nich :roll:
Bild
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

/:->
*mit nächstem der irre genug ist mich hier abzulösen abklatsch*
Antworten