Mostrar control ActiveX codejock en diálogo desde recurso

Post Reply
User avatar
VictorCasajuana
Posts: 269
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs
Has thanked: 1 time
Contact:

Mostrar control ActiveX codejock en diálogo desde recurso

Post 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


#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


#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


#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


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


#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
Antonio Linares
Site Admin
Posts: 42511
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 73 times
Contact:

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

Post by Antonio Linares »

Estimado Victor,

Prueba asi:

Code: Select all | Expand

#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
VictorCasajuana
Posts: 269
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs
Has thanked: 1 time
Contact:

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

Post 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


#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


#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
Antonio Linares
Site Admin
Posts: 42511
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 73 times
Contact:

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

Post 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
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
VictorCasajuana
Posts: 269
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs
Has thanked: 1 time
Contact:

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

Post 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!
--------
¿ Y porque no ?
¿ And why not ?
User avatar
Antonio Linares
Site Admin
Posts: 42511
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 73 times
Contact:

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

Post by Antonio Linares »

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

Antonio Linares
www.fivetechsoft.com
User avatar
VictorCasajuana
Posts: 269
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs
Has thanked: 1 time
Contact:

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

Post 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


#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



#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: 269
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs
Has thanked: 1 time
Contact:

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

Post 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!
--------
¿ Y porque no ?
¿ And why not ?
User avatar
richard-service
Posts: 807
Joined: Tue Oct 16, 2007 8:57 am
Location: New Taipei City, Taiwan
Has thanked: 1 time
Contact:

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

Post by richard-service »

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
Antonio Linares
Site Admin
Posts: 42511
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 73 times
Contact:

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

Post by Antonio Linares »

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: 42511
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 73 times
Contact:

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

Post by Antonio Linares »

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_too ... r/actx.obj
regards, saludos

Antonio Linares
www.fivetechsoft.com
paquitohm
Posts: 287
Joined: Fri Jan 14, 2022 8:37 am
Been thanked: 1 time

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

Post by paquitohm »

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
User avatar
Antonio Linares
Site Admin
Posts: 42511
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 73 times
Contact:

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

Post by Antonio Linares »

Hola Paco,

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

Antonio Linares
www.fivetechsoft.com
paquitohm
Posts: 287
Joined: Fri Jan 14, 2022 8:37 am
Been thanked: 1 time

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

Post by paquitohm »

Gracias, lo probaremos :)
Post Reply