martes, 23 de marzo de 2010

Ejemplo simple de Formularios Mdi en vb.net

Simple código fuente de muestra en visual basic.net que usa un formulario MDI para abrir y crear archivos de texto
El mismo consta de un form Mdi principal que tiene la opción para crear un nuevo formulario Mdi Child, creando una nueva instancia ( en este caso de formulario frmDoc) .
Este form tiene un Richtextbox donde se puede cargar o crear un archivo de texto. Para leer el documento se usa el método Loadfile y para guardarlo con saveFile

Para crear la nueva instancia del Child Form, se asigna a la propiedad MdiParent del child form al MDI .. en el momento de crearlo.
Para hacer referencia al frm Child activo, (ya que puede haber varios abiertos al mismo tiempo ), hay una variable pública de tipo form ( el from frmDoc ) llamado FrmActivo, que se establece en el evento Activated



Código fuente del MDI
Option Explicit On
Option Strict On

Imports System.Windows.Forms
Imports System.IO

Public Class MDIParent1
' cantidad de Mdi children
Private Child_Count As Integer = 0

Private Sub Crear_Nuevo_Formulario(ByVal sender As Object, _
ByVal e As EventArgs)Handles NewToolStripMenuItem.Click, _
NewToolStripButton.Click,NewWindowToolStripMenuItem.Click
' Crea una nueva instancia de FrmDoc
Crear_Mdi_Child()

End Sub

' crea un nuevo MdiChild
Sub Crear_Mdi_Child(Optional ByVal Ruta As String = "")

' Nueva instancia del formulario secundario ( FrmDoc )
Dim Child_form As New FrmDoc

' Lo asigna a este formulario MDI
Child_form.MdiParent = Me

' Variable con la cantidad de documentos que se crearon
Child_Count += 1

' nuevo doc
If Ruta = "" Then
Child_form.Text = "Nuevo documento " & Child_Count
Else
Child_form.Text = Ruta ' Ruta en el title bar
End If

Child_form.Show() ' lo muestra
End Sub

Private Sub OpenFile(ByVal sender As Object, _
ByVal e As EventArgs)Handles OpenToolStripMenuItem.Click, _
OpenToolStripButton.Click

' nuevo objeto OpenFileDialog
Dim OpenFileDialog As New OpenFileDialog

With OpenFileDialog
' filtro - archivos txt
.Filter = "Archivos de texto (*.txt)|*.txt|Todos los archivos (*.*)|*.*"
'.. abre el dlg
If (OpenFileDialog.ShowDialog(Me) = System.Windows.Forms.DialogResult.OK) Then
'Asigna el path
Dim ruta_archivo As String = OpenFileDialog.FileName

Try
If frmActivo Is Nothing Then
' Si no hay un mdi Child activo, crea uno nuevo y carga el fichero
Crear_Mdi_Child(OpenFileDialog.FileName)
End If
With frmActivo
' carga el documento de texto en el RichTextbox del frm activo
.rtb.LoadFile(ruta_archivo, RichTextBoxStreamType.PlainText)
.Text = ruta_archivo ' path en el title bar
End With
' error
Catch oe As Exception
MsgBox(oe.Message.ToString, MsgBoxStyle.Critical)
End Try
End If
End With
End Sub

' Guardar documento como ...
Private Sub SaveAsToolStripMenuItem_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles SaveAsToolStripMenuItem.Click

If Not frmActivo Is Nothing Then
frmActivo.Guardar_como()
Else
MsgBox("No hay documentos para guardar", MsgBoxStyle.Exclamation)
End If
End Sub

' Finalizar la aplicación
Private Sub ExitToolsStripMenuItem_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles ExitToolStripMenuItem.Click
Global.System.Windows.Forms.Application.Exit()
End Sub

Private Sub CutToolStripMenuItem_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles CutToolStripMenuItem.Click
MsgBox("Falta código")
End Sub

Private Sub CopyToolStripMenuItem_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles CopyToolStripMenuItem.Click
MsgBox("Falta código")
End Sub

Private Sub PasteToolStripMenuItem_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles PasteToolStripMenuItem.Click
MsgBox("Falta código")
End Sub

' forms en cascada
Private Sub CascadeToolStripMenuItem_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles CascadeToolStripMenuItem.Click

Me.LayoutMdi(MdiLayout.Cascade)

End Sub

' Organiza los formularios en cascada Vertical
Private Sub TileVerticleToolStripMenuItem_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles TileVerticalToolStripMenuItem.Click
Me.LayoutMdi(MdiLayout.TileVertical)
End Sub

' Organiza los formularios en cascada Horizontal
Private Sub TileHorizontalToolStripMenuItem_Click(ByVal sender As Object, _
ByVal e As EventArgs)Handles TileHorizontalToolStripMenuItem.Click

Me.LayoutMdi(MdiLayout.TileHorizontal)

End Sub

' organiza los formularios
Private Sub ArrangeIconsToolStripMenuItem_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles ArrangeIconsToolStripMenuItem.Click

Me.LayoutMdi(MdiLayout.ArrangeIcons)

End Sub

' Cierra todos los formularios MdiChild abiertos
Private Sub CloseAllToolStripMenuItem_Click(ByVal sender As Object, _
ByVal e As EventArgs)Handles CloseAllToolStripMenuItem.Click, ToolStripMenuItem1.Click

For Each ChildForm As Form In Me.MdiChildren
ChildForm.Close()
Next
End Sub

' guarda el documento
Private Sub MenuToolBarGuardar(ByVal sender As System.Object,ByVal e As System.EventArgs) _
Handles SaveToolStripButton.Click,SaveToolStripMenuItem.Click
If Not frmActivo Is Nothing Then
frmActivo.Guardar()
Else
MsgBox("No hay documentos para guardar. Crear uno nuevo " & _
"o Abrir un txt existente", MsgBoxStyle.Exclamation)
End If
End Sub

Private Sub SelectAllToolStripMenuItem_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs)Handles SelectAllToolStripMenuItem.Click
MsgBox("Falta agregar código", MsgBoxStyle.Information)
End Sub

Private Sub MDIParent1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

Me.Text = "Ejemplo simple de MDI en vb.net "

End Sub
End Class
Module Module1
Public frmActivo As FrmDoc
End Module

Código fuente del form Child ( FrmDoc )
Public Class FrmDoc
' flag para cuando se cancela el CommonDialog
Private m_Cancelar As Boolean
' Flag para saber si cambió el documento
Private m_Changed As Boolean

' Activación del Form
Private Sub FrmDoc_Activated(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Activated
' referencia al formulario activo cuando se dispara el Activated
frmActivo = Me
End Sub

' descarga del form
Private Sub FrmDoc_FormClosing(ByVal sender As Object, _
ByVal e As System.Windows.Forms.FormClosingEventArgs) _
Handles Me.FormClosing

Dim ret As Windows.Forms.DialogResult
' si no se cambió ..sale
If m_Changed = False Then
frmActivo = Nothing
Exit Sub
End If
' .. guardar ??
ret = MsgBox("¿ Guardar los cambios al documento: ?" & vbNewLine & Me.Text, _
MsgBoxStyle.YesNoCancel Or MsgBoxStyle.Question)

Select Case ret
' Si
Case Windows.Forms.DialogResult.Yes
Guardar()
If m_Cancelar Then
e.Cancel = True ' cancela la descarga
m_Cancelar = False ' Cancelar del OpenFileDialog
End If
' elimina esta instancia

frmActivo = Nothing
' No
Case Windows.Forms.DialogResult.No
frmActivo = Nothing
' Cancelar
Case Windows.Forms.DialogResult.Cancel
e.Cancel = True
End Select
End Sub

' Guardar documento como ...
Function Guardar_como() As Boolean
Dim SaveFiledialog As New SaveFileDialog

With SaveFiledialog
.Filter = "Archivos de texto (*.txt)|*.txt|Todos los archivos (*.*)|*.*"
Try
If .ShowDialog = Windows.Forms.DialogResult.OK Then
'Guardar
frmActivo.rtb.SaveFile(.FileName, RichTextBoxStreamType.PlainText)
m_Changed = False
Else
' Cancelar
m_Cancelar = True
End If
Catch oMen As Exception
MsgBox(oMen.Message, MsgBoxStyle.Critical)
End Try
End With
End Function

' guardar
Function Guardar() As Boolean
Try
' Si el documento existe, lo guarda
If System.IO.File.Exists(frmActivo.Text) = True Then
With frmActivo
.rtb.SaveFile(.Text, RichTextBoxStreamType.PlainText)
m_Changed = False
End With
' si no lo guarda como ...
Else
Guardar_como()
End If
Catch oMen As Exception
MsgBox(oMen.Message, MsgBoxStyle.Critical)
End Try
End Function

Private Sub rtb_KeyPress(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles rtb.KeyPress
' Flag que marca que se cambió el documento
m_Changed = True
End Sub

Private Sub FrmDoc_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
' Por si hubiese direcciones url en el archivo, para no detectarlas
With rtb
rtb.DetectUrls = False
End With
End Sub
End Class

No hay comentarios:

Publicar un comentario