Mostrar control ActiveX codejock en diálogo desde recurso

Mostrar control ActiveX codejock en diálogo desde recurso

Postby VictorCasajuana » Sat Aug 20, 2022 3: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: Select all  Expand view  RUN

#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  RUN

#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  RUN

#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  RUN

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  RUN

#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! :)
--------
¿ Y porque no ?
¿ And why not ?
User avatar
VictorCasajuana
 
Posts: 268
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs

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

Postby Antonio Linares » Sun Aug 21, 2022 9:05 am

Estimado Victor,

Prueba asi:
Code: Select all  Expand view  RUN
#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
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

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

Postby VictorCasajuana » 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:
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  RUN

#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  RUN

#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
--------
¿ Y porque no ?
¿ And why not ?
User avatar
VictorCasajuana
 
Posts: 268
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs

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

Postby Antonio Linares » 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
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

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

Postby VictorCasajuana » Sun Aug 21, 2022 12:09 pm

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!
--------
¿ Y porque no ?
¿ And why not ?
User avatar
VictorCasajuana
 
Posts: 268
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs

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

Postby Antonio Linares » Sun Aug 21, 2022 1:58 pm

Muchas gracias Victor por tus pruebas y ayuda :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

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

Postby VictorCasajuana » Sun Aug 21, 2022 4: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. :)

Image

aquí el código:

Code: Select all  Expand view  RUN

#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  RUN


#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 ?
User avatar
VictorCasajuana
 
Posts: 268
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs

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

Postby VictorCasajuana » Mon Aug 22, 2022 9: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 ?
User avatar
VictorCasajuana
 
Posts: 268
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs

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

Postby richard-service » Wed Aug 07, 2024 9: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 (r2402101027) => Borland C++ v7.7 32bit
MySQL v8.0 /ADS v10
Harbour 3.2.0dev (r2011030937) => Borland C++ v7.4 64bit
User avatar
richard-service
 
Posts: 804
Joined: Tue Oct 16, 2007 8:57 am
Location: New Taipei City, Taiwan

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

Postby Antonio Linares » 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
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

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

Postby Antonio Linares » Wed Aug 07, 2024 11:47 am

richard-service wrote:
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?


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
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

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

Postby paquitohm » Wed Aug 07, 2024 2: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
paquitohm
 
Posts: 281
Joined: Fri Jan 14, 2022 8:37 am

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

Postby Antonio Linares » Wed Aug 07, 2024 6:23 pm

Hola Paco,

Si, habría que probarlo, es posible.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

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

Postby paquitohm » Thu Aug 08, 2024 4:26 pm

Gracias, lo probaremos :)
paquitohm
 
Posts: 281
Joined: Fri Jan 14, 2022 8:37 am


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 99 guests