Skeeve •---->
  
  
  Anmeldedatum: 20.04.2006 Beiträge: 1067
 
  | 
		
			
				 Verfasst am: 30.05.2007 - 12:35    Titel: rekursives droplet | 
				     | 
			 
			
				
  | 
			 
			
				Da ich es immer mal wieder brauche, hier ein allgemeines "rekursives" droplet.
 
 
"rekursiv" da es nicht wirklich rekursiv arbeitet sondern die Elemente, die noch abzuarbeiten sind, in einer Liste mitführt.
 
 
Dies ist natürlich nur ein Muster. Es müsssen an entsprechender Stelle natürlich noch Handler eingebaut werden.
 
 
Es fehlt zum Beispiel der Test, ob die entsprechende Datei überhaupt verarbeitet werden kann und die Verarbeitung selbst muß natürlich auch für den jeweiligen Verwendungszweck angepaßt werden.
 
 
Ich hoffe, daß es dennoch ab und an mal nützlich ist, das Muster hier zur Verfügung zu haben.
 
 
 	  | Zitat: | 	 		  on run
 
   set something to choose file with multiple selections allowed
 
   -- oder
 
   set something to choose folder with multiple selections allowed
 
   display dialog process_recursively(something, true)
 
end run
 
 
on open something
 
   display dialog process_recursively(something, true)
 
end open
 
 
to process_recursively(the_thing, signal_error)
 
   -- eine liste?
 
   if list is class of the_thing then
 
      -- mit nur einem Element?
 
      if (count of the_thing) is 1 and not folder of (info for first item of the_thing) then
 
         -- Dann nur dieses Element behandeln
 
         return process_recursively(first item of the_thing, signal_error)
 
      end if
 
      
 
      set zaehler to 0
 
      -- ansonsten jedes Element behandeln
 
      repeat while (count of the_thing) > 0
 
         -- hol das erste
 
         set element to first item of the_thing
 
         -- und nimm es aus der Liste
 
         set the_thing to the rest of the_thing
 
         -- ist es ein folder?
 
         if folder of (info for element) then
 
            tell application "Finder"
 
               -- dann hole alle files aus dem Folder
 
               -- und stell sie vorne in die Liste
 
               copy (every file of element) to the beginning of the_thing
 
               -- stelle alle folder nach hinten
 
               copy (every folder of element) to the end of the_thing
 
            end tell
 
         else
 
            -- kein folder, dann behandeln 
 
            set zaehler to zaehler + process_recursively(element, false)
 
         end if
 
      end repeat
 
      return zaehler
 
   end if
 
   
 
   -- hier die Behandlung der einzelnen Elemente
 
   -- wenn gewünscht einen passenden Test eintragen
 
   if das_kann_verarbeitet_werden(the_thing) then
 
      -- und dann die Routine zur Behandlung
 
      -- einzelner Dateien aufrufen
 
      -- oder direkt hier einsetzen
 
      process(the_thing)
 
      return 1
 
   end if
 
   
 
   -- Sonst ein Fehler
 
   if signal_error then
 
      display alert "Keine Ahnung, wie ich damit umgehen soll: " & (displayed name of (info for the_thing)) as informational
 
      error -128
 
   end if
 
   return 0
 
end process_recursively
 
 | 	 
  _________________ "All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies") | 
			 
		  |