Herramientas Bidireccionales: Sincronizacion Disenador y Codigo
El motor de herramientas bidireccionales de HarbourBuilder asegura que tu diseno visual de formularios y tu codigo fuente esten perfectamente sincronizados. Cada cambio que haces en el Disenador de Formularios visual se refleja inmediatamente en el codigo generado, y cada cambio estructural que haces en el codigo es visible instantaneamente en el disenador.
El motor de regeneracion de codigo solo actualiza las lineas de definicion de interfaz de usuario (DEFINE, @ POSITION, propiedades). Tus implementaciones de METHOD, manejadores de eventos y logica personalizada nunca se tocan ni se sobrescriben.
Como Funciona
Cuando trabajas en el Disenador de Formularios, cada accion — colocar un control, redimensionar, mover, cambiar una propiedad — activa una regeneracion de codigo especifica. El motor analiza tu archivo fuente existente, identifica las secciones de definicion de interfaz, las actualiza y deja todo lo demas intacto.
Que se Regenera
El motor de codigo identifica y actualiza solo estas categorias:
| Categoria | Ejemplo | ¿Regenerado? |
|---|---|---|
| Sentencias DEFINE | DEFINE FORM, DEFINE BUTTON | Sí |
| Lineas @ POSITION | @ 10, 20 BUTTON ... | Sí |
| Asignaciones de propiedades | ::cTitle := "Hola" | Sí |
| Definiciones CLASS | CLASS TForm1 FROM TForm | Sí |
| Creacion de controles via codigo | TButton():New() | Sí |
| Implementaciones de METHOD | METHOD OnClick() CLASS TForm1 | No |
| Cuerpos de manejadores de eventos | bAction := { || ... } | No |
| Funciones personalizadas | static function MiAyudante() | No |
| Comentarios | // TODO: ... | No |
Antes y Despues: Regeneracion de Codigo
Antes: Colocas un boton en el disenador
CLASS TForm1 FROM TForm DATA oBtn1 METHOD CreateForm() METHOD OnBtnClic() ENDCLASS METHOD CreateForm() CLASS TForm1 ::cTitle := "Form1" ::nWidth := 400 ::nHeight := 300 return nil METHOD OnBtnClic() CLASS TForm1 // Tu logica personalizada - PRESERVADA MsgInfo( "¡Boton pulsado!" ) return nil
Despues: Codigo regenerado (boton agregado, metodo intacto)
CLASS TForm1 FROM TForm DATA oBtn1 METHOD CreateForm() METHOD OnBtnClic() ENDCLASS METHOD CreateForm() CLASS TForm1 ::cTitle := "Form1" ::nWidth := 400 ::nHeight := 300 // --- NUEVO: Boton agregado por el disenador --- @ 120, 140 BUTTON ::oBtn1 PROMPT "Boton1" ; OF Self SIZE 120, 32 ; ACTION ::OnBtnClic() return nil METHOD OnBtnClic() CLASS TForm1 // Tu logica personalizada - PRESERVADA MsgInfo( "¡Boton pulsado!" ) return nil
El cuerpo del metodo OnBtnClic permanece completamente intacto. Solo el
metodo CreateForm recibio la nueva definicion del boton.
Flujo de Trabajo
- Comienza con formulario en blanco — Archivo > Nuevo formulario
- Coloca controles desde la paleta — Arrastra controles al lienzo del formulario
- Configura propiedades en el Inspector de Objetos — Cambia textos, tamanios, colores
- El codigo se autogenera — Cada cambio actualiza el codigo fuente
- ¿Necesitas logica personalizada? — Cambia a la vista de codigo
- Escribe implementaciones de METHOD — Agrega tu logica de negocio
- Vuelve al disenador — Continua el diseno visual; tu logica esta segura
Reglas de Analisis de Codigo
El motor de regeneracion usa estas reglas para identificar secciones seguras de modificar:
- Bloques CLASS / ENDCLASS — Las declaraciones DATA y METHOD se actualizan; los cuerpos de METHOD existentes se omiten.
- Bloques
DEFINE FORM— Las propiedades dentro de los bloques DEFINE se regeneran. - Sentencias @ POSITION — Las clausulas de posicion, tamano y propiedad se actualizan.
- Bloques
ACTIVATE FORM— Las clausulas de activacion se regeneran. - Todo lo demas — Funciones estaticas, cuerpos de METHOD, comentarios y codigo personalizado se dejan intactos.
Mantén tu logica personalizada en implementaciones de METHOD separadas o funciones estaticas en lugar de en linea dentro de bloques DEFINE. Esto facilita que el motor de regeneracion identifique y preserve tu codigo.
Manejo de Conflictos
Si editas manualmente una linea que el disenador tambien gestiona (p. ej., cambiar la posicion de un boton en el codigo mientras tambien esta en el lienzo del formulario), la vista del disenador tiene prioridad en la siguiente regeneracion. Para evitar conflictos:
- Usa el Inspector de Objetos para cambiar propiedades en lugar de editar codigo directamente.
- Usa el lienzo del Disenador para mover y redimensionar controles.
- Usa el Editor de Codigo solo para implementaciones de METHOD, manejadores de eventos y funciones personalizadas.
El motor de regeneracion ha sido probado con mas de 200 casos extremos incluyendo bloques DEFINE anidados, multiples formularios en un archivo, sintaxis mixta basada en clases y procedural, y archivos con comentarios extensos.
Alternar Entre Vistas
Usa el boton de la barra de herramientas o el atajo de teclado para alternar entre las vistas Disenador y Codigo:
| Atajo | Accion |
|---|---|
| F12 | Alternar entre vistas Disenador y Codigo |
| Ctrl+Tab | Ciclar por las pestanas del editor abiertas |
| Ctrl+S | Guardar (datos de diseno y codigo) |