home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 September / Chip_2001-09_cd1.bin / zkuste / delphi / kolekce / d123456 / DFS.ZIP / SCP.txt < prev    next >
Text File  |  2001-06-28  |  63KB  |  952 lines

  1. System Control Pack v0.98.5 Beta
  2.  
  3. This is BETA software.  It is not guaranteed to do ANYTHING useful at all.
  4.  
  5.                       R E A D   T H I S   N O W ! ! !
  6.  
  7. I hope that got your attention.  This component requires a unit that
  8. provides access to the Win95/NT 4.0 Shell Namespace API.  Delphi 2.0 did not
  9. include this import, but the v2.01 update does.  Also, Mr. Pat Ritchey was
  10. kind enough to write one, which I think was the basis for Borland's (same
  11. bugs in both units, must be the same).  C++Builder 1.0's ShlObj.pas also suffers
  12. from the same problems.  Regardless of which you use, you will have to do some
  13. extra work because both contain errors that will prevent this component from
  14. working properly (or even compiling, probably).  To implement these changes,
  15. read the ShellFix.txt file that should have been included with this file.
  16. If you use Delphi 3 or higher, or C++Builder 3 or higher, you will not need to
  17. worry about any of this.  No bugs (that effect these components anyway).
  18.  
  19.  
  20. Description:
  21.   Tree view, list view, and combobox controls that act like the controls in the
  22.   Windows Explorer.
  23.  
  24.  
  25. Contact Information:
  26.   The lateset version will always be available on the web at:
  27.     http://www.delphifreestuff.com
  28.   If you have any questions, comments or suggestions, please use the Delphi
  29.   Free Stuff Support Forum at: 
  30.     http://www.delphifreestuff.com/discus/
  31.   If, for some reason, you can not use the web-based support forum, you can
  32.   email me at bstowers@delphifreestuff.com.  However, the support forum will
  33.   always take precedence over direct email since it provides a resource that
  34.   others can use when they have a problem.  Every message posted to the forum
  35.   is emailed directly to this account, so emailing me directly will not get 
  36.   your message to me any faster.  It will only make the message less important
  37.   for me to respond to since only one person (you) is benefiting from it
  38.   instead of everyone interested.  Having said all that, please do email me 
  39.   directly if it is regarding something that isn't really support related, 
  40.   i.e. just to say thanks (as novel as that idea is).  
  41.  
  42.  
  43. Installation:
  44.   Delphi 1:
  45.     * This component is not compatible with Delphi 1.
  46.   
  47.   Delphi 2, C++Builder 1:
  48.     * Select the 'Component | Install' menu item.
  49.     * In the Install Components dialog, click the Add button.
  50.     * In the Add Module dialog, enter the full path name of the component's
  51.       registration unit (the unit that ends with 'Reg.pas', i.e.
  52.       'BrowseDrReg.pas') and click OK.
  53.     * In the Add Module dialog, click OK.
  54.     * The component library will be rebuilt and a new tab named 'DFS' will be
  55.       available on the Component Palette.
  56.  
  57.   Delphi 3, 4, 5, C++Builder 3 & 4:
  58.     * Do one of the following:
  59.       + Create a new package by selecting File | New and choosing Package from
  60.         the New tab in the dialog.
  61.       + Open an existing package file.  I suggest you do this if you already 
  62.         have a package that you like to use for small, third party components.
  63.         I specifically have a package named "3rdParty.dpk" that I use for 
  64.         small components that come from other people.  Or, if you are using
  65.         several of my components, you might create a "DFS.dpk" package and 
  66.         use it for all of my DFS components.
  67.     * In the resulting package window, click the Add button.
  68.     * In the Add dialog, on the Add Unit tab, enter the full path name of the
  69.       component's registration unit (the unit that ends with 'Reg.pas', i.e.
  70.       'BrowseDrReg.pas') and click OK.
  71.     * You may want to add the other source files (*.pas) to the package as
  72.       well in the same manner as you did the registration unit.  While this is
  73.       not required, not doing it will cause compiler warnings when the package
  74.       is compiled.  The component will function fine either way, but I
  75.       personally find the warnings very irritating and am not happy until
  76.       every compiler warning and hint is gone.  NOTE:  If you use C++Builder 3,
  77.       do not install the other source units.  See Known Issuses section below.
  78.     * If this package is new, or it has never been installed, click the
  79.       Install button in the package window.  If this package is already
  80.       installed in Delphi, click the Compile button.
  81.  
  82.   C++Builder 5 and up:
  83.     * Perform the "Delphi 3 and up, C++Builder 3 and up" steps above, except
  84.       for the last step (Compile or Install).
  85.     * Select the package the component has been added to, and choose 
  86.       Project | Edit Option Source to open the package options in the editor.
  87.     * In the entry for PFLAGS, add the "-LUvcl50" option.  For example:
  88.         <PFLAGS value="-$YD -$W -$O -v -JPHNE -M -LUvcl50"/>
  89.     * Perform the final step from above, Compile or Install.
  90.     * For Borland's official word on this situation, open the C++Builder help
  91.       file and search the index for "dsgnintf.dcu" and see the "Compiling
  92.       packages with DsgnIntf" section.
  93.  
  94.   Delphi 6 and up:
  95.     * Perform the "Delphi 3, 4, 5, C++Builder 3 & 4" steps above, except
  96.       for the last step (Compile or Install).
  97.     * Add the DesignIDE package to the Requires list of the package into which
  98.       the component is being installed.
  99.     * Perform the final step from above, Compile or Install.
  100.     * This is necessary because of changes to the design-time support units
  101.       introduced in Delphi 6.  For complete information, see the Del6New.hlp
  102.       file in your Delphi 6 Help directory.  In the index, search for
  103.       "upgrade issues" and in the resulting list of topics, select the
  104.       "DsgnIntf renamed and related changes" topic.
  105.  
  106.  
  107. Conditional Defines:
  108.   These units makes extensive use of conditional defines to control many aspects
  109.   of how and what things are compiled.  Usually these are used to effect code
  110.   size or change how a feature works, but some are also for debugging purposes.
  111.   The following is a list of the defines that are used and how.  These defines
  112.   are all found in the SystemControlPack.inc file.  The prefix used in each
  113.   name identifies what is effected:
  114.     DFS   --  Prefix I use for all my defines to avoid clashing with other
  115.               defines that may be in use.  DFS = Delphi Free Stuff
  116.     SCP   --  Indicates that the define effects all components.  SCP = System
  117.               Control Pack
  118.     STV   --  Indicates that the define effects only the TSystemTreeView
  119.               component.  STV = System Tree View
  120.     SLV   --  Indicates that the define effects only the TSystemListView
  121.               component.
  122.     SCB   --  Indicates that the define effects only the TSystemComboBox
  123.               component.  Currently, there are none of these.
  124.   The defines used are as follows:
  125.  
  126.   * DFS_SCP_SYSTREEVIEW, DFS_SCP_SYSLISTVIEW, DFS_SCP_SYSCOMBOBOX: If you
  127.       undefine any of these, then that/those components will no longer be
  128.       compiled.  For example, if you undefined DFS_SCP_SYSLISTVIEW, the
  129.       TSystemListView component will not be compiled, and the tree view and
  130.       combo box components will no longer have a ListView property to link to.
  131.       This resulted in a 70k saving in the compiled EXE of a test app that used
  132.       only the TSystemTreeView component.  The down side to this is that if you
  133.       use TSystemListView for some projects and not for others, you will either
  134.       have to leave it enabled for all, or have one heck of a code maintenance
  135.       nightmare.  One solution to this could be to remove the
  136.       DFS_SCP_SYSLISTVIEW define from the include file completely and add it to
  137.       the Project | Options | Directories/Conditionals of the design-time
  138.       package you install the component in.  Then, you would add
  139.       DFS_SCP_SYSLISTVIEW to the options of the projects that need it, and leave
  140.       it out of those that don't. This would allow you to control what is
  141.       compiled into the Delphi IDE independant of what is compiled into your
  142.       projects without having to change the SystemControlPack.inc file in
  143.       between.  I have not tested this solution, but it works in theory.  :)
  144.   * DFS_STV_FASTMODE and DFS_SLV_FASTMODE: These defines are not enabled by
  145.       default.  If you enable them, the components will populate/display much
  146.       faster.  The reason is that the actual item data such as the Caption and
  147.       subitem text, the image index, etc. aren't retrieved when the list/tree is
  148.       populated.  Instead, the system will ask (via a CN_NOTIFY message) for the
  149.       data when it needs a particular item's data and it is supplied only then.
  150.       So, it doesn't take nearly as long to add a large number of items.  But
  151.       (there's always a price to be paid), you will lose access to this data via
  152.       the Nodes (treeview) or Items property (listview).  That means you won't
  153.       be able to do stuff like:
  154.  
  155.         ShowMessage(MySysListView.Items[0].Caption);
  156.  
  157.       However, you will still be able to do the equivalent using stuff like:
  158.  
  159.         ShowMessage(MyList.GetFullPath(MyList.Selected));
  160.  
  161.       So, if you need the text or image index stuff, leave the define off. But,
  162.       if you don't, turn it on by removing the period and it'll be faster. In my
  163.       informal testing, listing my windows directory went from 12 seconds to 2
  164.       seconds.  You'll only see these big gains on directories with a lot of
  165.       files, though.  Many thanks go to Andei V. Rasskazov for pointing this
  166.       technique out.
  167.   * DFS_SLV_USE_ENHLISTVIEW and DFS_SLV_USE_EXTLISTVIEW: These are not enabled
  168.       by default.  They are useful only if you also have my TEnhListView and
  169.       TExtListView components.  You will need v3.13 or later of these components
  170.       for this to work.  Enabling ONE of these (never enable both) will cause
  171.       TSystemListView to descend from the corresponding TEnh/ExtListView class,
  172.       giving you all of that class' features as well.  WARNING:  This is just a
  173.       simple implemenation currently, and there are likely to be problems.  Only
  174.       use these if you want to help me work out the bugs in it.  Defining either
  175.       of these will also cause DFS_SLV_USING_ELV to be defined.  I use this
  176.       internally when I want to know if either of the above are defined and
  177.       I don't care which one.  You should not define DFS_SLV_USING_ELV yourself.
  178.   * DFS_STV_FILECHANGES: Controls whether the treeview will "watch" the
  179.       directory that is currently displayed for changes, i.e. a new directory
  180.       or file created, an existing one deleted, etc. and automatically refresh
  181.       when this happens.  This was originally put in so that this feature could
  182.       be turned off during development if nasty bugs were found.  However, that
  183.       was quite a while back, and "change watching" seems to be quite stable
  184.       now.  The only reason you might want to turn it off now is to save
  185.       yourself the 3.5 kb of space it adds to your compiled EXE.  This define
  186.       will probably be removed entirely unless someone makes a strong case for
  187.       leaving it.
  188.   * DFS_DEBUG: This is a define that I use internally for debugging the
  189.       components.  It causes a unit to be used that is not distributed, so it
  190.       is most likely useless to anyone but me.
  191.  
  192.  
  193. Working Notes:
  194.   * I really need to rip all the namespace stuff out and put it in it's own
  195.     class so that you could use it however you wanted, not just in this comp.
  196.   * The included test project creates a TSystemTreeView object on the fly so
  197.     that you don't have to install the component in your library.  I'm
  198.     fairly confident that the component is stable, but if you don't want to
  199.     install, you don't have to just to see the demo.
  200.   * If anyone knows how to determine the type of object you have given it's
  201.     PIDL, I'd love to know it.  Right now, if it's not a file system object,
  202.     you just get it's name.  I need to determine other types like the
  203.     printer folder, control panel folder, network servers, network
  204.     workgroups, etc.
  205.     New information:  I've noticed that a commercial Explorer replacement that
  206.     I have (PowerDesk from Mijenix) has this exact behavior, i.e. if you select
  207.     the Printers folder, Recycle Bin, etc. you get just a single "Name" column.
  208.     Hey, if a bunch of paid programmers can't figure it out, I probably won't
  209.     either, so I'm inclined to call this "as-designed" behavior.  Comments?
  210.  
  211.  
  212. Items On The To-Do List:
  213.   * A few more bugs still in my email.
  214.   * CMF_CANRENAME flag for context menu.  Can't just add it as it will cause
  215.     OLE errors, i.e. system won't handle it.  I need to determine if I can
  216.     use "magic numbers" to interpret rename and other unhandled commands to
  217.     to catch them and process them myself.
  218.   * Use timeGetTime to decide if I should show the hourglass or not in
  219.     EnumerateFolders methods.
  220.   * Change GetItemAttrs so it uses a nice Delphi set instead of API values.
  221.   * Do away with ShowFolders/Files and ShowHiddenFolders/Files properties
  222.     and replace with a set that includes all the stanadard stuff: hidden,
  223.     system, read-only, etc.  AttrMask property.
  224.   * Add properties for the stuff in the registry key HKCU\Software\Microsoft\
  225.     Windows\CurrentVersion\Explorer\Advanced and use those values as default
  226.     values for the properties.  This has stuff like hide extensions, etc.
  227.   * I may or may not implement drag/drop with the shell.  In the meantime,
  228.     Dieter Steinwedel (dsteinwe@rz.uni-osnabrueck.de) has a fine d-n-d shell
  229.     component that works with any TWinControl descendant.  It can be found at
  230.     http://godard.oec.uni-osnabrueck.de/student_home/dsteinwe/delphi/DietersDelphiSite.htm
  231.     There are probably others as well, I haven't looked much.
  232.   * "Cut" context menu command does not show the file icon as disabled yet.
  233.   * Hidden files have same problem as cut files (item above).
  234.  
  235.  
  236. Known Issues:
  237.   * C++Builder 3 users:  You must install only the registration unit 
  238.     (SystemControlPackReg.pas) into the package you compile the component into.
  239.     If the package also includes the other source files, you will get error
  240.     messages about DCLSTD35.LIB, which doesn't exist.  It has to do with the
  241.     fact that the source lists ImgList in the uses clause, even though I have
  242.     properly $IFDEFed it out.  Must be some error in the C3 parser that is
  243.     causing it to see this unit, and in C3 this unit is some design-time unit or
  244.     something. It results in the IDE continuously inserting DCLSTD35.LIB into
  245.     the project file, and there's no such file.  Manually removing it from the
  246.     project does not help, it just sticks it back in.  The only way to get it to
  247.     stop is to manually edit the code and remove the reference to ImgList, or to
  248.     not include the source file in the package.  Bizarre.
  249.   * C++Builder 3 users:  You must edit the source files to remove the ImgList
  250.     unit from the uses clauses of the units.  I have properly $IFDEFed out
  251.     this unit, but some error in the C3 parser is causing it at some point to
  252.     see this unit, and in C3 this unit is some design-time unit or something.
  253.     It results in the IDE continuously inserting DCLSTD35.LIB into the project
  254.     file, and there's no such file.  Manually removing it from the project
  255.     does not help, it just sticks it back in.  The only way to get it to stop
  256.     is to manually edit the code and remove the reference to ImgList. Bizarre.
  257.   * None of the demos are probably going to work well with all the new stuff.
  258.     It's late and I really want to get this stuff out, so I'll update them
  259.     in the next version.
  260.   * The list view incorrectly thinks that some folders contain file system stuff
  261.     when the really don't.  For example, it thinks the Control Panel folder
  262.     does, so it get's all the columns for a file directory list.  This is a bug
  263.     introduced with the new way of doing things in v0.96 and I've not yet been
  264.     able to figure it out.  If anyone has any clues, I'd really appreciate it.
  265.     It didn't happen in v0.95, but things were a lot different in the list
  266.     population in that version.
  267.   * Combo box does not like working with a treeview that doesn't have rfDesktop
  268.     as it's root node.  I'm not sure if you'd really ever need to have a combo
  269.     that used something besides the desktop as a root, so at this point and not
  270.     going to invest the somewhat large amount of time to work on doing it.  If
  271.     you do need this, let me know and I'll add it to the to-do list.
  272.   * The tree is hitting the all the sub nodes of a just expanded node again.
  273.     For example, when you expand the "My Computer" node, it hits each item; one
  274.     of those is likely a floppy drive, and that slows things down as it cranks
  275.     on it for a second.  No error message, but the delay is irritating.  And I
  276.     fixed it once before, too!
  277.   * Changing the RootFolder of a tree doesn't update a linked listview at design
  278.     time.  This saved me a ton of work, and it's really not that important at
  279.     design-time anyway, is it?
  280.   * Double clicking on a computer name in a listview that is linked to a
  281.     rfNetHood rooted treeview will not move into that computer.
  282.   * If using the Checkboxes property and you cause the treeview window to be
  283.     recreated by doing something like changing the BorderStyle property or
  284.     something, the checked values will be lost.  I will fix this in the future.
  285.   * Changing the Color property to anything other than clWindow is strongly
  286.     discouraged.  The images will still use the clWindow color as their
  287.     background, so you'll end up with a pretty odd looking tree/list.  The
  288.     reason is that if I changed the background color of the image list(s), it
  289.     would effect the entire system.  That is, Explorer would then have a
  290.     tree/list with a clWindow background color but the images would have your
  291.     new color around them.  The image lists are a shared, system-wide resource
  292.     and a change like this simply can not be allowed.  There is one alternative:
  293.     a copy of the system image list can be made, and that used instead of the
  294.     real system image list.  It can be changed in any way without effecting the
  295.     rest of the system.  The problems I have with this are:  1) It's an awful
  296.     lot of trouble to implement, 2) It's generally very slow since the system
  297.     image list is quite large.  You'd have a delay of a second or three before
  298.     your app started.  If enough people ask me for this to be added, I will
  299.     reconsider, but for now I'm just considering it a known issue.
  300.  
  301.  
  302. Beta Revision History:
  303. 0.98.5 + Added RecreateColumns method to TdfsSystemListView.
  304.        + Fixed problem with SetColumnWidths not using new values until window
  305.          was recreated or repopulated.
  306.        + Updated for Delphi 6 compatibility.  See updated install directions
  307.          above.
  308. 0.98.4 + Updated for C++Builder 5 compatibility.
  309. 0.98.3 + IShellDetails stuff in SystemControlPack.pas has been removed.  I was
  310.          investigating this, but found out it was only available on Windows 
  311.          2000.  It was causing compiler problems for C++Builder, so I've 
  312.          removed it from the source entirely (it was never being used).
  313.        + Fixed problem with FileMask in tree view.
  314.        + Fixed memory leak problem with list view.
  315. 0.98.2 + Fixed some nasty problems with rfFileSystem RootFolder type.
  316.        + Fixed bizarre D5 problem with deleting a tree from a form in the IDE.
  317.        + Fixed problem with main win hook not being released when component
  318.          was destroyed.  Thanks to Matthieu Roger for this. 
  319. 0.98   + Fixed redeclaration problem in C++Builder 3.
  320.        + Fixed nasty recursion bug when using rfFileSystem RootFolder value.
  321.        + Bill Miller was nice enough to do a component bitmap for the combo box.
  322.        + Had some problems with right-click not bringing up the context menu
  323.          in the system and list view under D5.  Fixed.
  324.        + Deleting a file in a root directory would cause the list view to "fall
  325.          up" one level higher that where it was supposed to be on refresh.
  326.        + Fixed a couple of problems having to do with the read delay timer.
  327.          Could totally break it if window handle was recreated.  Could get
  328.          "Control has no parent window" errors.
  329.        + Changing treeview file mask to exclude the currently selected filename
  330.          would cause trouble.
  331.        + Removing a directory that was the selected directory would not refresh
  332.          the display.
  333.        + Updated information about the DCLSTD35.LIB Known Issue in C3.  See
  334.          above.
  335.        + I've removed the TFolderItemData.FileSize property for C++Builder 1 &
  336.          3.  They didn't work because I use the Delphi Comp data type, and
  337.          while Builder has a Comp class for this type of thing, it won't
  338.          automatically support Delphi code using Comp.  If you need the file
  339.          size in C1/C3, you'll have to use the FileSizeHigh and FileSizeLow
  340.          properties.  If FileSizeHigh is not zero, you know you have a big file
  341.          and that you'll have to do the 64-bit math yourself.
  342.        + Resetting would not always do a "full" reset.  The system will cache
  343.          some kinds of information, and you have to manually invalidate that
  344.          cache.  The most obvious manifestation of this problem was with a
  345.          CD-ROM drive.  Resetting would update the item's image, but would not
  346.          update it's text.
  347.        + Changing a CD would not update the display.
  348.        + Tree and list view item context menus now show and handle the Rename
  349.          context menu item. 
  350. 0.97   + Delphi 5 compatibility.
  351.        + Renamed to include the 'dfs' prefix in the component name.
  352.        + The DFS_STV_FASTMODE and DFS_SLV_FASTMODE defines were broken (code
  353.          wouldn't compile).  Thanks to Felipe Rocha Machado for catching this.
  354.        + Sort column/direction of list view wasn't preserved when directory was
  355.          changed.
  356.        + Added ChangeToParent methods in tree, list and combo to move up one
  357.          level, i.e. "cd .."
  358.        + Added Known Issue item for C++Builder 3 users.  See above.
  359.        + Changing FileMask property of listview at run-time would not refresh
  360.          the list.  Fixed.  Thanks to Tamas Demjen for this.
  361.        + DFS_SLV_FASTMODE conditional define has been removed.
  362.        + Setting the tree view Selection property to a UNC path wouldn't work
  363.          correctly (i.e. something like \\someserver\somepath\someotherpath).
  364.          Lennert Ploeger was kind enough to figure out what was going on and
  365.          fix it.
  366.        + FileMask in the tree view was totally broken.  Lennert also help on
  367.          this one.
  368.        + I think I finally got rid of that pesky removable drive spinning when
  369.          it's parent is selected once and for all.
  370.        + Tamas Demjen sent me code to make the combobox respond better to font
  371.          changes.
  372.        + Nasty problem fixed when something caused the combobox to be recreated.
  373.          Thanks to Joachim Jo Samstag for his help on this.
  374.        + Under Delphi 2, 3, C++Builder 1, and 3 the Color property would not be
  375.          honored by the tree or list because of a VCL bug.  This was fixed in
  376.          version 4 (of both).  I've added code sent to me by Chris Wallace to
  377.          work around it in prior versions.  Many thanks to him.
  378. 0.96   + Moved a lot of PItemIDList helper functions into a seperate unit named
  379.          PidlHelp.  This is mostly an internal thing, and shouldn't effect
  380.          component users.
  381.        + Marked public Reset methods as virtual for you folks who want to write
  382.          descendants.
  383.        + Now includes a TSystemComboBox written by Andrew Barnes.  Andrew was
  384.          kind enough to share this with the rest of us and give me permission
  385.          to include it in this package.  Huge thanks go to him.  Read the
  386.          comments at the top of SystemComboBox.pas for full information.
  387.          Also, this is just the first crack at the combo.  There are bound to
  388.          be problems, so please report them and provide as much info as you can
  389.          so I can duplicate them.  Some are already known, see the Known Issues
  390.          section.
  391.        + Since Andrew has provided us with the last missing piece (the combo),
  392.          I've renamed this thing the "System Control Pack".  SystemTreeView was
  393.          becoming ever more inadequate as a name.
  394.        + Because the SystemTreeView.pas file was growing ever more out of
  395.          control (144k in the last version), and because of some unit reference
  396.          issues, I decided to break up everything into smaller, more manageable
  397.          units.  SystemControlPack.pas now defines base virtual classes for all
  398.          the controls that define and implement how they interact with each
  399.          other, but implement none of the shell functionality.  Each control is
  400.          implemented in its own seperate unit descending from these base
  401.          classes.  Because of all the unit additions/changes/deletions, users of
  402.          previous versions should review how the component is installed.  Here
  403.          is the status of all the unit files in the package now:
  404.            SystemControlPack     -- New
  405.            SystemTreeView        -- Heavily modified
  406.            SystemListView        -- New
  407.            SystemComboBox        -- New
  408.            SystemViewReg         -- Deleted (see next)
  409.            SystemControlPackReg  -- New (renamed SystemViewReg unit)
  410.            PidlHelp              -- New
  411.            SystemView.inc        -- Deleted (see next)
  412.            SystemControlPack.inc -- New (renamed SystemView.inc and modified)
  413.          Delphi 3+ and BCB 3 users, update your packages accordingly.
  414.        + Because all of the major changes being made, I updated the $DEFINE
  415.          names to more accurately reflect what they effect.  See the
  416.          "Conditional Defines" section above for the new names.
  417.        + The $IFDEFs that checked to see if COM objects needed to be manually
  418.          reference counted used DFS_COMPILER_2.  This was technically correct
  419.          as it only needs to be done in Delphi 2 and C++Builder 1, but I've
  420.          changed it to use {$IFNDEF DFS_NO_COM_CLEANUP} to more accurately
  421.          show what is going on there.
  422.        + TSystemListView is not as tightly integrated with TSystemTreeView as
  423.          in previous versions.  This a first step towards making it work
  424.          completely on its own.  However, it is just a first step.  It needs
  425.          further testing, and some enhancements I'm sure.  Please send feedback
  426.          if you fool with this issue at all.
  427.        + The new stuff introduced a new bug in the list view, see Known Issues.
  428. 0.95   + FileMask property only worked if the system were set up to display
  429.          file extensions (in Explorer, View | Folder Options | View tab | "Hide
  430.          file extensions for known file types" checkbox was unchecked).  This
  431.          has been fixed, and FileMask now works properly regardless of this
  432.          setting. Note that the setting still effects how the file is displayed
  433.          (extension shown or not).
  434.        + File sizes in the list view weren't "commaized".  That is, "4305 KB"
  435.          was displayed instead of "4,305KB".
  436.        + Large file sizes are now handled properly.  In D4, the Int64 type is
  437.          used.  All others use the Comp type since Int64 isn't available.
  438.        + Updated William Miller's DFSExplorer demo project.  See the
  439.          DFSExplorerReadMe.Txt file contained in the DFSExplorer.zip file for
  440.          his release notes.
  441. 0.94   + Even though you could move through a removeable drive without a disk
  442.          in the tree with the ReadDelay property, it would still "spin up" when
  443.          you hit.  It just wouldn't generate an error message.  This has been
  444.          fixed so that it doesn't "spin up" at all unless you've stopped on it
  445.          long enough for it to populate (ReadDelay).
  446.        + Rewrote the TSystemListView.AddNode to make it a bit more efficient and
  447.          less messy.
  448.        + I was having sporadic problems with the images not being transparent on
  449.          my system.  I never could determine if it was my code, or some other
  450.          app that was causing it.  I've added a little more code to the image
  451.          list stuff, and the problem doesn't seem to be occuring now, but as
  452.          I said it was sporadic to begin with.
  453.        + The controls did not handle system color changes well.  This appears to
  454.          be a bug I inherited from the VCL.  The window background would change
  455.          to the correct color, but the background around the text would not.
  456.          I've worked around the problem.
  457.        + I wasn't calling inherited in my WM_TIMER handler.  This broke the
  458.          automatic editing of tree nodes when user clicked twice in a node.
  459.        + If the tree is reset, it will now remember the selected node.  If the
  460.          listview is reset, it will remember the focused item.
  461.        + ReadDelay is a little smarter now.  It won't delay at startup since
  462.          that's pretty silly.  It also won't delay on a manually refresh (a
  463.          call to the Reset method), since you really wouldn't want it to delay
  464.          there either.
  465.        + Added known issue about using the Color property (see above).
  466.        + Added DFSExplorer demo project.  A nicer version of the SimpleExplorer
  467.          demo written by William Miller.
  468. 0.93   + Added a new demo project, SimpleExplorer.  It's your basic Explorer
  469.          clone, but on a light scale.  No toolbar, no Favorites menu, only basic
  470.          menu item commands.  Just to illustrate that it doesn't take much code
  471.          to get basic Explorer functionality with the components.  One note: I
  472.          used a TSplitter in it, so Delphi 2 is going to complain about that
  473.          since it didn't come with Delphi until v3.  Just go along with what
  474.          Delphi wants to do when you open the project in D2, and it should
  475.          compile and run fine, sans splitter of course.
  476.        + Version property now marked as not stored.  Doesn't need to be, and
  477.          only increases DFM size.  Should have always been that way.
  478.        + Cut and paste of the treeview still had problems in the IDE.  I
  479.          _really_ fixed it this time.  Promise.  :)
  480.        + TSystemTreeView.ResetTreeView renamed to Reset, and
  481.          TSystemListView.Reload renamed to Reset for consitency.
  482.        + Added TSystemTreeView.NodeData and TSystemListView.ItemData public
  483.          read-only properties.  See the new SimpleExplorer demo app to see how
  484.          these can be useful.
  485.        + DeleteNode and DeleteItem only worked for files, and they did not do it
  486.          via the system, i.e. it didn't honor the system settings for using (or
  487.          not using) the recycle bin.
  488.        + File sizes were still being reported as not working in some situations.
  489.          I'm trying yet a another new way of getting the file sizes.  It seems
  490.          to work for me, even solving a long standing issue of not being able
  491.          to get file sizes of open files.  But, if it causes you problems, you
  492.          can add the DFS_STV_OLDFILESIZE define and it will use the v0.91 file
  493.          size code.
  494.        + Added ReadDelay property to the treeview.  This makes it behave much
  495.          more like Explorer.  Set this to the amount of time in milliseconds you
  496.          want the tree to delay before populating the listview.  It defaults to
  497.          500ms, mostly because that seems the closest to Explorer's behavior.
  498.          You can probably set it lower and get results that are as good and
  499.          make it more responsive to the user.  The main place where this is
  500.          useful is when you are browsing through the tree and you want to go
  501.          through a drive that doesn't have a disk in it (floppy, CD, ZIP, etc).
  502.          Before, you'd always get the not accessible error or a long wait if
  503.          there was a disk in a slow access drive.  Now, it blows right on past
  504.          it if you move on before ReadDelay milliseconds.
  505.        + Added TSystemListView.GetSelectedPIDLs function.  See SimpleExplorer
  506.          project for how it can be useful.
  507. 0.92   + On some network drives, the file size of files in the list view could
  508.          be reported incorrectly.  Thanks to Rob Watt for finding and providing
  509.          a fix for this.
  510.        + List view's ShowFolders property didn't work quite completely enough.
  511.          It would still show things like drives, which are technically folders.
  512.          If ShowFolders is false, it should only display files, as it does now.
  513.        + File changes were not being monitored correctly.  Things like files
  514.          being added in the current directory would not refresh the display.
  515.          Fixed.
  516.        + Don F. Ridgway sent me code to do that attributes column of the list
  517.          view.  MANY thanks to him for taking care of that To-Do list item.
  518. 0.91   + Added OnPopulated event to both tree and list.  They fire after all
  519.          items have been added to them.
  520.        + Real file masking!  I've removed the SimpleMask property (it only let
  521.          you mask based on extensions) and replaced it with a FileMask property.
  522.          The tree also has this property, and uses it to mask files when
  523.          ShowFiles is set to true.  Use it much the same as you would any file
  524.          mask: '*' is 0 or more of any character, '?' is any one character, ';'
  525.          is used to seperate individual masks.  So, if you want all executables,
  526.          you could do something like '*.exe;*.com;*.bat;*.lnk'.  You can get
  527.          more fancy if you need to, as well, like '*4*.com' will show all files
  528.          with a '4' in them that end with a '.com' extension.  Basically, it
  529.          should work just the same as a mask in FindFirst/FindNext (although
  530.          those aren't used).
  531.        + Fixed known issue of delete/cut/paste of TSystemTreeView in the IDE.
  532.          It absolutely hated to be deleted when the Selection (or Directory,
  533.          they're the same) property was set to something other than blank.  Now
  534.          works fine.
  535.        + See updated information on the last item in the Working Notes section.
  536. 0.90   + Stupid VCL doesn't update the Item.StateIndex property when the user
  537.          clicks on it to check/uncheck it.  Only updates it when you change
  538.          the value in code.  How worthless... Anyway, that made the ItemChecked
  539.          property pretty much useless as well.  I've fixed it.
  540.        + TSystemListView.GetFullPath screwed up drives.  It would return "C:\\"
  541.          instead of "C:\".  Thanks to Ladislav Dolezel for finding and fixing.
  542.        + Cleaned up the Known Issues list a bit.  A bunch of fixed stuff was
  543.          still listed.
  544. 0.89   + Using several root folder types would make it difficult to work with
  545.          assigning a value to Selection property in tree.  It now attempts to
  546.          convert new Selection values to their relative equivalents
  547.          automatically to simplify this.
  548.        + Context menu now supports multiple items.  That is, if multiple items
  549.          are selected in a listview and the default context menu is requested
  550.          (i.e. the user right-clicks), the context menu is valid for all
  551.          selected items, not just the first selected.
  552.        + New public method DisplaySelectedContextMenu for listview.  Same as
  553.          DisplayContextMenu, except it shows menu for all selected items instead
  554.          of a specific TListItem.
  555. 0.88   + Design-time value of tree's Selection property was not always honored
  556.          at run-time.
  557.        + Columns property should not have been published in the listview.  It is
  558.          now a public proeprty.  If you need to add your own columns, you do so
  559.          by setting ColumnType to ctUser and writing an OnCreateColumns event
  560.          handler that adds the columns at run-time.
  561.        + Added new public method DefaultDblClickAction to listview.  This can
  562.          be useful if you want to handle the OnDblClick in some situations, but
  563.          want normal handling in other situations.
  564.        + SimpleMask didn't work for registered file types if extensions were
  565.          hidden.  That is, if you set the "Hide file extensions for known file
  566.          types" option in Explorer, files of known types would always fail to
  567.          match the mask.
  568.        + Using listview's SimpleMask under Delphi 2 would cause AVs because of
  569.          an incorrect Release call.
  570.        + SimpleMask would hide files and folders that did not match instead of
  571.          just files.
  572.        + Listview didn't display the date/time for folders.
  573.        + Inplace renaming of listview items now renames the item properly, i.e.
  574.          if the listview is showing "Autoexec.bat" and you edit it, the file
  575.          will be renamed.
  576.        + Added two new public functions to listview, RenameItem and DeleteItem.
  577.        + Added Checkboxes published property and ItemChecked public property to
  578.          treeview.  These require the updated COMCTL32.DLL be on the system.  If
  579.          you don't know about the updated COMCTL32.DLL issue, get my
  580.          TExtListView component and read the ELV.txt file, especially the
  581.          "Redistributing COMCTL32.DLL" section.
  582. 0.87a  + Updated ItemProp.pas unit.  This fixes a known issue with
  583.          cut/copy/paste context menu items not working on all installations.
  584.          No code in SystemTreeView.pas has changed.
  585. 0.87   + The fix introduced in v0.85 broke TSystemTreeView if there was no
  586.          TSystemListView attached to it.  Stupid programmer...
  587.        + Removable drives would still get hit when being displayed in a
  588.          TSystemListView.  This was very annoying when those drives were empty.
  589.        + Added Data property to TFolderItemData class.  The reasoning is that
  590.          the components use the TTreeNode.Data and TListItem.Data properties,
  591.          so they aren't available to the component user any more.  Now, you can
  592.          have the equivalent by doing something like this:
  593.            TFolderItemData(Node.Data).Data := mydata;
  594.        + Demo program sometimes blew up on NT.
  595. 0.86   + Added SystemView.inc file.  This file contains all the conditional
  596.          defines used by the unit.  There are two new defines in this file that
  597.          you may be interested in:  DFS_STV_SYSTREEVIEW and DFS_STV_SYSLISTVIEW.
  598.          See the Conditional Defines section above for a complete description.
  599.        + DFS_STV_USE_ENHLISTVIEW and DFS_STV_USE_EXTLISTVIEW conditionals added.
  600.          These are not enabled by default. See the Conditional Defines section
  601.          above for a complete description.  WARNING:  This is just a simple
  602.          implemenation currently, and there are likely to be problems.  Only use
  603.          these if you want to help me work out the bugs in it.
  604. 0.85   + Resetting of a treeview that had a linked listview could cause nasty
  605.          problems because the listview kept a pointer that wasn't valid any
  606.          longer.
  607. 0.84   + Updated to publish the new D3 and D4 properties such as RowSelect,
  608.          RightClickSelect, Anchors, etc.  Note, this stuff only shows up in the
  609.          appropriate version of Delphi.  For example, only D4's list/tree view
  610.          has an Anchors property, so TSystemTree/ListView only has it if
  611.          compiled under D4.
  612.        + Renaming a tree node did not update some internal data, and doing
  613.          things like trying to expand the renamed directory would complain about
  614.          the old name not existing.
  615.        + Deleting nodes in the tree could cause the automatic refresh stuff to
  616.          get confused and cause AVs when the component was destroyed.
  617.        + Setting ShowFiles to TRUE in the tree would cause it to try to watch
  618.          for changes in a directory with the name of the file selected instead
  619.          of the directory that the file was in.
  620.        + Removed the FShellMalloc._Release call in the finalization section for
  621.          D3 and higher.  It was there to begin with because there appears to be
  622.          a compiler bug with COM objects whose references are gotten in an
  623.          initialization section.  The compiler is supposed to automatically
  624.          insert a release call when the reference "goes out of scope", but
  625.          Delphi doesn't do this for stuff in the init section.  I was
  626.          compensating by inserting the call manually, but it turns out that if
  627.          you do this, you'll then get two calls to release, yours and the
  628.          missing automatic call that Delphi was supposed to be inserting anyway.
  629.          So, I figure it is safer to have the ref count of the COM object to be
  630.          too high rather than too low.  Go too low, and you could conceivably
  631.          end up freeing the shell's IMalloc object and that would be a TRULY
  632.          bad thing.  Thanks to Grahame Marsh for the spelunking he did on this.
  633. 0.83   + The 'KB' abbreviation was hard-coded, it is now a resource string.
  634.        + Folders would show '0 kb' in fast mode instead of being blank like they
  635.          are in non-fast mode.
  636.        + Fixed range check error when sorting by column click under Delphi 4.
  637.        + AddNewNode method didn't like adding to root directory nodes.
  638.        + Floppy drive is no longer hit when expanding a tree node that contains
  639.          it.  MANY thanks to Jacques Bordas <farandir@club-internet.fr> for
  640.          fixing this EXTREMELY annoying bug.
  641. 0.82   + Updated for Delphi 4 compatibility.
  642. 0.81   + NT 4 has more than 8 bytes stored in in the registry key used for the
  643.          column sizes.  This caused problems, but it really shouldn't have.
  644.          At any rate, I've modified the code to account for the size being
  645.          unknown.
  646.        + Almer. S. Tigelaar <almer-t@usa.net> emailed me a fix for the "never
  647.          ending flicker" problem that some people have reported.  I could never
  648.          duplicate the problem, so I can only tell you that he said it fixed it
  649.          for him.  If you still have the problem, please let me know.
  650. 0.80   + Unit now uses DFS.INC file for my commone defines.
  651.        + Moved all this crap out of source file to this text file.
  652.        + Changed context menu handling entirely.  Components now use my ItemProp
  653.          unit (included) that handles it all.  I did this because I have the
  654.          Send To menu problem solved in ItemProp, and redoing it here seemed
  655.          pointless.  So, the Send To menu bug (it being empty) is now fixed.
  656.        + Added PopupMenuMethod property to both components.  pmmNone means use
  657.          no popup menus at all, pmmUser means use only menu in PopupMenu
  658.          property, pmmContext means use only system context menu, pmmContextUser
  659.          means use system context menu if it can and PopupMenu if it can't.
  660.          Items like the Desktop node and listviews with nothing selected are
  661.          places where the context menu would not be used and the PopupMenu would
  662.          kick in.
  663.        + I've added two new defines to the top of the unit, DFS_STV_FASTMODE and
  664.          DFS_SLV_FASTMODE.  See Conditional Defines section above.
  665.        + Forgot to override the tree's Notification method.  This would cause
  666.          violations if a linked list view is deleted before the tree view.  Many
  667.          thanks to Simon Armstrong <simes@clara.net> for catching this one.
  668.        + File time in TSystemListView could be incorrect in some time zones.
  669.          Thanks to Frank Kroeger <FKroeger@tkc.de> for providing a fix.
  670.        + Added Reload method to TSystemListView.  You can guess what it's for.
  671.        + Shortcut (.LNK) files in the Desktop folder no longer show their .LNK
  672.          extension.
  673.        + Wouldn't compile with DFS_STV_FILECHANGES undefined.  Thanks to Elmar
  674.          Klaus <herr.schwupp@cww.de> for fixing this.
  675.        + Added Known Issuses section above.  Please read it.
  676.        + Changing MultiSelect property of TSystemListView at run-time would
  677.          clear the contents of the list view.  Actually, anything that recreated
  678.          the window would do this.  Now properly reloads after window is
  679.          recreated. May also have been causing some AVs that people reported
  680.          when changing MutliSelect value, but I wasn't able to verify this.
  681.        + TSystemTreeView has a new Directory property.  It is identical in
  682.          every way to the Selection property.  :)
  683.        + Added two read-only properties to TSystemListView: Filename and
  684.          FullFilename.  Both are array properties that use a TListItem as the
  685.          index.  Ex:
  686.              ShowMessage(MyList.FullFilename[MyList.Selected]);
  687.        + Got rid of the hard-coded column captions for TSystemListView.  They
  688.          are declared as resourcestrings for D3 and just constants for D2 in the
  689.          interface section.
  690.        + Double clicking on an item in TSystemListView now takes the item's
  691.          default action (the one in bold on it's context menu).  However, if you
  692.          have an event handler for OnDblClick, this will not happen.
  693.        + Share and link image overlays weren't correct on all machines.  Fixed
  694.          by Benedykt Kubica <b.kubica@computer.org>.  Many thanks.
  695.        + TSystemTreeView and TSystemListView Items property has been changed to
  696.          public visibility and read-only.  This stuff should only be read from,
  697.          never written to from outside the component.
  698.        + Dropping a TSystemListView on a form with a TSystemTreeView on it will
  699.          automatically hook it up to the ListView property of the the tree.
  700.        + TSystemListView would always show the contents of the desktop when the
  701.          treeview's root node was selected, even if the root node wasn't the
  702.          desktop, i.e. RootFolder was rfCustom and CustomDir set to c:\.
  703.        + Setting MultiSelect property of list view at design-time in forms that
  704.          were not auto-created would cause AV's when the form was created and
  705.          shown at runtime.
  706.        + Found and fixed a problem with the file/dir thread watcher. Not sure
  707.          what problems it may have been causing as it would have been very
  708.          sporadic, but creating directories may now be more reliable.
  709.        + Sorting is better now.  TSystemListView sorting was broken sometimes,
  710.          and it wasn't completely right anyway.  Now sorts folders first and
  711.          items after.  Should sort exactly like explorer now.
  712.        + Now compatible with C++Builder 1 & 3.
  713.        + Added AutoScroll property.  This feature was entirely written and
  714.          contributed by Aristide Torrelli <a.torrelli@tin.it>.  I have only
  715.          adapted it for use in TSystemListView.  Many thanks to him.
  716.        + Palette icon for list view provided by Almer. S. Tigelaar
  717.          <almer-t@usa.net>.
  718.        + SimpleMask property added to TSystemListView.  This feature was written
  719.          by Rafal Platek <creams@creamsoft.com> and slightly edited by me. To
  720.          only list files with specific extension(s), just assign the
  721.          extension(s) to this property.  For example:
  722.            MyList.SimpleMask := 'pas'; // show only .pas files.
  723.            MyList.SimpleMask := 'pas,dpr,dfm'; // show common Delphi source files
  724.            MyList.SimpleMask := ''; // No masking, show all.
  725.        + The following were done by Fabrice Fouquet (services@cfp47.inba.fr):
  726.          * Setting Section property of tree now makes sure it is also visible.
  727.          * Hourglass cursor during directory changes.
  728.          * Use registry info to size list view columns so they match Explorer's.
  729.          * Double-click in listview moves into sub-folder and updates treeview,
  730.            too.  I enhanced this one so that it would work with non-file
  731.            system folders, so if something there breaks, it's my bug not
  732.            Fabrice's.
  733.          * Column sorting for list view.
  734. 0.70   + Turns out I was thick-skulled after all (see 0.65 notes). I was
  735.          allocating the memory with GetMem, and that of course does not
  736.          initialize the memory (i.e. make sure the pointer variables are set
  737.          to NIL).  So, I assigned something to the IShellFolder variable,
  738.          and Delphi 3 checks the existing value and tries to Release it if
  739.          it is not NIL.  Well, it's just trash initially, so off it goes
  740.          into the weeds...  I could go back to the dynamic allocation method
  741.          and use the Initialize function to clear it all, but the class is
  742.          better anyway.
  743.        + General clean-up.
  744.        + Fixed bug in RenameNode method.  It updated the relative PIDL, but
  745.          not the fully qualifed PIDL.  Thanks to Frank Kroeger
  746.          (FKroeger@tkc.de) for finding and fixing this.
  747.        + Shared and link overlay images now work for the tree and list. HUGE
  748.          thanks go to Peter Ruskin (PeterRuskin@classic.msn.com) and Lars
  749.          Randers (lranders@post2.tele.dk) who both for provided this code.
  750.        + Added ShowFolders property to TSystemListView.
  751.        + Files weren't shown in folders that had no subfolders (ShowFiles
  752.          property set to TRUE).
  753.        + Fixed problem that would cause bizarre access violations if you did
  754.          anything that caused the window to be recreated.  For example, if
  755.          you changed the BorderStyle property, you would get this because
  756.          the window handle has to be destroyed and recreated.  This caused
  757.          all the pointers to get freed, but then the pointer values were
  758.          restored when the window was recreated -- data is gone, just a load
  759.          of invalid pointers.
  760.        + Images were screwed up in Control Panel and Printers folder.
  761.        + Overriden Expand method never called inherited.  Broke OnExpanded
  762.          event.
  763. 0.65   + Yes, it's true; I FINALLY got it working under Delphi 3.  I thought
  764.          I was just really thick skulled, but turns out that Delphi 3 freaks
  765.          out when you try to store COM object references in dynamically
  766.          allocated records.  I switched the record structure over to a class,
  767.          and all works just fine... Go figure.  Needed to be done anyway.
  768.          Now I need to flesh out the new class so it's more OOP-ish.
  769. 0.60   + Well, it compiles under Delphi 3, but it sure doesn't work.  I will
  770.          get to when I can.  Sorry.
  771.        + Added TSystemListView.GetItemAttrs public method so you can get the
  772.          attrs of an item to do stuff like testing for if it is a folder:
  773.             if (SLV.GetItemAttrs(SLF.Selected) and SFGAO_FOLDER) <> 0 then
  774.                // It's a folder
  775.        + Added TSystemListView.GetFullPath public method to get an item with
  776.          it's complete path information.  This obviously doesn't apply for
  777.          things like printers and such.
  778.        + Sorting in the TSystemListView should now work.  Set SortType to
  779.          something other than stNone.
  780. 0.50   + ShowRoot didn't work as it should (as TListView does).
  781.        + rfFileSystem roots wouldn't expand farther than the first level.
  782.        + Some serious problems with EAccessViolations after fiddling with
  783.          the component for a while (change RootFolder, etc).  I think I have
  784.          this all fixed up now.  AddRefs and Releases weren't quite right.
  785.        + Selection property is now read and WRITE.  That means you can do
  786.          something like MyTree.Selection := 'c:\windows\system'; and it will
  787.          select that node. Note that this only works with file/directory
  788.          stuff, there is no way to do something like MyTree.Selection :=
  789.          Control Panel; Also note that the assignment value is relative to
  790.          the root type.  So, if you want to select a directory when
  791.          RootFolder is rfDesktop or rfDrives, you pass the full pathname.
  792.          If RootFolder was rfPrograms and your programs directory was
  793.          'c:\win\start menu\programs' and you wanted to select
  794.          'c:\win\start menu\programs\some folder\subfolder', you would do:
  795.            MyTree.Selection := 'some folder\subfolder';
  796.          Many thanks to Raymond Chen for his help on walking a PIDL (similar
  797.          to walking a dog, but without the pooper-scooper).
  798.        + Added OnAddListItem and OnCreateColumns to the TSystemListView
  799.          component. OnCreateColumns is called when ColumnType is set to
  800.          ctUser.  The old columns are removed and then the event is fired.
  801.          The event is responsible for creating the columns it needs.
  802.          OnAddListItem is called every time an item is added to the listview.
  803.          It passes the new TListItem, which has the Caption property set to
  804.          the name of the new item.  You should set the ColumnType property
  805.          to ctUser and create the columns you need in the OnCreateColumns
  806.          event.  Then, in the OnAddListItem event, you would add the data
  807.          for these new columns by using the passed TListItem's SubItems.Add
  808.          method.
  809.        + Updated for compatibility with Delphi 3.
  810. 0.40   + At this point, TSystemListView is just an experiment.  If you have
  811.          problems with it, I will try to help, but I will not devote much
  812.          time to it.  I'm mainly interested in the tree view.  Now, if you
  813.          have problem AND a fix, I'll be more than happy to hear about it.
  814.        + Somehow I ended up with two versions of v0.30.  I don't have any
  815.          idea how it happened, and I've given up trying to merge the two
  816.          versions and just gone back to the one with the most functionality.
  817.        + Got rid of the SHGetDataFromIDList call.  Only works correctly on
  818.          NT 4 with service pack 2, so it's not really a viable alternative
  819.          for this.
  820.        + Sorting revisited. Thanks to Detlef Meister
  821.          (Meister@rz.fhtw-berlin.de) for sending me some good code to start
  822.          with for this.  I think sorting is working very well now, but that
  823.          is of course only on my machines.  Please try it out, and especially
  824.          pay attention to see if it sorts in the same order as Explorer.  If
  825.          you find that sorting is causing terrible problems for some reason,
  826.          you can turn it off by undefining STV_DOSORTING below. If all goes
  827.          well with it, I'll add it to the list view next.
  828.        + Added read only Selection property.  Returns the path name of the
  829.          selected node (if it is a file system object).  Working on making
  830.          it read/write, but it's a pretty hairy problem.
  831.        + CustomDir didn't like UNC names (\\somecomputer\somedirectory).
  832.          Working a little better now, but still not right.
  833.        + Many people have asked how to just display drives, i.e. RootFolder
  834.          set to rfDrives but without the printers, control panels, etc.
  835.          There is no direct support for this at the API level
  836.          (SHGetSpecialFolderLocation), but I think I have found a way to do
  837.          it.  Try the new rfFileSystem root type. Let me know if you have
  838.          any problems with it.  It should have My Computer as the root node
  839.          and then any device that has physical storage capability as child
  840.          nodes.  If you are interested, search for SFGAO_FILESYSANCESTOR to
  841.          see what I'm doing.
  842. 0.30   + New feature:  Set the value of CustomDir to a valid directory, and
  843.          then set RootFolder to rfCustom, and the tree will allow you to
  844.          browse from that directory as the root.  Also, if you don't want
  845.          the root to read something like 'c:\win\system', then use
  846.          CustomDirCaption to override it.
  847.        + Now using SHGetDataFromIDList, which is missing from SHLOBJ.PAS.
  848.          See step five in ShellFix.txt.
  849.        + If PopupMenu property is has a menu, it is displayed instead of the
  850.          context menu.
  851.        + TSystemListView now descends form TCustomListView as it should.
  852.        + Fixed bug.  I overrode the Change method of the tree, but forgot to
  853.          call inherited method. This broke the OnChangeEvent - never called.
  854.        + Fixed bug that caused serious problems for projects with one of
  855.          these saved on a form.  When you tried to reopen the form after it
  856.          was closed, it would cause many strange things to happen, usually
  857.          just a lockup.  See the Loaded and CreateWnd methods for the fix.
  858.          If you want detailed description, email me and I will explain it.
  859.        + New feature: ShowFiles property.  Allows the tree to display items
  860.          other than folders in it.  I guess ShowFiles isn't the best
  861.          description, since also includes things like printers in the
  862.          printers folder.  Anyone got a better name for it?
  863.        + TSystemListView object has some serious problems, so I've disabled
  864.          it in test app until I get time to work on it.  I strongly suggest
  865.          you stay away from it in this version, unless you want to help me
  866.          fix it.  To reenable it in the test app, take out the NOLISTVIEW
  867.          define at the top of TESTING.PAS.
  868. 0.21   + DisplayContextMenu doesn't work for root tree objects.  Desktop
  869.          doesn't have one, and I fixed that, but don't know what's wrong
  870.          with the others.
  871.        + Moved all strings into resource file (ErrorMsgs.r32) except for the
  872.          debugging "mem leak" string.  Doesn't seem to like loading strings
  873.          in an exitproc (finalization section).
  874.        + Could never make up my mind about whether to go with message boxes
  875.          or exceptions, so I just added a public property that can be used
  876.          to set your preference.  I prefer message boxes since there is no
  877.          good way to catch the exceptions in an app, so that is the default.
  878.        + Added all the file system report info stuff for list view items
  879.          (size, type, date).  If anyone knows how to determine the type of
  880.          object you have given it's PIDL, I'd love to know it.  Right now,
  881.          if it's not a file system object, you just get it's name.
  882. 0.20   + This unit requires complete boolean eval to be turned off.  I've
  883.          added the appropriate compiler switches to do this in case it is
  884.          turned on in your project.
  885.        + First crack at a TSystemListView component to compliment the tree
  886.          view. It is way far from being as functionally complete as the tree
  887.          view.  Mostly it's to see if it works for everyone at it's simplest
  888.          form.
  889. 0.11   + Deleted the $I DEFINES.INC file in demo app.  Not needed any more.
  890.        + Added GetNodePath.  Returns full path given a TTreeNode.  Returns
  891.          '' if it is not a file system type node (i.e. control panel).
  892.        + If selected node were deleted from another app, it could get pretty
  893.          ugly. Fixed.
  894.        + Added palette resource icon for component.  Thanks to Basri Kanca
  895.          for it.
  896.        + Added three new functions, RenameNode, DeleteNode, AddNewNode.
  897. 0.10:  + I Feel reasonably confident in the component now.  All core
  898.          functionality seems to be in place and working.
  899.        + Added ability to rename folders.  Thanks to Thomas AW Brown.
  900.        + Fixed problem that would occur if you installed the component in
  901.          Delphi (i.e. Component | Install).  By default, the Items property
  902.          is "stored", so all everything in it is written to the DFM file
  903.          that the component is on and that includes the Data property of
  904.          each of the tree nodes.  This a pointer to memory we allocate, so
  905.          having the pointer value stored wouldn't do a whole lot of good,
  906.          would it?  See the redeclaration of Items below.
  907.        + Added a new unit, FileChange, which provides a TThread descendant
  908.          that knows how to watch directories for changes in structure.  It
  909.          hasn't been well tested, so I have included it only inside $IFDEFs.
  910.          It should automatically cause the selected node to be updated if
  911.          another app makes changes to that directory's subdir structure.
  912.          For example, compile and run the demo.  Select a node that is a
  913.          directory somewhere on your hard drive.  Start explorer and select
  914.          that same node in it.  Add a new folder to the selected directory
  915.          in Explorer.  The demo app should automatically update the node to
  916.          reflect the change.  If you have problems with it, comment out the
  917.          $DEFINE FILECHANGES line below.
  918. 0.03:  + Finally got the damn icon problem fixed.  The PIDL wrapper class
  919.          was hosing me up somehow.  Don't know what was wrong with it, but
  920.          its pointer would disappear for some reason.  Getting rid of it
  921.          cleared up the problem.  So much for OOP making my life easier.  :)
  922.        + Got ShowRoot working.  Thanks to John Cardinal for that.
  923.        + General code clean up.
  924.        + While Mr. Ritchey acknowledged the declaration errors in his
  925.          ShellObj unit, he has never answered my request to included a fixed
  926.          version of it with this control.  So, for now, I'm just going to
  927.          include directions on how to fix everything and not worry about.
  928.          See the SHELLFIX.TXT file.
  929. 0.02:  + Updated to use ShlObj, available inthe Delphi 2.01 update.  See
  930.          NOTE above. Edit the DEFINES.INC file to control which namespace
  931.          import unit you want to use.  If $D201 is defined, you use
  932.          Borland's, otherwise Pat Ritchey's. Also made some more changes to
  933.          ShellObj to make it more compatible with Borland's ShlObj version.
  934.          If you use Borland's, context menus won't work. See the comments in
  935.          the DisplayContextMenu method for an explanation.
  936.        + Context menus (right click) are working, but need a good round of
  937.          testing.
  938.        + Added some stuff to the demo project to help with testing.
  939.        + Can now change RootFolder property during execution.  Would blow up
  940.          before if changed after initial assignment.
  941.          rfRecycleBin still blows up...  don't know why.  It doesn't like
  942.          the EnumObjects call in EnumerateFolders.
  943.        + A lot of the code got rewritten to make context menus, icons, etc.
  944.          work. A the Golden Rule of PIDLs is that the SH* functions take a
  945.          fully qualified path PIDL, and the IShellFolder interface methods
  946.          take a relative PIDL. I was using relative PIDLs everywhere.  The
  947.          result is that more things work now, but the code is probably even
  948.          less stable than before.  Bang on it.
  949. 0.01:  + Cleaned up the mess in the USES clauses and the test project.
  950. 0.00:  + Initial alpha release to limited audience.
  951.  
  952.