Page 1 of 2

ImageList en Treeview con Dialogo

Posted: Fri Jun 16, 2006 2:50 am
by jllinas
Hola a todos,

He buscado agregar un ImageList a un Treeview, pero no me funciona. Alguien sabe o ha tenido la experiencia de decirme porque no funciona este codigo?

Code: Select all

#Include "FiveWin.ch"

Function Main()

   LOCAL oDlg, oTree, oImageList

   DEFINE DIALOG oDlg TITLE "TreeView from source"

   oImageList = TImageList():New()

   oImageList:Add( TBitmap():Define( , "..\bitmaps\16x16\folder.bmp", oDlg ),;
                   TBitmap():Define( , "..\bitmaps\16x16\fldMask.bmp", oDlg ) )
   oImageList:Add( TBitmap():Define( , "..\bitmaps\16x16\form.bmp", oDlg ),;
                   TBitmap():Define( , "..\bitmaps\16x16\frmMask.bmp", oDlg ) )
   oImageList:Add( TBitmap():Define( , "..\bitmaps\16x16\icon.bmp", oDlg ),;
                   TBitmap():Define( , "..\bitmaps\16x16\icoMask.bmp", oDlg ) )
   oImageList:Add( TBitmap():Define( , "..\bitmaps\16x16\bitmap.bmp", oDlg ),;
                   TBitmap():Define( , "..\bitmaps\16x16\bmpMask.bmp", oDlg ) )

   @ 0.5, 1 TREEVIEW oTree OF oDlg SIZE 80,60 COLOR 0, GetSysColor( 5 )

   oTree:SetImageList( oImageList )

   ACTIVATE DIALOG oDlg CENTERED ON INIT AddItems( oTree )


Return NIL

********************************************************************************
Function AddItems( oTree )
********************************************************************************
   local oItem1, oItem2, oItem3

   oItem1 = oTree:Add( "First", 0 )

            oItem1:Add( "One", 1 )
            oItem1:Add( "Two", 1 )
            oItem1:Add( "Three", 1 )

   oItem2 = oTree:Add( "Second", 0 )

            oItem2:Add( "Hello" )
            oItem2:Add( "World" )

   oItem3 = oTree:Add( "Third", 0 )

            oItem3:Add( "Last" )
            oItem3:Add( "item" )
   oTree:Expand()

Return NIL
Gracias anticipadas,

Posted: Fri Jun 16, 2006 3:20 am
by jllinas
Ok, Ok, Ok.... me contesto yo mismo:

Hay que pasar el oImageList a la funcion que se llama al ON INIT del dialogo, e invocar alli el metodo del treeview

oTree:SetImageList( oImageList )

.... y listo!

Perdonen, es que siempre tengo que buscar.

La pregunta ahora es: ¿De verdad que no se puede cambiar el BMP en tiempo de ejecucion? Deseo hacerlo para incluir una configuracion del sistema estilo arbol, pero debo cambiar los BMP en tiempo de ejecucion

Gracias por soportarme !

Posted: Fri Jun 16, 2006 8:57 am
by Antonio Linares
Julio,

Puede hacerse pero aún no esta implementado en FWH.

Posted: Fri Jun 16, 2006 11:30 am
by RenOmaS
Veams si esto resulta..
Agrega este metodo a TTVItem.prg

Code: Select all

METHOD Set( cPrompt, nImage ) CLASS TTVItem
   DEFAULT cPrompt := ::cPrompt, ;
           nImage  := ::nImage

   TVSetTextImage( ::oTree:hWnd, ::hItem, cPrompt, nImage )

   Return nil

#pragma BEGINDUMP

#include <WinTen.h>
#include <windows.h>
#include <CommCtrl.h>
#include <ClipApi.h>

HB_FUNC ( TVSETTEXTIMAGE ) // ( hWnd ) --> cText
{
   HWND hWnd = ( HWND ) _parnl( 1 );
   HTREEITEM hItem = ( HTREEITEM ) _parnl( 2 );
   TV_ITEM tvi;
   tvi.hItem      = hItem;

   tvi.mask    = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
   tvi.pszText = _parc( 3 );
   tvi.iImage  = _parnl( 4 );
   tvi.iSelectedImage = _parnl( 4 );
   TreeView_SetItem( hWnd, &tvi );

}

#pragma ENDDUMP

Ahora puedes utilizar

oItem:Set( "MI Texto Nuevo", 2 )

ten presente que 2 es el tercer elemento en tu ImagenList, porque la numeracion comienza de 0

;)

Posted: Mon Jun 19, 2006 12:01 am
by jllinas
Muy Bien,

Pues como se muestra con el ejemplo, aquí incluyo el ejemplo que desarollé, partiendo de uno que me proporcionó AL sobre un Treeview en codigo.

Ojala y les sirva a muchos de Ustedes. Como recomendación, creo que las proximas ediciones de FW deben incluir los BMP de controles radio en BITMAPS\16x16. En este ejemplo lo hago con otros cualesquiera.

Code: Select all

#Include "FiveWin.ch"

Function Main()

   LOCAL oDlg, oTree, oImageList
    
   // Sample suggested by Antonio Linares, and modified by Julio Llin s

   DEFINE DIALOG oDlg TITLE "TreeView from source"

   oImageList = TImageList():New()

   oImageList:Add( TBitmap():Define( , "..\bitmaps\16x16\folder.bmp", oDlg ),;
                   TBitmap():Define( , "..\bitmaps\16x16\fldMask.bmp", oDlg ) )
   oImageList:Add( TBitmap():Define( , "..\bitmaps\16x16\form.bmp", oDlg ),;
                   TBitmap():Define( , "..\bitmaps\16x16\frmMask.bmp", oDlg ) )
   oImageList:Add( TBitmap():Define( , "..\bitmaps\16x16\icon.bmp", oDlg ),;
                   TBitmap():Define( , "..\bitmaps\16x16\icoMask.bmp", oDlg ) )
   oImageList:Add( TBitmap():Define( , "..\bitmaps\16x16\bitmap.bmp", oDlg ),;
                   TBitmap():Define( , "..\bitmaps\16x16\bmpMask.bmp", oDlg ) )
   oImageList:Add( TBitmap():Define( , "..\bitmaps\16x16\folder2.bmp", oDlg ),;
                   TBitmap():Define( , "..\bitmaps\16x16\bmpMask.bmp", oDlg ) )
   oImageList:Add( TBitmap():Define( , "..\bitmaps\16x16\checkbox.bmp", oDlg ),;
                   TBitmap():Define( , "..\bitmaps\16x16\bmpMask.bmp", oDlg ) )
   oImageList:Add( TBitmap():Define( , "..\bitmaps\16x16\cancel.bmp", oDlg ),;
                   TBitmap():Define( , "..\bitmaps\16x16\bmpMask.bmp", oDlg ) )

   @ 0.5, 1 TREEVIEW oTree OF oDlg SIZE 90,60 COLOR 0, GetSysColor( 5 )

   oTree:bLDblClick := { | nRow, nCol, nKeyFlags | MyClick( nRow, nCol, oTree ) }

   ACTIVATE DIALOG oDlg CENTERED ON INIT AddItems( oTree, oImageList )

Return NIL

********************************************************************************
Function AddItems( oTree, oImageList )
********************************************************************************
   local oItem1, oItem2, oItem3
   local oItem11, oItem12, oItem13
   local oItem21, oItem22
   local oItem31, oItem32, oItem33, oItem34, oItem35
   local Mydate, Mytime

   Mydate := DATE()
   Mytime := TIME()

   oTree:SetImageList( oImageList )
  
   oItem1 = oTree:Add( "CHECKBOX in a Tree", 0 )

      // "Cargo" set a Checkbox control
      oItem11 = oItem1:Add( "One",   6); oItem11:Cargo:={"CHECKBOX"}
      oItem12 = oItem1:Add( "Two",   6); oItem12:Cargo:={"CHECKBOX"}
      oItem13 = oItem1:Add( "Three", 6); oItem13:Cargo:={"CHECKBOX"}

   oItem2 = oTree:Add( "GET in a Tree", 0 ) 

      // "Cargo" set a Get control, AND the variable to manage in GET
      oItem21 = oItem2:Add( DTOC(Mydate), 2 ); oItem21:Cargo:={"GET",Mydate}
      oItem22 = oItem2:Add( Mytime      , 2 ); oItem22:Cargo:={"GET",Mytime}

   oItem3 = oTree:Add( "RADIO in a Tree", 0 )

      // "Cargo" set a Radio control, the selected option and "parent" branch
      oItem31 = oItem3:Add( "One", 2 ); oItem31:Cargo:={"RADIO",2,oItem3}
      oItem32 = oItem3:Add( "Two", 1 ); oItem32:Cargo:={"RADIO",1,oItem3}
      oItem33 = oItem3:Add( "Tree",1 ); oItem33:Cargo:={"RADIO",1,oItem3}
      oItem34 = oItem3:Add( "Four",1 ); oItem34:Cargo:={"RADIO",1,oItem3}
      oItem35 = oItem3:Add( "Five",1 ); oItem35:Cargo:={"RADIO",1,oItem3}

   oTree:Expand()

Return NIL

********************************************************************************
Function Myclick( nRow, nCol, oTree )
********************************************************************************
   local oItem, array, Mydate, Mget, hItem, II, oItemRadio

   oItem := oTree:HitTest( nRow, nCol )

   IF oItem != NIL
      IF oItem:Cargo != NIL      
         array := oItem:Cargo
         DO CASE
           // managing a checkbox control.  BMP can be changed.
           CASE array[1] = "CHECKBOX"
             IF oItem:nImage = 5
                oItem:Set( ,6)
                oItem:nImage := 6
             ELSE
                oItem:Set( ,5)
                oItem:nImage := 5
             ENDIF

           // managing a get control.  BMP can be changed.  
           //   We use MsgGet and MsgDate functions.
           //   Keep in second element of "Cargo" the variable to edit,
           //   VALTYPE of this element is important for correct GET manager
           CASE array[1] = "GET"
             DO CASE
              CASE VALTYPE( array[2] ) = "D"
                Mydate := MsgDate( array[2] )
                oItem:Set( DTOC(Mydate) )
                oItem:cPrompt := DTOC( Mydate )
                oItem:Cargo[2]:= Mydate

              CASE VALTYPE( array[2] ) = "C"
                Mget := PADR(oItem:cPrompt,256)
                IF MsgGet( "Modificar...", "Modifique esta cadena de caracteres", @Mget )
                   Mget := ALLTRIM( Mget )
                   oItem:Set( Mget )
                   oItem:cPrompt := Mget
                   oItem:Cargo[2]:= Mget
                ENDIF

              CASE VALTYPE( array[2] ) = "N"
                Mget := VAL(oItem:cPrompt)
                IF MsgGet( "Modificar...", "Modifique este numero", @Mget )
                   oItem:Set( STR(Mget) )
                   oItem:cPrompt := STR(Mget)
                   oItem:Cargo[2]:= Mget
                ENDIF

             ENDCASE

           // managing a RADIO control.  BMP can be changed
           // "2" means choosen option, and "1" means NO choosen options
           CASE array[1] = "RADIO"
             hItem := oItem:hItem
             FOR II := 1 TO LEN( array[3]:aItems )
                oItemRadio := array[3]:aItems[II]
                IF oItemRadio:hItem = hItem
                   oItemRadio:Set( ,2)
                   oItemRadio:Cargo[2]:=2
                ELSE
                   oItemRadio:Set( ,1)
                   oItemRadio:Cargo[2]:=1
                ENDIF
             NEXT
                   
         ENDCASE
      ENDIF
   ENDIF

return nil
Abrazos,

Posted: Mon Jun 19, 2006 4:35 am
by Antonio Linares
Julio,

>
Como recomendación, creo que las proximas ediciones de FW deben incluir los BMP de controles radio en BITMAPS\16x16.
>

Por favor, podrías enviarme esos bitmaps por email ? gracias

Posted: Fri Aug 03, 2007 10:55 pm
by MarioG
JLLinas;
estoy probando el código que dejaste, pero resulta que el método TTVITEM:SET() no lo tiene la clase TTVItem.
Uso la version 26MAY2005, es por eso?

gracias

Posted: Tue Aug 07, 2007 1:09 am
by MarioG
Antonio; tu me podrías dar algún dato sobre la consulta anterior?

gracias

Posted: Tue Aug 07, 2007 7:20 am
by Antonio Linares
Mario,

La versión que usas es bastante antigua. _ en la clase TTVItem se hicieron en octubre-Noviembre 2006.

Posted: Tue Aug 07, 2007 8:11 pm
by MarioG
gracias

Error en la generacion de TTVitem.prg

Posted: Fri Feb 08, 2008 3:36 pm
by pablo.softgraf
Senhor Renomas , vi su post que hace algun tiempo que lo coloco pero está siendo una incognita para mi !

Tengo un problema al generar la FiveHX.lib

coloque el método "SET" en la classe TTVitem original
para cambiar el Bmp de algun item en tiempo de ejecucion

exactamente como dices tú

[red]
METHOD Set( cPrompt, nImage ) CLASS TTVItem
DEFAULT cPrompt := ::cPrompt, ;
nImage := ::nImage

TVSetTextImage( ::oTree:hWnd, ::hItem, cPrompt, nImage )

Return nil

#pragma BEGINDUMP

#include <WinTen.h>
#include <windows.h>
#include <CommCtrl.h>
#include <ClipApi.h>

HB_FUNC ( TVSETTEXTIMAGE ) // ( hWnd ) --> cText
{
HWND hWnd = ( HWND ) _parnl( 1 );
HTREEITEM hItem = ( HTREEITEM ) _parnl( 2 );
TV_ITEM tvi;
tvi.hItem = hItem;

tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvi.pszText = _parc( 3 );
tvi.iImage = _parnl( 4 );
tvi.iSelectedImage = _parnl( 4 );
TreeView_SetItem( hWnd, &tvi );

}

#pragma ENDDUMP
[/red]


pero en el momento que genero la lib me muestra este mensaje


[blue]
Classes - 0151 TTVITEM --------------------------------------------------------------
xHarbour Compiler build 0.99.61 (SimpLex)
Copyright 1999-2006, http://www.xharbour.org http://www.harbour-project.org/
Compiling 'c:\fwh27\source\classes\TTVITEM.prg'...

Lines 116, Functions/Procedures 5
Generating C source output to 'TTVITEM.c'...
Done.
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
ttvitem.c:
Error E2209 c:\\fwh27\\source\\classes\\TTVITEM.prg 4: Unable to open include file 'WinTen.h'
Error E2209 c:\\fwh27\\source\\classes\\TTVITEM.prg 7: Unable to open include file 'ClipApi.h'
Warning W8065 c:\\fwh27\\source\\classes\\TTVITEM.prg 11: Call to function '_parnl' with no prototype in function HB_FUN_TVSETTEXTIMAGE
Warning W8065 c:\\fwh27\\source\\classes\\TTVITEM.prg 12: Call to function '_parnl' with no prototype in function HB_FUN_TVSETTEXTIMAGE
Warning W8065 c:\\fwh27\\source\\classes\\TTVITEM.prg 17: Call to function '_parc' with no prototype in function HB_FUN_TVSETTEXTIMAGE
Warning W8069 c:\\fwh27\\source\\classes\\TTVITEM.prg 17: Nonportable pointer conversion in function HB_FUN_TVSETTEXTIMAGE
Warning W8065 c:\\fwh27\\source\\classes\\TTVITEM.prg 18: Call to function '_parnl' with no prototype in function HB_FUN_TVSETTEXTIMAGE
Warning W8065 c:\\fwh27\\source\\classes\\TTVITEM.prg 19: Call to function '_parnl' with no prototype in function HB_FUN_TVSETTEXTIMAGE
*** 2 errors in Compile ***
TLIB 4.5 Copyright (c) 1987, 1999 Inprise Corporation

Warning: 'TTVITEM' not found in library
Warning: 'TTVITEM.OBJ' file not found
[/blue]

Pablo Andrés Reyes Rivera
FWH 2.7 - xHarbour Compiler build 0.99.61 (SimpLex) - PellesC

Posted: Fri Feb 08, 2008 5:00 pm
by mmercado
Como recomendación, creo que las proximas ediciones de FW deben incluir los BMP de controles radio en BITMAPS\16x16.
Hola Julio:
Image
Image
Un abrazo.
Manuel Mercado

Posted: Fri Feb 08, 2008 5:19 pm
by RenOmaS
pablo.softgraf

vc, tem que configurar seu bath ou make com que gera a lib para que ela apunte a include de borland.

como esta a gerar a lib?

cumprimentos

Posted: Fri Feb 08, 2008 5:30 pm
by pablo.softgraf
Todas as classes estou compilando da mesma maneira ,
se eu compilar a classe TTVITEM sem o pragma begin e pragma end
e sem a adição do metodo SET ela funciona caso contrário da o erro postado anteriormente

eu faço assim pra todas as classes

ECHO Classes - 0151 TTVITEM
ECHO Classes - 0151 TTVITEM -------------------------------------------------------------- >> FIVEHX.LOG
\xharbour\bin\harbour.exe c:\fwh27\source\classes\TTVITEM /n/a/v/w /i\fwh27\include;\xharbour\include >> FIVEHX.LOG
ECHO -O2 -I\xharbour\include -tW TTVITEM.C > b32.bc
c:\borland\bcc55\bin\bcc32.exe -tWM -DHB_GUI -DHB_API_MACROS -DHB_STACK_MACROS -DHB_FM_STATISTICS_OFF -d -a8 -OS -O2 -5 -c @b32.bc >> FIVEHX.LOG
c:\borland\bcc55\bin\tlib.exe FIVEHX -+TTVITEM /0 /P32,, >> FIVEHX.LOG
DEL TTVITEM.C >> FIVEHX.LOG
DEL TTVITEM.OBJ >> FIVEHX.LOG

Posted: Fri Feb 08, 2008 6:11 pm
by RenOmaS
\xharbour\bin\harbour.exe c:\fwh27\source\classes\TTVITEM /n/a/v/w /i\fwh27\include;\xharbour\include;c:\borland\bcc55\include >> FIVEHX.LOG