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:
2. Agrego un Bevel, que actuará de contenedor del botón:
3. Finalmente trato de agregar el botón al contenedor sin éxito alguno:
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":
Y el código que viene lo indica de la manera que te comentaba antes:
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:

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.
