Página 1 de 1

Posible Bug en el diseñador

Publicado: Jue Feb 04, 2016 9:32 am
por Shadax
Hola, buenos días a todos!

Hoy me he dado cuenta de que cuando trato de insertar un control "TOffice2007Button" sobre un contenedor cualquiera ( Panel, Bevel ) el diseñador ignora totalmente el contenedor sobre el que se pretende insertar el botón y siempre lo genera en el formulario. ¿Cómo se puede solventar este problema?

1. Creo proyecto desde cero y agrego un simple formulario:
Imagen

2. Agrego un Bevel, que actuará de contenedor del botón:
Imagen

3. Finalmente trato de agregar el botón al contenedor sin éxito alguno:
Imagen

Un saludo a todos.

Re: Posible Bug en el diseñador

Publicado: Jue Feb 04, 2016 9:48 am
por jfgimenez
Juanra,

tiene que ser un bug de ese control. Si tienes el código fuente, mira a ver cómo se está creando el control. Si hace falta, fíjate cómo se crean ese tipo de controles en \xailer\samples\controls. Quizás en la llamada a RegisterComponent() estés creando el control, cuando ahí sólo hay que instanciar el objeto. P.ej.:

Código: Seleccionar todo

   RegisterComponent( "Samples", "Label", "TBanner", {|| TBanner() } )

Re: Posible Bug en el diseñador

Publicado: Jue Feb 04, 2016 10:37 am
por Shadax
jfgimenez escribió:Juanra,

tiene que ser un bug de ese control. Si tienes el código fuente, mira a ver cómo se está creando el control. Si hace falta, fíjate cómo se crean ese tipo de controles en \xailer\samples\controls. Quizás en la llamada a RegisterComponent() estés creando el control, cuando ahí sólo hay que instanciar el objeto. P.ej.:

Código: Seleccionar todo

   RegisterComponent( "Samples", "Label", "TBanner", {|| TBanner() } )
Buenos días José!
El control que estoy utilizando en cuestión es el que tenéis en el directorio de "Samples" del Xailer: < \Samples\MetaControls\Office2007Button\ >. Se trata de un MetaControl y utiliza la instrucción:

Código: Seleccionar todo

   RegisterComponent( "Metacontrols", "Office2007Btn", "TOffice2007Button", {|| TOffice2007Button():Create() } )
¿Será que con los metacontroles no se tiene en cuenta algo así?

EDIT
====
Prescindiendo del ":Create()" sigue comportándose de la misma manera.

Re: Posible Bug en el diseñador

Publicado: Jue Feb 04, 2016 11:33 am
por ignacio
Buenas,

Ese control no es de nuestro ejemplo samplesdll:

Código: Seleccionar todo

INIT PROCEDURE SamplesDll()

   RegisterComponent( "Samples", "Label", "TBanner", {|| TBanner() } )
   RegisterComponent( "Samples", "LabelShadow", "TLabelShadow", {|| TLabelShadow() } )
   RegisterComponent( "Samples", "SearchComboBox", "TSearchComboBox", {|| TSearchComboBox() } )
   RegisterComponent( "Samples", "FilterComboBox", "TFilterComboBox", {|| TFilterComboBox() } )
   RegisterComponent( "Samples", "EditBanner", "TEditBanner", {|| TEditBanner() } )
   RegisterComponent( "Samples", "Planning", "TPlanning", {|| TPlanning() } )
   RegisterComponent( "Samples", "BToolBar", "TToolBarRE", {|| TToolBarRE() } )

RETURN
Saludos

Re: Posible Bug en el diseñador

Publicado: Jue Feb 04, 2016 11:45 am
por Shadax
ignacio escribió: Buenas,

Ese control no es de nuestro ejemplo samplesdll:

Código: Seleccionar todo

INIT PROCEDURE SamplesDll()

   RegisterComponent( "Samples", "Label", "TBanner", {|| TBanner() } )
   RegisterComponent( "Samples", "LabelShadow", "TLabelShadow", {|| TLabelShadow() } )
   RegisterComponent( "Samples", "SearchComboBox", "TSearchComboBox", {|| TSearchComboBox() } )
   RegisterComponent( "Samples", "FilterComboBox", "TFilterComboBox", {|| TFilterComboBox() } )
   RegisterComponent( "Samples", "EditBanner", "TEditBanner", {|| TEditBanner() } )
   RegisterComponent( "Samples", "Planning", "TPlanning", {|| TPlanning() } )
   RegisterComponent( "Samples", "BToolBar", "TToolBarRE", {|| TToolBarRE() } )

RETURN
Saludos
Sí, tienes razón. Sin embargo, lo tenéis dentro de los Samples que vienen en el Xailer4, en la carpeta "MetaControls":
Imagen


Y el código que viene lo indica de la manera que te comentaba antes:
Imagen


Al parecer está suministrado por José Lalin.

La cosa es que se trata de un MetaControl ¿e igual se le escapa algo al RegisterComponent?

Re: Posible Bug en el diseñador

Publicado: Jue Feb 04, 2016 12:06 pm
por jfgimenez
Juanra,

precísamente me refería a eso, a la llamada al RegisterComponent(). Prueba a quitar el :Create() del final

Re: Posible Bug en el diseñador

Publicado: Jue Feb 04, 2016 12:15 pm
por Shadax
jfgimenez escribió:Juanra,

precísamente me refería a eso, a la llamada al RegisterComponent(). Prueba a quitar el :Create() del final
Sí, lo he probado también y sigue comportándose igual: Genera el control dentro del TForm y no del TBevel. :?

Re: Posible Bug en el diseñador

Publicado: Jue Feb 04, 2016 12:46 pm
por ignacio
Efectivamente está fallando. Mientras tanto, simplemente 'corte' y 'pegue' el control.

Saludos

Re: Posible Bug en el diseñador

Publicado: Jue Feb 04, 2016 12:47 pm
por jfgimenez
Juanra,

veo que ese control está hecho explícitamente para que se coloque sobre el formulario, no sobre otro contenedor. Habría que cambiar lo siguiente (no lo he probado):

Código: Seleccionar todo

//------------------------------------------------------------------------------

INIT PROC RegisterOffice2007Btn()

   RegisterComponent( "Metacontrols", "Office2007Btn", "TOffice2007Button", {|| TOffice2007Button() } )

RETURN

//------------------------------------------------------------------------------

CLASS TOffice2007Button FROM TIDEMetaControl

   METHOD Create()

ENDCLASS

//------------------------------------------------------------------------------

METHOD Create( oParent ) CLASS TOffice2007Button

   LOCAL oBtn
   LOCAL aPos := GetCursorPos()

   IF ::oActiveForm == Nil
      RETURN Nil
   ENDIF

   aPos := ScreenToClient( ::oActiveForm:Handle, aPos )

   WITH OBJECT oBtn := ::AddComponent( TGlassbtn(), oParent )
      :nLeft := aPos[1]
      :nTop := aPos[2]
      :nClrGlow := 0x04BAFF
      :nClrPane := 0x04BAFF
      :nClrShine := 0xFDFFFF
      :nClrInnerBorder := clWhite
      :nClrOuterBorder := clGray
      :nClrText := clNavy
   END

   ::SetControl( oBtn )

RETURN Nil

//------------------------------------------------------------------------------
Aquí lo tienes en formato parche para que se vean los cambios:

Código: Seleccionar todo

Index: Source\Office2007Btn.prg
===================================================================
--- Source\Office2007Btn.prg	(revision: 1 head)
+++ Source\Office2007Btn.prg	(workcopy)
@@ -15,7 +15,7 @@
 
 INIT PROC RegisterOffice2007Btn()
 
-   RegisterComponent( "Metacontrols", "Office2007Btn", "TOffice2007Button", {|| TOffice2007Button():Create() } )
+   RegisterComponent( "Metacontrols", "Office2007Btn", "TOffice2007Button", {|| TOffice2007Button() } )
 
 RETURN
 
@@ -29,7 +29,7 @@
 
 //------------------------------------------------------------------------------
 
-METHOD Create() CLASS TOffice2007Button
+METHOD Create( oParent ) CLASS TOffice2007Button
 
    LOCAL oBtn
    LOCAL aPos := GetCursorPos()
@@ -40,7 +40,7 @@
 
    aPos := ScreenToClient( ::oActiveForm:Handle, aPos )
 
-   WITH OBJECT oBtn := ::AddComponent( TGlassbtn(), ::oActiveForm )
+   WITH OBJECT oBtn := ::AddComponent( TGlassbtn(), oParent )
       :nLeft := aPos[1]
       :nTop := aPos[2]
       :nClrGlow := 0x04BAFF

Re: Posible Bug en el diseñador

Publicado: Jue Feb 04, 2016 12:55 pm
por ignacio
Buenos días,

Realmente el control no es más que un TGlassBtn con algunas propiedades cambiadas que perfectamente lo habría podido hacer con la opción de 'Crear control de usuario'. No obstante aquí le dejo el código corregido:

Código: Seleccionar todo

INIT PROC RegisterOffice2007Btn()
   RegisterComponent( "Metacontrols", "Office2007Btn", "TOffice2007Button", {|| TOffice2007Button() } )
RETURN

CLASS TOffice2007Button FROM TGlassBtn

   PROPERTY nClrGlow          INIT 0x04BAFF
   PROPERTY nClrPane          INIT 0x04BAFF
   PROPERTY nClrShine         INIT 0xFDFFFF
   PROPERTY nClrInnerBorder   INIT clWhite
   PROPERTY nClrOuterBorder   INIT clGray
   PROPERTY nClrText          INIT clNavy

ENDCLASS

Un saludo

Re: Posible Bug en el diseñador

Publicado: Jue Feb 04, 2016 1:06 pm
por Shadax
jfgimenez escribió:Juanra,

veo que ese control está hecho explícitamente para que se coloque sobre el formulario, no sobre otro contenedor. Habría que cambiar lo siguiente (no lo he probado):

Código: Seleccionar todo

//------------------------------------------------------------------------------

INIT PROC RegisterOffice2007Btn()

   RegisterComponent( "Metacontrols", "Office2007Btn", "TOffice2007Button", {|| TOffice2007Button() } )

RETURN

//------------------------------------------------------------------------------

CLASS TOffice2007Button FROM TIDEMetaControl

   METHOD Create()

ENDCLASS

//------------------------------------------------------------------------------

METHOD Create( oParent ) CLASS TOffice2007Button

   LOCAL oBtn
   LOCAL aPos := GetCursorPos()

   IF ::oActiveForm == Nil
      RETURN Nil
   ENDIF

   aPos := ScreenToClient( ::oActiveForm:Handle, aPos )

   WITH OBJECT oBtn := ::AddComponent( TGlassbtn(), oParent )
      :nLeft := aPos[1]
      :nTop := aPos[2]
      :nClrGlow := 0x04BAFF
      :nClrPane := 0x04BAFF
      :nClrShine := 0xFDFFFF
      :nClrInnerBorder := clWhite
      :nClrOuterBorder := clGray
      :nClrText := clNavy
   END

   ::SetControl( oBtn )

RETURN Nil

//------------------------------------------------------------------------------
Aquí lo tienes en formato parche para que se vean los cambios:

Código: Seleccionar todo

Index: Source\Office2007Btn.prg
===================================================================
--- Source\Office2007Btn.prg	(revision: 1 head)
+++ Source\Office2007Btn.prg	(workcopy)
@@ -15,7 +15,7 @@
 
 INIT PROC RegisterOffice2007Btn()
 
-   RegisterComponent( "Metacontrols", "Office2007Btn", "TOffice2007Button", {|| TOffice2007Button():Create() } )
+   RegisterComponent( "Metacontrols", "Office2007Btn", "TOffice2007Button", {|| TOffice2007Button() } )
 
 RETURN
 
@@ -29,7 +29,7 @@
 
 //------------------------------------------------------------------------------
 
-METHOD Create() CLASS TOffice2007Button
+METHOD Create( oParent ) CLASS TOffice2007Button
 
    LOCAL oBtn
    LOCAL aPos := GetCursorPos()
@@ -40,7 +40,7 @@
 
    aPos := ScreenToClient( ::oActiveForm:Handle, aPos )
 
-   WITH OBJECT oBtn := ::AddComponent( TGlassbtn(), ::oActiveForm )
+   WITH OBJECT oBtn := ::AddComponent( TGlassbtn(), oParent )
       :nLeft := aPos[1]
       :nTop := aPos[2]
       :nClrGlow := 0x04BAFF
José, el parche que indicas parece válido pero lo he probado y no funciona. En el método "Create", el parámetro que recibe ( oParent ) es de tipo "TFormEditor" por lo que al agregarlo a oParent, lo agrega al Formulario y no al control seleccionado en el mismo.

Parece ser que aunque selecciones el TBevel para agregar el control al mismo, en el método Create se recibe el TFormEditor:
Imagen

Re: Posible Bug en el diseñador

Publicado: Jue Feb 04, 2016 1:14 pm
por Shadax
ignacio escribió:Buenos días,

Realmente el control no es más que un TGlassBtn con algunas propiedades cambiadas que perfectamente lo habría podido hacer con la opción de 'Crear control de usuario'. No obstante aquí le dejo el código corregido:

Código: Seleccionar todo

INIT PROC RegisterOffice2007Btn()
   RegisterComponent( "Metacontrols", "Office2007Btn", "TOffice2007Button", {|| TOffice2007Button() } )
RETURN

CLASS TOffice2007Button FROM TGlassBtn

   PROPERTY nClrGlow          INIT 0x04BAFF
   PROPERTY nClrPane          INIT 0x04BAFF
   PROPERTY nClrShine         INIT 0xFDFFFF
   PROPERTY nClrInnerBorder   INIT clWhite
   PROPERTY nClrOuterBorder   INIT clGray
   PROPERTY nClrText          INIT clNavy

ENDCLASS

Un saludo
De esta manera sí funcionaría. Sin embargo, si tratamos de crear un MetaControl utilizando la técnica que tenía éste, seguiría recibiendo TFormEditor en vez de un oParent ( tal como muestro en el anterior post ). Eso se podría arreglar de alguna manera?

Re: Posible Bug en el diseñador

Publicado: Jue Feb 04, 2016 1:33 pm
por ignacio
Desconozco como funcionan los 'Metacontrols'. El padre de la criatura es José Lalín, espero que él mismo pueda decirte algo al respecto en breve.

Un saludo

Re: Posible Bug en el diseñador

Publicado: Jue Feb 04, 2016 4:22 pm
por Shadax
Ok, gracias ignacio. A ver si se pasa por aquí y me echa un cable. :D