Are there any Treeview samples with associated edit boxes?

Are there any Treeview samples with associated edit boxes?

Postby FWExplorer » Mon Nov 23, 2020 11:54 pm

Hi,

I'd like to build a simple pim using a Treeview as a basis, but am not certain how to start.

Kresin has a 'KS Organizer' in Harbour, but the source isn't available.

http://www.kresin.ru/en/ksorg.html

I'll reinvent the wheel if necessary, but wanted to see if there are some existing snippets that maybe associate a memo field with each node, and save the tree to a database or json or whatever.
FWExplorer
 
Posts: 100
Joined: Fri Aug 09, 2013 12:43 am

Re: Are there any Treeview samples with associated edit boxes?

Postby Antonio Linares » Tue Nov 24, 2020 10:24 am

D.

work in progress:
Image

pim.prg
Code: Select all  Expand view
// FiveWin PIM (personal information manager)

#include "FiveWin.ch"
#include "Splitter.ch"
#include "xbrowse.ch"

static oWnd, oBtnSave, oImageList, oMruRCs
           
//----------------------------------------------------------------------------//
                   
function Main()    
                   
   local oBar, oMenuNew
   local oBmpTiled
   
   DEFINE BITMAP oBmpTiled RESOURCE "background"

   DEFINE WINDOW oWnd FROM 3, 6 TO 20, 70 ;
      TITLE FWVERSION + " PIM" ;
      MENU BuildMenu() MDI
                   
   DEFINE BUTTONBAR oBar SIZE 70, 70 OF oWnd 2010
                   
   DEFINE BUTTON OF oBar PROMPT "New" ;
      TOOLTIP "New" NOBORDER RESOURCE "New"
                   
   DEFINE BUTTON OF oBar PROMPT "Open" ;
      TOOLTIP "Open" NOBORDER RESOURCE "Open" ;
      ACTION OpenDataFile()
                   
   DEFINE BUTTON oBtnSave OF oBar PROMPT "Save" ;
      TOOLTIP "Save" NOBORDER RESOURCE "Save" ACTION Save()
     
   oBtnSave:Disable()  

   DEFINE BUTTON OF oBar GROUP PROMPT "Exit" ;
      TOOLTIP "Exit" NOBORDER RESOURCE "Exit" ACTION oWnd:End()

   oImageList = TImageList():New()

   oImageList:Add( TBitmap():Define( "folder",,  oWnd ),;
                   TBitmap():Define( "fldmask",, oWnd ) )
   oImageList:Add( TBitmap():Define( "dialog",,  oWnd ),;
                   TBitmap():Define( "dlgmask",, oWnd ) )
   oImageList:Add( TBitmap():Define( "icon",,    oWnd ),;
                   TBitmap():Define( "icomask",, oWnd ) )
   oImageList:Add( TBitmap():Define( "bitmap",,  oWnd ),;
                   TBitmap():Define( "bmpmask",, oWnd ) )
   oImageList:Add( TBitmap():Define( "includes",, oWnd ),;
                   TBitmap():Define( "incmask",, oWnd ) )

   DEFINE MSGBAR OF oWnd PROMPT "Personal Information Manager (c) FiveTech Software 2020" DATE KEYBOARD 2010

   ACTIVATE WINDOW oWnd MAXIMIZED ;
      ON PAINT DrawTiled( hDC, oWnd, oBmpTiled )
      // VALID MsgYesNo( "Want to end ?" )

   oBmpTiled:End()
   oImageList:End()
 
return nil

//----------------------------------------------------------------------------//

function BuildMenu()

   local oMenu

   MENU oMenu 2007
      MENUITEM "&File"
      MENU
         MENUITEM "&New"  RESOURCE "new2"
         MENUITEM "&Open" RESOURCE "Open2" ;
            ACTION OpenDataFile()

         MENUITEM "&Save as..."
         SEPARATOR
   
         MENUITEM "Recent files"
         MENU
            MRU oMruRCs ;
               FILENAME ".\re.ini" ;    // .INI to manipulate. '\.' for local
               SECTION  "Recent RC files" ; // The name of the INI section
               ACTION   OpenDataFile( cMruItem ) ;   // cMruItem is automatically provided
               MESSAGE  "Open this file" ;   // The message for all of them
               SIZE     10
         ENDMENU
         
         SEPARATOR
         
         MENUITEM "&Exit..." ACTION oWnd:End() RESOURCE "Exit2"
      ENDMENU
      MENUITEM "&Edit"
      oMenu:AddMDI()
      oMenu:AddHelp( "FiveWin Resources Editor", "FiveTech 1993-2018" )
   ENDMENU

return oMenu

//----------------------------------------------------------------------------//

function Save()

   local oTreeView := oWnd:oWndActive:aControls[ 1 ]
   local cText := "", cFileName := oWnd:oWndActive:GetText()
   
   oTreeView:Scan( { | oItem | BuildXML( oItem, @cText ) } )
   
   if File( cFileName )
      if MsgYesNo( "Do you want to overwrite " + cFileName + " ?",;
                   cFileName + " already exists" )
         // MemoWrit( cFileName, cText )
         MsgInfo( cText )
         oBtnSave:Disable()
      endif  
   else
      MemoWrit( cFileName, cText )
      oBtnSave:Disable()
   endif
   
return nil  

//----------------------------------------------------------------------------//

function BuildXML( oItem, cText )

   if oItem:oParent != nil
      cText += CRLF
   endif
   
   cText += "<" + oItem:cPrompt + ">"

   if ! Empty( oItem:Cargo )
      cText += oItem:Cargo
   endif    
   
   if Len( oItem:aItems ) == 0
      cText += "</" + oItem:cPrompt + ">"
   endif      

   if oItem:oParent != nil
      if oItem == ATail( oItem:oParent:aItems )
         cText += CRLF + "</" + oItem:oParent:cPrompt + ">"
      endif
   endif  

return .F.  // so it iterates the entire tree

//----------------------------------------------------------------------------//

function OpenDataFile( cFileName )

   local oWndData, oTree, oMemo, oSplit
   local cTxtFile, cLine, nFrom := 1, cItemText := "", cText
   local oItem, oIncItem, oDefItem, oBmpItem, oDlgItem, oIcoItem
   local oMnuItem, oMnuString

   DEFAULT cFileName := cGetFile( "XML files (*.xml) |*.xml| JSON files (*.json)", "Select a data file" )

   if Empty( cFileName )
      return nil
   endif  

   oMruRCs:Save( cFileName )
   oBtnSave:Disable()

   DEFINE WINDOW oWndData TITLE cFileName MDICHILD

   oTree = TTreeView():New( 2, 0, oWndData )
   oTree:bChanged = { | oItem | oItem := oTree:GetSelected(),;
                      If( oItem != nil, oMemo:SetText( If( ! Empty( oItem:Cargo ), oItem:Cargo, "" ) ),) }
   // oTree:bLDblClick = { || ShowItem( oTree:GetSelected() ) }                  
   oTree:bRClicked = { | nRow, nCol | EditTree( nRow, nCol, oWndData, oTree ) }

   oTree:SetImageList( oImageList )
   oTree:nWidth += 48

   @ 0, 25.7 GET oMemo VAR cItemText MEMO OF oWndData SIZE 300, 100 ;
      ON CHANGE ( oBtnSave:Enable(), oMemo:Cargo := .T.,;
                  oTree:GetSelected():Cargo := cItemText )
                 
   oMemo:Cargo = .F. // it has not changed              

   @ 0, 200 SPLITTER oSplit ;
      VERTICAL ;
      PREVIOUS CONTROLS oTree ;
      HINDS CONTROLS oMemo ;
      SIZE 4, 200 PIXEL ;
      OF oWndData
     
   oSplit:AdjClient()  

   if ! Empty( cFileName )
      cTxtFile = MemoRead( cFileName )
     
      do case
         case Upper( cFileExt( cFileName ) ) == "XML"
            OpenXML( cFileName, oTree )
           
         case Upper( cFileExt( cFileName ) ) == "JSON"
            OpenJSON( cFileName, oTree )
      endcase
   endif  

   ACTIVATE WINDOW oWndData ;
      ON RESIZE oSplit:AdjClient()
     
   oWndData:bGotFocus = { || If( oMemo:Cargo, oBtnSave:Enable(), oBtnSave:Disable() ) }  
     
return nil

//----------------------------------------------------------------------------//

function OpenXML( cFileName, oTree )

   local aRoots := {}, hFile, oXmlDoc, oXmlIter, oTagLast, oTagActual

   hFile    = FOpen( cFileName )
   oXmlDoc  = TXmlDocument():New( hFile )
   oXmlIter = TXmlIterator():New( oXmlDoc:oRoot )

   AAdd( aRoots, oTree )

   while ( oTagActual := oXmlIter:Next() ) != nil
      if oTagLast != nil
         if oTagLast:Depth() < oTagActual:Depth()
            ASize( aRoots, Len( aRoots ) + 1 )
            aRoots[ oTagActual:Depth() + 1 ] = aRoots[ oTagActual:Depth() ]:Add( oTagActual:cName )
            aRoots[ oTagActual:Depth() + 1 ]:Cargo = oTagActual:cData
         endif

         if oTagLast:Depth() > oTagActual:Depth()
            aRoots[ oTagActual:depth() + 1 ] = aRoots[ oTagActual:Depth() ]:Add( oTagActual:cName )
            aRoots[ oTagActual:depth() + 1 ]:Cargo = oTagActual:cData
         endif

         if oTagLast:Depth() == oTagActual:Depth()
            aRoots[ Max( oTagLast:Depth(), 1 ) ]:Add( oTagActual:cName ):Cargo = oTagActual:cData
         endif
      else
         AAdd( aRoots, oTree:Add( oTagActual:cName ) )
         ATail( aRoots ):Cargo = oTagActual:cData
      endif
      oTagLast = oTagActual
   end

   FClose( hFile )

return nil    

//----------------------------------------------------------------------------//

function OpenJSON( cFileName )

return nil    

//----------------------------------------------------------------------------//

function ShowImage( cBmp )

   local oDlg, oBmp
   
   DEFINE DIALOG oDlg TITLE cBmp

   if Lower( Right( cBmp, 3 ) ) == "bmp"
      @ 0, 0 BITMAP oBmp FILENAME cBmp OF oDlg NOBORDER
   elseif Lower( Right( cBmp, 3 ) ) == "ico"
      @ 0, 0 ICON oBmp FILENAME cBmp OF oDlg
   endif    
   
   ACTIVATE DIALOG oDlg CENTERED ;
      ON INIT ( oDlg:SetSize( Max( 300, oBmp:nWidth + 20 ),;
                              Max( 300, oBmp:nHeight + 20 ) ),;
                oBmp:Center( oDlg ), oDlg:Center() )              
   
return nil  

//----------------------------------------------------------------------------//

function EditTree( nRow, nCol, oWndData, oTree )

   local oPopup
   
   MENU oPopup POPUP
      MENUITEM "Add"       ACTION If( oTree:GetSelected() != nil, ( oTree:GetSelected():oParent:Add( "new" ), oTree:Refresh() ),)
      MENUITEM "Add child" ACTION If( oTree:GetSelected() != nil, ( oTree:GetSelected():Add( "new" ), oTree:Refresh() ),)
      MENUITEM "Edit"
      MENUITEM "Delete"    
   ENDMENU  

   ACTIVATE POPUP oPopup WINDOW oWndData AT nRow, nCol

return nil

//----------------------------------------------------------------------------//

static function GenDblClickBlock( oCtrl )

return { || MsgInfo( oCtrl:nId ) }

//----------------------------------------------------------------------------//


pim.rc
Code: Select all  Expand view
#ifndef __64__
  1 24 "WinXP/WindowsXP.Manifest"
#endif

background BITMAP .\..\bitmaps\backgrnd\iosbg.bmp

New      BITMAP "../bitmaps/32x32/new.bmp"
New2     BITMAP "../bitmaps/16x16/new.bmp"
Dialog   BITMAP "../bitmaps/16x16/form.bmp"
DlgMask  BITMAP "../bitmaps/16x16/frmmask.bmp"
Open     BITMAP "../bitmaps/32x32/open.bmp"
Open2    BITMAP "../bitmaps/16x16/open.bmp"
Save     BITMAP "../bitmaps/32x32/floppy.bmp"
Run      BITMAP "../bitmaps/32x32/run.bmp"
Prg      BITMAP "../bitmaps/32x32/source.bmp"
Exit     BITMAP "../bitmaps/32x32/exit.bmp"
Exit2    BITMAP "../bitmaps/16x16/exit2.bmp"
includes BITMAP "../bitmaps/16x16/next.bmp"
incmask  BITMAP "../bitmaps/16x16/nxtmask.bmp"
bitmap   BITMAP "../bitmaps/16x16/bitmap.bmp"
bmpmask  BITMAP "../bitmaps/16x16/bmpmask.bmp"
icon     BITMAP "../bitmaps/16x16/icon.bmp"
icomask  BITMAP "../bitmaps/16x16/icomask.bmp"
folder   BITMAP "../bitmaps/16x16/folder.bmp"
fldmask  BITMAP "../bitmaps/16x16/fldmask.bmp"
regards, saludos

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

Re: Are there any Treeview samples with associated edit boxes?

Postby FWExplorer » Tue Nov 24, 2020 1:15 pm

Ah, so you guys are working on something like this?

Ok thanks, I'll hold off and I'll check back periodically, and stay subscribed to FTDN.

Btw, do you send out notifications when our FTDN has to be renewed?
FWExplorer
 
Posts: 100
Joined: Fri Aug 09, 2013 12:43 am

Re: Are there any Treeview samples with associated edit boxes?

Postby Antonio Linares » Tue Nov 24, 2020 6:12 pm

D.

> Ah, so you guys are working on something like this?

We have used another FWH example to adapt it. We always wanted to have a tool like this one, too :-)

> Ok thanks, I'll hold off and I'll check back periodically, and stay subscribed to FTDN.

We have included this pim.prg new example in FWH examples for next FWH build. many thanks

> Btw, do you send out notifications when our FTDN has to be renewed?

Sometimes :-)
regards, saludos

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

Re: Are there any Treeview samples with associated edit boxes?

Postby Antonio Linares » Thu Nov 26, 2020 1:38 pm

Enhanced version:

EXE and full source code (it requires FWH 20.10)
https://github.com/FiveTechSoft/FWH_tools/blob/master/pim.zip

pim.prg
Code: Select all  Expand view
// FiveWin PIM (personal information manager)

#include "FiveWin.ch"
#include "Splitter.ch"
#include "xbrowse.ch"

static oWnd, oBtnSave, oImageList, oMruRCs
           
//----------------------------------------------------------------------------//
                   
function Main()    
                   
   local oBar, oMenuNew
   local oBmpTiled
   
   DEFINE BITMAP oBmpTiled RESOURCE "background"

   DEFINE WINDOW oWnd FROM 3, 6 TO 20, 70 ;
      TITLE FWVERSION + " PIM" ;
      MENU BuildMenu() MDI
                   
   DEFINE BUTTONBAR oBar SIZE 70, 70 OF oWnd 2010
                   
   DEFINE BUTTON OF oBar PROMPT "New" ;
      TOOLTIP "New" NOBORDER RESOURCE "New" ;
      ACTION NewDataFile()
                   
   DEFINE BUTTON OF oBar PROMPT "Open" ;
      TOOLTIP "Open" NOBORDER RESOURCE "Open" ;
      ACTION OpenDataFile()
                   
   DEFINE BUTTON oBtnSave OF oBar PROMPT "Save" ;
      TOOLTIP "Save" NOBORDER RESOURCE "Save" ACTION Save()
     
   oBtnSave:Disable()  

   DEFINE BUTTON OF oBar GROUP PROMPT "Exit" ;
      TOOLTIP "Exit" NOBORDER RESOURCE "Exit" ACTION oWnd:End()

   oImageList = TImageList():New()

   oImageList:Add( TBitmap():Define( "folder",,  oWnd ),;
                   TBitmap():Define( "fldmask",, oWnd ) )
   oImageList:Add( TBitmap():Define( "dialog",,  oWnd ),;
                   TBitmap():Define( "dlgmask",, oWnd ) )
   oImageList:Add( TBitmap():Define( "icon",,    oWnd ),;
                   TBitmap():Define( "icomask",, oWnd ) )
   oImageList:Add( TBitmap():Define( "bitmap",,  oWnd ),;
                   TBitmap():Define( "bmpmask",, oWnd ) )
   oImageList:Add( TBitmap():Define( "includes",, oWnd ),;
                   TBitmap():Define( "incmask",, oWnd ) )

   DEFINE MSGBAR OF oWnd PROMPT "Personal Information Manager (c) FiveTech Software 2020" DATE KEYBOARD 2010

   ACTIVATE WINDOW oWnd MAXIMIZED ;
      ON PAINT DrawTiled( hDC, oWnd, oBmpTiled )
      // VALID MsgYesNo( "Want to end ?" )

   oBmpTiled:End()
   oImageList:End()
 
return nil

//----------------------------------------------------------------------------//

function BuildMenu()

   local oMenu

   MENU oMenu 2007
      MENUITEM "&File"
      MENU
         MENUITEM "&New"  RESOURCE "new2"
         MENUITEM "&Open" RESOURCE "Open2" ;
            ACTION OpenDataFile()

         MENUITEM "&Save as..."
         SEPARATOR
   
         MENUITEM "Recent files"
         MENU
            MRU oMruRCs ;
               FILENAME ".\re.ini" ;    // .INI to manipulate. '\.' for local
               SECTION  "Recent RC files" ; // The name of the INI section
               ACTION   OpenDataFile( cMruItem ) ;   // cMruItem is automatically provided
               MESSAGE  "Open this file" ;   // The message for all of them
               SIZE     10
         ENDMENU
         
         SEPARATOR
         
         MENUITEM "&Exit..." ACTION oWnd:End() RESOURCE "Exit2"
      ENDMENU
      MENUITEM "&Edit"
      oMenu:AddMDI()
      oMenu:AddHelp( "FiveWin Resources Editor", "FiveTech 1993-2018" )
   ENDMENU

return oMenu

//----------------------------------------------------------------------------//

function Save()

   local oTreeView := oWnd:oWndActive:aControls[ 1 ]
   local cText := "", cFileName := oWnd:oWndActive:GetText()
   
   oTreeView:Scan( { | oItem, nItem | BuildXML( oItem, @cText, nItem ) } )
   
   if File( cFileName )
      if MsgYesNo( "Do you want to overwrite " + cFileName + " ?",;
                   cFileName + " already exists" )
         hb_MemoWrit( cFileName, cText, .F. )
         MsgInfo( cText )
      endif  
   else
      hb_MemoWrit( cFileName, cText,.F. )
   endif
   oBtnSave:Disable()
   
return nil  

//----------------------------------------------------------------------------//

function BuildXML( oItem, cText, nItem )

   if oItem:oParent != nil
      cText += CRLF
   endif
   
   if oItem:oParent == nil .and. nItem == 1
      if oItem:cPrompt != "xml"
         oItem:Cargo = oItem:cPrompt
         oItem:cPrompt = "xml"
         cText += "<" + oItem:Cargo + ">"
      endif
   endif      

   if " " $ oItem:cPrompt
      oItem:cPrompt = StrTran( oItem:cPrompt, " ", "_" )
   endif  

   cText += "<" + If( ! Empty( oItem:cPrompt ), oItem:cPrompt, "" ) + ">"

   if ! Empty( oItem:Cargo )
      cText += oItem:Cargo
   endif    
   
   if Len( oItem:aItems ) == 0
      cText += "</" + If( ! Empty( oItem:cPrompt ), oItem:cPrompt, "" ) + ">"
   endif      

   if oItem:oParent != nil .and. oItem:cPrompt != "xml"
      if oItem == ATail( oItem:oParent:aItems )
         cText += CRLF + "</" + oItem:oParent:cPrompt + ">"
      endif
   endif  

return .F.  // so it iterates the entire tree

//----------------------------------------------------------------------------//

function NewDataFile( cFileName )

   local oWndData, oTree, oMemo, cItemText, oSplit

   DEFAULT cFileName := cNewFileName( "new", "xml" )

   DEFINE WINDOW oWndData TITLE cFileName MDICHILD

   oTree = TTreeView():New( 2, 0, oWndData )
   oTree:bChanged = { | oItem | oItem := oTree:GetSelected(),;
                      If( oItem != nil, oMemo:SetText( If( ! Empty( oItem:Cargo ), oItem:Cargo, "" ) ),) }
   // oTree:bLDblClick = { || ShowItem( oTree:GetSelected() ) }                  
   oTree:bRClicked = { | nRow, nCol | EditTree( nRow, nCol, oWndData, oTree ) }

   oTree:SetImageList( oImageList )
   oTree:nWidth += 48

   if ! File( cFileName )
      hb_MemoWrit( cFileName, '<xml>version="1.0"<new></new></xml>', .F. )
      OpenXml( cFileName, oTree )
   endif  

   @ 0, 25.7 GET oMemo VAR cItemText MEMO OF oWndData SIZE 300, 100 ;
      ON CHANGE ( oBtnSave:Enable(), oMemo:Cargo := .T.,;
                  oTree:GetSelected():Cargo := cItemText )
                 
   oMemo:Cargo = .F. // it has not changed              

   @ 0, 200 SPLITTER oSplit ;
      VERTICAL ;
      PREVIOUS CONTROLS oTree ;
      HINDS CONTROLS oMemo ;
      SIZE 4, 200 PIXEL ;
      OF oWndData
     
   oSplit:AdjClient()  

   ACTIVATE WINDOW oWndData ;
      ON RESIZE oSplit:AdjClient()
     
   oWndData:bGotFocus = { || If( oMemo:Cargo, oBtnSave:Enable(), oBtnSave:Disable() ) }  

return nil

//----------------------------------------------------------------------------//

function OpenDataFile( cFileName )

   local cTxtFile, oTree

   DEFAULT cFileName := cGetFile( "XML files (*.xml) |*.xml| JSON files (*.json)", "Select a data file" )

   if Empty( cFileName )
      return nil
   endif  

   oMruRCs:Save( cFileName )
   oBtnSave:Disable()

   NewDataFile( cFileName )
   oTree = oWnd:oWndActive:aControls[ 1 ]

   if ! Empty( cFileName )        
      do case
         case Upper( cFileExt( cFileName ) ) == "XML"
            OpenXML( cFileName, oTree )
           
         case Upper( cFileExt( cFileName ) ) == "JSON"
            OpenJSON( cFileName, oTree )
      endcase
   endif  
     
return nil

//----------------------------------------------------------------------------//

function OpenXML( cFileName, oTree )

   local aRoots := {}, hFile, oXmlDoc, oXmlIter, oTagLast, oTagActual

   hFile    = FOpen( cFileName )
   oXmlDoc  = TXmlDocument():New( hFile )
   oXmlIter = TXmlIterator():New( oXmlDoc:oRoot )

   AAdd( aRoots, oTree )

   while ( oTagActual := oXmlIter:Next() ) != nil
      if oTagLast != nil
         if oTagLast:Depth() < oTagActual:Depth()
            ASize( aRoots, Len( aRoots ) + 1 )
            aRoots[ oTagActual:Depth() + 1 ] = aRoots[ oTagActual:Depth() ]:Add( oTagActual:cName )
            aRoots[ oTagActual:Depth() + 1 ]:Cargo = oTagActual:cData
         endif

         if oTagLast:Depth() > oTagActual:Depth()
            aRoots[ oTagActual:depth() + 1 ] = aRoots[ oTagActual:Depth() ]:Add( oTagActual:cName )
            aRoots[ oTagActual:depth() + 1 ]:Cargo = oTagActual:cData
         endif

         if oTagLast:Depth() == oTagActual:Depth()
            aRoots[ Max( oTagLast:Depth(), 1 ) ]:Add( oTagActual:cName ):Cargo = oTagActual:cData
         endif
      else
         AAdd( aRoots, oTree:Add( oTagActual:cName ) )
         ATail( aRoots ):Cargo = oTagActual:cData
      endif
      oTagLast = oTagActual
   end

   FClose( hFile )

return nil    

//----------------------------------------------------------------------------//

function OpenJSON( cFileName )

return nil    

//----------------------------------------------------------------------------//

function ShowImage( cBmp )

   local oDlg, oBmp
   
   DEFINE DIALOG oDlg TITLE cBmp

   if Lower( Right( cBmp, 3 ) ) == "bmp"
      @ 0, 0 BITMAP oBmp FILENAME cBmp OF oDlg NOBORDER
   elseif Lower( Right( cBmp, 3 ) ) == "ico"
      @ 0, 0 ICON oBmp FILENAME cBmp OF oDlg
   endif    
   
   ACTIVATE DIALOG oDlg CENTERED ;
      ON INIT ( oDlg:SetSize( Max( 300, oBmp:nWidth + 20 ),;
                              Max( 300, oBmp:nHeight + 20 ) ),;
                oBmp:Center( oDlg ), oDlg:Center() )              
   
return nil  

//----------------------------------------------------------------------------//

function EditTree( nRow, nCol, oWndData, oTree )

   local oPopup, cPrompt
   
   MENU oPopup POPUP
      MENUITEM "Add"       ACTION If( oTree:GetSelected() != nil,;
                                  ( oTree:GetSelected():oParent:Add( "new" ), oTree:Refresh() ),;
                                  ( oTree:Add( "new" ), oTree:Refresh(), oBtnSave:Enable() ) )
      MENUITEM "Add child" ACTION If( oTree:GetSelected() != nil,;
                                  ( oTree:GetSelected():Add( "new" ), oTree:Refresh(), oBtnSave:Enable() ),)
      MENUITEM "Edit"      ACTION ( cPrompt := PadR( oTree:GetSelected():cPrompt, 30 ),;
                                  If( MsgGet( "Edit", "item prompt", @cPrompt ),;
                                  ( oTree:GetSelected():cPrompt := AllTrim( cPrompt ), oBtnSave:Enable() ),) )  
      MENUITEM "Delete"    ACTION If( oTree:GetSelected() != nil,;
                                  ( oTree:GetSelected():End(), oTree:Refresh(), oBtnSave:Enable() ),)    
   ENDMENU  

   ACTIVATE POPUP oPopup WINDOW oWndData AT nRow, nCol

return nil

//----------------------------------------------------------------------------//

static function GenDblClickBlock( oCtrl )

return { || MsgInfo( oCtrl:nId ) }

//----------------------------------------------------------------------------//
regards, saludos

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

Re: Are there any Treeview samples with associated edit boxes?

Postby Silvio.Falconi » Fri Nov 27, 2020 11:52 am

When I load a file created not read good
Please try it

Code: Select all  Expand view

< ?xml version = "1.0" encoding = "ISO-8859-1" ? >
<ROOT RPT="ripara" DESCRIPCION="scheda">
<Modulo>
   <Structure>
      <Field>
         <Field_name>REPORTNUM</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>         3</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>MODELLO</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>        25</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>DESC</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>        60</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>FORMATO</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>        15</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>LARGHEZZA</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>ALTEZZA</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>ORIZONTALE</Field_name>
         <Field_type>Logical</Field_type>
      </Field>
      <Field>
         <Field_name>OFFSETX</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>OFFSETY</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>BODYINIT</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>ENDBODY</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>INTERLINEA</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>RIGHE</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         2</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>COLONNE</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         2</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>GUTTER</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>MARGINSUP</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>MARGININF</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>MARGINSIN</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>MARGINDES</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>IMGFRONTE</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>        60</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>IMGRETRO</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>        60</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>MARGINFRO</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>MARGINGRET</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
   </Structure>
   <Data>
      <Record>
         <REPORTNUM>001</REPORTNUM>
         <MODELLO>Scheda di riparazione
</MODELLO>
         <DESC>Scheda di riparazione
</DESC>
         <FORMATO>A4</FORMATO>
         <LARGHEZZA>21.00</LARGHEZZA>
         <ALTEZZA>29.70</ALTEZZA>
         <ORIZONTALE>False</ORIZONTALE>
         <OFFSETX>0.00</OFFSETX>
         <OFFSETY>0.00</OFFSETY>
         <BODYINIT>0.00</BODYINIT>
         <ENDBODY>0.00</ENDBODY>
         <INTERLINEA>0.00</INTERLINEA>
         <RIGHE>0</RIGHE>
         <COLONNE>0</COLONNE>
         <GUTTER>0.00</GUTTER>
         <MARGINSUP>0.00</MARGINSUP>
         <MARGININF>0.00</MARGININF>
         <MARGINSIN>0.00</MARGINSIN>
         <MARGINDES>0.00</MARGINDES>
         <IMGFRONTE>.\images\Chrysanthemum.jpg</IMGFRONTE>
         <IMGRETRO>.\images\Lighthouse.jpg</IMGRETRO>
         <MARGINFRO>4.00</MARGINFRO>
         <MARGINGRET>7.00</MARGINGRET>
      </Record>
   </Data>
</Modulo>
<RigheModulo>
   <Structure>
      <Field>
         <Field_name>TIPO</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>         1</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>TESTO</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>        40</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>CAMPO</Field_name>
         <Field_type>Logical</Field_type>
      </Field>
      <Field>
         <Field_name>RIGA</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>COLONNA</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>LARGHEZZA</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>ALTEZZA</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>BORDO</Field_name>
         <Field_type>Logical</Field_type>
      </Field>
      <Field>
         <Field_name>COLORBORDO</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>        20</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>TIPOBORDO</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         1</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>ANGLBORDER</Field_name>
         <Field_type>Logical</Field_type>
      </Field>
      <Field>
         <Field_name>BACKBORDO</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>        20</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>CARATTERE</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>        20</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>SIZEFONT</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         2</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>ALLINEA</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         1</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>POSIZIONE</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         1</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>GRASSETTO</Field_name>
         <Field_type>Logical</Field_type>
      </Field>
      <Field>
         <Field_name>CORSIVO</Field_name>
         <Field_type>Logical</Field_type>
      </Field>
      <Field>
         <Field_name>BARRATO</Field_name>
         <Field_type>Logical</Field_type>
      </Field>
      <Field>
         <Field_name>SOTTOLINE</Field_name>
         <Field_type>Logical</Field_type>
      </Field>
      <Field>
         <Field_name>COLORFONT</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>        20</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>SPOSTARIGA</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>SPOSTACOLO</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>REPORTNUM</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>         3</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
   </Structure>
   <Data>
      <Record>
         <TIPO>T</TIPO>
         <TESTO></TESTO>
         <CAMPO>False</CAMPO>
         <RIGA>1.00</RIGA>
         <COLONNA>11.00</COLONNA>
         <LARGHEZZA>20.00</LARGHEZZA>
         <ALTEZZA>0.01</ALTEZZA>
         <BORDO>True</BORDO>
         <COLORBORDO>black</COLORBORDO>
         <TIPOBORDO>1</TIPOBORDO>
         <ANGLBORDER>False</ANGLBORDER>
         <BACKBORDO></BACKBORDO>
         <CARATTERE>Arial</CARATTERE>
         <SIZEFONT>6</SIZEFONT>
         <ALLINEA>1</ALLINEA>
         <POSIZIONE>1</POSIZIONE>
         <GRASSETTO>False</GRASSETTO>
         <CORSIVO>False</CORSIVO>
         <BARRATO>False</BARRATO>
         <SOTTOLINE>False</SOTTOLINE>
         <COLORFONT></COLORFONT>
         <SPOSTARIGA>0.04</SPOSTARIGA>
         <SPOSTACOLO>0.03</SPOSTACOLO>
         <REPORTNUM>001</REPORTNUM>
      </Record>
      <Record>
         <TIPO>T</TIPO>
         <TESTO>Intestatario</TESTO>
         <CAMPO>False</CAMPO>
         <RIGA>1.00</RIGA>
         <COLONNA>11.00</COLONNA>
         <LARGHEZZA>13.00</LARGHEZZA>
         <ALTEZZA>0.40</ALTEZZA>
         <BORDO>True</BORDO>
         <COLORBORDO>black</COLORBORDO>
         <TIPOBORDO>1</TIPOBORDO>
         <ANGLBORDER>False</ANGLBORDER>
         <BACKBORDO>black</BACKBORDO>
         <CARATTERE>Arial</CARATTERE>
         <SIZEFONT>6</SIZEFONT>
         <ALLINEA>1</ALLINEA>
         <POSIZIONE>3</POSIZIONE>
         <GRASSETTO>True</GRASSETTO>
         <CORSIVO>False</CORSIVO>
         <BARRATO>False</BARRATO>
         <SOTTOLINE>False</SOTTOLINE>
         <COLORFONT>white</COLORFONT>
         <SPOSTARIGA>0.00</SPOSTARIGA>
         <SPOSTACOLO>0.00</SPOSTACOLO>
         <REPORTNUM>001</REPORTNUM>
      </Record>
      <Record>
         <TIPO>T</TIPO>
         <TESTO>Tipo Documento</TESTO>
         <CAMPO>False</CAMPO>
         <RIGA>5.50</RIGA>
         <COLONNA>1.00</COLONNA>
         <LARGHEZZA>5.50</LARGHEZZA>
         <ALTEZZA>0.80</ALTEZZA>
         <BORDO>True</BORDO>
         <COLORBORDO>black</COLORBORDO>
         <TIPOBORDO>1</TIPOBORDO>
         <ANGLBORDER>False</ANGLBORDER>
         <BACKBORDO>gray</BACKBORDO>
         <CARATTERE>Arial</CARATTERE>
         <SIZEFONT>6</SIZEFONT>
         <ALLINEA>1</ALLINEA>
         <POSIZIONE>1</POSIZIONE>
         <GRASSETTO>False</GRASSETTO>
         <CORSIVO>False</CORSIVO>
         <BARRATO>False</BARRATO>
         <SOTTOLINE>False</SOTTOLINE>
         <COLORFONT>white</COLORFONT>
         <SPOSTARIGA>0.00</SPOSTARIGA>
         <SPOSTACOLO>0.00</SPOSTACOLO>
         <REPORTNUM>001</REPORTNUM>
      </Record>
      <Record>
         <TIPO>T</TIPO>
         <TESTO>Numero Documento</TESTO>
         <CAMPO>False</CAMPO>
         <RIGA>5.50</RIGA>
         <COLONNA>5.50</COLONNA>
         <LARGHEZZA>7.80</LARGHEZZA>
         <ALTEZZA>0.80</ALTEZZA>
         <BORDO>True</BORDO>
         <COLORBORDO>black</COLORBORDO>
         <TIPOBORDO>1</TIPOBORDO>
         <ANGLBORDER>False</ANGLBORDER>
         <BACKBORDO>gray</BACKBORDO>
         <CARATTERE>Arial</CARATTERE>
         <SIZEFONT>6</SIZEFONT>
         <ALLINEA>1</ALLINEA>
         <POSIZIONE>1</POSIZIONE>
         <GRASSETTO>True</GRASSETTO>
         <CORSIVO>False</CORSIVO>
         <BARRATO>False</BARRATO>
         <SOTTOLINE>False</SOTTOLINE>
         <COLORFONT>white</COLORFONT>
         <SPOSTARIGA>0.00</SPOSTARIGA>
         <SPOSTACOLO>0.00</SPOSTACOLO>
         <REPORTNUM>001</REPORTNUM>
      </Record>
      <Record>
         <TIPO>I</TIPO>
         <TESTO>fondo.jpg</TESTO>
         <CAMPO>False</CAMPO>
         <RIGA>1.00</RIGA>
         <COLONNA>1.00</COLONNA>
         <LARGHEZZA>20.00</LARGHEZZA>
         <ALTEZZA>29.00</ALTEZZA>
         <BORDO>False</BORDO>
         <COLORBORDO></COLORBORDO>
         <TIPOBORDO>0</TIPOBORDO>
         <ANGLBORDER>False</ANGLBORDER>
         <BACKBORDO>gray</BACKBORDO>
         <CARATTERE></CARATTERE>
         <SIZEFONT>0</SIZEFONT>
         <ALLINEA>0</ALLINEA>
         <POSIZIONE>0</POSIZIONE>
         <GRASSETTO>False</GRASSETTO>
         <CORSIVO>False</CORSIVO>
         <BARRATO>False</BARRATO>
         <SOTTOLINE>False</SOTTOLINE>
         <COLORFONT></COLORFONT>
         <SPOSTARIGA>0.00</SPOSTARIGA>
         <SPOSTACOLO>0.00</SPOSTACOLO>
         <REPORTNUM>001</REPORTNUM>
      </Record>
      <Record>
         <TIPO>I</TIPO>
         <TESTO>logoditta.bmp</TESTO>
         <CAMPO>False</CAMPO>
         <RIGA>1.15</RIGA>
         <COLONNA>1.10</COLONNA>
         <LARGHEZZA>8.00</LARGHEZZA>
         <ALTEZZA>2.00</ALTEZZA>
         <BORDO>False</BORDO>
         <COLORBORDO></COLORBORDO>
         <TIPOBORDO>0</TIPOBORDO>
         <ANGLBORDER>False</ANGLBORDER>
         <BACKBORDO>gray</BACKBORDO>
         <CARATTERE></CARATTERE>
         <SIZEFONT>0</SIZEFONT>
         <ALLINEA>0</ALLINEA>
         <POSIZIONE>0</POSIZIONE>
         <GRASSETTO>False</GRASSETTO>
         <CORSIVO>False</CORSIVO>
         <BARRATO>False</BARRATO>
         <SOTTOLINE>False</SOTTOLINE>
         <COLORFONT></COLORFONT>
         <SPOSTARIGA>0.00</SPOSTARIGA>
         <SPOSTACOLO>0.00</SPOSTACOLO>
         <REPORTNUM>001</REPORTNUM>
      </Record>
   </Data>
</RigheModulo>
</ROOT>
 
Since from 1991/1992 ( fw for clipper Rel. 14.4 - Momos)
I use : FiveWin for Harbour November 2023 - January 2024 - Harbour 3.2.0dev (harbour_bcc770_32_20240309) - Bcc7.70 - xMate ver. 1.15.3 - PellesC - mail: silvio[dot]falconi[at]gmail[dot]com
User avatar
Silvio.Falconi
 
Posts: 6772
Joined: Thu Oct 18, 2012 7:17 pm

Re: Are there any Treeview samples with associated edit boxes?

Postby Otto » Fri Nov 27, 2020 2:38 pm

C:\_DEL ohne Rückfrage\xmltestz.xml (2:2) Critical Ein Name darf nicht mit dem Zeichen ' ', hexadezimaler Wert 0x20, beginnen. Zeile 2, Position 2.
Silvio, please delete the space in this line.
<?xml version = "1.0" encoding = "ISO-8859-1" ?>

Best regards,
Otto
********************************************************************
mod harbour - Vamos a la conquista de la Web
modharbour.org
https://www.facebook.com/groups/modharbour.club
********************************************************************
User avatar
Otto
 
Posts: 6005
Joined: Fri Oct 07, 2005 7:07 pm

Re: Are there any Treeview samples with associated edit boxes?

Postby Silvio.Falconi » Fri Nov 27, 2020 6:32 pm

Otto wrote:C:\_DEL ohne Rückfrage\xmltestz.xml (2:2) Critical Ein Name darf nicht mit dem Zeichen ' ', hexadezimaler Wert 0x20, beginnen. Zeile 2, Position 2.
Silvio, please delete the space in this line.
<?xml version = "1.0" encoding = "ISO-8859-1" ?>

Best regards,
Otto


thanks
Otto my report system save on Rpt file ( xml) , now I must make the decoding into
Since from 1991/1992 ( fw for clipper Rel. 14.4 - Momos)
I use : FiveWin for Harbour November 2023 - January 2024 - Harbour 3.2.0dev (harbour_bcc770_32_20240309) - Bcc7.70 - xMate ver. 1.15.3 - PellesC - mail: silvio[dot]falconi[at]gmail[dot]com
User avatar
Silvio.Falconi
 
Posts: 6772
Joined: Thu Oct 18, 2012 7:17 pm

Re: Are there any Treeview samples with associated edit boxes?

Postby Otto » Fri Nov 27, 2020 7:05 pm

Hello Silvio,
mavbe this code is of any help.

Code: Select all  Expand view


#include "FiveWin.ch"
#include "fileio.ch"
#include "hbxml.ch"
#INCLUDE "FILEIO.CH"

function xml2dbf( nActual, cXMLFile )

    local oXmlDoc  := TXmlDocument():New( cXMLFile  )
   local oXmlIter := TXmlIterator():New( oXmlDoc:oRoot ), oTagActual
   local nDepth
   local cStart     := ""
   local cEnde      := ""
   *----------------------------------------------------------
    
    ferase("xml2.log")
   while .T.
     
      oTagActual = oXmlIter:Next()
     
      if oTagActual != nil
       
         nDepth = oTagActual:Depth()
         
            if oTagActual:cName = "RoomType"      .and. .not. oTagActual:cName = "RoomTypes"
                select onlinestand
                APPEND_BLANK()
              rlok()
                HEval( oTagActual:aAttributes, { | cKey, cValue | logfile( "xml2.log", { ,cKey, cValue } ),;
                         iif( cKey = "RoomID", ( onlinestand->RoomType := cValue ) , ),;
                         iif( cKey = "NumberOfUnits", (onlinestand->Units := cValue ) , ),;
                         iif( cKey = "Quantity", (onlinestand->Quantity := cValue ) , )       } )
                unlok()
         
            endif
 
            if oTagActual:cName = "TimeSpan"    
                rlok()
                HEval( oTagActual:aAttributes, { | cKey, cValue | logfile( "xml2.log", { ,cKey, cValue } ),;
                iif( cKey = "Start", ( onlinestand->Start := cValue ) , ),;
                    iif( cKey = "End", ( onlinestand->End := cValue ) , ) } )
               
            endif
            unlok()
      else
         exit
      endif
   end
   *----------------------------------------------------------
return nil

//----------------------------------------------------------------------------//

 


Best regards,
Otto
********************************************************************
mod harbour - Vamos a la conquista de la Web
modharbour.org
https://www.facebook.com/groups/modharbour.club
********************************************************************
User avatar
Otto
 
Posts: 6005
Joined: Fri Oct 07, 2005 7:07 pm

Re: Are there any Treeview samples with associated edit boxes?

Postby FWExplorer » Fri Nov 27, 2020 11:16 pm

Antonio,

Thanks, I didn't realize that anyone replied today. My email notification must be disabled.

Taking a look, now.

Happy birthday, enjoy.


T & R,




Antonio Linares wrote:D.

> Ah, so you guys are working on something like this?

We have used another FWH example to adapt it. We always wanted to have a tool like this one, too :-)

> Ok thanks, I'll hold off and I'll check back periodically, and stay subscribed to FTDN.

We have included this pim.prg new example in FWH examples for next FWH build. many thanks

> Btw, do you send out notifications when our FTDN has to be renewed?

Sometimes :-)
FWExplorer
 
Posts: 100
Joined: Fri Aug 09, 2013 12:43 am

Re: Are there any Treeview samples with associated edit boxes?

Postby Antonio Linares » Sat Nov 28, 2020 10:55 am

There were a few bugs that have been solved. Please try pim.exe first with the included xml files in pim.zip. Open them from pim.exe.
They should read fine.

* We have noticed that Harbour Class TXmlIterator seems to fails when numbers are used instead of chars, i.e.:
<1></1>. This is something to be confirmed, fixed and reported to the Harbour dev. team

* Saving is failing when new1.xml (included in pim.zip) is saved. </one> is missing. This is our new bug to find and fix. Help is appreciated.

* We need to find a way to report an error when a XML is not properly processed and try to provide some feedback
to the user about where the error in the XML file is located. Help is appreciated.

* function OpenXML() had a bug that was inherited from the code in xmltree.prg. FWH/samples/xmltree.prg has been fixed also:
xmltree.prg
Code: Select all  Expand view
#include "FiveWin.ch"
#include "Splitter.ch"

static oSplit1, oSplit2, oLbxDatas, oLbxMethods

//----------------------------------------------------------------------------/

function Test()

   local oWnd

   DEFINE WINDOW oWnd TITLE "XML viewer" ;
      MENU BuildMenu()

   ACTIVATE WINDOW oWnd ;
      ON INIT BuildTree( oWnd ) ;
      ON RESIZE ( If( oSplit1 != nil, oSplit1:AdjLeft(),),;
                  If( oSplit2 != nil, oSplit2:AdjRight(),) )

return nil

//----------------------------------------------------------------------------/


function BuildMenu()

   local oMenu

   MENU oMenu
      MENUITEM "About" ACTION MsgAbout( "XML Viewer", "(c) FiveTech Software 2013" )
   ENDMENU

return oMenu

//----------------------------------------------------------------------------/


function BuildTree( oWnd )

   local oTree := TTreeView():New( 0, 0, oWnd )
   local oClass, cData, cMethod
   local hFile, oXmlDoc, oXmlIter, oTagActual
   local oTagLast, aRoots := {}

   oTree:nWidth = 180
   // oTree:SetImageList( oImageList )

   oTree:Expand()

   @ 0, 186 LISTBOX oLbxDatas VAR cData ITEMS {} ;
      SIZE 200, 200 PIXEL OF oWnd

   @ 0, 391 LISTBOX oLbxMethods VAR cMethod ITEMS {} ;
      SIZE 200, 200 PIXEL OF oWnd

   @ 0, 181 SPLITTER oSplit1 ;
      VERTICAL ;
      PREVIOUS CONTROLS oTree ;
      HINDS CONTROLS oLbxDatas ;
      LEFT MARGIN 150 ;
      RIGHT MARGIN oSplit2:nLast + 100 ;
      SIZE 4, 300  PIXEL ;
      OF oWnd STYLE

   @ 0, 386 SPLITTER oSplit2 ;
      VERTICAL ;
      PREVIOUS CONTROLS oLbxDatas ;
      HINDS CONTROLS oLbxMethods ;
      LEFT MARGIN oSplit1:nFirst + 120 ;
      RIGHT MARGIN 80 ;
      SIZE 4, 300 PIXEL ;
      OF oWnd STYLE

   hFile    = FOpen( "test.xml" )
   oXmlDoc  = TXmlDocument():New( hFile )
   oXmlIter = TXmlIterator():New( oXmlDoc:oRoot )

   AAdd( aRoots, oTree )

   while ( oTagActual := oXmlIter:Next() ) != nil
      if oTagLast != nil
         if oTagLast:Depth() < oTagActual:Depth()
            ASize( aRoots, Len( aRoots ) + 1 )
            aRoots[ oTagActual:Depth() + 1 ] = aRoots[ oTagActual:Depth() ]:Add( oTagActual:cName )
            aRoots[ oTagActual:Depth() + 1 ]:Cargo = oTagActual
         endif

         if oTagLast:Depth() > oTagActual:Depth()
            aRoots[ oTagActual:Depth() + 1 ] = aRoots[ oTagActual:Depth() ]:Add( oTagActual:cName )
            aRoots[ oTagActual:Depth() + 1 ]:Cargo = oTagActual
         endif

         if oTagLast:Depth() == oTagActual:Depth()
            aRoots[ oTagActual:Depth() + 1 ] = aRoots[ Max( oTagLast:Depth(), 1 ) ]:Add( oTagActual:cName )
            aRoots[ oTagActual:Depth() + 1 ]:Cargo = oTagActual  
         endif
      else
         AAdd( aRoots, oTree:Add( oTagActual:cName ) )
         ATail( aRoots ):Cargo = oTagActual
      endif
      oTagLast = oTagActual
   end

   FClose( hFile )

   oTree:bChanged = { | oItem | ChangeItem( oItem ) }

return nil

//----------------------------------------------------------------------------//

function ChangeItem( oItem )
 
   if ! Empty( oItem:GetSelected():Cargo )
      oLbxDatas:SetItems( { oItem:GetSelected():Cargo:cData } )
   endif  
   oLbxMethods:Reset()
   if ! Empty( oItem:GetSelected():Cargo:aAttributes )
      HEval( oItem:GetSelected():Cargo:aAttributes,;
      { | cKey, cData | oLbxMethods:Add( cKey + " : " + cData ) } )
   endif
   
return nil    

//----------------------------------------------------------------------------//


Please download pim.zip again from:
https://github.com/FiveTechSoft/FWH_tools/blob/master/pim.zip

many thanks for your feedback and help.

Silvio I am going to try your XML file but meanwhile we don't have a XML file format error reporting system, we should try with small and simple XML files as the XML files included in pim.zip. Thanks
regards, saludos

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

Re: Are there any Treeview samples with associated edit boxes?

Postby Antonio Linares » Sat Nov 28, 2020 11:03 am

Silvio,

As I have explained in the previous post we need to implement a way to detect if there is an error in the XML file or check if it is a Harbour (Class TXmlIterator) bug.

Silvio.Falconi wrote:When I load a file created not read good
Please try it

Code: Select all  Expand view

< ?xml version = "1.0" encoding = "ISO-8859-1" ? >
<ROOT RPT="ripara" DESCRIPCION="scheda">
<Modulo>
   <Structure>
      <Field>
         <Field_name>REPORTNUM</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>         3</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>MODELLO</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>        25</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>DESC</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>        60</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>FORMATO</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>        15</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>LARGHEZZA</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>ALTEZZA</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>ORIZONTALE</Field_name>
         <Field_type>Logical</Field_type>
      </Field>
      <Field>
         <Field_name>OFFSETX</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>OFFSETY</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>BODYINIT</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>ENDBODY</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>INTERLINEA</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>RIGHE</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         2</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>COLONNE</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         2</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>GUTTER</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>MARGINSUP</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>MARGININF</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>MARGINSIN</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>MARGINDES</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>IMGFRONTE</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>        60</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>IMGRETRO</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>        60</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>MARGINFRO</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>MARGINGRET</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
   </Structure>
   <Data>
      <Record>
         <REPORTNUM>001</REPORTNUM>
         <MODELLO>Scheda di riparazione
</MODELLO>
         <DESC>Scheda di riparazione
</DESC>
         <FORMATO>A4</FORMATO>
         <LARGHEZZA>21.00</LARGHEZZA>
         <ALTEZZA>29.70</ALTEZZA>
         <ORIZONTALE>False</ORIZONTALE>
         <OFFSETX>0.00</OFFSETX>
         <OFFSETY>0.00</OFFSETY>
         <BODYINIT>0.00</BODYINIT>
         <ENDBODY>0.00</ENDBODY>
         <INTERLINEA>0.00</INTERLINEA>
         <RIGHE>0</RIGHE>
         <COLONNE>0</COLONNE>
         <GUTTER>0.00</GUTTER>
         <MARGINSUP>0.00</MARGINSUP>
         <MARGININF>0.00</MARGININF>
         <MARGINSIN>0.00</MARGINSIN>
         <MARGINDES>0.00</MARGINDES>
         <IMGFRONTE>.\images\Chrysanthemum.jpg</IMGFRONTE>
         <IMGRETRO>.\images\Lighthouse.jpg</IMGRETRO>
         <MARGINFRO>4.00</MARGINFRO>
         <MARGINGRET>7.00</MARGINGRET>
      </Record>
   </Data>
</Modulo>
<RigheModulo>
   <Structure>
      <Field>
         <Field_name>TIPO</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>         1</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>TESTO</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>        40</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>CAMPO</Field_name>
         <Field_type>Logical</Field_type>
      </Field>
      <Field>
         <Field_name>RIGA</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>COLONNA</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>LARGHEZZA</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>ALTEZZA</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>BORDO</Field_name>
         <Field_type>Logical</Field_type>
      </Field>
      <Field>
         <Field_name>COLORBORDO</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>        20</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>TIPOBORDO</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         1</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>ANGLBORDER</Field_name>
         <Field_type>Logical</Field_type>
      </Field>
      <Field>
         <Field_name>BACKBORDO</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>        20</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>CARATTERE</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>        20</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>SIZEFONT</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         2</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>ALLINEA</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         1</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>POSIZIONE</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         1</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>GRASSETTO</Field_name>
         <Field_type>Logical</Field_type>
      </Field>
      <Field>
         <Field_name>CORSIVO</Field_name>
         <Field_type>Logical</Field_type>
      </Field>
      <Field>
         <Field_name>BARRATO</Field_name>
         <Field_type>Logical</Field_type>
      </Field>
      <Field>
         <Field_name>SOTTOLINE</Field_name>
         <Field_type>Logical</Field_type>
      </Field>
      <Field>
         <Field_name>COLORFONT</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>        20</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
      <Field>
         <Field_name>SPOSTARIGA</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>SPOSTACOLO</Field_name>
         <Field_type>Numeric</Field_type>
         <Field_length>         5</Field_length>
         <Field_decimals>         2</Field_decimals>
      </Field>
      <Field>
         <Field_name>REPORTNUM</Field_name>
         <Field_type>Character</Field_type>
         <Field_length>         3</Field_length>
         <Field_decimals>         0</Field_decimals>
      </Field>
   </Structure>
   <Data>
      <Record>
         <TIPO>T</TIPO>
         <TESTO></TESTO>
         <CAMPO>False</CAMPO>
         <RIGA>1.00</RIGA>
         <COLONNA>11.00</COLONNA>
         <LARGHEZZA>20.00</LARGHEZZA>
         <ALTEZZA>0.01</ALTEZZA>
         <BORDO>True</BORDO>
         <COLORBORDO>black</COLORBORDO>
         <TIPOBORDO>1</TIPOBORDO>
         <ANGLBORDER>False</ANGLBORDER>
         <BACKBORDO></BACKBORDO>
         <CARATTERE>Arial</CARATTERE>
         <SIZEFONT>6</SIZEFONT>
         <ALLINEA>1</ALLINEA>
         <POSIZIONE>1</POSIZIONE>
         <GRASSETTO>False</GRASSETTO>
         <CORSIVO>False</CORSIVO>
         <BARRATO>False</BARRATO>
         <SOTTOLINE>False</SOTTOLINE>
         <COLORFONT></COLORFONT>
         <SPOSTARIGA>0.04</SPOSTARIGA>
         <SPOSTACOLO>0.03</SPOSTACOLO>
         <REPORTNUM>001</REPORTNUM>
      </Record>
      <Record>
         <TIPO>T</TIPO>
         <TESTO>Intestatario</TESTO>
         <CAMPO>False</CAMPO>
         <RIGA>1.00</RIGA>
         <COLONNA>11.00</COLONNA>
         <LARGHEZZA>13.00</LARGHEZZA>
         <ALTEZZA>0.40</ALTEZZA>
         <BORDO>True</BORDO>
         <COLORBORDO>black</COLORBORDO>
         <TIPOBORDO>1</TIPOBORDO>
         <ANGLBORDER>False</ANGLBORDER>
         <BACKBORDO>black</BACKBORDO>
         <CARATTERE>Arial</CARATTERE>
         <SIZEFONT>6</SIZEFONT>
         <ALLINEA>1</ALLINEA>
         <POSIZIONE>3</POSIZIONE>
         <GRASSETTO>True</GRASSETTO>
         <CORSIVO>False</CORSIVO>
         <BARRATO>False</BARRATO>
         <SOTTOLINE>False</SOTTOLINE>
         <COLORFONT>white</COLORFONT>
         <SPOSTARIGA>0.00</SPOSTARIGA>
         <SPOSTACOLO>0.00</SPOSTACOLO>
         <REPORTNUM>001</REPORTNUM>
      </Record>
      <Record>
         <TIPO>T</TIPO>
         <TESTO>Tipo Documento</TESTO>
         <CAMPO>False</CAMPO>
         <RIGA>5.50</RIGA>
         <COLONNA>1.00</COLONNA>
         <LARGHEZZA>5.50</LARGHEZZA>
         <ALTEZZA>0.80</ALTEZZA>
         <BORDO>True</BORDO>
         <COLORBORDO>black</COLORBORDO>
         <TIPOBORDO>1</TIPOBORDO>
         <ANGLBORDER>False</ANGLBORDER>
         <BACKBORDO>gray</BACKBORDO>
         <CARATTERE>Arial</CARATTERE>
         <SIZEFONT>6</SIZEFONT>
         <ALLINEA>1</ALLINEA>
         <POSIZIONE>1</POSIZIONE>
         <GRASSETTO>False</GRASSETTO>
         <CORSIVO>False</CORSIVO>
         <BARRATO>False</BARRATO>
         <SOTTOLINE>False</SOTTOLINE>
         <COLORFONT>white</COLORFONT>
         <SPOSTARIGA>0.00</SPOSTARIGA>
         <SPOSTACOLO>0.00</SPOSTACOLO>
         <REPORTNUM>001</REPORTNUM>
      </Record>
      <Record>
         <TIPO>T</TIPO>
         <TESTO>Numero Documento</TESTO>
         <CAMPO>False</CAMPO>
         <RIGA>5.50</RIGA>
         <COLONNA>5.50</COLONNA>
         <LARGHEZZA>7.80</LARGHEZZA>
         <ALTEZZA>0.80</ALTEZZA>
         <BORDO>True</BORDO>
         <COLORBORDO>black</COLORBORDO>
         <TIPOBORDO>1</TIPOBORDO>
         <ANGLBORDER>False</ANGLBORDER>
         <BACKBORDO>gray</BACKBORDO>
         <CARATTERE>Arial</CARATTERE>
         <SIZEFONT>6</SIZEFONT>
         <ALLINEA>1</ALLINEA>
         <POSIZIONE>1</POSIZIONE>
         <GRASSETTO>True</GRASSETTO>
         <CORSIVO>False</CORSIVO>
         <BARRATO>False</BARRATO>
         <SOTTOLINE>False</SOTTOLINE>
         <COLORFONT>white</COLORFONT>
         <SPOSTARIGA>0.00</SPOSTARIGA>
         <SPOSTACOLO>0.00</SPOSTACOLO>
         <REPORTNUM>001</REPORTNUM>
      </Record>
      <Record>
         <TIPO>I</TIPO>
         <TESTO>fondo.jpg</TESTO>
         <CAMPO>False</CAMPO>
         <RIGA>1.00</RIGA>
         <COLONNA>1.00</COLONNA>
         <LARGHEZZA>20.00</LARGHEZZA>
         <ALTEZZA>29.00</ALTEZZA>
         <BORDO>False</BORDO>
         <COLORBORDO></COLORBORDO>
         <TIPOBORDO>0</TIPOBORDO>
         <ANGLBORDER>False</ANGLBORDER>
         <BACKBORDO>gray</BACKBORDO>
         <CARATTERE></CARATTERE>
         <SIZEFONT>0</SIZEFONT>
         <ALLINEA>0</ALLINEA>
         <POSIZIONE>0</POSIZIONE>
         <GRASSETTO>False</GRASSETTO>
         <CORSIVO>False</CORSIVO>
         <BARRATO>False</BARRATO>
         <SOTTOLINE>False</SOTTOLINE>
         <COLORFONT></COLORFONT>
         <SPOSTARIGA>0.00</SPOSTARIGA>
         <SPOSTACOLO>0.00</SPOSTACOLO>
         <REPORTNUM>001</REPORTNUM>
      </Record>
      <Record>
         <TIPO>I</TIPO>
         <TESTO>logoditta.bmp</TESTO>
         <CAMPO>False</CAMPO>
         <RIGA>1.15</RIGA>
         <COLONNA>1.10</COLONNA>
         <LARGHEZZA>8.00</LARGHEZZA>
         <ALTEZZA>2.00</ALTEZZA>
         <BORDO>False</BORDO>
         <COLORBORDO></COLORBORDO>
         <TIPOBORDO>0</TIPOBORDO>
         <ANGLBORDER>False</ANGLBORDER>
         <BACKBORDO>gray</BACKBORDO>
         <CARATTERE></CARATTERE>
         <SIZEFONT>0</SIZEFONT>
         <ALLINEA>0</ALLINEA>
         <POSIZIONE>0</POSIZIONE>
         <GRASSETTO>False</GRASSETTO>
         <CORSIVO>False</CORSIVO>
         <BARRATO>False</BARRATO>
         <SOTTOLINE>False</SOTTOLINE>
         <COLORFONT></COLORFONT>
         <SPOSTARIGA>0.00</SPOSTARIGA>
         <SPOSTACOLO>0.00</SPOSTACOLO>
         <REPORTNUM>001</REPORTNUM>
      </Record>
   </Data>
</RigheModulo>
</ROOT>
 
regards, saludos

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

Re: Are there any Treeview samples with associated edit boxes?

Postby Antonio Linares » Sat Nov 28, 2020 1:14 pm

Class TXmlDocument() provides XML error detection support, so we have already included it:
https://github.com/FiveTechSoft/FWH_tools/blob/master/pim.zip

Silvio, now you can check the error in your XML file! Anyhow, we get the error description but no idea what the error is yet :-)
regards, saludos

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

Re: Are there any Treeview samples with associated edit boxes?

Postby FWExplorer » Sat Nov 28, 2020 1:54 pm

Very nice. This is a good template. I'll play with it, after getting the environment issues resolved.

I think some hotkeys will need to be added, like Ins or <Alt>Ins to add a child. Also, immediately after adding a child, it should go right into Edit mode, with "New" highlighted.

I'll play with some Export/Save As routines, as this proceeds.

This is has some real potential, Antonio.



Antonio Linares wrote:Class TXmlDocument() provides XML error detection support, so we have already included it:
https://github.com/FiveTechSoft/FWH_tools/blob/master/pim.zip

Silvio, now you can check the error in your XML file! Anyhow, we get the error description but no idea what the error is yet :-)
FWExplorer
 
Posts: 100
Joined: Fri Aug 09, 2013 12:43 am

Re: Are there any Treeview samples with associated edit boxes?

Postby Antonio Linares » Sat Nov 28, 2020 4:07 pm

Enhanced version:
https://github.com/FiveTechSoft/FWH_tools/blob/master/pim.zip

> * Saving is failing when new1.xml (included in pim.zip) is saved. </one> is missing. This is our new bug to find and fix. Help is appreciated.

fixed

> I think some hotkeys will need to be added, like Ins or <Alt>Ins to add a child. Also, immediately after adding a child, it should go right into Edit mode, with "New" highlighted

Implemented: you may press "+" on the numeric keyboard to add an item and start editing
regards, saludos

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

Next

Return to FiveWin for Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 93 guests