Estamos de vuelta otra vez en las andadas de hace dos diciembres: dos años atrás comencé este proyecto.
Recapitulemos algo sobre cómo comenzó esto: fue en el año 2005 cuando se me ocurrió esto, aunque la fecha exacta luce ensombrecida. Hay un post: NekroEditor con fecha ''martes 27 de diciembre de 2005'' donde escribo:
Hoy me he propuesto comenzar bien un proyecto que quería hacer desde hace meses
Creo, teorizo, que con "hace meses" me refería al pasado abril... sólo es una corazonada.
La fecha exacta no es del todo clara ya que, pese a la fecha en el que publico que me he decidido, en las propiedades del
modMain.bas
aparece: Domingo, 25 de Diciembre de 2005, 04:03:40 p.m. El frmMain.frm
y NekroEditor.vbp
que uso ahora, que serían fuentes más fiables (más el último) fueron recreados ayer por unas movidas que les hice a los archivos, perdiéndose los originales.Pero, según recuerdo, fue por abril o marzo cuando comencé a hacer bocetos e intentos en VB tramando el suceso, pero fue hasta aquel diciembre de masoquistas desvelos cuando arranqué muy de lleno y... casi todo lo que hice está narrado en las otras entradas.
<acheere diagonal>
¿Y qué hay de ahora?
Fue ayer o antier cuando proseguí el camino, después de haber tomado un firme entrenamiento y adquirido experiencia en C y Java.
Me embarqué en varias cosas que había dejado pendientes, junto con el proyecto, por ejemplo, necesitaba demostrarme que podía tener control con funciones que cambien el formato del texto, y me sorprende que ahora que estoy de vuelta haya resuelto ese problema en cuestión de minutos y casi sin dificultades (lo único que hice fue programar la función, lo demás ya lo tenía):
Type CHARFORMAT2
cbSize As Long
dwMask As Long
dwEffects As Long
yHeight As Long
yOffset As Long
crTextColor As Long
bCharset As Byte
bPitchAndFamily As Byte
szFaceName(65) As Byte
wWeight As Integer
sSpacing As Integer
crBackColor As Long
lcid As Long
dwReserved As Long
sStyle As Integer
wKerning As Integer
bUnderlineType As Byte
bAnimation As Byte
bRevAuthor As Byte
bReserved1 As Byte
End Type
Enum Selection
SCF_SELECTION = &H1
SCF_WORD = &H2 Or &H1 '(SCF_WORD | SCF_SELECTION)
SCF_ALL = &H4
SCF_USEUIRULES = &H8
SCF_DEFAULT = &H0
End Enum
Sub SetBold(ByVal Sel As Selection)
Dim Format As CHARFORMAT2
With Format
.cbSize = Len(Format)
.dwMask = CFM_BOLD
.dwEffects = CFE_BOLD
End With
Call SendMessage(hWorkArea, EM_SETCHARFORMAT, Sel, Format)
End Sub
Es poco, pero para mí, que no sabía mucho en aquel entonces me resultaba muy mareador el pensar que debía aprender a controlar todas las propiedades de ese tipo de datos tan grande.
Lo que vino después fue hacer los prototipos de las funciones que iba a tener mi programa: las generales que son las que interactúan con el usuario (OpenFile, SaveFile, Find, Replace) y las internas que asisten el programa en sus labores durante la edición tales como SetBold, SetColor, SetFont, LoadFile y demás. Repito y aclaro, únicamente fue cuestión de crear los prototipos, dos conjuntos de
Sub [Nombre]() ' End Sub
\ que luego programaré; más que nada fue para asignárselas a los Select Case LoWord(wParam)
, que es lo que me dice qué opción del menú se presionó (tuve también que investigar eso y programar las funciones LoWord() y HiWord().En el intermedio que hubo al hacer cada grupo de prototipos hice unos cambios en la organización de archivos: pasaron de estar todos los formularios, módulos, imágenes y demás a reorganizarse en las carpetas /Documentación, /Forms, /Main, /Modules y /Resources (la carpeta de documentación la cambiaré después a una llamada /Docs o algo así. Me lié con ello, pues no solo era cuestión de mover archivos sino también las imágenes de otros dos formularios (de búsqueda y reemplazo) y las de la barra de herramientas, en fin, fue un rollo que, al parecer, recreó varios archivos.
Y lo último más importante que hay que mencionar es lo que me encuentro tratando de resolver ahora: crear un cuadro de diálogo con APIs.
Habrá que usar
GetOpenFile
y GetSaveFile
pero el problema no son ellas, sino el único parámetro que llevan: un tipo de dato OPENFILENAME
Public 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
que al principio me intimidó pero al final descubrí que era como el
CHARFORMAT2
: sólo ocupas los elementos que necesites, los demás quedan descartados.Aunque no es del todo sencillo ya que hay que someterse a los caprichos de la API. El procedimiento que estoy programando es el segundo prototipo en desarrollo que maquilo (el primero fue SetBold), aún imperfecto y no del todo acabo funciona bien, es el bloque
DlgOpen
que se encarga de crear un cuadro de diálogo para abrir un archivo y es el que me ayudará con la función OpenFile
. Como vi que crear cuadros de diálogo no era algo sencillo y de poco código estoy asignando las funciones de cuadros de diálogo en un recién creado modDialogs.bas
Busqué algo de ayuda en Google y, con un par de buenos ratos resumí el primer paso que es conseguir abrir el cuadro de diálogo desde Archivo / Abrir:
Function DlgOpen() As Boolean
Dim SNull As String * 1: SNull = Chr$(0) 'Single Null String
Dim DNull As String * 2: DNull = Chr$(0) & Chr$(0) 'Double Null String
Dim Flags&
Flags = OFN_CREATEPROMPT Or OFN_ENABLESIZING Or OFN_EXPLORER Or OFN_PATHMUSTEXIST
Dim FilterIndex As Byte
Dim Filters As String
Filters = "Text Files (*.txt)" & SNull & "*.txt" & SNull + _
"All Files (*.*)" & SNull & "*.*" & DNull
Dim Trash As Integer
Dim Struct As OPENFILENAME
With Struct
'Internal properties
.lStructSize = Len(Struct)
.Flags = Flags
.nFileOffset = Trash
.nFileExtension = Trash
'Simply
.hwndOwner = hwnd
.hInstance = App.hInstance
'Filters
.lpstrFilter = Filters
.lpstrCustomFilter = 2
.nMaxCustFilter = Len(Filters)
.nFilterIndex = FilterIndex
'File
.lpstrFile = Space(254)
.nMaxFile = 255
.lpstrFileTitle = Space(254)
.nMaxFileTitle = 255
'Dialog properties
.lpstrInitialDir = CurDir$
.lpstrTitle = "TITULER"
.lpstrDefExt = vbNull
End With
DlgOpen = GetOpenFileName(Struct)
End Function
Seguiré trabajando en eso pero como veo que este proyecto tendrá cierta trascendencia después de haber sido inspirado entre otras cosas por el KWrite decidí añadirle su categoría en el blog, además de la de Visual Basic: NekroEditor.
No hay comentarios.:
Publicar un comentario