Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - bybaal

#31
Tengo en el listview dos columnas y 20 items, cada item tiene un subitem. Cuando el index del elemento es menor o igual que el index de la última columna funciona bien, pero cuando el el index del elemento es mayor que el index de la última columna, ejemplo: doy docble clic en un item o subitem de index >=3 da el siguiente error:

Código (vbnet) [Seleccionar]

'InvalidArgument=El valor de '4' no es válido para 'index'.
'Nombre del parámetro: index
.Width = lv.Columns(hitTest.Item.Index).Width


Cita de: Eleкtro en  8 Enero 2016, 19:16 PM
Esa es una limitación del control ListView, por lo tanto es algo que debes implementar por ti mismo.

Te he escrito el siguiente ejemplo funcional (para editar una celda o subitem haz doble-click):
Código (vbnet) [Seleccionar]
   Friend WithEvents TextBoxLvItem As TextBox
   Private currentItem As ListViewSubItem

   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

       Me.TextBoxLvItem = New TextBox With {.Visible = False}
       Me.Controls.Add(Me.TextBoxLvItem)

   End Sub

   Private Sub ListView1_MouseClick(ByVal sender As Object, ByVal e As MouseEventArgs) _
   Handles ListView1.MouseClick

       Me.TextBoxLvItem.Hide()

   End Sub

   Private Sub ListView1_MouseDoubleClick(ByVal sender As Object, ByVal e As MouseEventArgs) _
   Handles ListView1.MouseDoubleClick

       Dim lv As ListView = DirectCast(sender, ListView)
       Dim hitTest As ListViewHitTestInfo = lv.HitTest(e.X, e.Y)
       Me.currentItem = hitTest.SubItem

       With Me.TextBoxLvItem
           .Width = lv.Columns(hitTest.Item.Index).Width
           .Left = (lv.Left + hitTest.SubItem.Bounds.Left + 3)
           .Top = (lv.Top + hitTest.SubItem.Bounds.Top)
           .Text = hitTest.SubItem.Text
           .Show()
           .Focus()
           .SelectAll()
       End With

       lv.SendToBack()

   End Sub

   Private Sub TextBoxLvItem_KeyUp(ByVal sender As Object, ByVal e As KeyEventArgs) _
   Handles TextBoxLvItem.KeyUp

       Select Case e.KeyData

           Case Keys.Return ' Guardar el texto.
               currentItem.Text = DirectCast(sender, TextBox).Text
               DirectCast(sender, TextBox).Hide()

           Case Keys.Escape ' No guardar el texto.
               DirectCast(sender, TextBox).Hide()

           Case Else
               '...

       End Select

   End Sub


PD: No actives el LabelEdit, no es necesario con el código que mostré.

Saludos
#32
Hola a todos, quisiera saber como permitir a los usuarios editar los subitems de un listview, ya que con la propiedad LabelEdit sólo se pueden editar los items, aquí les dejo un ejemplo para que se vea mejor

Código (vbnet) [Seleccionar]

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       Dim C As Integer

       ListView1.View = View.Details
       ListView1.Columns.Add("Items")
       ListView1.Columns.Add("SubItems", 70)
       ListView1.FullRowSelect = True
       ListView1.GridLines = True
       'A pesar que permito modificar los items,
       'no me lo permite para los subitems, que es lo que quiero hacer.
       ListView1.LabelEdit = True

       For C = 0 To 20
           ListView1.Items.Add("Prueba " & C)
           ListView1.Items(C).SubItems.Add("SubItem " & C)
       Next
   End Sub
#33
Ahora si quedó perfecto.

Muchas gracias por la ayuda y por aguantar tantas molestias

Cita de: Eleкtro en  2 Enero 2016, 22:13 PM
Código (vbnet) [Seleccionar]
Private ReadOnly title As String = "Espere"
Friend WithEvents TimerEfect As Global.System.Windows.Forms.Timer

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load

    Me.Text = Me.title
    Me.TimerEfect = New Global.System.Windows.Forms.Timer With {.Enabled = True, .Interval = 1000}

End Sub

Private Sub TimerEfect_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles TimerEfect.Tick

    If Me.Text.EndsWith("...") Then
        Me.Text = Me.title

    Else
        Me.Text &= "."

    End If

End Sub

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click

    Task.Factory.StartNew(
        Sub()
            Dim t As Task = RunWait("calc.exe", ProcessWindowStyle.Normal)
            t.Start()
            t.Wait()
            MessageBox.Show("calc.exe has exited.")

            t = RunWait("mspaint.exe", ProcessWindowStyle.Normal)
            t.Start()
            t.Wait()
            MessageBox.Show("mspaint.exe has exited.")
        End Sub)

End Sub

Private Function RunWait(ByVal fullPathFile As String, ByVal windowStyle As ProcessWindowStyle) As Task

    Dim processTask As Action =
        Sub()
            Using p As New Process
                p.StartInfo.FileName = fullPathFile
                p.StartInfo.WindowStyle = windowStyle
                p.Start()
                p.WaitForExit()
            End Using
        End Sub

    Return New Task(processTask)

End Function


Saludos
#34
Eso es exactamente lo que necesito, sólo queda un pequeño detalle, que para mi es el más problemático y para que puedan ayudarme, voy a tratar de explicar mejor lo que quiero hacer.

El programa ejecuta varias aplicaciones a lo largo de un procedimiento y es espera a que terminen cada una de ellas para poder continuar con el resto del código. Hasta aquí vamos bien con lo logrado hasta ahora, el problema es que mientras se espera a que las aplicaciones terminen un timer tiene que ir haciendo cambios en el formulario, como uso en el ejemplo cambiar el texto del titulo del form, pero puede ser cualquier otra cosa para indicar que el programa está funcionando, como pudiera ser también cambiar la imagen de un picturebox para mostrar una secuencia de imágenes de un reloj de arena.

Por ejemplo:

Código (vbnet) [Seleccionar]

Imports System.Threading.Tasks

Public Class Form1
    Dim WithEvents tmrEfect As New Timer With {.Enabled = True, .Interval = 1000}

    Private Function RunWait(ByVal fullPathFile As String, ByVal windowStyle As ProcessWindowStyle) As Task

        Dim processTask As Action =
            Sub()
                Using p As New Process
                    p.StartInfo.FileName = fullPathFile
                    p.StartInfo.WindowStyle = windowStyle
                    p.Start()
                    p.WaitForExit()
                End Using
            End Sub

        Return New Task(processTask)

    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim t As Task = RunWait("calc.exe", ProcessWindowStyle.Normal)
        t.Start()
        t.Wait()
        MessageBox.Show("calc.exe has exited.")

        t = RunWait("mspaint.exe", ProcessWindowStyle.Normal)
        t.Start()
        t.Wait()
        MessageBox.Show("mspaint.exe has exited.")
    End Sub

    Private Sub tmrEfect_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmrEfect.Tick
        Me.Text &= "."
        If Len(Me.Text) = 10 Then Me.Text = "Espere"
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Text = "Espere"
    End Sub
End Class


PD: Disculpen por la demora en responder.
#35
Siento tener que revivir este tema, pero la verdad es que a pesar de que el código funciona perfectamente, no he podido adaptarlo a lo que necesito, discúlpenme.

Anteriormente en VB6 yo usaba una función para ejecutar aplicaciones y esperar a que estas se cerrasen para continuar ejecutando el código de mi programa, sin que esto detuviera los timers que yo usaba en mi proyecto.

Ahora en VB.NET como adapto este código para poder usarlo varías veces seguidas dentro de un mismo evento.

Ejemplo:

Código (vbnet) [Seleccionar]
Imports System.Threading.Tasks

Public Class Form1

   Dim WithEvents tmrEfect As New Timer With {.Enabled = True, .Interval = 1000}

   Private Sub tmrEfect_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmrEfect.Tick
       Me.Text = Now
   End Sub

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       RunWait("calc.exe", ProcessWindowStyle.Normal)
       'Aquí necesito poner varias líneas de código de tienen que ejecutarse al cerrarce la calculadora
       MsgBox("aplicación calc.exe cerrada")

       RunWait("mspaint.exe", ProcessWindowStyle.Normal)
       'Aquí necesito poner varias líneas de código de tienen que ejecutarse al cerrarce el paint
       MsgBox("aplicación mspaint.exe cerrada")
   End Sub

   Private Sub RunWait(ByVal FullPathFile As String, ByVal WindowStyle As ProcessWindowStyle)
       Threading.Tasks.Task.Factory.StartNew(
           Sub()
               Using p As New Process
                   p.StartInfo.FileName = FullPathFile
                   p.StartInfo.WindowStyle = WindowStyle
                   p.Start()
                   p.WaitForExit()
               End Using
           End Sub, TaskCreationOptions.None)
   End Sub
End Class
#36
Ahora si funciona perfectamente, gracias por todo

Cita de: Eleкtro en 24 Diciembre 2015, 20:52 PM
A mi no se me ve, pero prueba así de todas formas:

Código (vbnet) [Seleccionar]
Public NotInheritable Class Form1 : Inherits Form

   Public Sub New()

       MyClass.InitializeComponent()
       Me.Size = Size.Empty
       Me.Opacity = 0.0R
       Me.ShowInTaskbar = False

   End Sub

   Private Sub RestoreWindow()

       Me.Size = Me.DefaultSize
       Me.Opacity = 1.0R
       Me.ShowInTaskbar = True

   End Sub

   Private Sub Form1_Shown(ByVal sender As Object, ByVal e As EventArgs) _
   Handles MyBase.Shown

       ' Me.RestoreWindow()

   End Sub

End Class


Saludos
#37
Funciona, pero el formulario se ve y después se oculta, por lo que no es un método muy eficiente

si hubiese otro modo en el que el formulario no se viese en ningún momento sería magnifico.

muchas gracias por la ayuda

Cita de: Eleкtro en 24 Diciembre 2015, 20:03 PM
En el evento Form.Load la ventana todavía no se ha llegado a componer completamente así que no tiene efecto que la intentes ocultar llamando al método Hide.

Puedes utilizar el evento Form.Shown

Código (vbnet) [Seleccionar]
Private Sub Form1_Shown(ByVal sender As Object, ByVal e As EventArgs) _
Handles MyBase.Shown

   Me.Hide()

End Sub


O también:
Código (vbnet) [Seleccionar]
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _
Handles MyBase.Load

   ' Me.Opacity = 0.0R
   Me.ShowInTaskbar = False
   Me.Visible = False

End Sub


Nota: También puedes asignar las propiedades deseadas en el constructor del Form.

Saludos
#38
Hola a todos, en VB 6 era muy fácil utilizar app.taskvisible y me.hide en el evento load del formulario inicial del proyecto para que no se mostrara el formulario, pero en VB.NET me.hide no esconde el formulario, me.visible = false, tampoco lo hace y no se de que forma hacer lo que se hacía con app.taskvisible

Antes en VB 6

Código (vbnet) [Seleccionar]
Private Sub Form_Load()
 App.TaskVisible = False
 Me.Hide
End Sub


Ahora en VB.NET 2010 como sería?

gracias a todos
#39
Disculpen la demora, el trabajo me impidió responder mas rápido.

El código de este enlace fue el que funcionó perfectamente, muchísimas gracias a todos

http://stackoverflow.com/questions/24817235/change-opacity-in-picturebox

    Public Shared Function ChangeOpacity(ByVal img As Image, ByVal opacityvalue As Single) As Bitmap
        Dim bmp As New Bitmap(img.Width, img.Height)
        Dim graphics__1 As Graphics = Graphics.FromImage(bmp)
        Dim colormatrix As New colormatrix
        colormatrix.Matrix33 = opacityvalue
        Dim imgAttribute As New ImageAttributes
        imgAttribute.SetColorMatrix(colormatrix, ColorMatrixFlag.[Default], ColorAdjustType.Bitmap)
        graphics__1.DrawImage(img, New Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, img.Width, img.Height, _
         GraphicsUnit.Pixel, imgAttribute)
        graphics__1.Dispose()
        Return bmp
    End Function

Cita de: DarK_FirefoX en 23 Diciembre 2015, 15:34 PM
Una solución medio brute-force es:

- Cargar la imagen en un tipo Bitmap

- Recorrer cada Pixel de la imagen con dos for (anidados)

- Obtener el Color que tiene el pixel y almacenarlo en un tipo Color. Utilizando:

Código (csharp) [Seleccionar]
//i, j son las variables iteradoras
//pic es el Bitmap con la imagen cargada
Color c = pic.GetPixel(i,j);


- Luego crear un tipo Color nuevo con el Alpha que quieras y el color obtenido de la imagen:

Código (csharp) [Seleccionar]
Color newC = Color.FromArgb(50, c); //50 es el Alpha

- Después setear este nuevo color en el mismo Pixel (i,j):

Código (csharp) [Seleccionar]
pic.SetPixel(newC, i, j);

- Al terminar de recorrer todos los Píxeles de la imagen:

Código (csharp) [Seleccionar]
pictureBox.Image = pic;




Si lo que te dijo @Eleкtro no te funciona, debe haber algo raro, responde sus preguntas. De todas formas revisa este link. Aquí utilizan el mismo código de @Eleкtro y le dan solución. Quizás te sirva de algo:

http://stackoverflow.com/questions/24817235/change-opacity-in-picturebox

Salu2s
#40
Lo siento mucho, pero la imagen sale completamente sin transparencia, no importa el porciento que se le ponga

Cita de: Eleкtro en 22 Diciembre 2015, 21:04 PM
Aquí tienes un ejemplo:

Código (vbnet) [Seleccionar]
Imports System.Drawing.Imaging

Public NotInheritable Class Form1 : Inherits Form

   Private srcImg As Image ' Source image.
   Private tmpImg As Image ' Transparent image.

   Public Sub New()
       MyClass.InitializeComponent()
       Me.srcImg = Bitmap.FromFile("C:\image.bmp")
   End Sub

   Private Sub Button1_Click() Handles Button1.Click

       If (Me.tmpImg IsNot Nothing) Then
           Me.tmpImg.Dispose()
       End If

       Me.tmpImg = Me.SetOpacity(Me.srcImg, 0.25) ' 25%
       Me.PictureBox1.BackgroundImage = Me.tmpImg

   End Sub

    Public Function SetOpacity(ByVal img As Image, ByVal opacity As Single) As Image

        If (opacity < 0.0F) OrElse (opacity > 1.0F) Then
            Throw New ArgumentOutOfRangeException(paramName:="opacity")

        Else
            Dim bmp As New Bitmap(img.Width, img.Height)

            Using g As Graphics = Graphics.FromImage(bmp)

                Dim matrix As New ColorMatrix
                matrix.Matrix33 = opacity

                Using ia As New ImageAttributes

                    ia.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap)
                    g.DrawImage(img, New Rectangle(0, 0, bmp.Width, bmp.Height),
                                0, 0, bmp.Width, bmp.Height,
                                GraphicsUnit.Pixel, ia)

                End Using

            End Using

            Return bmp

        End If

    End Function

End Class


Saludos