FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Mostrar control ActiveX codejock en diálogo desde recurso
Posts: 309
Joined: Wed Mar 28, 2018 04:38 PM
Mostrar control ActiveX codejock en diálogo desde recurso
Posted: Sat Aug 20, 2022 03:03 PM
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 (fw): Select all Collapse
#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 )


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 (fw): Select all Collapse
#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 (fw): Select all Collapse
#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:


si sustituyo el redefine por un new:
Code (fw): Select all Collapse
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 (fw): Select all Collapse
#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:


pero necesito definir las posiciones de los controles desde recursos.

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

Gracias! :-)
--------

¿ Y porque no ?

¿ And why not ?
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Mostrar control ActiveX codejock en diálogo desde recurso
Posted: Sun Aug 21, 2022 09:05 AM
Estimado Victor,

Prueba asi:
Code (fw): Select all Collapse
#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
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 309
Joined: Wed Mar 28, 2018 04:38 PM
Re: Mostrar control ActiveX codejock en diálogo desde recurso
Posted: Sun Aug 21, 2022 10:34 AM
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:


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


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 (fw): Select all Collapse
#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 (fw): Select all Collapse
#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! :-)
--------

¿ Y porque no ?

¿ And why not ?
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Mostrar control ActiveX codejock en diálogo desde recurso
Posted: Sun Aug 21, 2022 10:59 AM

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

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 309
Joined: Wed Mar 28, 2018 04:38 PM
Re: Mostrar control ActiveX codejock en diálogo desde recurso
Posted: Sun Aug 21, 2022 12:09 PM
Fantástico Master! :-)

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


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!
--------

¿ Y porque no ?

¿ And why not ?
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Mostrar control ActiveX codejock en diálogo desde recurso
Posted: Sun Aug 21, 2022 01:58 PM

Muchas gracias Victor por tus pruebas y ayuda :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 309
Joined: Wed Mar 28, 2018 04:38 PM
Re: Mostrar control ActiveX codejock en diálogo desde recurso
Posted: Sun Aug 21, 2022 04:59 PM
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. :-)



aquí el código:

Code (fw): Select all Collapse
#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 (fw): Select all Collapse
#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!
--------

¿ Y porque no ?

¿ And why not ?
Posts: 309
Joined: Wed Mar 28, 2018 04:38 PM
Re: Mostrar control ActiveX codejock en diálogo desde recurso
Posted: Mon Aug 22, 2022 09:45 AM

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!

--------

¿ Y porque no ?

¿ And why not ?
Posts: 866
Joined: Tue Oct 16, 2007 08:57 AM
Re: Mostrar control ActiveX codejock en diálogo desde recurso
Posted: Wed Aug 07, 2024 09:40 AM
VictorCasajuana wrote: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!
Any News?
Best Regards,



Richard



Harbour 3.2.0dev (r2503251254) => Borland C++ v7.7 32bit

MySQL v8.0

Harbour 3.2.0dev (r2503251254) => Borland C++ v7.7 64bit
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Mostrar control ActiveX codejock en diálogo desde recurso
Posted: Wed Aug 07, 2024 11:25 AM
VictorCasajuana wrote: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!
Estimado Victor,

Obvié este mensaje y gracias al mensaje de Richard acabo de verlo, a los dos años!

Hemos hecho una modificación en la Clase TActiveX a bajo nivel que debería liberar esa memoria que comentas que se queda sin liberar
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Mostrar control ActiveX codejock en diálogo desde recurso
Posted: Wed Aug 07, 2024 11:47 AM
richard-service wrote:
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!
Any News?
Dear Richard,

Here you have a modified actx.obj that should properly release the memory. Please replace this OBJ in FIveHC.lib and let me know your results:

https://github.com/FiveTechSoft/FWH_tools/blob/master/actx.obj
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 318
Joined: Fri Jan 14, 2022 08:37 AM
Re: Mostrar control ActiveX codejock en diálogo desde recurso
Posted: Wed Aug 07, 2024 02:14 PM

Hola Antonio,

¿ Crees que Actx.obj podria resolver los problemas de memoria que se presentan en excel y que, por ejemplo en xBrowse.prg estan resueltos en algunos casos sysrefresh() ?

Salu2

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Mostrar control ActiveX codejock en diálogo desde recurso
Posted: Wed Aug 07, 2024 06:23 PM

Hola Paco,

Si, habría que probarlo, es posible.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 318
Joined: Fri Jan 14, 2022 08:37 AM
Re: Mostrar control ActiveX codejock en diálogo desde recurso
Posted: Thu Aug 08, 2024 04:26 PM
Gracias, lo probaremos :)

Continue the discussion