lunes, 25 de junio de 2007

Rekapitulerende i prosjekten NekroEditor

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