home *** CD-ROM | disk | FTP | other *** search
- System Control Pack v0.98.5 Beta
-
- This is BETA software. It is not guaranteed to do ANYTHING useful at all.
-
- R E A D T H I S N O W ! ! !
-
- I hope that got your attention. This component requires a unit that
- provides access to the Win95/NT 4.0 Shell Namespace API. Delphi 2.0 did not
- include this import, but the v2.01 update does. Also, Mr. Pat Ritchey was
- kind enough to write one, which I think was the basis for Borland's (same
- bugs in both units, must be the same). C++Builder 1.0's ShlObj.pas also suffers
- from the same problems. Regardless of which you use, you will have to do some
- extra work because both contain errors that will prevent this component from
- working properly (or even compiling, probably). To implement these changes,
- read the ShellFix.txt file that should have been included with this file.
- If you use Delphi 3 or higher, or C++Builder 3 or higher, you will not need to
- worry about any of this. No bugs (that effect these components anyway).
-
-
- Description:
- Tree view, list view, and combobox controls that act like the controls in the
- Windows Explorer.
-
-
- Contact Information:
- The lateset version will always be available on the web at:
- http://www.delphifreestuff.com
- If you have any questions, comments or suggestions, please use the Delphi
- Free Stuff Support Forum at:
- http://www.delphifreestuff.com/discus/
- If, for some reason, you can not use the web-based support forum, you can
- email me at bstowers@delphifreestuff.com. However, the support forum will
- always take precedence over direct email since it provides a resource that
- others can use when they have a problem. Every message posted to the forum
- is emailed directly to this account, so emailing me directly will not get
- your message to me any faster. It will only make the message less important
- for me to respond to since only one person (you) is benefiting from it
- instead of everyone interested. Having said all that, please do email me
- directly if it is regarding something that isn't really support related,
- i.e. just to say thanks (as novel as that idea is).
-
-
- Installation:
- Delphi 1:
- * This component is not compatible with Delphi 1.
-
- Delphi 2, C++Builder 1:
- * Select the 'Component | Install' menu item.
- * In the Install Components dialog, click the Add button.
- * In the Add Module dialog, enter the full path name of the component's
- registration unit (the unit that ends with 'Reg.pas', i.e.
- 'BrowseDrReg.pas') and click OK.
- * In the Add Module dialog, click OK.
- * The component library will be rebuilt and a new tab named 'DFS' will be
- available on the Component Palette.
-
- Delphi 3, 4, 5, C++Builder 3 & 4:
- * Do one of the following:
- + Create a new package by selecting File | New and choosing Package from
- the New tab in the dialog.
- + Open an existing package file. I suggest you do this if you already
- have a package that you like to use for small, third party components.
- I specifically have a package named "3rdParty.dpk" that I use for
- small components that come from other people. Or, if you are using
- several of my components, you might create a "DFS.dpk" package and
- use it for all of my DFS components.
- * In the resulting package window, click the Add button.
- * In the Add dialog, on the Add Unit tab, enter the full path name of the
- component's registration unit (the unit that ends with 'Reg.pas', i.e.
- 'BrowseDrReg.pas') and click OK.
- * You may want to add the other source files (*.pas) to the package as
- well in the same manner as you did the registration unit. While this is
- not required, not doing it will cause compiler warnings when the package
- is compiled. The component will function fine either way, but I
- personally find the warnings very irritating and am not happy until
- every compiler warning and hint is gone. NOTE: If you use C++Builder 3,
- do not install the other source units. See Known Issuses section below.
- * If this package is new, or it has never been installed, click the
- Install button in the package window. If this package is already
- installed in Delphi, click the Compile button.
-
- C++Builder 5 and up:
- * Perform the "Delphi 3 and up, C++Builder 3 and up" steps above, except
- for the last step (Compile or Install).
- * Select the package the component has been added to, and choose
- Project | Edit Option Source to open the package options in the editor.
- * In the entry for PFLAGS, add the "-LUvcl50" option. For example:
- <PFLAGS value="-$YD -$W -$O -v -JPHNE -M -LUvcl50"/>
- * Perform the final step from above, Compile or Install.
- * For Borland's official word on this situation, open the C++Builder help
- file and search the index for "dsgnintf.dcu" and see the "Compiling
- packages with DsgnIntf" section.
-
- Delphi 6 and up:
- * Perform the "Delphi 3, 4, 5, C++Builder 3 & 4" steps above, except
- for the last step (Compile or Install).
- * Add the DesignIDE package to the Requires list of the package into which
- the component is being installed.
- * Perform the final step from above, Compile or Install.
- * This is necessary because of changes to the design-time support units
- introduced in Delphi 6. For complete information, see the Del6New.hlp
- file in your Delphi 6 Help directory. In the index, search for
- "upgrade issues" and in the resulting list of topics, select the
- "DsgnIntf renamed and related changes" topic.
-
-
- Conditional Defines:
- These units makes extensive use of conditional defines to control many aspects
- of how and what things are compiled. Usually these are used to effect code
- size or change how a feature works, but some are also for debugging purposes.
- The following is a list of the defines that are used and how. These defines
- are all found in the SystemControlPack.inc file. The prefix used in each
- name identifies what is effected:
- DFS -- Prefix I use for all my defines to avoid clashing with other
- defines that may be in use. DFS = Delphi Free Stuff
- SCP -- Indicates that the define effects all components. SCP = System
- Control Pack
- STV -- Indicates that the define effects only the TSystemTreeView
- component. STV = System Tree View
- SLV -- Indicates that the define effects only the TSystemListView
- component.
- SCB -- Indicates that the define effects only the TSystemComboBox
- component. Currently, there are none of these.
- The defines used are as follows:
-
- * DFS_SCP_SYSTREEVIEW, DFS_SCP_SYSLISTVIEW, DFS_SCP_SYSCOMBOBOX: If you
- undefine any of these, then that/those components will no longer be
- compiled. For example, if you undefined DFS_SCP_SYSLISTVIEW, the
- TSystemListView component will not be compiled, and the tree view and
- combo box components will no longer have a ListView property to link to.
- This resulted in a 70k saving in the compiled EXE of a test app that used
- only the TSystemTreeView component. The down side to this is that if you
- use TSystemListView for some projects and not for others, you will either
- have to leave it enabled for all, or have one heck of a code maintenance
- nightmare. One solution to this could be to remove the
- DFS_SCP_SYSLISTVIEW define from the include file completely and add it to
- the Project | Options | Directories/Conditionals of the design-time
- package you install the component in. Then, you would add
- DFS_SCP_SYSLISTVIEW to the options of the projects that need it, and leave
- it out of those that don't. This would allow you to control what is
- compiled into the Delphi IDE independant of what is compiled into your
- projects without having to change the SystemControlPack.inc file in
- between. I have not tested this solution, but it works in theory. :)
- * DFS_STV_FASTMODE and DFS_SLV_FASTMODE: These defines are not enabled by
- default. If you enable them, the components will populate/display much
- faster. The reason is that the actual item data such as the Caption and
- subitem text, the image index, etc. aren't retrieved when the list/tree is
- populated. Instead, the system will ask (via a CN_NOTIFY message) for the
- data when it needs a particular item's data and it is supplied only then.
- So, it doesn't take nearly as long to add a large number of items. But
- (there's always a price to be paid), you will lose access to this data via
- the Nodes (treeview) or Items property (listview). That means you won't
- be able to do stuff like:
-
- ShowMessage(MySysListView.Items[0].Caption);
-
- However, you will still be able to do the equivalent using stuff like:
-
- ShowMessage(MyList.GetFullPath(MyList.Selected));
-
- So, if you need the text or image index stuff, leave the define off. But,
- if you don't, turn it on by removing the period and it'll be faster. In my
- informal testing, listing my windows directory went from 12 seconds to 2
- seconds. You'll only see these big gains on directories with a lot of
- files, though. Many thanks go to Andei V. Rasskazov for pointing this
- technique out.
- * DFS_SLV_USE_ENHLISTVIEW and DFS_SLV_USE_EXTLISTVIEW: These are not enabled
- by default. They are useful only if you also have my TEnhListView and
- TExtListView components. You will need v3.13 or later of these components
- for this to work. Enabling ONE of these (never enable both) will cause
- TSystemListView to descend from the corresponding TEnh/ExtListView class,
- giving you all of that class' features as well. WARNING: This is just a
- simple implemenation currently, and there are likely to be problems. Only
- use these if you want to help me work out the bugs in it. Defining either
- of these will also cause DFS_SLV_USING_ELV to be defined. I use this
- internally when I want to know if either of the above are defined and
- I don't care which one. You should not define DFS_SLV_USING_ELV yourself.
- * DFS_STV_FILECHANGES: Controls whether the treeview will "watch" the
- directory that is currently displayed for changes, i.e. a new directory
- or file created, an existing one deleted, etc. and automatically refresh
- when this happens. This was originally put in so that this feature could
- be turned off during development if nasty bugs were found. However, that
- was quite a while back, and "change watching" seems to be quite stable
- now. The only reason you might want to turn it off now is to save
- yourself the 3.5 kb of space it adds to your compiled EXE. This define
- will probably be removed entirely unless someone makes a strong case for
- leaving it.
- * DFS_DEBUG: This is a define that I use internally for debugging the
- components. It causes a unit to be used that is not distributed, so it
- is most likely useless to anyone but me.
-
-
- Working Notes:
- * I really need to rip all the namespace stuff out and put it in it's own
- class so that you could use it however you wanted, not just in this comp.
- * The included test project creates a TSystemTreeView object on the fly so
- that you don't have to install the component in your library. I'm
- fairly confident that the component is stable, but if you don't want to
- install, you don't have to just to see the demo.
- * If anyone knows how to determine the type of object you have given it's
- PIDL, I'd love to know it. Right now, if it's not a file system object,
- you just get it's name. I need to determine other types like the
- printer folder, control panel folder, network servers, network
- workgroups, etc.
- New information: I've noticed that a commercial Explorer replacement that
- I have (PowerDesk from Mijenix) has this exact behavior, i.e. if you select
- the Printers folder, Recycle Bin, etc. you get just a single "Name" column.
- Hey, if a bunch of paid programmers can't figure it out, I probably won't
- either, so I'm inclined to call this "as-designed" behavior. Comments?
-
-
- Items On The To-Do List:
- * A few more bugs still in my email.
- * CMF_CANRENAME flag for context menu. Can't just add it as it will cause
- OLE errors, i.e. system won't handle it. I need to determine if I can
- use "magic numbers" to interpret rename and other unhandled commands to
- to catch them and process them myself.
- * Use timeGetTime to decide if I should show the hourglass or not in
- EnumerateFolders methods.
- * Change GetItemAttrs so it uses a nice Delphi set instead of API values.
- * Do away with ShowFolders/Files and ShowHiddenFolders/Files properties
- and replace with a set that includes all the stanadard stuff: hidden,
- system, read-only, etc. AttrMask property.
- * Add properties for the stuff in the registry key HKCU\Software\Microsoft\
- Windows\CurrentVersion\Explorer\Advanced and use those values as default
- values for the properties. This has stuff like hide extensions, etc.
- * I may or may not implement drag/drop with the shell. In the meantime,
- Dieter Steinwedel (dsteinwe@rz.uni-osnabrueck.de) has a fine d-n-d shell
- component that works with any TWinControl descendant. It can be found at
- http://godard.oec.uni-osnabrueck.de/student_home/dsteinwe/delphi/DietersDelphiSite.htm
- There are probably others as well, I haven't looked much.
- * "Cut" context menu command does not show the file icon as disabled yet.
- * Hidden files have same problem as cut files (item above).
-
-
- Known Issues:
- * C++Builder 3 users: You must install only the registration unit
- (SystemControlPackReg.pas) into the package you compile the component into.
- If the package also includes the other source files, you will get error
- messages about DCLSTD35.LIB, which doesn't exist. It has to do with the
- fact that the source lists ImgList in the uses clause, even though I have
- properly $IFDEFed it out. Must be some error in the C3 parser that is
- causing it to see this unit, and in C3 this unit is some design-time unit or
- something. It results in the IDE continuously inserting DCLSTD35.LIB into
- the project file, and there's no such file. Manually removing it from the
- project does not help, it just sticks it back in. The only way to get it to
- stop is to manually edit the code and remove the reference to ImgList, or to
- not include the source file in the package. Bizarre.
- * C++Builder 3 users: You must edit the source files to remove the ImgList
- unit from the uses clauses of the units. I have properly $IFDEFed out
- this unit, but some error in the C3 parser is causing it at some point to
- see this unit, and in C3 this unit is some design-time unit or something.
- It results in the IDE continuously inserting DCLSTD35.LIB into the project
- file, and there's no such file. Manually removing it from the project
- does not help, it just sticks it back in. The only way to get it to stop
- is to manually edit the code and remove the reference to ImgList. Bizarre.
- * None of the demos are probably going to work well with all the new stuff.
- It's late and I really want to get this stuff out, so I'll update them
- in the next version.
- * The list view incorrectly thinks that some folders contain file system stuff
- when the really don't. For example, it thinks the Control Panel folder
- does, so it get's all the columns for a file directory list. This is a bug
- introduced with the new way of doing things in v0.96 and I've not yet been
- able to figure it out. If anyone has any clues, I'd really appreciate it.
- It didn't happen in v0.95, but things were a lot different in the list
- population in that version.
- * Combo box does not like working with a treeview that doesn't have rfDesktop
- as it's root node. I'm not sure if you'd really ever need to have a combo
- that used something besides the desktop as a root, so at this point and not
- going to invest the somewhat large amount of time to work on doing it. If
- you do need this, let me know and I'll add it to the to-do list.
- * The tree is hitting the all the sub nodes of a just expanded node again.
- For example, when you expand the "My Computer" node, it hits each item; one
- of those is likely a floppy drive, and that slows things down as it cranks
- on it for a second. No error message, but the delay is irritating. And I
- fixed it once before, too!
- * Changing the RootFolder of a tree doesn't update a linked listview at design
- time. This saved me a ton of work, and it's really not that important at
- design-time anyway, is it?
- * Double clicking on a computer name in a listview that is linked to a
- rfNetHood rooted treeview will not move into that computer.
- * If using the Checkboxes property and you cause the treeview window to be
- recreated by doing something like changing the BorderStyle property or
- something, the checked values will be lost. I will fix this in the future.
- * Changing the Color property to anything other than clWindow is strongly
- discouraged. The images will still use the clWindow color as their
- background, so you'll end up with a pretty odd looking tree/list. The
- reason is that if I changed the background color of the image list(s), it
- would effect the entire system. That is, Explorer would then have a
- tree/list with a clWindow background color but the images would have your
- new color around them. The image lists are a shared, system-wide resource
- and a change like this simply can not be allowed. There is one alternative:
- a copy of the system image list can be made, and that used instead of the
- real system image list. It can be changed in any way without effecting the
- rest of the system. The problems I have with this are: 1) It's an awful
- lot of trouble to implement, 2) It's generally very slow since the system
- image list is quite large. You'd have a delay of a second or three before
- your app started. If enough people ask me for this to be added, I will
- reconsider, but for now I'm just considering it a known issue.
-
-
- Beta Revision History:
- 0.98.5 + Added RecreateColumns method to TdfsSystemListView.
- + Fixed problem with SetColumnWidths not using new values until window
- was recreated or repopulated.
- + Updated for Delphi 6 compatibility. See updated install directions
- above.
- 0.98.4 + Updated for C++Builder 5 compatibility.
- 0.98.3 + IShellDetails stuff in SystemControlPack.pas has been removed. I was
- investigating this, but found out it was only available on Windows
- 2000. It was causing compiler problems for C++Builder, so I've
- removed it from the source entirely (it was never being used).
- + Fixed problem with FileMask in tree view.
- + Fixed memory leak problem with list view.
- 0.98.2 + Fixed some nasty problems with rfFileSystem RootFolder type.
- + Fixed bizarre D5 problem with deleting a tree from a form in the IDE.
- + Fixed problem with main win hook not being released when component
- was destroyed. Thanks to Matthieu Roger for this.
- 0.98 + Fixed redeclaration problem in C++Builder 3.
- + Fixed nasty recursion bug when using rfFileSystem RootFolder value.
- + Bill Miller was nice enough to do a component bitmap for the combo box.
- + Had some problems with right-click not bringing up the context menu
- in the system and list view under D5. Fixed.
- + Deleting a file in a root directory would cause the list view to "fall
- up" one level higher that where it was supposed to be on refresh.
- + Fixed a couple of problems having to do with the read delay timer.
- Could totally break it if window handle was recreated. Could get
- "Control has no parent window" errors.
- + Changing treeview file mask to exclude the currently selected filename
- would cause trouble.
- + Removing a directory that was the selected directory would not refresh
- the display.
- + Updated information about the DCLSTD35.LIB Known Issue in C3. See
- above.
- + I've removed the TFolderItemData.FileSize property for C++Builder 1 &
- 3. They didn't work because I use the Delphi Comp data type, and
- while Builder has a Comp class for this type of thing, it won't
- automatically support Delphi code using Comp. If you need the file
- size in C1/C3, you'll have to use the FileSizeHigh and FileSizeLow
- properties. If FileSizeHigh is not zero, you know you have a big file
- and that you'll have to do the 64-bit math yourself.
- + Resetting would not always do a "full" reset. The system will cache
- some kinds of information, and you have to manually invalidate that
- cache. The most obvious manifestation of this problem was with a
- CD-ROM drive. Resetting would update the item's image, but would not
- update it's text.
- + Changing a CD would not update the display.
- + Tree and list view item context menus now show and handle the Rename
- context menu item.
- 0.97 + Delphi 5 compatibility.
- + Renamed to include the 'dfs' prefix in the component name.
- + The DFS_STV_FASTMODE and DFS_SLV_FASTMODE defines were broken (code
- wouldn't compile). Thanks to Felipe Rocha Machado for catching this.
- + Sort column/direction of list view wasn't preserved when directory was
- changed.
- + Added ChangeToParent methods in tree, list and combo to move up one
- level, i.e. "cd .."
- + Added Known Issue item for C++Builder 3 users. See above.
- + Changing FileMask property of listview at run-time would not refresh
- the list. Fixed. Thanks to Tamas Demjen for this.
- + DFS_SLV_FASTMODE conditional define has been removed.
- + Setting the tree view Selection property to a UNC path wouldn't work
- correctly (i.e. something like \\someserver\somepath\someotherpath).
- Lennert Ploeger was kind enough to figure out what was going on and
- fix it.
- + FileMask in the tree view was totally broken. Lennert also help on
- this one.
- + I think I finally got rid of that pesky removable drive spinning when
- it's parent is selected once and for all.
- + Tamas Demjen sent me code to make the combobox respond better to font
- changes.
- + Nasty problem fixed when something caused the combobox to be recreated.
- Thanks to Joachim Jo Samstag for his help on this.
- + Under Delphi 2, 3, C++Builder 1, and 3 the Color property would not be
- honored by the tree or list because of a VCL bug. This was fixed in
- version 4 (of both). I've added code sent to me by Chris Wallace to
- work around it in prior versions. Many thanks to him.
- 0.96 + Moved a lot of PItemIDList helper functions into a seperate unit named
- PidlHelp. This is mostly an internal thing, and shouldn't effect
- component users.
- + Marked public Reset methods as virtual for you folks who want to write
- descendants.
- + Now includes a TSystemComboBox written by Andrew Barnes. Andrew was
- kind enough to share this with the rest of us and give me permission
- to include it in this package. Huge thanks go to him. Read the
- comments at the top of SystemComboBox.pas for full information.
- Also, this is just the first crack at the combo. There are bound to
- be problems, so please report them and provide as much info as you can
- so I can duplicate them. Some are already known, see the Known Issues
- section.
- + Since Andrew has provided us with the last missing piece (the combo),
- I've renamed this thing the "System Control Pack". SystemTreeView was
- becoming ever more inadequate as a name.
- + Because the SystemTreeView.pas file was growing ever more out of
- control (144k in the last version), and because of some unit reference
- issues, I decided to break up everything into smaller, more manageable
- units. SystemControlPack.pas now defines base virtual classes for all
- the controls that define and implement how they interact with each
- other, but implement none of the shell functionality. Each control is
- implemented in its own seperate unit descending from these base
- classes. Because of all the unit additions/changes/deletions, users of
- previous versions should review how the component is installed. Here
- is the status of all the unit files in the package now:
- SystemControlPack -- New
- SystemTreeView -- Heavily modified
- SystemListView -- New
- SystemComboBox -- New
- SystemViewReg -- Deleted (see next)
- SystemControlPackReg -- New (renamed SystemViewReg unit)
- PidlHelp -- New
- SystemView.inc -- Deleted (see next)
- SystemControlPack.inc -- New (renamed SystemView.inc and modified)
- Delphi 3+ and BCB 3 users, update your packages accordingly.
- + Because all of the major changes being made, I updated the $DEFINE
- names to more accurately reflect what they effect. See the
- "Conditional Defines" section above for the new names.
- + The $IFDEFs that checked to see if COM objects needed to be manually
- reference counted used DFS_COMPILER_2. This was technically correct
- as it only needs to be done in Delphi 2 and C++Builder 1, but I've
- changed it to use {$IFNDEF DFS_NO_COM_CLEANUP} to more accurately
- show what is going on there.
- + TSystemListView is not as tightly integrated with TSystemTreeView as
- in previous versions. This a first step towards making it work
- completely on its own. However, it is just a first step. It needs
- further testing, and some enhancements I'm sure. Please send feedback
- if you fool with this issue at all.
- + The new stuff introduced a new bug in the list view, see Known Issues.
- 0.95 + FileMask property only worked if the system were set up to display
- file extensions (in Explorer, View | Folder Options | View tab | "Hide
- file extensions for known file types" checkbox was unchecked). This
- has been fixed, and FileMask now works properly regardless of this
- setting. Note that the setting still effects how the file is displayed
- (extension shown or not).
- + File sizes in the list view weren't "commaized". That is, "4305 KB"
- was displayed instead of "4,305KB".
- + Large file sizes are now handled properly. In D4, the Int64 type is
- used. All others use the Comp type since Int64 isn't available.
- + Updated William Miller's DFSExplorer demo project. See the
- DFSExplorerReadMe.Txt file contained in the DFSExplorer.zip file for
- his release notes.
- 0.94 + Even though you could move through a removeable drive without a disk
- in the tree with the ReadDelay property, it would still "spin up" when
- you hit. It just wouldn't generate an error message. This has been
- fixed so that it doesn't "spin up" at all unless you've stopped on it
- long enough for it to populate (ReadDelay).
- + Rewrote the TSystemListView.AddNode to make it a bit more efficient and
- less messy.
- + I was having sporadic problems with the images not being transparent on
- my system. I never could determine if it was my code, or some other
- app that was causing it. I've added a little more code to the image
- list stuff, and the problem doesn't seem to be occuring now, but as
- I said it was sporadic to begin with.
- + The controls did not handle system color changes well. This appears to
- be a bug I inherited from the VCL. The window background would change
- to the correct color, but the background around the text would not.
- I've worked around the problem.
- + I wasn't calling inherited in my WM_TIMER handler. This broke the
- automatic editing of tree nodes when user clicked twice in a node.
- + If the tree is reset, it will now remember the selected node. If the
- listview is reset, it will remember the focused item.
- + ReadDelay is a little smarter now. It won't delay at startup since
- that's pretty silly. It also won't delay on a manually refresh (a
- call to the Reset method), since you really wouldn't want it to delay
- there either.
- + Added known issue about using the Color property (see above).
- + Added DFSExplorer demo project. A nicer version of the SimpleExplorer
- demo written by William Miller.
- 0.93 + Added a new demo project, SimpleExplorer. It's your basic Explorer
- clone, but on a light scale. No toolbar, no Favorites menu, only basic
- menu item commands. Just to illustrate that it doesn't take much code
- to get basic Explorer functionality with the components. One note: I
- used a TSplitter in it, so Delphi 2 is going to complain about that
- since it didn't come with Delphi until v3. Just go along with what
- Delphi wants to do when you open the project in D2, and it should
- compile and run fine, sans splitter of course.
- + Version property now marked as not stored. Doesn't need to be, and
- only increases DFM size. Should have always been that way.
- + Cut and paste of the treeview still had problems in the IDE. I
- _really_ fixed it this time. Promise. :)
- + TSystemTreeView.ResetTreeView renamed to Reset, and
- TSystemListView.Reload renamed to Reset for consitency.
- + Added TSystemTreeView.NodeData and TSystemListView.ItemData public
- read-only properties. See the new SimpleExplorer demo app to see how
- these can be useful.
- + DeleteNode and DeleteItem only worked for files, and they did not do it
- via the system, i.e. it didn't honor the system settings for using (or
- not using) the recycle bin.
- + File sizes were still being reported as not working in some situations.
- I'm trying yet a another new way of getting the file sizes. It seems
- to work for me, even solving a long standing issue of not being able
- to get file sizes of open files. But, if it causes you problems, you
- can add the DFS_STV_OLDFILESIZE define and it will use the v0.91 file
- size code.
- + Added ReadDelay property to the treeview. This makes it behave much
- more like Explorer. Set this to the amount of time in milliseconds you
- want the tree to delay before populating the listview. It defaults to
- 500ms, mostly because that seems the closest to Explorer's behavior.
- You can probably set it lower and get results that are as good and
- make it more responsive to the user. The main place where this is
- useful is when you are browsing through the tree and you want to go
- through a drive that doesn't have a disk in it (floppy, CD, ZIP, etc).
- Before, you'd always get the not accessible error or a long wait if
- there was a disk in a slow access drive. Now, it blows right on past
- it if you move on before ReadDelay milliseconds.
- + Added TSystemListView.GetSelectedPIDLs function. See SimpleExplorer
- project for how it can be useful.
- 0.92 + On some network drives, the file size of files in the list view could
- be reported incorrectly. Thanks to Rob Watt for finding and providing
- a fix for this.
- + List view's ShowFolders property didn't work quite completely enough.
- It would still show things like drives, which are technically folders.
- If ShowFolders is false, it should only display files, as it does now.
- + File changes were not being monitored correctly. Things like files
- being added in the current directory would not refresh the display.
- Fixed.
- + Don F. Ridgway sent me code to do that attributes column of the list
- view. MANY thanks to him for taking care of that To-Do list item.
- 0.91 + Added OnPopulated event to both tree and list. They fire after all
- items have been added to them.
- + Real file masking! I've removed the SimpleMask property (it only let
- you mask based on extensions) and replaced it with a FileMask property.
- The tree also has this property, and uses it to mask files when
- ShowFiles is set to true. Use it much the same as you would any file
- mask: '*' is 0 or more of any character, '?' is any one character, ';'
- is used to seperate individual masks. So, if you want all executables,
- you could do something like '*.exe;*.com;*.bat;*.lnk'. You can get
- more fancy if you need to, as well, like '*4*.com' will show all files
- with a '4' in them that end with a '.com' extension. Basically, it
- should work just the same as a mask in FindFirst/FindNext (although
- those aren't used).
- + Fixed known issue of delete/cut/paste of TSystemTreeView in the IDE.
- It absolutely hated to be deleted when the Selection (or Directory,
- they're the same) property was set to something other than blank. Now
- works fine.
- + See updated information on the last item in the Working Notes section.
- 0.90 + Stupid VCL doesn't update the Item.StateIndex property when the user
- clicks on it to check/uncheck it. Only updates it when you change
- the value in code. How worthless... Anyway, that made the ItemChecked
- property pretty much useless as well. I've fixed it.
- + TSystemListView.GetFullPath screwed up drives. It would return "C:\\"
- instead of "C:\". Thanks to Ladislav Dolezel for finding and fixing.
- + Cleaned up the Known Issues list a bit. A bunch of fixed stuff was
- still listed.
- 0.89 + Using several root folder types would make it difficult to work with
- assigning a value to Selection property in tree. It now attempts to
- convert new Selection values to their relative equivalents
- automatically to simplify this.
- + Context menu now supports multiple items. That is, if multiple items
- are selected in a listview and the default context menu is requested
- (i.e. the user right-clicks), the context menu is valid for all
- selected items, not just the first selected.
- + New public method DisplaySelectedContextMenu for listview. Same as
- DisplayContextMenu, except it shows menu for all selected items instead
- of a specific TListItem.
- 0.88 + Design-time value of tree's Selection property was not always honored
- at run-time.
- + Columns property should not have been published in the listview. It is
- now a public proeprty. If you need to add your own columns, you do so
- by setting ColumnType to ctUser and writing an OnCreateColumns event
- handler that adds the columns at run-time.
- + Added new public method DefaultDblClickAction to listview. This can
- be useful if you want to handle the OnDblClick in some situations, but
- want normal handling in other situations.
- + SimpleMask didn't work for registered file types if extensions were
- hidden. That is, if you set the "Hide file extensions for known file
- types" option in Explorer, files of known types would always fail to
- match the mask.
- + Using listview's SimpleMask under Delphi 2 would cause AVs because of
- an incorrect Release call.
- + SimpleMask would hide files and folders that did not match instead of
- just files.
- + Listview didn't display the date/time for folders.
- + Inplace renaming of listview items now renames the item properly, i.e.
- if the listview is showing "Autoexec.bat" and you edit it, the file
- will be renamed.
- + Added two new public functions to listview, RenameItem and DeleteItem.
- + Added Checkboxes published property and ItemChecked public property to
- treeview. These require the updated COMCTL32.DLL be on the system. If
- you don't know about the updated COMCTL32.DLL issue, get my
- TExtListView component and read the ELV.txt file, especially the
- "Redistributing COMCTL32.DLL" section.
- 0.87a + Updated ItemProp.pas unit. This fixes a known issue with
- cut/copy/paste context menu items not working on all installations.
- No code in SystemTreeView.pas has changed.
- 0.87 + The fix introduced in v0.85 broke TSystemTreeView if there was no
- TSystemListView attached to it. Stupid programmer...
- + Removable drives would still get hit when being displayed in a
- TSystemListView. This was very annoying when those drives were empty.
- + Added Data property to TFolderItemData class. The reasoning is that
- the components use the TTreeNode.Data and TListItem.Data properties,
- so they aren't available to the component user any more. Now, you can
- have the equivalent by doing something like this:
- TFolderItemData(Node.Data).Data := mydata;
- + Demo program sometimes blew up on NT.
- 0.86 + Added SystemView.inc file. This file contains all the conditional
- defines used by the unit. There are two new defines in this file that
- you may be interested in: DFS_STV_SYSTREEVIEW and DFS_STV_SYSLISTVIEW.
- See the Conditional Defines section above for a complete description.
- + DFS_STV_USE_ENHLISTVIEW and DFS_STV_USE_EXTLISTVIEW conditionals added.
- These are not enabled by default. See the Conditional Defines section
- above for a complete description. WARNING: This is just a simple
- implemenation currently, and there are likely to be problems. Only use
- these if you want to help me work out the bugs in it.
- 0.85 + Resetting of a treeview that had a linked listview could cause nasty
- problems because the listview kept a pointer that wasn't valid any
- longer.
- 0.84 + Updated to publish the new D3 and D4 properties such as RowSelect,
- RightClickSelect, Anchors, etc. Note, this stuff only shows up in the
- appropriate version of Delphi. For example, only D4's list/tree view
- has an Anchors property, so TSystemTree/ListView only has it if
- compiled under D4.
- + Renaming a tree node did not update some internal data, and doing
- things like trying to expand the renamed directory would complain about
- the old name not existing.
- + Deleting nodes in the tree could cause the automatic refresh stuff to
- get confused and cause AVs when the component was destroyed.
- + Setting ShowFiles to TRUE in the tree would cause it to try to watch
- for changes in a directory with the name of the file selected instead
- of the directory that the file was in.
- + Removed the FShellMalloc._Release call in the finalization section for
- D3 and higher. It was there to begin with because there appears to be
- a compiler bug with COM objects whose references are gotten in an
- initialization section. The compiler is supposed to automatically
- insert a release call when the reference "goes out of scope", but
- Delphi doesn't do this for stuff in the init section. I was
- compensating by inserting the call manually, but it turns out that if
- you do this, you'll then get two calls to release, yours and the
- missing automatic call that Delphi was supposed to be inserting anyway.
- So, I figure it is safer to have the ref count of the COM object to be
- too high rather than too low. Go too low, and you could conceivably
- end up freeing the shell's IMalloc object and that would be a TRULY
- bad thing. Thanks to Grahame Marsh for the spelunking he did on this.
- 0.83 + The 'KB' abbreviation was hard-coded, it is now a resource string.
- + Folders would show '0 kb' in fast mode instead of being blank like they
- are in non-fast mode.
- + Fixed range check error when sorting by column click under Delphi 4.
- + AddNewNode method didn't like adding to root directory nodes.
- + Floppy drive is no longer hit when expanding a tree node that contains
- it. MANY thanks to Jacques Bordas <farandir@club-internet.fr> for
- fixing this EXTREMELY annoying bug.
- 0.82 + Updated for Delphi 4 compatibility.
- 0.81 + NT 4 has more than 8 bytes stored in in the registry key used for the
- column sizes. This caused problems, but it really shouldn't have.
- At any rate, I've modified the code to account for the size being
- unknown.
- + Almer. S. Tigelaar <almer-t@usa.net> emailed me a fix for the "never
- ending flicker" problem that some people have reported. I could never
- duplicate the problem, so I can only tell you that he said it fixed it
- for him. If you still have the problem, please let me know.
- 0.80 + Unit now uses DFS.INC file for my commone defines.
- + Moved all this crap out of source file to this text file.
- + Changed context menu handling entirely. Components now use my ItemProp
- unit (included) that handles it all. I did this because I have the
- Send To menu problem solved in ItemProp, and redoing it here seemed
- pointless. So, the Send To menu bug (it being empty) is now fixed.
- + Added PopupMenuMethod property to both components. pmmNone means use
- no popup menus at all, pmmUser means use only menu in PopupMenu
- property, pmmContext means use only system context menu, pmmContextUser
- means use system context menu if it can and PopupMenu if it can't.
- Items like the Desktop node and listviews with nothing selected are
- places where the context menu would not be used and the PopupMenu would
- kick in.
- + I've added two new defines to the top of the unit, DFS_STV_FASTMODE and
- DFS_SLV_FASTMODE. See Conditional Defines section above.
- + Forgot to override the tree's Notification method. This would cause
- violations if a linked list view is deleted before the tree view. Many
- thanks to Simon Armstrong <simes@clara.net> for catching this one.
- + File time in TSystemListView could be incorrect in some time zones.
- Thanks to Frank Kroeger <FKroeger@tkc.de> for providing a fix.
- + Added Reload method to TSystemListView. You can guess what it's for.
- + Shortcut (.LNK) files in the Desktop folder no longer show their .LNK
- extension.
- + Wouldn't compile with DFS_STV_FILECHANGES undefined. Thanks to Elmar
- Klaus <herr.schwupp@cww.de> for fixing this.
- + Added Known Issuses section above. Please read it.
- + Changing MultiSelect property of TSystemListView at run-time would
- clear the contents of the list view. Actually, anything that recreated
- the window would do this. Now properly reloads after window is
- recreated. May also have been causing some AVs that people reported
- when changing MutliSelect value, but I wasn't able to verify this.
- + TSystemTreeView has a new Directory property. It is identical in
- every way to the Selection property. :)
- + Added two read-only properties to TSystemListView: Filename and
- FullFilename. Both are array properties that use a TListItem as the
- index. Ex:
- ShowMessage(MyList.FullFilename[MyList.Selected]);
- + Got rid of the hard-coded column captions for TSystemListView. They
- are declared as resourcestrings for D3 and just constants for D2 in the
- interface section.
- + Double clicking on an item in TSystemListView now takes the item's
- default action (the one in bold on it's context menu). However, if you
- have an event handler for OnDblClick, this will not happen.
- + Share and link image overlays weren't correct on all machines. Fixed
- by Benedykt Kubica <b.kubica@computer.org>. Many thanks.
- + TSystemTreeView and TSystemListView Items property has been changed to
- public visibility and read-only. This stuff should only be read from,
- never written to from outside the component.
- + Dropping a TSystemListView on a form with a TSystemTreeView on it will
- automatically hook it up to the ListView property of the the tree.
- + TSystemListView would always show the contents of the desktop when the
- treeview's root node was selected, even if the root node wasn't the
- desktop, i.e. RootFolder was rfCustom and CustomDir set to c:\.
- + Setting MultiSelect property of list view at design-time in forms that
- were not auto-created would cause AV's when the form was created and
- shown at runtime.
- + Found and fixed a problem with the file/dir thread watcher. Not sure
- what problems it may have been causing as it would have been very
- sporadic, but creating directories may now be more reliable.
- + Sorting is better now. TSystemListView sorting was broken sometimes,
- and it wasn't completely right anyway. Now sorts folders first and
- items after. Should sort exactly like explorer now.
- + Now compatible with C++Builder 1 & 3.
- + Added AutoScroll property. This feature was entirely written and
- contributed by Aristide Torrelli <a.torrelli@tin.it>. I have only
- adapted it for use in TSystemListView. Many thanks to him.
- + Palette icon for list view provided by Almer. S. Tigelaar
- <almer-t@usa.net>.
- + SimpleMask property added to TSystemListView. This feature was written
- by Rafal Platek <creams@creamsoft.com> and slightly edited by me. To
- only list files with specific extension(s), just assign the
- extension(s) to this property. For example:
- MyList.SimpleMask := 'pas'; // show only .pas files.
- MyList.SimpleMask := 'pas,dpr,dfm'; // show common Delphi source files
- MyList.SimpleMask := ''; // No masking, show all.
- + The following were done by Fabrice Fouquet (services@cfp47.inba.fr):
- * Setting Section property of tree now makes sure it is also visible.
- * Hourglass cursor during directory changes.
- * Use registry info to size list view columns so they match Explorer's.
- * Double-click in listview moves into sub-folder and updates treeview,
- too. I enhanced this one so that it would work with non-file
- system folders, so if something there breaks, it's my bug not
- Fabrice's.
- * Column sorting for list view.
- 0.70 + Turns out I was thick-skulled after all (see 0.65 notes). I was
- allocating the memory with GetMem, and that of course does not
- initialize the memory (i.e. make sure the pointer variables are set
- to NIL). So, I assigned something to the IShellFolder variable,
- and Delphi 3 checks the existing value and tries to Release it if
- it is not NIL. Well, it's just trash initially, so off it goes
- into the weeds... I could go back to the dynamic allocation method
- and use the Initialize function to clear it all, but the class is
- better anyway.
- + General clean-up.
- + Fixed bug in RenameNode method. It updated the relative PIDL, but
- not the fully qualifed PIDL. Thanks to Frank Kroeger
- (FKroeger@tkc.de) for finding and fixing this.
- + Shared and link overlay images now work for the tree and list. HUGE
- thanks go to Peter Ruskin (PeterRuskin@classic.msn.com) and Lars
- Randers (lranders@post2.tele.dk) who both for provided this code.
- + Added ShowFolders property to TSystemListView.
- + Files weren't shown in folders that had no subfolders (ShowFiles
- property set to TRUE).
- + Fixed problem that would cause bizarre access violations if you did
- anything that caused the window to be recreated. For example, if
- you changed the BorderStyle property, you would get this because
- the window handle has to be destroyed and recreated. This caused
- all the pointers to get freed, but then the pointer values were
- restored when the window was recreated -- data is gone, just a load
- of invalid pointers.
- + Images were screwed up in Control Panel and Printers folder.
- + Overriden Expand method never called inherited. Broke OnExpanded
- event.
- 0.65 + Yes, it's true; I FINALLY got it working under Delphi 3. I thought
- I was just really thick skulled, but turns out that Delphi 3 freaks
- out when you try to store COM object references in dynamically
- allocated records. I switched the record structure over to a class,
- and all works just fine... Go figure. Needed to be done anyway.
- Now I need to flesh out the new class so it's more OOP-ish.
- 0.60 + Well, it compiles under Delphi 3, but it sure doesn't work. I will
- get to when I can. Sorry.
- + Added TSystemListView.GetItemAttrs public method so you can get the
- attrs of an item to do stuff like testing for if it is a folder:
- if (SLV.GetItemAttrs(SLF.Selected) and SFGAO_FOLDER) <> 0 then
- // It's a folder
- + Added TSystemListView.GetFullPath public method to get an item with
- it's complete path information. This obviously doesn't apply for
- things like printers and such.
- + Sorting in the TSystemListView should now work. Set SortType to
- something other than stNone.
- 0.50 + ShowRoot didn't work as it should (as TListView does).
- + rfFileSystem roots wouldn't expand farther than the first level.
- + Some serious problems with EAccessViolations after fiddling with
- the component for a while (change RootFolder, etc). I think I have
- this all fixed up now. AddRefs and Releases weren't quite right.
- + Selection property is now read and WRITE. That means you can do
- something like MyTree.Selection := 'c:\windows\system'; and it will
- select that node. Note that this only works with file/directory
- stuff, there is no way to do something like MyTree.Selection :=
- Control Panel; Also note that the assignment value is relative to
- the root type. So, if you want to select a directory when
- RootFolder is rfDesktop or rfDrives, you pass the full pathname.
- If RootFolder was rfPrograms and your programs directory was
- 'c:\win\start menu\programs' and you wanted to select
- 'c:\win\start menu\programs\some folder\subfolder', you would do:
- MyTree.Selection := 'some folder\subfolder';
- Many thanks to Raymond Chen for his help on walking a PIDL (similar
- to walking a dog, but without the pooper-scooper).
- + Added OnAddListItem and OnCreateColumns to the TSystemListView
- component. OnCreateColumns is called when ColumnType is set to
- ctUser. The old columns are removed and then the event is fired.
- The event is responsible for creating the columns it needs.
- OnAddListItem is called every time an item is added to the listview.
- It passes the new TListItem, which has the Caption property set to
- the name of the new item. You should set the ColumnType property
- to ctUser and create the columns you need in the OnCreateColumns
- event. Then, in the OnAddListItem event, you would add the data
- for these new columns by using the passed TListItem's SubItems.Add
- method.
- + Updated for compatibility with Delphi 3.
- 0.40 + At this point, TSystemListView is just an experiment. If you have
- problems with it, I will try to help, but I will not devote much
- time to it. I'm mainly interested in the tree view. Now, if you
- have problem AND a fix, I'll be more than happy to hear about it.
- + Somehow I ended up with two versions of v0.30. I don't have any
- idea how it happened, and I've given up trying to merge the two
- versions and just gone back to the one with the most functionality.
- + Got rid of the SHGetDataFromIDList call. Only works correctly on
- NT 4 with service pack 2, so it's not really a viable alternative
- for this.
- + Sorting revisited. Thanks to Detlef Meister
- (Meister@rz.fhtw-berlin.de) for sending me some good code to start
- with for this. I think sorting is working very well now, but that
- is of course only on my machines. Please try it out, and especially
- pay attention to see if it sorts in the same order as Explorer. If
- you find that sorting is causing terrible problems for some reason,
- you can turn it off by undefining STV_DOSORTING below. If all goes
- well with it, I'll add it to the list view next.
- + Added read only Selection property. Returns the path name of the
- selected node (if it is a file system object). Working on making
- it read/write, but it's a pretty hairy problem.
- + CustomDir didn't like UNC names (\\somecomputer\somedirectory).
- Working a little better now, but still not right.
- + Many people have asked how to just display drives, i.e. RootFolder
- set to rfDrives but without the printers, control panels, etc.
- There is no direct support for this at the API level
- (SHGetSpecialFolderLocation), but I think I have found a way to do
- it. Try the new rfFileSystem root type. Let me know if you have
- any problems with it. It should have My Computer as the root node
- and then any device that has physical storage capability as child
- nodes. If you are interested, search for SFGAO_FILESYSANCESTOR to
- see what I'm doing.
- 0.30 + New feature: Set the value of CustomDir to a valid directory, and
- then set RootFolder to rfCustom, and the tree will allow you to
- browse from that directory as the root. Also, if you don't want
- the root to read something like 'c:\win\system', then use
- CustomDirCaption to override it.
- + Now using SHGetDataFromIDList, which is missing from SHLOBJ.PAS.
- See step five in ShellFix.txt.
- + If PopupMenu property is has a menu, it is displayed instead of the
- context menu.
- + TSystemListView now descends form TCustomListView as it should.
- + Fixed bug. I overrode the Change method of the tree, but forgot to
- call inherited method. This broke the OnChangeEvent - never called.
- + Fixed bug that caused serious problems for projects with one of
- these saved on a form. When you tried to reopen the form after it
- was closed, it would cause many strange things to happen, usually
- just a lockup. See the Loaded and CreateWnd methods for the fix.
- If you want detailed description, email me and I will explain it.
- + New feature: ShowFiles property. Allows the tree to display items
- other than folders in it. I guess ShowFiles isn't the best
- description, since also includes things like printers in the
- printers folder. Anyone got a better name for it?
- + TSystemListView object has some serious problems, so I've disabled
- it in test app until I get time to work on it. I strongly suggest
- you stay away from it in this version, unless you want to help me
- fix it. To reenable it in the test app, take out the NOLISTVIEW
- define at the top of TESTING.PAS.
- 0.21 + DisplayContextMenu doesn't work for root tree objects. Desktop
- doesn't have one, and I fixed that, but don't know what's wrong
- with the others.
- + Moved all strings into resource file (ErrorMsgs.r32) except for the
- debugging "mem leak" string. Doesn't seem to like loading strings
- in an exitproc (finalization section).
- + Could never make up my mind about whether to go with message boxes
- or exceptions, so I just added a public property that can be used
- to set your preference. I prefer message boxes since there is no
- good way to catch the exceptions in an app, so that is the default.
- + Added all the file system report info stuff for list view items
- (size, type, date). If anyone knows how to determine the type of
- object you have given it's PIDL, I'd love to know it. Right now,
- if it's not a file system object, you just get it's name.
- 0.20 + This unit requires complete boolean eval to be turned off. I've
- added the appropriate compiler switches to do this in case it is
- turned on in your project.
- + First crack at a TSystemListView component to compliment the tree
- view. It is way far from being as functionally complete as the tree
- view. Mostly it's to see if it works for everyone at it's simplest
- form.
- 0.11 + Deleted the $I DEFINES.INC file in demo app. Not needed any more.
- + Added GetNodePath. Returns full path given a TTreeNode. Returns
- '' if it is not a file system type node (i.e. control panel).
- + If selected node were deleted from another app, it could get pretty
- ugly. Fixed.
- + Added palette resource icon for component. Thanks to Basri Kanca
- for it.
- + Added three new functions, RenameNode, DeleteNode, AddNewNode.
- 0.10: + I Feel reasonably confident in the component now. All core
- functionality seems to be in place and working.
- + Added ability to rename folders. Thanks to Thomas AW Brown.
- + Fixed problem that would occur if you installed the component in
- Delphi (i.e. Component | Install). By default, the Items property
- is "stored", so all everything in it is written to the DFM file
- that the component is on and that includes the Data property of
- each of the tree nodes. This a pointer to memory we allocate, so
- having the pointer value stored wouldn't do a whole lot of good,
- would it? See the redeclaration of Items below.
- + Added a new unit, FileChange, which provides a TThread descendant
- that knows how to watch directories for changes in structure. It
- hasn't been well tested, so I have included it only inside $IFDEFs.
- It should automatically cause the selected node to be updated if
- another app makes changes to that directory's subdir structure.
- For example, compile and run the demo. Select a node that is a
- directory somewhere on your hard drive. Start explorer and select
- that same node in it. Add a new folder to the selected directory
- in Explorer. The demo app should automatically update the node to
- reflect the change. If you have problems with it, comment out the
- $DEFINE FILECHANGES line below.
- 0.03: + Finally got the damn icon problem fixed. The PIDL wrapper class
- was hosing me up somehow. Don't know what was wrong with it, but
- its pointer would disappear for some reason. Getting rid of it
- cleared up the problem. So much for OOP making my life easier. :)
- + Got ShowRoot working. Thanks to John Cardinal for that.
- + General code clean up.
- + While Mr. Ritchey acknowledged the declaration errors in his
- ShellObj unit, he has never answered my request to included a fixed
- version of it with this control. So, for now, I'm just going to
- include directions on how to fix everything and not worry about.
- See the SHELLFIX.TXT file.
- 0.02: + Updated to use ShlObj, available inthe Delphi 2.01 update. See
- NOTE above. Edit the DEFINES.INC file to control which namespace
- import unit you want to use. If $D201 is defined, you use
- Borland's, otherwise Pat Ritchey's. Also made some more changes to
- ShellObj to make it more compatible with Borland's ShlObj version.
- If you use Borland's, context menus won't work. See the comments in
- the DisplayContextMenu method for an explanation.
- + Context menus (right click) are working, but need a good round of
- testing.
- + Added some stuff to the demo project to help with testing.
- + Can now change RootFolder property during execution. Would blow up
- before if changed after initial assignment.
- rfRecycleBin still blows up... don't know why. It doesn't like
- the EnumObjects call in EnumerateFolders.
- + A lot of the code got rewritten to make context menus, icons, etc.
- work. A the Golden Rule of PIDLs is that the SH* functions take a
- fully qualified path PIDL, and the IShellFolder interface methods
- take a relative PIDL. I was using relative PIDLs everywhere. The
- result is that more things work now, but the code is probably even
- less stable than before. Bang on it.
- 0.01: + Cleaned up the mess in the USES clauses and the test project.
- 0.00: + Initial alpha release to limited audience.
-
-