Estoy usando un extended RichTextbox que se llama "RichtextboxLinks", con ese control puedo usar el método ".InsertLink" para insertar Filelinks en el richtextbox,
y abrirlos diréctamente usando el click izquierdo dle ratón.
RichTextboxLinks > http://www.codeproject.com/Articles/9196/Links-with-arbitrary-text-in-a-RichTextBox
Lo que quiero hacer es abrir los filelinks con el click derecho en lugar de usar click izquierdo, y quiero que antes se muestre un menú contextual para seleccionar la acción a realizar,
el menú contextual contiene estos dos elementos:
1. Open file in explorer
2. Open file with...
El problema es que no tengo ni idea de como hacerlo. he intentado añadir el handle del evento junto al contextmenu pero me dice que la firma es incompatible para el handle del "InsertLink".
Este es el sub que tengo y que maneja el evento cuando un "FileLink" se clicka con el botón izquierdo dle ratón:
(e.LinkText contiene el text del FileLink)
' This event happens when a FileLink is clicked
Private Sub results_box_LinkClicked_1(sender As Object, e As LinkClickedEventArgs) Handles results_box.LinkClicked ' I can't add here a handle for the contextmenu: "results_box.ContextMenu" but anyway I don't know if that is the way to do it
NewMenu.show
' Dim FileInformation = My.Computer.FileSystem.GetFileInfo(e.LinkText)
' Process.Start("explorer.exe", " /select," & FileInformation.DirectoryName & "\" & FileInformation.Name)
End Sub
PD: Más info aquí: http://stackoverflow.com/questions/13994639/contextmenu-in-a-richtextbox-for-open-a-filelink#comment19317914_13994639
(http://i.stack.imgur.com/xCTEx.jpg)
Me he partido la cabeza un rato buscando como hacerlo :xD pero aquí está y funciona perfecto :P
En un proyecto Form, con un Form llamado 'Form1', un ContextMenuStrip con un Item llamado 'AbrirToolStripMenuItem' y de Texto 'Abrir' y un RichTextBox con rutas de prueba...
El código está completamente comentado ;D
Public Class Form1
'Ruta: Variable que guarda la ruta a la que le hemos hecho segundo click'
Public Ruta As String
'Este evento se da antes que Opening'
Private Sub RichTextBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles RichTextBox1.MouseDown
'Si el evento se dio con el segundo click'
If e.Button = Windows.Forms.MouseButtons.Right Then
'Palabra: Variable que almacenara la palabra a la que le hemos dado segundo click'
Dim Palabra As String = ""
'Index: Index más cercano al Char en el RichTextBox al que le hemos dado click'
Dim Index As Integer = RichTextBox1.GetCharIndexFromPosition(e.Location)
'Comienzo: Variable que almacena el Index dónde comienza la palabra'
Dim Comienzo As Integer = Index
'Final: Variable que almacena el Index dónde termina la palabra'
Dim Final As Integer = Index
'Mientras que el Char en la posición Comienzo sea diferente de espacio y restarle uno'
'nos matenga aún en un Index existente, retrocemos en el texto.'
While RichTextBox1.Text(Comienzo) <> " " And Comienzo - 1 > -1
Comienzo -= 1
End While
'Si el carácter en Comienzo es espacio, avanzamos un Index.'
If RichTextBox1.Text(Comienzo) = " " Then
Comienzo += 1
End If
'Usamos Char.IsControl para buscar el salto de línea.'
'Mientras que el Char el la posición Final no sea un salto de línea y sumarle uno'
'nos mantenga en un Index existente, avanzamos un espacio.'
While Not Char.IsControl(RichTextBox1.Text(Final)) And Final + 1 < RichTextBox1.TextLength
Final += 1
End While
'Si el carácter en Final no es salto de línea, avanzamos un Index.'
If Not Char.IsControl(RichTextBox1.Text(Final)) Then
Final += 1
End If
'La palabra está desde el Comienzo y su longitud es Final - Comienzo.'
Palabra = RichTextBox1.Text.Substring(Comienzo, Final - Comienzo)
'Pasamos la Palabra a la variable global Ruta'
Ruta = Palabra
End If
End Sub
Private Sub AbrirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AbrirToolStripMenuItem.Click
Process.Start(Ruta) 'Iniciamos la Ruta.
End Sub
Private Sub ContextMenuStrip1_Opening(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ContextMenuStrip1.Opening
'Se cancela si el archivo de la ruta no existe.
e.Cancel = Not IO.File.Exists(Ruta)
End Sub
End Class
Edito: Cambie la expresión regular por un File.Exists ya que estás trabajando con archivos.
Cita de: EleKtro H@cker en 22 Diciembre 2012, 15:48 PM
Estoy usando un extended RichTextbox que se llama "RichtextboxLinks", con ese control puedo usar el método ".InsertLink" para insertar Filelinks en el richtextbox,
y abrirlos diréctamente usando el click izquierdo dle ratón.
RichTextboxLinks > http://www.codeproject.com/Articles/9196/Links-with-arbitrary-text-in-a-RichTextBox
Lo que quiero hacer es abrir los filelinks con el click derecho en lugar de usar click izquierdo, y quiero que antes se muestre un menú contextual para seleccionar la acción a realizar,
el menú contextual contiene estos dos elementos:
1. Open file in explorer
2. Open file with...
El problema es que no tengo ni idea de como hacerlo. he intentado añadir el handle del evento junto al contextmenu pero me dice que la firma es incompatible para el handle del "InsertLink".
Este es el sub que tengo y que maneja el evento cuando un "FileLink" se clicka con el botón izquierdo dle ratón:
(e.LinkText contiene el text del FileLink)
' This event happens when a FileLink is clicked
Private Sub results_box_LinkClicked_1(sender As Object, e As LinkClickedEventArgs) Handles results_box.LinkClicked ' I can't add here a handle for the contextmenu: "results_box.ContextMenu" but anyway I don't know if that is the way to do it
NewMenu.show
' Dim FileInformation = My.Computer.FileSystem.GetFileInfo(e.LinkText)
' Process.Start("explorer.exe", " /select," & FileInformation.DirectoryName & "\" & FileInformation.Name)
End Sub
PD: Más info aquí: http://stackoverflow.com/questions/13994639/contextmenu-in-a-richtextbox-for-open-a-filelink#comment19317914_13994639
(http://i.stack.imgur.com/xCTEx.jpg)
te lo dire denuevo usa el objeto fastcoloredtextbox y usa delegados :) y hara todo lo que tu desees y mucho mas
investiga 1 poquito :P el richtextbox no tiene la suficiente dinamica para realizar lo q tu quieres de manera optima
esto es lo malo de dar todo resuelto, pero toma
Private Sub FastColoredTextBox3_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles FastColoredTextBox3.MouseMove
Dim p As Place = FastColoredTextBox3.PointToPlace(e.Location)
If CharIsHyperlink(p) Then
FastColoredTextBox3.Cursor = Cursors.Hand
Else
FastColoredTextBox3.Cursor = Cursors.IBeam
End If
End Sub
Private Function CharIsHyperlink(ByVal place As Place) As Boolean
Dim mask = FastColoredTextBox3.GetStyleIndexMask(New Style() {blueStyle})
If place.iChar < FastColoredTextBox3.GetLineLength(place.iLine) Then
If (FastColoredTextBox3(place).style And mask) <> 0 Then
Return True
End If
End If
Return False
End Function
Private Sub FastColoredTextBox3_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles FastColoredTextBox3.MouseDown
Dim p As Place = FastColoredTextBox3.PointToPlace(e.Location)
If CharIsHyperlink(p) Then
If MsgBox("Estas Accediendo a un enlace fuera del software, desea continuar con la operacion?", vbQuestion + vbYesNo, StringResources.msgboxPREGUNTA) = MsgBoxResult.Yes Then
Dim url As String = FastColoredTextBox3.GetRange(p, p).GetFragment("[\S]").Text
Process.Start(url)
Else
End If
End If
End Sub
@spiritdead
No te equivoques conmigo! no soy el típico lammer que lo busca todo hecho, pero si la manera de hacerlo,
yo intento informarme primero en Google en MSDN y en Stackoverf... otra cosa es que no encuentre información xD.
Lo que pasa es que aún hay algún control que se escapa a mi comprensión o que desconozco, hasta que llega alguien como tú y me dice "tienes que usar fastcoloredtextbox" (es decir, un listview),
por ejemplo haste hace pocos días no sabía muy bien que era el listview ni lo que se podía hacer con él, porque nunca lo había usado, pero en cuanto me dijiste que lo que debía usar era un listview me puse a investigar y lo resolví yo solo:
(http://img37.imageshack.us/img37/7135/prtscrcapture2m.jpg)
Eso sí, es un listview normal, porque yo no tenía ni p*** idea de como crear el modelo de objeto para un fastcoloredtextbox :xD, así que me guardo tu ejemplo que me puede servir para otra ocasión,
gracias!
@Keyen
Lo mismo te digo, al final lo resolví con un listview pero tu esfuerzo no queda en vano porque tu ejemplo me puede servir para otra ocasión,
Muchísimas gracias.