2006³â 6¿ù  

 

The ClassDefinition Object

Or how to create a simple object browser - Part 1

 

 ClassDefinition object´Â ¿À·¡Àü¿¡ ¼Ò°³µÇ¾ú´Ù. ÀÌ ¿ÀºêÁ§Æ®´Â »ç¿ëÀÚ°¡ ·±Å¸Àӽà ¿ÀºêÁ§Æ®ÀÇ Á¤º¸¸¦ Á¶È¸ÇÒ¼ö ÀÖµµ·Ï ÇØÁÖÁö¸¸ ´ëºÎºÐÀÌ

ÀÌ ¿ÀºêÁ§Æ®¿¡ ¸¹Àº °ü½ÉÀ» ¾²Áö ¾ÊÀ¸¸ç, debugger¿¡¼­ º¼ ¶§¿¡¸¸ °ü½ÉÀ» °¡Á³´Ù. ÀÌ ±Û¿¡¼± ClassDefinition ¿ÀºêÁ§Æ®¿Í °ü·ÃµÈ

¿ÀºêÁ§Æ®µéÀÇ °³¿ä¸¦ ¼³¸íÇϰí ÀÌ·¯ÇÑ ¿ÀºêÁ§Æ®µéÀÇ °¡Àå Áß¿äÇÑ ¼Ó¼ºµéÀ» ¼³¸íÇÏ·Á ÇÑ´Ù. ¶ÇÇÑ, °£´ÜÇÑ ¿ÀºêÁ§Æ® ºê¶ó¿ìÁ®¸¦ ¸¸µå´Â ¹æ¹ý¿¡

´ëÇØ ´Ü°èÀûÀ¸·Î »ìÆìº¸´Â ³»¿ëÀ» Æ÷ÇÔÇϰí ÀÖ´Ù.

 

The ClassDefinition Object Hierarchy

 

ClassDefinitionObject´Â pbtocppobject·ÎºÎÅÍ »ó¼Ó¹Þ¾ÒÀ¸¸ç PowerBuilder ¿ÀºêÁ§Æ®µéÀ» ¹¦»çÇÏ´Â ¸ðµç ¿ÀºêÁ§Æ®µéÀÇ Á¶»óÀÌ´Ù.

PowerBuilder °¢°¢ÀÇ ¿ÀºêÁ§Æ®´Â ClassDefinitionÀ̶ó ºÒ¸®´Â ÇϳªÀÇ ¼Ó¼ºÀ» °¡Áö°í ÀÖ´Ù.

Figure 1ÀÇ ¿ÀºêÁ§Æ®µéÀº ´ÙÀ½ÀÇ ¿ÀºêÁ§Æ®µéÀ» Á¦°øÇÑ´Ù.

 

                                        

·    ArrayBounds : array º¯¼öÀÇ °æ°è¿¡ ´ëÇÑ Á¤º¸

·    EnumerationItemDefinition : enumerated valueÀÇ À̸§°ú °ª

·    ScriptDefinition : ½ºÅ©¸³Æ®ÀÇ ¸ðµç Á¤º¸

·    ClassDefinition : Ŭ·¡½ºÀÇ Á¤º¸

·    EnumerationDefinition : enumerated data type¿¡ °ü·ÃµÈ Á¤º¸

·    SimpleTypeDefinition : scalar º¯¼öÀÇ Á¾·ù¿¡ ´ëÇÑ Á¤º¸

·    VariableCardinalityDefinition : º¯¼ö cardinalityÀÇ Á¤º¸ Á¦°ø

·    VariableDefinition : º¯¼ö, ¼Ó¼º, ȤÀº argumentÀÇ ¸ðµç Á¤º¸

 

ÇÑ´«¿¡ º¸±â¿¡ À̰͵éÀº ¸¶Ä¡ ´Ù¾çÇÑ classµéÀ» ÀüÇô »ç¿ëÇØº¸Áö ¾Ê¾Ò´ø °Íó·³ º¹ÀâÇÏ°Ô º¸ÀδÙ. ¸ÕÀú ClassDefinition ¿ÀºêÁ§Æ®¸¦ À¯½ÉÈ÷ ºÁ¾ßÇÑ´Ù.

 

First Steps

 

¸ÕÀú, À©µµ¿ì·Î applicationÀ» ¸¸µç´Ù. ¾î¶°ÇÑ ¿ÀºêÁ§Æ®ÀÇ ClassDefinition ¿ÀºêÁ§Æ®¿¡ Á¢±ÙÇϱâ À§Çؼ­´Â, FindClassDefinition ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.

ÇÔ¼öÀÇ Ã¹¹øÂ° argument´Â classÀÇ À̸§À̸ç, µÎ¹øÂ° argument´Â ¶óÀ̺귯¸® ¸ñ·ÏÀ» Á¤ÀÇÇÏ´Â stringµéÀÇ ÀÓÀÇÀÇ arrayÀÌ´Ù. ¸¸ÀÏ µÎ ¹øÂ°

argument°¡ »ý·«µÈ´Ù¸é, ÇöÀç ¶óÀ̺귯¸® ¸®½ºÆ®°¡ °Ë»öµÈ´Ù. ¾Æ·¡ÀÇ Äڵ带 À©µµ¿ìÀÇ ¿ÀÇ À̺¥Æ®¿¡ ÀÔ·ÂÇϸé À©µµ¿ìÀÇ À̸§À» ÀÌ¿ëÇØ À©µµ¿ìÀÇ

ClassDefinition ¿ÀºêÁ§Æ®¸¦ ºÒ·¯¿À°í À©µµ¿ì ¿ÀºêÁ§Æ®°¡ ÀúÀåµÈ ¶óÀ̺귯¸® À̸§À» º¸¿©ÁÖ°Ô µÈ´Ù.

 

This.Title = FindClassDefinition( ClassName() ).LibraryName

 

»ç¿ëÀÚ´Â À©µµ¿ì¸¦ ½ÇÇà½ÃŰ°Å³ª ¾îÇø®ÄÉÀÌ¼Ç ¿ÀºêÁ§Æ®¾È¿¡¼­ ¿­ ¼ö ÀÖ´Ù. ¾îÇø®ÄÉÀ̼ÇÀÇ ½ÇÇàÀº »ç¿ëÀÚ°¡ debugÇϰí ClassDefinition ¿ÀºêÁ§Æ®ÀÇ

ºÎ°¡ÀûÀÎ ¼Ó¼ºÀ» °Ë»çÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù. ÇÊÀÚ´Â À̵éÀ» µÎ ±×·ìÀ¸·Î ºÐ·ùÇϴµ¥ ù¹øÂ° ±×·ìÀº ¿ÀºêÁ§Æ®¸¦ ¼³¸íÇÏ´Â ¼Ó¼ºµéÀ» °¡Áö°í ÀÖ´Ù.

À̰͵éÀº Name, DataTypeOf, IsVisualType µîÀÇ ¼Ó¼ºÀÌ´Ù. ´Ù¸¥ ±×·ì¿¡´Â NestedClassList, ScriptList, ¶Ç´Â VariableList ±×¸®°í NestedClassÀÇ

ParentClass °°Àº ¿ÀºêÁ§Æ® ¾ÈÀÇ µ¥ÀÌÅ͸¦ ¼³¸íÇÏ´Â ¼Ó¼ºµéÀÌ´Ù. À©µµ¿ì¿¡ treeview controlÀ» Ãß°¡Çϰí, LinesAtRootÀ» È®ÀÎÇϰí,

Listing 1ÀÇ Äڵ带 À©µµ¿ìÀÇ ¿ÀÇ À̺¥Æ®¿¡ ÀÔ·ÂÇÑ´Ù.

 

LISTING 1: VARIABLE LIST
Classdefinition lcd_Window
Long ll_Handle, ll_Counter, ll_Max
lcd_Window=FindClassDefinition(This.ClassName())
ll_Handle=tv_1.InsertItemLast(0,lcd_Window.Name,1)
ll_Max=UpperBound(lcd_Window.VariableList)
FOR ll_Counter=1 TO ll_Max
        tv_1.InsertItemLast(ll_Handle, &
        lcd_Window.VariableList [ll_Counter].Name,1)
NEXT
 

ù¹øÂ°·Î, ClassDefinition ¿ÀºêÁ§Æ®¸¦ Á¶È¸Çϰí ÇÁ·ÎÆÛƼ À̸§À» »ç¿ëÇØ treeview¿¡¼­ ù ¿£Æ®¸®ÀÇ À̸§À¸·Î À©µµ¿ì À̸§À» Ãß°¡ÇÑ´Ù.

ÀÌÁ¦ VariableList¿¡ ÀúÀåµÈ À©µµ¿ìÀÇ ¸ðµç º¯¼öµéÀ» loop ½Ã۰í À©µµ¿ì À̸§ ¿£Æ®¸®ÀÇ ÀÚ¼ÕÀ¸·Î º¯¼öÀÇ À̸§À» Ãß°¡ÇÑ´Ù. ¸îÁÙ ¾ÈµÇ´Â

½ºÅ©¸³Æ®·Î ÀÌ¹Ì ÀÌ À©µµ¿ì º¯¼ö¿Í °ü·ÃµÈ ¸î¸î Á¤º¸¸¦ º¼ ¼ö ÀÖ´Ù.

Listing 1ÀÇ ½ºÅ©¸³Æ®¿¡¼­ ¿ì¸®´Â Ŭ·¡½ºÀÇ ¸ðµç º¯¼öµéÀ» ¸®½ºÆ®ÇÏ´Â VariableList ¼Ó¼º (VariableDefinitionObjectsÀÇ array)À» »ç¿ëÇÏ¿´´Ù.

À©µµ¿ìÀÇ nested Ŭ·¡½ºµéÀ» ÀÚ¼¼È÷ º¸±â À§ÇØ, ClassDefinition ¿ÀºêÁ§Æ®ÀÇ NestedClassList ¼Ó¼ºÀ» »ç¿ëÇÏ¸é µÈ´Ù. NestedClassList´Â ¿ÀºêÁ§Æ®ÀÇ

nested Ŭ·¡½ºµéÀ» ¼³¸íÇÏ´Â ClassDefinition ¿ÀºêÁ§Æ®µéÀÇ arrayÀÌ´Ù. Listing 2ÀÇ ÄÚµå´Â treeview¿¡¼­ÀÇ nested Ŭ·¡½ºµéÀ» º¸¿©ÁØ´Ù.

À©µµ¿ì¿¡ ¸î °³ÀÇ ÄÁÆ®·ÑµéÀ» Ãß°¡ÇÑ´Ù.

 

LISTING 2: NESTED CLASSES
Classdefinition           lcd_Window
Long                        ll_Handle, ll_Counter, ll_Max
lcd_Window=FindClassDefinition(This.ClassName())
ll_Handle=tv_1.InsertItemLast(0,lcd_Window.Name,1)
ll_Max=UpperBound(lcd_Window.NestedClassList)
FOR ll_Counter=1 TO ll_Max
   tv_1.InsertItemLast(ll_Handle, &
   lcd_Window.NestedClassList[ll_Counter].Name,1)
NEXT
 

ScriptDefinition ¿ÀºêÁ§Æ®ÀÇ arrayÀÎ ScriptList ¼Ó¼ºÀ» »ç¿ëÇØ ½ºÅ©¸³Æ®¿¡ NestedClassList¸¦ ´ëüÇϸé, À©µµ¿ìÀÇ À̺¥Æ®µé°ú ÇÔ¼öµéÀÌ

treeview¿¡ º¸¿©Áö°Ô µÈ´Ù.Listing 1ÀÇ ½ºÅ©¸³Æ®¸¦ »ç¿ëÇÏ¿© º¯¼öÀÇ Ã³À½ °ªÀ» treeview ·¹ÀÌºí¿¡ Ãß°¡ÇÑ ÈÄ,  InsertItemLast ÇÔ¼öÀÇ ·¹ÀÌºí¿¡

´ÙÀ½ÀÇ Äڵ带 ÀÔ·ÂÇÏ°í ¾îÇø®ÄÉÀ̼ÇÀ» ½ÇÇà½ÃŲ´Ù.

 

+ ': ' + String( lcd_Window.VariableList[ll_Counter].InitialValue)

 

°¢ º¯¼öÀÇ À̸鿡 »ç¿ëÀÚ´Â º¯¼ö°¡ °£´ÜÇÑ Å¸ÀÔÀ̰í toolbaralignment°ú °°Àº ¿­°ÅÇü(enumerated) ŸÀÔÀÌ ¾Æ´Ñ ÀÌ»ó º¯¼öÀÇ Ã³À½ °ªÀ» º¼ °ÍÀÌ´Ù.

 

The Browser

 

ClassDefinition ¿ÀºêÁ§Æ®°¡ ¾î¶»°Ô ÀÛµ¿µÇ´ÂÁö¸¦ ¾Ë¾Æ³½ ÈÄ, ¿ì¸®´Â ºê¶ó¿ìÁ®(Figure 2)¿¡ ´ëÇØ »ìÆìº¸ÀÚ. ¾îÇø®ÄÉÀ̼ÇÀº ÇѲ¨¹ø¿¡ Çϳª ÀÌ»óÀÇ

PowerBuilder ¾îÇø®ÄÉÀ̼ÇÀ» ºÐ¼®ÇÏ°Ô ÇØÁÖ´Â MDI ¾îÇø®ÄÉÀ̼ÇÀÌ´Ù.

 

 

ù¹øÂ°·Î ¸Þ´º(m_frame)¿Í sheet À©µµ¿ì(w_main)À» °¡Áö°í ÀÖ´Â MDI frame À©µµ¿ì¸¦ ¸¸µç´Ù. ¾îÇø®ÄÉÀÌ¼Ç ¾ÆÀÌÄÜÀ̳ª library-related

¾ÆÀÌÄÜÀ» °í¸¥´Ù.  SheetÀº ÀÚ½ÅÀÇ ¸Þ´º¸¦ ÇÊ¿ä·ÎÇÏÁö ¾Ê´Â´Ù. ¸ÞÀÎ ¸Þ´º´Â File/Open¿Í File/ExitÀ» Æ÷ÇÔÇϰí ÀÖ¾î¾ßÇÑ´Ù.

»ç¿ëÀÚ´Â À̰ÍÀ» ½ºÅ©·¡Ä¡¿¡¼­ºÎÅÍ ¸¸µé ¼öµµ ÀÖ°í PowerBuilder IDE¿¡ ÀÖ´Â Template Application Wizard¸¦ »ç¿ëÇÏ¿© ¸¸µé ¼ö ÀÖ´Ù.

 

Getting the Library List

 

¾îÇø®ÄÉÀ̼ÇÀ» ºÐ¼®Çϱâ Àü¿¡, Çϳª¸¦ ¼±ÅÃÇØ ±×°ÍÀÇ ¶óÀ̺귯¸® ¸®½ºÆ®¸¦ °áÁ¤ÇØ¾ß ÇÑ´Ù. ¾îÇø®ÄÉÀÌ¼Ç Å¸°Ù ÆÄÀÏ(PBT)Àº ÇÊ¿äÇÑ Á¤º¸¸¦ °¡Áö°í ÀÖ´Ù.

ù ¹øÂ°·Î ¿ì¸®´Â ue_opentarget¶ó°í ºÒ¸®´Â ÇÁ·¹ÀÓ À©µµ¿ì¿¡ ´ëÇÑ À̺¥Æ®¸¦ ¸¸µé°ÍÀÌ´Ù. ÀÌ À̺¥Æ®¿¡ Listing 3ÀÇ Äڵ带 ÀÔ·ÂÇÑ´Ù.

 

LISTING 3: CHOOSE A TARGET
window        lw_Sheet
string          ls_Path, ls_File
IF GetFileOpenName( "Choose Target",ls_Path,ls_File,&
   "PBT","PowerBuilder Targets (*.pbt),*.pbt")>0 &
   THEN
   OpenSheetWithParm( lw_Sheet, ls_Path, "w_main", This )
END IF
 

»ç¿ëÀÚ´Â À̺¥Æ®¿¡ Ÿ°Ù ÆÄÀÏÀ» Á¤ÇÒ ¼ö ÀÖ°í À©µµ¿ì w_mainÀÌ ¿­¸±°Í ÀÌ´Ù. ÇÁ·¹ÀÓ ¸Þ´º¿¡ ÀÖ´Â File/Open ¸Þ´º¿¡¼­ À̺¥Æ® ue_opentarget¸¦

ºÒ·¯¿Í À©µµ¿ì w_main¿¡¼­, il_LibList[]¶ó°í ºÒ¸®´Â ÀνºÅϽº º¯¼ö¸¦ string ŸÀÔ array·Î ¼±¾ðÇÑ ´ÙÀ½, of_ParseLibList ÇÔ¼ö¸¦ ¸¸µé¾î ¾îÇø®ÄÉÀ̼Ç

À̸§°ú ¶óÀ̺귯¸® ¸®½ºÆ®¸¦ Ÿ°Ù ÆÄÀϷκÎÅÍ °¡Á®¿Â´Ù. PBT ÆÄÀÏÀº Ÿ°ÙÀÇ Á¤ÀǸ¦ Æ÷ÇÔÇϰí ÀÖ´Â ÅØ½ºÆ® ÆÄÀÏÀÌ´Ù. ù¹øÂ° ÁÙÀº Ű¿öµå·Î ½ÃÀÛÇϰí

±× ´ÙÀ½¿¡´Â ½ºÆäÀ̽º¿Í µ¥ÀÌÅͰ¡ ³ª¿À´Âµ¥ µ¥ÀÌÅÍ´Â Å« µû¿ÈÇ¥¾È¿¡ µé¾î°£´Ù. ´ÙÀ½Àº ¿ÀºêÁ§Æ® ºê¶ó¿ìÁ®ÀÇ PBT ÆÄÀÏÀ» º¸¿©ÁÝ´Ï´Ù.

 

Save Format v3.0(19990112)
appname "myobjectbrowser";
applib "mob.pbl";
liblist "mob.pbl";
type "pb";

 

¾îÇø®ÄÉÀ̼ÇÀÇ À̸§À» °áÁ¤Çϱâ À§Çؼ­´Â Ű¿öµå appnameÀÌ ÇÊ¿äÇϸç, ¶óÀ̺귯¸® ¸®½ºÆ®¸¦ À§Çؼ­´Â Ű¿öµå liblist°¡ ÇÊ¿äÇÏ´Ù. Listing 4¿¡¼­

¿ì¸®´Â °¢ ÁÙµé loopingÇÏ¿© PBT ÆÄÀÏÀ» ºÐ¼®Çϰí Ű appnameÀ» °Ë»çÇÑ´Ù.

 

LISTING 4: PARSE THE LIBRARY LIST
/* Name: of_ParseLibList
Parameters: string as_PBT
Returns: (none)  */
long            ll_Handle
string          ls_Line, ls_Path
integer li_Pos
// Open the target file
ll_Handle=FileOpen(as_PBT)
DO WHILE FileRead(ll_Handle,ls_Line) > 0
   IF Lower(Left(ls_Line,7))="appname" THEN
      // Application name Found
      ls_Line=Mid(ls_Line,8)
      ls_Line=Mid(ls_Line,Pos(ls_Line,'"')+1)
      This.Title=Left( ls_Line, Pos( ls_Line, '"' ) - 1 )
   END IF
   IF Lower(Left(ls_Line,7))="liblist" THEN
      // LibraryList Found
      EXIT
   END IF
LOOP
FileClose( ll_Handle )
// Get the Path the target file resides in
ls_Path=Left(as_PBT,LastPos(as_PBT,"\"))
// Parse the Library List
li_Pos=Pos(ls_Line,'"')
ls_Line=Mid(ls_Line,li_Pos+ 1)
// Add semicolon that all the library entries end with ;
ls_Line=Left(ls_Line,Pos( ls_Line,'"')-1) + ";"
li_Pos=Pos(ls_Line,";")
DO WHILE li_Pos > 0
   il_LibList[UpperBound(il_LibList)+1]= &
      ls_Path+Left(ls_Line,li_Pos - 1)
   ls_Line=Mid(ls_Line,li_Pos+1)
   li_Pos=Pos(ls_Line,";")
LOOP
RETURN
 

À̸¦ ã¾Æ³»´Â Áï½Ã, ¿ì¸®´Â Å« µû¿ÈÇ¥¸¦ Á¦°ÅÇϰí À©µµ¿ìÀÇ Á¦¸ñÀ» ¾îÇø®ÄÉÀ̼ÇÀÇ À̸§À¸·Î Á¤ÇÑ´Ù. Ű liblist°¡ ¹ß°ßµÉ ¶§±îÁö °è¼Ó loopingÀ» ÇØ¾ßÇÑ´Ù.

۸¦ °Ë»öÇϸé, ¿ì¸®´Â loopÀ» Áß´ÜÇϰí ãÀº ÁÙÀ» ºÐ¼®Çϱ⠽ÃÀÛÇÏ¸é µÈ´Ù. °¢ PBL ¿£Æ®¸®´Â ¼¼¹ÌÄÝ·ÐÀ¸·Î ºÐ¸®µÇ¾î ÀÖ´Ù. ¼±µéÀ» ºÐ¸®Çϰí

°¢ ¶óÀ̺귯¸®¸¦ il_LibList array¿¡ ¿£Æ®¸®·Î ÀúÀåÇÑ´Ù.

treeview ÄÁÆ®·ÑÀ» w_main À©µµ¿ìÀÇ ¿ÞÂÊ Àý¹Ý¿¡ LinesAtRootÀÌ Ã¼Å©µÈ »óÅ·Π°¡Á®´Ù ³õ°í âÀÇ ¿À¸¥ÂÊ¿¡´Â multilineedit ÄÁÆ®·ÑÀ» ³õ´Â´Ù.

À©µµ¿ìÀÇ Å©±â°¡ º¯ÇÒ¶§ »ç¿ëÀÚ´Â µ¿ÀûÀ¸·Î Å©±â¸¦ Á¶ÀýÇϱâ À§ÇØ ÄÚµåµéÀ» Ãß°¡ÇÒ ¼öµµ ÀÖ´Ù. ¿ì¸®´Â ¾îÇø®ÄÉÀ̼ǿ¡ ²Ï ¸¹Àº treeview ±×¸²µéÀÌ ÇÊ¿äÇÏ´Ù.

PictureMaskColorÀÇ ¼Ó¼ºÀ» Àº»öÀ¸·Î ÁöÁ¤Çϰí treeviewÀÇ ÇÈÃÄ¿Í  Table 1¿¡ µû¸¥ ÀνºÅº½º º¯¼öµé ¾È¿¡ ÀÖ´Â ÇÈÃÄ »ó¼öµéÀ» ÁöÁ¤ÇÑ´Ù.

¿À¹ö·¹ÀÌ ÇÈÃÄ·Î ¸¶Áö¸· ÇÈÃĸ¦ »ç¿ëÇÏ¿´À¸¹Ç·Î, ´ÙÀ½ÀÇ Äڵ带 treeview ÄÁÆ®·ÑÀÇ ÄÁ½ºÆ®·°ÅÍ À̺¥Æ®¾È¿¡ ÀÔ·ÂÇÑ´Ù

 

This.SetOverlayPicture(1, PICT_OVERLAY)

 

 

À©µµ¿ìÀÇ ¿ÀÇ À̺¥Æ® ¾È¿¡¼­ w_main´Â of_ParseLibList¶ó´Â ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. ŸÄÏ ÆÄÀÏÀÌ w_main À©µµ¿ì·Î ¿­¸±¶§¿¡ ÆÐ½ºµÇ´Â °Íó·³

message.stringparmÀ» ÀÌ ÇÔ¼ö·Î argument·Î  ÆÐ½º½ÃŲ´Ù. ÇÔ¼ö¸¦ ºÎ¸£°í treeview¸¦ ä¿ì´Â ÄÚµå´Â Listing 5¿¡ ³ª¿ÍÀÖ´Ù.

 

LISTING 5: INITIAL FILLING OF THE TREEVIEW CONTROL
integer         li_Counter
long            ll_Handle
treeviewitem             ll_Tvi
// Get the LibraryList
This.of_ParseLibList(  message.stringparm )
ll_Handle=tv_1.InsertItemLast(0,This.Title,1)
FOR li_Counter=1 TO UpperBound(il_LibList)
   // Label is name only, full pathname is in Data
   ll_Tvi.Label=Mid(il_LibList[li_Counter], &
      LastPos( il_LibList[li_Counter],"\")+1)
   ll_Tvi.Data=il_LibList[li_Counter]
   ll_Tvi.Pictureindex=2
   ll_Tvi.SelectedPictureindex=2
   // Force the + sign to expand
   ll_Tvi.children=TRUE
   tv_1.InsertItemLast(ll_Handle,ll_Tvi)
NEXT
RETURN
 

¶óÀ̺귯¸®ÀÇ À̸§Àº °æ·Î Á¤º¸¸¦ º¸¿©ÁÖÁö ¾Ê°í °æ·Î Á¤º¸´Â treeviewitemÀÇ Á¤º¸ ¼Ó¼º¿¡ ÀúÀåµÇ¾î ÀÖ´Ù. ÀÚ¼Õ ¼Ó¼ºÀº TRUE·Î Á¤ÇØÁ® ÀÖ¾î

¶óÀ̺귯¸® ¿£Æ®¸®ÀÇ ¾Õ¿¡ Ç÷¯½º »çÀÎÀ» º¸¿©ÁÖ°Ô µÈ´Ù. À̰ÍÀº itemexpanding À̺¥Æ® ¾È¿¡ ÄÚµùÀÌ µå¸±´Ù¿îµÇµµ·Ï ÇÑ´Ù.

 

¡á ¿øº»ÀÚ·á

- http://pbdj.sys-con.com/read/198703.htm,  By:Arthur Hefti