Shell 19-02-2024, 01:20
Buenas!.

¿ Se acuerdan que es un bucle ?. Big Grin

- Mediante el ratón y la pulsación del botón izquierdo de este voy creando sprites/imágenes por un control DrawingArea.

Encontré dos formas de hacerlo:

- Mediante un bucle While que comprueba constantemente si se ha pulsado el botón izquierdo del ratón

Pero eso tiene un problema. Un bucle While que está constantemente comprobando y comprobando parece
algo como un bucle sin fin. Tiene que haber algo que lo frene un poco..

Primera versión, con el bucle While.

Código:
Public Sub CrearSprites(ix As Integer, iy As Integer)

  Dim asprite As Sprite
  Dim aimage As Image

  While botonpulsado
    aimage = Image.Load("Imagenes/" & anomimagenes[Rand(0, anomimagenes.max)])
    asprite = New Sprite([ix, iy], [Rnd(-1, 1), Rnd(-1, 1)], Rand(0, 360), Deg(Rnd(-0.1, 0.1)), aimage)
    asprites.Add(asprite)
    Wait 0.01 'Obligatorio dentro del bucle. Cada Sprite se crea según este tiempo, no lo que diga el reloj
  Wend

End

Ese bucle recibe la coordenada del ratón y en la zona de dibujar del control DrawingArea no se controla si se ha pulsado o no
el botón izquierdo del ratón. Ese DrawingArea es refrescado por un Timer.

Código:
Public Sub Ventana_Draw()

  Dim asprite As Sprite

  For Each asprite In asprites
    asprite.Dibujar()
    asprite.Update()
    asprite.vel = colisionBordes([VENTANA_ANCHO, VENTANA_ALTO], asprite)
  Next

End

Segunda versión. Se evita el uso del bucle while.

Código:
Public Sub CrearSprites(ix As Integer, iy As Integer)

  Dim asprite As Sprite
  Dim aimage As Image

  aimage = Image.Load("Imagenes/" & anomimagenes[Rand(0, anomimagenes.max)])
  asprite = New Sprite([ix, iy], [Rnd(-1, 1), Rnd(-1, 1)], Rand(0, 360), Deg(Rnd(-0.1, 0.1)), aimage)
  asprites.Add(asprite)

End

Tuve que añadir dos variables comunes a todo el formulario para saber en "todo" momento donde se ha hecho clic
con el ratón.

Código:
Public Sub Ventana_Draw()

  Dim asprite As Sprite

  If botonpulsado Then CrearSprites(mx, my)
  For Each asprite In asprites
    asprite.Dibujar()
    asprite.Update()
    asprite.vel = colisionBordes([VENTANA_ANCHO, VENTANA_ALTO], asprite)
  Next

End

botonpulsado se produce naturalmente cuando hacemos click con el ratón en algún lugar de la ventana de dibujo.
Al usar esas variables globales (por llamarlas de alguna forma, común a toda la clase). Carece de importancia
llamar a crear el sprite en los eventos del ratón.

Uso dos:

- Uno para dibujar en el mismo lugar. MouseDown
- Para crear una estela de sprites por la zona de dibujo. MouseMove.

Código:
Public Sub Ventana_MouseDown()

  If Mouse.Left Then
    botonpulsado = True
    mx = Mouse.X
    my = Mouse.Y
    'CrearSprites(mx, my)
  Endif

End

Public Sub Ventana_MouseMove()

  mx = Mouse.X
  my = Mouse.Y
  'If Mouse.Left Then CrearSprites(mx, my)

End

Voy a subiros el proyecto ejemplo. FormEjemplo1 usa el bucle While y FormEjemplo2, no.
El área de dibujo es de 1600x900. No creo que haya problema en reducirla, podéis hacerlo en las dos constantes del principio
del código.

No subo la imagen de la demo entero ya que es un poco grande. Subo una parte. Solo objetos por todos lados
creados con el ratón.

[Imagen: nmntXnn.png]

Recordar , debéis dejar pulsado el botón izquierdo. También podéis dejado pulsado el botón y mover el ratón.
Ejecutar un form u otro. Y ojo, a más imágenes , mas se calienta la computadora. Rolleyes

Llevo unos días con esto que puede parecer una tontería. En realidad, queriendo controlar otras cosas.

Saludos
Archivos adjuntos
.gz
DemoTest-0.0.1.tar.gz (Tamaño: 73.08 KB Descargas: 3)
tincho 19-02-2024, 00:15
Hola, hace unos días que vengo con esta función que intenta listar los programas por defecto dedicados a una tares determinada.
Hice la función porque en algunas ocasiones cuando en gambas enviaba una orden de abrir un directorio sucedía otra cosa distinta a abrir el directorio en el gestor de archivos.
Así que les acerco la funcion por si tal vez les resulta de utilidad.
Código:
'' This function list all the .desktop applications in the directory /usr/share/applications which are asociated to al the mimetypes in the frirst argument and optionally is possible filter by category.
Static Public Function DeskApp2(aMimeType As String[], Optional aCategories As String[]) As DesktopFile[]
  Dim oTemp As DesktopFile[]
  Dim oDsk As New DesktopFile[]
  Dim oDsk2 As New DesktopFile[]
  Dim dsk As DesktopFile
  Dim sDef As String
  Dim ad As New String[]
  Dim sMime As String
  Dim sApps As String
  Dim xapp As DesktopFile
  Dim mk As String
  Dim sKat As String
  Dim sl As String
  Dim sApp As String
  If aMimeType.Count Then
    For Each mk In aMimeType
      oTemp = DesktopFile.FromMime(mk)
      For Each dsk In oTemp
        If aCategories.Count Then
          For Each sKat In aCategories
            If dsk.Categories.Exist(sKat) Then
              oDsk.Add(dsk)
              Break
            Endif
          Next
        Else
        Endif
      Next
    Next
  Endif
  Select Desktop.Type
    Case "KDE"
      sDef = User.Home &/ ".config/kde-mimeapps.list"
    Case "LXQT"
      sDef = User.Home &/ ".config/lxqt-mimeapps.list"
    Case "GNOME", "MATE", "ENLIGHTENMENT", "WINDOWMAKER", "XFCE"
      sDef = User.Home &/ ".config/mimeapps.list"
  End Select
  If Exist(sDef) Then
    Select Stat(sDef).Type
      Case gb.File, gb.Link
        ad = Split(File.Load(sDef), "\n")
        If ad.Count > 0 Then
          For Each sl In ad
            If InStr(sl, "=") > 0 Then
              sMime = Split(sl, "=")[0]
              sApps = Split(sl, "=")[1]
              If InStr(sApps, ";") Then
                For Each sApp In Split(sApps, ";")
                  If sApp <> "" Then
                    For Each xapp In oDsk
                      If File.Name(xapp.Path) = sApp Then
                        oDsk2.Add(xapp)
                      Endif
                    Next
                  Endif
                Next
              Endif
            Endif
          Next
        Endif
    End Select
    For Each xapp In oDsk
      If Not oDsk2.Exist(xapp) Then
        oDsk2.Add(xapp)
      Endif
    Next
  Else
    oDsk2 = oDsk
  Endif
  Return oDsk2
End

Para llamar la función hay dos parámetros que se le deben pasar, mas bien uno solo, el segundo es opcional pero en ocasiones es necesario si se desea filtrar aplicaciones que no pintan nada en el asunto.
Por ejemplo yo tenia que abrir un directorio en el gestor de archivos y aparecía EasyTag, el programa de edición de metadatos de los mp3.

Código:
    o = System.DeskApp2(["text/plain"], ["TextEditor"]) ' Con esto llamo la funcion, le paso los parametros en forma de 2 String[] y luego con la lista de objetos puedo obtener los datos
    Print o[0].ProgramName
    Print o[0].Name
tincho 18-02-2024, 23:29
A raíz de una función que estoy optimizando con la finalidad de detectar las aplicaciones por defecto para diferentes archivos necesito recabar informacion de otros sistemas.
Concretamente donde se encuentran los archivos mimeapps.list en cada distribución y escritorio.
Solo se donde se encuentra en XFCE que es el escritorio que uso yo.
A ver si me pueden decir en vuestra distro donde están esos archivos y si en KDE por ejemplo se llama kde-mimeapps.list y cosas así.
Dentro del archivo hay algo como:
[Added Associations]
image/jpeg=bar.desktop;baz.desktop
video/H264=bar.desktop
[Removed Associations]
video/H264=baz.desktop
[Default Applications]
image/jpeg=foo.desktop

Gracias.
Páginas (560):    1 102 103 104 105 106 560   
Bienvenido, Invitado
Tienes que registrarte para poder participar en nuestro foro.
Recordarme?
Miembros: 288
Último miembro: shoUsho
Temas del foro: 1,729
Mensajes del foro: 8,985
Últimos temas
Paren...WAIT !!!
Foro: Aplicaciones/Fragmentos de Código
Último mensaje por: guizans, 25-08-2025, 14:49
Respuestas: 3 - Vistas: 420
GambOS
Foro: General
Último mensaje por: guizans, 20-08-2025, 13:58
Respuestas: 0 - Vistas: 283
Gambas y Wayland
Foro: General
Último mensaje por: guizans, 20-08-2025, 13:56
Respuestas: 6 - Vistas: 566
Odio a gb.Report
Foro: General
Último mensaje por: guizans, 19-08-2025, 10:40
Respuestas: 8 - Vistas: 921
Powered By MyBB, © 2002-2025 MyBB Group.
Made with by Curves UI.