Page 1 of 1

Mostrar control ActiveX codejock en diálogo desde recurso

PostPosted: Sat Aug 20, 2022 3:03 pm
by VictorCasajuana
Hola.
Estoy haciendo pruebas con los controles de codejock y me he topado con un problema al intentar añadirlos en un diálogo ya creado desde recursos. Si lo hago desde una ventana me funciona perfectamente pero necesito utilizarlos dentro de diálogos que ya tengo definidos en recursos.
Me explico mejor con código:
Code: Select all  Expand view

#include 'fivewin.ch'
Function Main()  

    Local oWnd         AS Object := Nil
    Local OgRIDcONTROL AS Object := Nil
    Local oCategory    AS Object := Nil
    Local oItem        AS Object := Nil

    DEFINE WINDOW oWnd FROM 0,0 TO 1000,1000 PIXEL TITLE 'Pruebas Codejock'

    oGridControl      := TactiveX():New( oWnd, 'Codejock.PropertyGrid.20.3.0' )

    oWnd:oClient := oGridControl

    oCategory := oGridControl:AddCategory('Bloque1')
    oItem := oCategory:AddChildItem(0,'Tipo 0')
    oItem := oCategory:AddChildItem(1,'Tipo 1')
    oItem := oCategory:AddChildItem(2,'Tipo 2')
    oItem := oCategory:AddChildItem(3,'Tipo 3')
    oItem := oCategory:AddChildItem(4,'Tipo 4')
    oItem := oCategory:AddChildItem(5,'Tipo 5')
    oItem := oCategory:AddChildItem(6,'Tipo 6')
    oItem := oCategory:AddChildItem(7,'Tipo 7')
    oItem := oCategory:AddChildItem(8,'Tipo 8')
    oItem := oCategory:AddChildItem(9,'Tipo 9')
    oItem := oCategory:AddChildItem(10,'Tipo 10')
    oItem := oCategory:AddChildItem(11,'Tipo 11')
    oItem := oCategory:AddChildItem(12,'Tipo 12')

    ACTIVATE WINDOW oWnd 

Return ( Nil )
Image

pero cuando lo intento desde recurso me indica cannot create dialog box ya que tengo un custom control que es el ActiveX que al no estar instanciado cuando activo el diálogo, falla al crearlo, pero tengo que crearlo en el ON INIT para que funcione bien la definición del control, es como el pez que se come la cola...

Este es el fichero de recursos:
Code: Select all  Expand view

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>

LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US

DIALOGO DIALOG DISCARDABLE 33, 55, 523, 373
STYLE WS_POPUP|DS_MODALFRAME|DS_3DLOOK|WS_CAPTION|WS_SYSMENU|WS_VISIBLE
CAPTION "Prueba ActiveX"
FONT 8, "Segoe UI"
{
  CONTROL "Custom control", 4001, "TActiveX", 0x00000000, 0, 0, 392, 260
}
 


Este es el código, lo he reducido a lo mínimo con una sola categoría para no hacer el post más largo:
Code: Select all  Expand view

#include 'fivewin.ch'

Function Main()

    DEFINE DIALOG oDlg RESOURCE "DIALOGO"
    ACTIVATE DIALOG oDlg ON INIT BuildGrid( oDlg )
   
return( Nil )

Static Function BuildGrid( oDlg )

    oGridControl := TActiveX():Redefine( 4001, oDlg, "Codejock.PropertyGrid.20.3.0" )
    oCategory := oGridControl:AddCategory('Bloque1')

Return ( Nil )
 


El error que me lanza es el siguiente:
Image

si sustituyo el redefine por un new:
Code: Select all  Expand view

oGridControl := TActiveX():New( odlg, "Codejock.PropertyGrid.20.3.0",0,0,600,400)
 


y quito el custom control ActiveX del diálogo en el recurso:
Code: Select all  Expand view

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>

LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US

DIALOGO DIALOG DISCARDABLE 33, 55, 523, 373
STYLE WS_POPUP|DS_MODALFRAME|DS_3DLOOK|WS_CAPTION|WS_SYSMENU|WS_VISIBLE
CAPTION "Prueba ActiveX"
FONT 8, "Segoe UI"
{
}
 


entonces funciona bien:
Image

pero necesito definir las posiciones de los controles desde recursos.

No tengo mucha experiencia utilizando los ActiveX desde Fivewin :oops: , supongo que me dejo alguna cosa básica pero no doy con la tecla.
Cualquier ayuda es bien recibida :D

Gracias! :)

Re: Mostrar control ActiveX codejock en diálogo desde recurso

PostPosted: Sun Aug 21, 2022 9:05 am
by Antonio Linares
Estimado Victor,

Prueba asi:
Code: Select all  Expand view
#include 'fivewin.ch'

Function Main()

   local oDlg, oGridControl

    DEFINE DIALOG oDlg RESOURCE "DIALOGO"

    oGridControl = TActiveX():Redefine( 4001, oDlg, "Codejock.PropertyGrid.20.3.0" )

    ACTIVATE DIALOG oDlg ON INIT ( oGridControl:AddCategory( 'Bloque1' ), .T. )
   
return nil

Desde que URL se puede descargar una versión demo de "Codejock.PropertyGrid.20.3.0" ? gracias

Re: Mostrar control ActiveX codejock en diálogo desde recurso

PostPosted: Sun Aug 21, 2022 10:34 am
by VictorCasajuana
Hola Maestro.
Gracias por tu respuesta y tiempo.

He probado lo que me indicas y ahora crea el diálogo pero no muestra el control, lo único que muestra es un punto en la parte superior izquierda del control tal y como se puede ver en esta imagen:
Image

el control se crea bien, porque lanzando su método about() muestra la información correcta:
Image

Parece como si ese punto fuese el control que crea. He buscado por toda la documetación del control por si hay algún método o data para poder indicarele el tamaño, expandir, etc... pero no hay nada al respecto, técnicamente ha de adaptarse al recurso en el que se define, como así hace si lo llamo desde una WINDOW

El código que muestra lo anterior es el siguiente:
Code: Select all  Expand view

#include 'fivewin.ch'

Function Main()

   local oDlg, oGridControl

    DEFINE DIALOG oDlg RESOURCE "DIALOGO"

    oGridControl = TActiveX():Redefine( 4001, oDlg, "Codejock.PropertyGrid.20.3.0" )

    ACTIVATE DIALOG oDlg ON INIT ( buildGridControl(oGridControl) )
   
return nil

Static Function BuildGridControl(oGridControl)
    oGridControl:AddCategory( 'Bloque1' )
    oGridControl:AboutBox()
Return ( Nil )
 


y este es el recurso:
Code: Select all  Expand view

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>

LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US

DIALOGO DIALOG DISCARDABLE 33, 55, 523, 373
STYLE WS_POPUP|DS_MODALFRAME|DS_3DLOOK|WS_CAPTION|WS_SYSMENU|WS_VISIBLE
CAPTION "Prueba ActiveX"
FONT 8, "Segoe UI"
{
  CONTROL "Custom control", 4001, "TActiveX", 0x00000000, 114, 51, 324, 276
}
 


La demo con todos los controles de codejock se puede descargar desde su web: https://codejock.com/downloads/

No obstante dejo el enlace al ejecutable que se descarga así no hay que registrarse para hacer las pruebas: https://mega.nz/file/pOQhGDwD#7sVw-BVLCX4lbofefDp9-Jqi6_io8Ueaj6zRDa8ToOE

Continúo haciendo pruebas para ver si doy con la tecla, cualquier ayuda o idea es bien recibida! :)

Salud! :D

Re: Mostrar control ActiveX codejock en diálogo desde recurso

PostPosted: Sun Aug 21, 2022 10:59 am
by Antonio Linares
Victor,

Muchas gracias

Ahora tengo que salir, luego lo descargaré y lo probaré

Prueba a hacer oGridControl:SetSize( nWidth, nHeight ) a ver si aparece con las dimensiones desde el ON INIT

Re: Mostrar control ActiveX codejock en diálogo desde recurso

PostPosted: Sun Aug 21, 2022 12:09 pm
by VictorCasajuana
Fantástico Master! :D

he echo una prueba rápida y ha funcionado... :)
Image

he puesto este post rápido para que sepas que ya funciona, para rematarlo pondré un ejemplo más atractivo por si alguien llega hasta aquí, que sepa utilizar mejor este control. :)

Salud!

Re: Mostrar control ActiveX codejock en diálogo desde recurso

PostPosted: Sun Aug 21, 2022 1:58 pm
by Antonio Linares
Muchas gracias Victor por tus pruebas y ayuda :-)

Re: Mostrar control ActiveX codejock en diálogo desde recurso

PostPosted: Sun Aug 21, 2022 4:59 pm
by VictorCasajuana
Dejo este pequeño ejemplo de utilización de la librería codejock en un diálogo ( en una windows funciona también ). Es solo algo muy básico, pero el nivel de personalización y las posibilidades que ofrece esta librería con el resto de controles son increíbles y muy profesionales.
Gracias por tu ayuda Antonio, estaba bloqueado. :)

Image

aquí el código:

Code: Select all  Expand view

#include 'fivewin.ch'

Function Main()

    Local oGridControl AS Object := Nil
    Local oCharControl AS Object := Nil
    Local oCategory AS Object := Nil

   
    DEFINE DIALOG oDlg RESOURCE "DIALOGO"

    oGridControl := TActiveX():Redefine( 4001, oDlg, "Codejock.PropertyGrid.20.3.0" )
    oCharControl := TActiveX():Redefine( 4004, oDlg, "Codejock.ChartControl.20.3.0" )
   
    ACTIVATE DIALOG oDlg ON INIT ( BuildGrid( oGridControl ), BuildChart( oCharControl ) )
   
return( Nil )

Static Function BuildChart( oCharControl )

    oCharControl:SetSize(425,550)

    oCharControl:Content:Titles:Add( "Population by U.S. State" )
    oCharControl:Content:Legend:Visible := .T.
    //oCharControl.Content.Legend.HorizontalAlignment = xtpChartLegendNearOutside
   
    oCharSerie := oCharControl:Content:Series:Add("New York")

    oCharSerie:Points:Add( 1900, 7268)
    oCharSerie:Points:Add( 1950, 14830)
    oCharSerie:Points:Add( 1990, 17990)
    oCharSerie:Points:Add( 2000, 18976)
    oCharSerie:Points:Add( 2008, 18323)
   
    oCharSerie = oCharControl:Content:Series:Add("California")

    oCharSerie:Points:Add( 1900, 1485)
    oCharSerie:Points:Add( 1950, 10586)
    oCharSerie:Points:Add( 1990, 29760)
    oCharSerie:Points:Add( 2000, 33871)
    oCharSerie:Points:Add( 2008, 36756)
   
    oCharSerie = oCharControl:Content:Series:Add("Florida")

    oCharSerie:Points:Add( 1900, 528)
    oCharSerie:Points:Add( 1950, 2771)
    oCharSerie:Points:Add( 1990, 12937)
    oCharSerie:Points:Add( 2000, 15982)
    oCharSerie:Points:Add( 2008, 18328)
       
    oCharSerie = oCharControl:Content:Series:Add("Texas")

    oCharSerie:Points:Add( 1900, 3048)
    oCharSerie:Points:Add( 1950, 7711)
    oCharSerie:Points:Add( 1990, 14986)
    oCharSerie:Points:Add( 2000, 20851)
    oCharSerie:Points:Add( 2008, 24326)

    oCharControl:Content:Series[3]:Style = oCharControl:CreateElement('ChartAreaSeriesStyle')
    oCharControl:Content:Series[2]:Style = oCharControl:CreateElement('ChartPointSeriesStyle')
    oCharControl:Content:Series[1]:Style = oCharControl:CreateElement('ChartBarSeriesStyle')
    oCharControl:Content:Series[0]:Style = oCharControl:CreateElement('ChartSplineSeriesStyle')

    oCharControl:Content:Series[1]:Diagram:AxisY:Title:Text := "Population Growth (Millions)"
    oCharControl:Content:Series[1]:Diagram:AxisY:Title:Visible = .T.
    oCharControl:Content:Series[1]:Diagram:AxisX:Title:Text = "Decade / Year"
    oCharControl:Content:Series[1]:Diagram:AxisX:Title:Visible = .T.


Return ( Nil )

Static Function BuildGrid( oGridControl )

    oGridControl:SetSize(425,550)

    oCategory := oGridControl:AddCategory('Valores Standard')

    oItem := oCategory:AddChildItem(0,'string','Hola')
    oItem := oCategory:AddChildItem(1,'numerico',123)
    oItem := oCategory:AddChildItem(2,'booleano',.T.)
    oItem := oCategory:AddChildItem(5,'double',123.45)
    oItem := oCategory:AddChildItem(6,'Fecha',Date())
    oItem := oCategory:AddChildItem(11,'Multilínea','Varias'+CRLF+'Lineas')

    oCategory := oGridControl:AddCategory('Valores Avanzados')
    oItem := oCategory:AddChildItem(3,'Color',0XAA00FF)
    oItem := oCategory:AddChildItem(4,'fuente')
    oItem:FontFaceName := 'Arial'
    oItem:FontSize := 10

    oItem := oCategory:AddChildItem(7,'Imagen')
       
    oItem := oCategory:AddChildItem(8,'enum',2)
    oItem:Constraints:Add('uno')
    oItem:Constraints:Add('dos')
    oItem:Constraints:Add('tres')
    oItem := oCategory:AddChildItem(9,'checks',1+8) // TODO: Probar y entender la lógica
    oItem:Constraints:Add("All Windows", 1 + 2 + 4 + 8 + 16 + 32)
    oItem:Constraints:Add("Windows 98", 1)
    oItem:Constraints:Add("Windows 2000", 2)
    oItem:Constraints:Add("Windows XP", 4)
    oItem:Constraints:Add("Windows 95", 8)
    oItem:Constraints:Add("Windows NT", 16)
    oItem:Constraints:Add("Windows 2003", 32)
    oItem := oCategory:AddChildItem(10,'Categoría')
    oItem := oCategory:AddChildItem(12,'Opciones',1)
    oItem:Constraints:Add("Option 1", 1)
    oItem:Constraints:Add("Option 2", 2)

Return ( Nil )

 


aquí el recurso:

Code: Select all  Expand view


#include <windows.h>
#include <commctrl.h>
#include <richedit.h>

LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US

DIALOGO DIALOG DISCARDABLE 33, 55, 613, 373
STYLE WS_POPUP|DS_MODALFRAME|DS_3DLOOK|WS_CAPTION|WS_SYSMENU|WS_VISIBLE
CAPTION "Prueba ActiveX"
FONT 8, "Segoe UI"
{
  CONTROL "", 4001, "TActiveX", 0x00000000, 10, 21, 281, 332
  CONTROL "Opciones", 4002, "Button", BS_GROUPBOX, 3, 5, 296, 360
  CONTROL "Grafico", 4003, "Button", BS_GROUPBOX, 303, 5, 301, 360
  CONTROL "", 4004, "TActiveX", 0x00000000, 313, 21, 281, 332
}


 


Salud!

Re: Mostrar control ActiveX codejock en diálogo desde recurso

PostPosted: Mon Aug 22, 2022 9:45 am
by VictorCasajuana
Hola de nuevo Antonio.

Una última consulta por curiosidad, he realizado una prueba de stress con un timer y he creado y destruido 1000 diálogos como los del ejemplo. La memória del programa ha pasado de 6,8Mb a 13Mb es algo muy insignificante para 1000 diálogos abiertos y cerrados, pero me gustaría saber si hay alguna forma de limpiar esto. He probado con deleteobject() antes de cerrar el diálogo, con :Destroy() de los controles activeX y con hb_gcAll() siempre después de cada diálogo y el resultado es exactamente el mismo.

Gracias y salud!