Shell 22-09-2024, 12:38
Buenas!

La idea central del ejemplo es cargar y mostrar una imagen en su control Picturebox, sin importar su tamaño.
La imagen puede ser más pequeña o más grande que el propio formulario.

El ejemplo mostrará la imagen y recordará mediante los settings, la imagen (su ruta, nombre).
Así ademas podemos abrir el dialogo en la última ruta donde estuvimos. Si es que queremos ver más imágenes.

Este es el formulario

[Imagen: RKR2e1g.png]

Aquí su distribución:

Código:
Public Sub MostrarImagen(unaimagen As Picture)

  'Aquí se encuentra toda la distribución de los organizadores/contenedores del formulario
  'He dejado a posta el borde activo para ver como se muestra el espacio ocupado

  With Me
    .Center()
    .Arrangement = Arrange.Horizontal
    .Spacing = True
    .Margin = True
  End With

  With Panel1
    .Arrangement = Arrange.Vertical
    .Spacing = True
    .Margin = True
    .Border = Border.Plain
  End With

'Contenedor padre del PictureBox
  With Panel2
    .Arrangement = Arrange.Horizontal
    .Expand = True
  End With

  With PictureBox1
    .Border = Border.Plain
    .Picture = unaimagen
    .Expand = True
    .Mode = PictureBox.Contain 'La imagen se estrecha para que se ajuste a su contenedor
  End With

  'El efecto de maximizar puede cambiar la distribución de la imagen y mostrarse de un tamaño distinto o su ajuste en su contenedor

End

Y aquí todo el código completo del ejemplo:

Código:
Private nomimagen As String
Private rutadeimagenes As String

Public Sub Form_Open()

  Dim unaimagen As Picture

  Me.Title = "Ejemplo con Organizadores"

  Settings.Read(Me)

  'Imagen por defecto
  nomimagen = Settings["Imagen", "Gambas3.png"]
  rutadeimagenes = File.RealPath(nomimagen)

  unaimagen = Picture.Load(nomimagen)
  MostrarImagen(unaimagen)

End

Public Sub MostrarImagen(unaimagen As Picture)

  'Aquí se encuentra toda la distribución de los organizadores/contenedores del formulario
  'He dejado a posta el borde activo para ver como se muestra el espacio ocupado

  With Me
    .Center()
    .Arrangement = Arrange.Horizontal
    .Spacing = True
    .Margin = True
  End With

  With Panel1
    .Arrangement = Arrange.Vertical
    .Spacing = True
    .Margin = True
    .Border = Border.Plain
  End With

  With Panel2
    .Arrangement = Arrange.Horizontal
    .Expand = True
  End With

  With PictureBox1
    .Border = Border.Plain
    .Picture = unaimagen
    .Expand = True
    .Mode = PictureBox.Contain 'La imagen se estrecha para que se ajuste a su contenedor
  End With

  'El efecto de maximizar puede cambiar la distribución de la imagen y mostrarse de un tamaño distinto o su ajuste en su contenedor

End

Public Sub btLoadPicture_Click()

  Dim unaimagen As Picture

  Dialog.Title = Application.Name & ": Selecciona archivo"
  Dialog.Filter = ["*.jpg;*.jpeg;*.png;*.bmp;*.ico;*.xpm", "Ficheros de imágenes"]
  Dialog.Path = rutadeimagenes
  If Dialog.OpenFile() Then Return
  nomimagen = Dialog.Path
  unaimagen = Picture.Load(nomimagen)
  MostrarImagen(unaimagen)

End

Public Sub btnExit_Click()

  Me.Close

End

Public Sub Form_Close()

  Settings.Write(Me)
  Settings["Imagen"] = nomimagen
  Settings.Save()

End

Se debe probar con distintas imágenes para ver que hace con las dimensiones.
Por defecto he usado la del logo de Gambas3. Pero se puede usar otras del pc, cargando la que os interese.

Saludos
Archivos adjuntos
.gz
EjemploContenedoresYPropiedades-0.0.1.tar.gz (Tamaño: 36.73 KB Descargas: 0)
omoreno 20-09-2024, 17:22
Hola colegas.

Estoy verificando una conexión ODBC a SQL Server pero la consultas y procedimientos almacenados ejecutados con EXEC que tengan validación siempre me retornan el error: 'UNABLE TO FETCH ROW'.

Gambas: 3.19.4
ODBC: FreeTDS o Microsoft ODBC 18
SQL Server: 2022 Express

Como retornan datos en sus procedimientos almacenados para que no les salga el error.
Por ejemplo, si quiero hacer un update de esta forma:
 
Código:
 
IF EXISTS (SELECT ID FROM Usuarios WHERE ID = '1')
  BEGIN
    UPDATE Usuarios 
    SET Nombre = 'Nombre x', Apellido = 'Apellido x'
    WHERE ID = '1'
    SELECT '1:ok' AS 'RESULTADO'
  END
ELSE
  BEGIN
    SELECT '0:NO EXISTE' AS 'RESULTADO'
  END

Adjunto un modulo de pruebas, gracias por las posibles repuestas.
Saludos.
Archivos adjuntos
.gz
SqlSeverODBC-0.0.1.tar.gz (Tamaño: 10.62 KB Descargas: 0)
Shell 20-09-2024, 14:58
Buenas!

Viendo un ejemplo para la terminal me dio por hacerlo con formularios, añadirle la posibilidad de
poder pasar información entre los formularios y agregar la posibilidad de grabar al salir
la información en un archivo setting.

El ejemplo consiste en una recepción de una consulta médica.
Se agregan nombres de pacientes y se van llamando a estos según van llegando.
Ah y si queda alguno y se ha cerrado la consulta, que vuelva mañana.

[Imagen: OPw3mse.png]

Los nombres de los pacientes no se eliminan de la lista hasta pasar el tiempo estipulado.
Van en orden de llegada.

Si cerramos la aplicación se guarda la lista de pacientes que no fueron atendidos.

Creo que la forma de pasar información de un formulario a otra es la más adecuada,
aunque sea poca en este caso.

Formulario FMain:

Código:
' Gambas class file

Const TITULO As String = "Recepción de la consulta"
Const TIEMPOMAXCONSULTA As Integer = 5

Private tiempo As Integer
Property nombre As String Use $nombre

Public Sub Form_Open()

  Settings.Read(Me)

  lstboxPacientes.List = Settings["ListaPacientes", []]

  'No se puede llamar a pacientes si no existen
  If lstboxPacientes.Count = 0 Then btnCallNext.Enabled = False

End

Public Sub Opciones_Click()

  Select Case Last.tag
    Case 0
      'Añadir un nuevo paciente
      RegistrarPaciente()
    Case 1
      If lstboxPacientes.Count >= 1 Then
        Timer1.Delay = 1000
        Timer1.Start
        'Si ya no hay más pacientes, desactivamos la opción de llamar a otros pacientes
        If lstboxPacientes.Count = 0 Then btnCallNext.Enabled = False
      Endif
    Case 2
      Me.Close
  End Select

End

Public Function RegistrarPaciente() As String

  Dim fpaciente As New FormPaciente

  fpaciente.formu = Me
  fpaciente.ShowModal()

  lstboxPacientes.Add(Me.nombre)
  If Not btnCallNext.Enabled Then btnCallNext.Enabled = True

End

Public Sub Timer1_Timer()

  If tiempo = TIEMPOMAXCONSULTA Then
    lstboxPacientes.Remove(0)
    If lstboxPacientes.Count = 0 Then btnCallNext.Enabled = False
    tiempo = 0
    Me.Title = TITULO
    Timer1.Stop
  Else
    Me.Title = "Paciente: " & lstboxPacientes.List.First & " en la consulta..." & tiempo
    tiempo += 1
  Endif

End

Public Sub Form_Close()

  Settings.Write(Me)
  Settings["ListaPacientes"] = lstboxPacientes.List
  Settings.Save()

End

Formulario de entrada del nombre del paciente

Código:
Property formu As Object Use $formu

Public Sub Form_Open()

End

Public Sub btnEntrarSalir_Click()

  If IsNull(Trim(txtbPaciente.text)) Then
    txtbPaciente.Text = ""
    Stop Event
  Else
    $formu.nombre = Trim(txtbPaciente.Text)
    Me.Close
  Endif

End

Public Sub txtbPaciente_KeyPress()

  If Key.Code = Key.Enter Or Key.Code = Key.Return Then btnEntrarSalir_Click()

End

Para alinear mejor los controles y situarlos en el formulario del paciente, usé organizadores.

Puede darse el caso cuando ejecutamos un formulario es que veces cuando se presentan
los controles ( incluso usando organizadores) estos queden más a un lado que otro con respecto
al superior. Esto es a veces es una lata y requiere algo de tiempo. Rolleyes

Saludos
Archivos adjuntos
.gz
HabitacionEsperaDoctor-0.0.2.tar.gz (Tamaño: 7.82 KB Descargas: 3)
Páginas (573):    1 65 66 67 68 69 573   
Bienvenido, Invitado
Tienes que registrarte para poder participar en nuestro foro.
Recordarme?
Miembros: 314
Último miembro: LKTFermin2
Temas del foro: 1,769
Mensajes del foro: 9,182
Últimos temas
Programando con la IA
Foro: General
Último mensaje por: seta43, 30-07-2026, 12:20
Respuestas: 12 - Vistas: 7,677
GauchoCAD vuelve a las pi...
Foro: Aplicaciones/Fragmentos de Código
Último mensaje por: tincho, 27-07-2026, 14:15
Respuestas: 15 - Vistas: 20,886
Powered By MyBB, © 2002-2026 MyBB Group.
Made with by Curves UI.