blog/editor-de-texto-tipo-notepad-en-visual-basic-60
Por Yal Publicidad
Publicado el Jue 25 de Febrero del 2021 a las 19:42
Hola en esta ocasión les explicaré como crear un editor de texto simple.
Para no hacer esto aburrido vamos a los hechos, Solo lean bien el contenido ya que ahí explico cada parte del código. Bien a Trabajar:
Primero creamos un Formulario, para mi caso lo llamaré EditorY. En el colocamos un TextBox(cambiar las propiedades multiLine = True y ScrollBars = 3 - Both), y un Menú con sus respectivos Sub-menús de esta forma:
Caption = &Nuevo Name = mnuNew ------------------------ Caption = &Abrir Name = mnuOpen ------------------------ Caption = &Guardar Name = mnuSave ------------------------ Caption = Guar&dar Como... Name = mnuSaveAs ------------------------ Caption = Imprimir Name = mnuPrint ------------------------ Caption = &Salir Name = mnuExit ------------------------ Caption = &Copiar Name = mnuCopy ------------------------ Caption = C&ortar Name = mnuCut ------------------------ Caption = Pegar Name = mnuPaste ------------------------ Caption = Seleccionar Todo Name = mnuSelectAll ------------------------ Caption = Eliminar Name = mnuDelete ------------------------ Caption = Fuente Name = mnuFont
Me olvidaba de un componente... vayan al menú Proyecto->Componentes y seleccionen Microsoft Common Dialog control 6.0 (SP3) y en Proyecto-> Referencias seleccionamos Microsoft Word 9.0 Object Library
NOTA: Si deseas crear tu propio CommonDilog te explico al final como se hace un editor de texto parecido a notepad.
Aclaro que pueden poner el nombre que quieran al menú y sus submenús pero asegúrense de colocar cada código en sus respectivos menús. Estos nombres son los que yo estoy utilizando para este ejm.
Ahora vamos al formulario EditorY
Option Explicit Private Modificado As Boolean ?verifica si el texto se modifica o no como verdadero o falso ?FUNCION PUBLICA PARA PASAR EL CONTENIDO DE UN TEXTBOX WORD Public Sub AbrirWord_Click() 'Pasar el contenido del TextBox a Microsoft Word, para ello decimos que el documento de la aplicación de word contendra lo escrito en nuestro textBox Dim MSWord As New Word.Application Dim Documento As Word.Document Dim Parrafo As Paragraph Set Documento = MSWord.Documents.Add Set Parrafo = Documento.Paragraphs.Add Parrafo.Range.InsertAfter Text1.Text MSWord.Visible = True End Sub Private Sub Form_Load() Dim i As Long, tamFic As Long 'Llamamos a Crear Asociacion pasandole la ruta de nuestro Exe, _ luego la extención a registrar, una descripción , y el último es el _ path opcional para asociar la extención con un icono, que debe estar _ en una dll o será un icono personalizado en este ejm. ?Miicono.ico? y la extensión ?.yal?. CrearAsociacion App.Path & "" & App.EXEName, "yal", "Mi Documento Yal", "iconosmiicono.ico" ?App.Path (es la ruta del .exe ejm. C:Mi exe) y(&) y(&) App.EXEName (es el nombre del .exe ejm. EditorY.exe) lo que nos quedaria la ruta C:Mi exeEditorY.exe, tan facil como eso (para los que recien se inician en la programación de VB6). 'Ahora recibimos el valor de la linea de comandos, si es distinta de un a cadena vacia osea a nada entonces 'Leemos el archivo con el método FreeFile del TextBox, pasandole la ruta, al Command$ es la ruta del documento que contenga la extensión .yal o cualquier extensión que quieran registrar. If Command$ <> "" Then i = FreeFile ?Utilizamos el freeFile para abrir el Texto cuando hagamos doble click en el documento.yal Open Command$ For Input As I ?abrimos la ruta del Command$ en donde sea que este en Mis documento en C: o en donde este. tamFic = LOF(i) ?le decimos que el textbox abra el documento con la ruta command& utilizando el FreeFile Text1.Text = Input$(tamFic, i) Close i ?cerramos i Caption = Command$ & " ? Mi Editor" ?colocamos l nombre del documento en el caption del Formulario Modificado = False ?le decimos al textBox que no se modifique cuando abrimos el documento CommonDialog.FileName = Command$ ?le decimos al commonDialog que la ruta del archivo es igual a la ruta de Command$, esto para que cuando modifiques el documento lo siga guardando en el mismo y no se abra guardar como un documento que no existe. Else VerNuevoDoc 'Llamada a la operacion de nuevo documento en caso se abra el .exe sin utilizar un domento de extensión .yal, para que entiendan abrir EditorY.exe de forma normal y se coloque en el caption del formulario ?Mi Documento 1 ? Mi Editor? End If End Sub Private Sub Form_Unload(Cancel As Integer) ?Esta parte indica que al cerrar el formulario se preguntara si desea guardar los cambios si es que el texto se ha modificado o no mnuExit_Click ? Para ello nos vamos al menú salir donde se encuentra el código de salida End Sub Public Sub imprimeLineas(Texto As Object, Linea As Integer) ?Funcion para imprimir el texto del editor On Error GoTo NoImprimir ?el On Error nos sirve para enviar cualquier error que suceda al ejecutar el comando a una determinada función en este caso NoImprimir (puede ser cualquier nombre que deseen pero recuerden poner ese nombre al final de declarar toda la función en nuestro ejm NoImprimir:) Linea Then NumB = NumC Linea For i = 0 To NumB ? Para no complicarnos decimos que imprimimos de 0 lineas hasta las lineas que exista para todo esto utilizamos un bucle, estudien bien cada codigo puesto aquí Texto.SelStart = (Linea * i) Texto.SelLength = Linea Bloque = Texto.SelText Printer.Print Bloque Next i Else Printer.Print Texto.Text End If Printer.EndDoc NoImprimir: ?No imprime si sucede algun error End Sub Private Sub mnuAbrir_Click() On Error GoTo NoAbrir ?el On Error nos sirve para enviar cualquier error que suceda al ejecutar el comando a una determinada función en este caso NoAbrir (puede ser cualquier nombre que deseen pero recuerden poner ese nombre al final de declarar toda la función en nuestro ejm NoAbrir: y le podemos poner un mensaje el que queramos como lo veremos abajo) Dim sFile As String Dim i As Long, tamFic As Long With CommonDialog ?solo decimos que con(With) realizamos todas las funciones que contiene este componente. .DialogTitle = "Abrir Documento..." ?titulo del commondialod .FileName = sFile ?Nombre del Archivo, decimos que es igual a sFile, este para poder asignar la ruta al textBox 'Filter indicadores y atributos del control common dialog .Filter = "Mi Documento YAL (*.yal; *.txt)|*.yal; *.txt|Todos los archivos(*.*)|*.*" .ShowOpen ?abrimos el commonDialog If Len(.FileName) Then ? este punto ya lo explicamos en el Form_Load() sFile = .FileName i = FreeFile Open sFile For Input As i tamFic = LOF(i) Text1.Text = Input$(tamFic, i) Close i End If If Len(.FileName) = 0 Then ? en este punto decimos que si no hay ningun archivo el caption del formulario es igual al mismo nombre osea ?Mi documento 1 o sea el numero de documento en que estemos o sea el nombre del ducumento que tengamos abierto en ese momento, esto es para evitar errores cuando pulsemos cancelar y no escojamos ningun documento y no se coloque ningun nombre en el caption del Formulario? Caption = Caption Else ?si abrimos un documento se asignara el nombre(.FileTitle) del documento que abramos Caption = .FileTitle & " - Mi Editor" End If End With Modificado = False ?le decimos que el texto no se modifica cuando se abre Exit Sub NoAbrir: ?si hay error al abrir mandamos el contenido a Microsoft word, porque a Microsoft word... para que sepan como pasar un documento de texto en VB6 a word. If MsgBox (?El texto es demasiado grande para abrirlo con Mi Editor...? &vbCrLf & _ ¿desea abrirlo con Microsoft Word??, vbQuestion vbYesNo) = vbYes Then ?Mensaje si hay error en abrir AbrirWord ?llamada a función para abrir word End Sub Private Sub mnuCopy_Click() 'Copiar Texto Clipboard.Clear Clipboard.SetText Text1.SelText Text1.SetFocus End Sub Private Sub mnuCut_Click() 'Cortar Texto Clipboard.SetText Text1.SelText Text1.SelText = "" Text1.SetFocus End Sub Private Sub mnuEliminar_Click() 'Eliminar Texto Text1.SelText = "" End Sub Private Sub mnuExit_Click() If Modificado Then 'verificar si el texto esta Modificado, fijate bien en esto cuando presionamos salir preguntamos si esta modificado y si(If) en el mensaje presionamos Aceptar (vbYes) entonces se presionará guardar. If MsgBox("El documento ha sido modificado..." & vbCrLf & _ "¿Desea Guardar el documento antes de salir del editor?", vbQuestion vbYesNo) = vbYes Then mnuSave_Click End If End If End End Sub Private Sub mnuFont_Click() CommonDialog.flags = cdlCFBoth Or cdlCFEffects 'observar el tipo de fuente que tendra nuestro textBox CommonDialog.FontName = "Ms Sans Serif" CommonDialog.ShowFont If Err <> 32755 Then Text1.Font = CommonDialog.FontName Text1.ForeColor = CommonDialog.Color Text1.FontItalic = CommonDialog.FontItalic Text1.FontBold = CommonDialog.FontBold 'Aquí indicamos que la fuente del textbox es igual a la fuente del commonDialog, asi como el color ect,ect,ect... 'como te dije en un comienzo estudia bien los codigos puestos aquí ya que te los estoy explicando no es solo copiar y ya hay que saber porque va cada cosa por las....¡??@ no te estoy expklicando paso a paso todo ...Perdón pero es que me interesa que aprendan End If End Sub Private Sub mnuNew_Click() 'Si el texto se ha modificado preguntar si se guarda o no If Modificado Then ?si el texto se ha modificado preguntará si se guarda o no If MsgBox("El documento ha sido modificado..." & vbCrLf & _ "¿Desea guardar el documento?", vbQuestion vbYesNo) = vbYes Then ?si sale el mensaje de guardar verificar si se presiona aceptar(vbYes) si es igual a este entonces presionamos mnuSave(Guardar). Si no simplemente se pierde la información y generamos un nuevo documento ...como? lo veremos en un momento. mnuSave_Click End If End If 'Abrir Documento en blanco Text1.Text = "" 'Pone el texto en blanco, simplemente borra el contenido escrito en el. VerNuevoDoc ?Llama a la funcion que hace que aumente los numeros 1, 2, 3 etc. Recuerda que esto lo hace en el caption de Formulario. Modificado = False ?hace que el TextBox(Text1.Text) se vuelva a no modificado. CommonDialog.FileName = "" ?hace que el commondDialog no contenga ningun documento para que sea guardado como nuevo y no reemplace nuestro documento que habiamos trabajado anteriormente. End Sub Private Sub mnuPaste_Click() 'Pegar Texto Text1.SelText = Clipboard.GetText() Text1.SetFocus End Sub Private Sub mnuPrint_Click() 'Imprime X lineas, X es 60 en este ejmplo imprimeLineas Text1, 60 ?Llamamos a la funcion imprime lineas End Sub Private Sub mnuSave_Click() Dim sFile As String Dim i As Integer If Len(CommonDialog.FileName) = 0 Then ?Aquí decimos que si el commonDialog es igual a 0 osea que no contiene ningun achivo se abra el commonDialog con mnuSaveAs_Click ?el menu guardar como... Else ?y si hay un archivo abierto simplemente se omitira abrir guardar como y se guardara lo modificado el documento ya abierto con la funcion commonDialog.FileName i = FreeFile Open CommonDialog.FileName For Output As i Print #i, Text1.Text Close i End If mnuSave.Enabled = False ?colocamos el menu guardar a Enabled = False Modificado = False ?le decimos al editor que como se guardo no hay nada que quede modificado hasta que se vuelva a escribir en el. End Sub Private Sub mnuSaveAs_Click() On Error GoTo NoGuardar ?lo mismo explicado anteriormente que si hay error no guarde Dim sFile As String Dim i As Long With CommonDialog ?Esta función hace que el commondialog se abra siempre que queremos guardar un nuevo documento (estúdienlo bien ya que parte de este codigo ha sido explicado anteriormente). .DialogTitle = "Guardar Documento..." .FileName = sFile 'establecer los indicadores y atributos del control common dialog en Filter .Filter = "Mi Documento YAL (*.yal)|*.yal|Documento de texto (*.txt; *.wri)|*.txt; *.wri|Todos los archivos (*.*)|*.*" .ShowSave ?abre el commonDialog para guaradra documento. If Len(.FileName) Then ?recuerda que .FileName es la ubicación del archivo ejm. C:Mis documentosmi documento.yal. Que .FileTitle es el nombre del documento ejm. Mi documento.yal, asi que lo que nos quiere decir esto es que si(If) la longitud(Len) es .fileName(C:Mis do......) entonces(then) se guarda el documento con el FreeFile en la ubicación del .FileName sFile = .FileName i = FreeFile Open .FileName For Output As i Print #i, Text1.Text Close i End If If Len(.FileName) = 0 Then ?Aquí decimos que si se presiona cancelar y no se guarda el documento sigue conservando el nombre que tiene sea documento 1 o el nombre del documento con que se esta trabajando actualmente. Caption = Caption Else ? y si lo guardamos se colocara el nombre con que lo guardamos Caption = .FileTitle & " - Mi Editor" End If End With Modificado = False ? le decimos al textbox que ya no hay nada modificado NoGuardar: ? si hay error se viene aquí End Sub Private Sub mnuSelect_Click() 'Seleccionar todo el texto Text1.SetFocus Text1.SelStart = 0 Text1.SelLength = Len(Text1.Text) End Sub Private Sub VerNuevoDoc() 'Esta funcion hace que el nombre del nuevo documento aumente progresivamente 'Ejm. documento 1, documento 2,3,4.... ect, ect, cada vez que se presione Nuevo Documento. Static lDocumentCount As Long ?se crea un valor estatico lDocumentCount = lDocumentCount 1 ?se indica que el valor estatico sea igual a este mas 1, en pocas palabras que aumente cada vez que sea llamado. Caption = "Mi Documento " & lDocumentCount & " ? Mi Editor? ?Hacemos que el caption del formulario se escriba lo siguiente: Mi documento 1 ? Mi Editor. End Sub Private Sub Text1_Change() Modificado = True ?Aquí solo indicamos que si se modifica el texto Modificado cambia a verdadero lblGuardar.Enabled = True ? hace que le quite el enabled al menú guardar End Sub
EN UN MODULO .BAS COPIA LO SIGUIENTE y como te dije analiza lo que va aquí.
Option Explicit 'Funciones Api para leer, abrir, cerrar y escribir en el registro Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long Public Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, ByVal lpSecurityAttributes As Long, phkResult As Long, lpdwDisposition As Long) As Long Public Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long Public Declare Function RegSetValueExString Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpValue As String, ByVal cbData As Long) As Long Public Declare Function RegSetValueExLong Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpValue As Long, ByVal cbData As Long) As Long 'Constantes varias para las funciones Api del registro Public Const REG_SZ As Long = 1 Public Const REG_DWORD As Long = 4 Public Const HKEY_CURRENT_USER = &H80000001 Public Const HKEY_LOCAL_MACHINE = &H80000002 Public Const HKEY_USERS = &H80000003 Public Const ERROR_NONE = 0 Public Const ERROR_BADDB = 1 Public Const ERROR_BADKEY = 2 Public Const ERROR_CANTOPEN = 3 Public Const ERROR_CANTREAD = 4 Public Const ERROR_CANTWRITE = 5 Public Const ERROR_OUTOFMEMORY = 6 Public Const ERROR_INVALID_PARAMETER = 7 Public Const ERROR_ACCESS_DENIED = 8 Public Const ERROR_INVALID_PARAMETERS = 87 Public Const ERROR_NO_MORE_ITEMS = 259 Public Const KEY_ALL_ACCESS = &H3F Public Const REG_OPTION_NON_VOLATILE = 0 Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal _ hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long Public Declare Function OSRegOpenKey Lib "advapi32" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpszSubKey As String, phkResult As Long) As Long Global Const HKEY_CLASSES_ROOT = &H80000000 Public Const ERROR_SUCCESS = 0& Private Declare Sub SHChangeNotify Lib "shell32.dll" _ (ByVal wEventId As Long, _ ByVal uFlags As Long, _ dwItem1 As Any, _ dwItem2 As Any) Const SHCNE_ASSOCCHANGED = &H8000000 Const SHCNF_IDLIST = &H0& Public Sub CrearAsociacion(RutadelExe As String, EXT As String, Descripción As String, LibreriaIcono As String) ?Aquí decimos que RutadelExe es igual a donde estara ubicado nuestro .exe, EXT es la extensión que utilizaremos y descripción es la descripción que va como identificador del documento ejemplo documento.yal su descripción es Documento de YAL, y libreríaIcono es el icono que tendra nuestro documento .yal Dim sPath As String sPath = App.Path & "" & "EditorY.exe" & " %1" CreateNewKey "." & EXT, HKEY_CLASSES_ROOT SetKeyValue "." & EXT, "", RutadelExe, REG_SZ CreateNewKey RutadelExe & "shellopencommand", HKEY_CLASSES_ROOT CreateNewKey RutadelExe & "DefaultIcon", HKEY_CLASSES_ROOT SetKeyValue RutadelExe, "", Descripción, REG_SZ SetKeyValue RutadelExe & "shellopencommand", "", sPath, REG_SZ SetKeyValue RutadelExe & "DefaultIcon", "", LibreriaIcono, REG_SZ SHChangeNotify SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0 End Sub ?Ahora las funciones para el registro Private Sub CreateNewKey(sNewKeyName As String, lPredefinedKey As Long) 'handle para la nueva clave Dim hKey As Long 'retorno de la función RegCreateKeyEx Dim r As Long r = RegCreateKeyEx(lPredefinedKey, sNewKeyName, 0&, vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0&, hKey, r) Call RegCloseKey(hKey) End Sub Public Sub SetKeyValue(sKeyName As String, sValueName As String, vValueSetting As Variant, lValueType As Long) 'retorno de funcion SetValueEx Dim r As Long 'handle Dim hKey As Long 'Abrimos la clave especifica r = RegOpenKeyEx(HKEY_CLASSES_ROOT, sKeyName, 0, KEY_ALL_ACCESS, hKey) r = SetValueEx(hKey, sValueName, lValueType, vValueSetting) 'cerramos la clave abierta pasandole el handle Call RegCloseKey(hKey) End Sub Private Function SetValueEx(ByVal hKey As Long, sValueName As String, lType As Long, vValue As Variant) As Long Dim nValue As Long, sValue As String Select Case lType 'Valor de Cadena Case REG_SZ sValue = vValue & Chr$(0) 'Establecemos el valor en el registro SetValueEx = RegSetValueExString(hKey, sValueName, 0&, lType, sValue, Len(sValue)) 'Valor entero Case REG_DWORD nValue = vValue 'Establecer el valor en el registro SetValueEx = RegSetValueExLong(hKey, sValueName, 0&, lType, nValue, 4) End Select End Function Esto solo es adicional no coloquen dentro del codigo del formulario es solo si quieren crear un efecto con un Label, vamos al ejemplo, solo coloquen un Label que tenga el color blanco: Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Label1.ForeColor = vbWhite ?si pasamos el roton por el formulario el Label tendra el color Blanco y si lo ponemos encima del Label se pondra de Color Rojo. End Sub Private Sub Label1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Label1.ForeColor = vbRed End Sub Bueno como les dije en alguna parte de este tutorial les explicare como hacer un commond dialog, en un Modulo con nombre ?MiDialogo.bas? pongan lo siguiente: Private Type OPENFILENAME lStructSize As Long hwndOwner As Long hInstance As Long lpstrFilter As String lpstrCustomFilter As String nMaxCustFilter As Long nFilterIndex As Long lpstrFile As String nMaxFile As Long lpstrFileTitle As String nMaxFileTitle As Long lpstrInitialDir As String lpstrTitle As String flags As Long nFileOffset As Integer nFileExtension As Integer lpstrDefExt As String lCustData As Long lpfnHook As Long lpTemplateName As String End Type Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long Private Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long Dim OFName As OPENFILENAME Public Function AbrirArchivo(f As Form, extenciones As String, titulo As String) As String With OFName .lStructSize = Len(OFName) .hwndOwner = f.hWnd .hInstance = App.hInstance .lpstrFilter = extenciones .lpstrFile = Space$(254) .nMaxFile = 255 .lpstrFileTitle = Space$(254) .nMaxFileTitle = 255 .lpstrInitialDir = "C:Mis documentos" .lpstrTitle = titulo .flags = 0 If GetOpenFileName(OFName) Then AbrirArchivo = Trim$(OFName.lpstrFile) Else AbrirArchivo = "" End If End With End Function Public Function GuardarComo(f As Form, extenciones As String, titulo As String) As String With OFName .lStructSize = Len(OFName) .hwndOwner = f.hWnd .hInstance = App.hInstance .lpstrFilter = extenciones .lpstrFile = Space$(254) .nMaxFile = 255 .lpstrFileTitle = Space$(254) .nMaxFileTitle = 255 .lpstrInitialDir = "C:Mis documentos" .lpstrTitle = titulo .flags = 0 If GetSaveFileName(OFName) Then GuardarComo = Trim$(.lpstrFile) Else GuardarComo = "" End If End With End Function
Ahora en un formulario coloquen un TextBoxy un CommandButton:
Private Sub Command1_Click() Dim NomArchivo As String, tipoArchivos As String tipoArchivos = "Text Files (*.txt)" Chr$(0) "*.txt" Chr$(0) "All Files (*.*)" Chr$(0) "*.*" Chr$(0) NomArchivo = MiDialogo.AbrirArchivo(Me, tipoArchivos, "Selecciona un archivo") ?Aquí MiDialogo es el modulo donde estan las funciones, tipo de Archivo es el archivo seleccionado y ?seleccionar un archivo es el nombre que tendra nuestro commonDialog como titulo mejor dicho el DialogTitle de VB6? If NomArchivo <> "" Then Text1.Text = NomArchivo ? en el textbox aparecera la direccion abierta si desean abrir el contenido solo reemplacen el contenido del FreeFile del Texbox por este. End If ?SI DESEAN GUARDAR SOLO REEMPLACEN MiDialogo.AbrirArchivo por MiDialogo.GuardarComo y colocar como titulo guardarComo? en ?seleccionar archivo?. End Sub
Eso es todo :) espero les sirva de mucha ayuda...
Yuri Lizama