alberto-moyano   17-03-2024, 01:51
#1
Hola gente, tengo la siguiente función (que es una adaptación de un aporte de Tincho), la cuestión es que no obtengo error alguno, pero tampoco hace lo que espero.

En concreto, se supone que lee un directorio a través de un path (revisado que existe en otra función) y listar los archivos que encuentra en un menú existente en el formulario.

Código:
Public Sub ShowFilesMenu()

  Dim strPath As String

  strPath = rutaScriptsExternos
  ShowFilesMenuWithPath(strPath)

End

Public Sub ShowFilesMenuWithPath(strPath As String)

  ShowFilesMenuInternal(strPath)

End

Public Sub ShowFilesMenuInternal(strPath As String, Optional stxExt As String[], Optional bolRec As Boolean)

  Dim stxFiles As New String[]
  Dim strFile As String
  Dim i As Integer

  stxFiles = RListFiles(strPath, stxExt, bolRec)

  Dim oMenu As New FMain.Menu77 'indico el menú donde se mostrara el listado de archivos

  For Each strFile In stxFiles
    Dim oMenuItem As Menu77
    oMenuItem = oMenu.Add(MenuFileFromPath(strFile))
    oMenuItem.Tag = strFile
    Connection(oMenuItem, "Activate", Me, "OpenFile")
  Next

End

Public Sub OpenFile(sender As Object)

  Dim strFilePath As String

  strFilePath = Sender.Tag

End

Private Function MenuFileFromPath(strFilePath As String) As String
  ' Esta función toma un camino completo de un archivo
  ' y devuelve solo el nombre del archivo para mostrar en el menú.

  Dim strFile As String

  strFile = File.Name(strFilePath)
  Return strFile

End

Public Function RListFiles(strPath As String, Optional stxExt As String[], Optional bolRec As Boolean) As String[]

  Dim stxTmp As New String[]
  Dim stxFiles As New String[]
  Dim strFile As String
  Dim strExt As String

  stxTmp.Clear
  stxFiles.Clear

  strPath = ArrangePath(strPath)

  Select Stat(strPath).Type
    Case gb.File
      strPath = File.Dir(strPath)
  End Select

  If stxExt <> Null Then
    Select stxExt.Count
      Case 0
        If bolRec = True Then
          stxTmp.Insert(RDir(strPath, "*.py"))
        Else
          stxTmp.Insert(Dir(strPath, "*.py", gb.File))
        Endif

      Case Else
        For Each strExt In stxExt
          If bolRec = True Then
            stxTmp.Insert(RDir(strPath, "*." & strExt))
          Else
            stxTmp.Insert(Dir(strPath, "*." & strExt, gb.File))
          Endif
        Next

    End Select
  Else

    If bolRec = True Then
      stxTmp.Insert(RDir(strPath, "*.py"))
    Else
      stxTmp.Insert(Dir(strPath, "*.py", gb.File))
    Endif
  Endif

  For Each strFile In stxTmp
    Select Stat(strPath &/ strFile).Type
      Case gb.File
        stxFiles.Add(strPath &/ strFile)
    End Select
  Next

  Return stxFiles

End

Public Function ArrangePath(strPath As String) As String

  If Right(strPath, 1) <> "/" Then
    strPath &= "/"
  Endif
  Return strPath

End

Alguna idea de por donde vienen los tiros
tincho   17-03-2024, 23:52
#2
(17-03-2024, 01:51)alberto-moyano escribió: no obtengo error alguno, pero tampoco hace lo que espero.

Que función es la que adaptaste y que esperas que suceda?

1 Saludo.
alberto-moyano   18-03-2024, 02:25
#3
Hola Tincho, es de una función que publicaste acá en el foro, allá por el 2019 (si no recuerdo mal, tendría que volver a buscarla en el foro), lo que debe hacer es buscar en un directorio los archivos que encuentra en él y listarlos en un menú.

Abrazo
tincho   18-03-2024, 10:25
#4
(18-03-2024, 02:25)alberto-moyano escribió: ...es de una función que publicaste acá en el foro, allá por el 2019 ... lo que debe hacer es buscar en un directorio los archivos que encuentra en él y listarlos en un menú.

ok, esa función la modifique bastante y ahora uso otra que se llama ScanFiles() que entrega una lista de archivos y como parámetro de entrada requiere la ruta del directorio a escanear, pero también permite opciones extra como el nivel de anidamiento, el tipo de archivo o si se toman en cuenta los enlaces. La función la podes ver en el post de DirZip

1 Saludo.
alberto-moyano   26-03-2024, 22:28
#5
Hola Tincho, disculpa la tardanza en responder pero me salí de ruta por temas personales.

Ya solucioné el asunto con ayuda de un ejercicio que mostró el compañero jsban en youtube, la solución quedo así

Código:
Dim mtmp As Menu
Dim file As String

  For Each file In Dir(rutaScriptsExternos, "*.*").Sort()
    mtmp = New Menu(Menu76) As "obs"
    mtmp.caption = File
  Next

y con el evento click del observador accedo a la ejecución de los script sobre el archivo de texto relacionado
Código:
Public Sub obs_click()

  TerminalView1.Input("python3 " & rutaScriptsExternos &/ Last.caption & " " & File.Name(TextBox1.Text) & "\n")

End
Utilizo la consola porque los scripts devuelven info de las consultas.

Saludos
Última modificación: 26-03-2024, 22:29 por alberto-moyano.
  
Usuarios navegando en este tema: 2 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.