📄 elv.txt
字号:
TdfsExtListView & TdfsEnhListView v3.72
Description:
TdfsEnhListView is a list view control that provides enhanced functionality
such as:
* Automatic sorting of text, numeric, and date columns
* Ability to automatically save and restore user column width settings
* Owner drawing events
This functionality does NOT require the updated COMCTL32.DLL from Microsoft.
TdfsExtListView is a list view control that provides all functionality of
TdfsEnhListView, plus provides access to the new features of the list view
control found with MS Internet Explorer 4.0, et. al. This functionality
DOES require the updated COMCTL32.DLL from Microsoft. The COMCTL32.DLL file
must be version 4.72.xxx or later for all functionality in this component
to work. Earlier versions *may* work, but are not supported (i.e. don't
email me if you aren't using the latest version of COMCTL32.DLL).
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.
Help File:
Delphi 3:
* Copy ELV.hlp and ELV.cnt to your Delphi\Help directory.
* Edit the DELPHI3.CNT file and add the following line to the Index section:
:Index Extended List View Reference =ELV.hlp
* Delete the hidden Delphi3.Gid file.
Delphi 2:
* Copy ELV.hlp, ELV.kwf and ELV.cnt to your Delphi\Help directory.
* Use the HelpInst tool included with Delphi to install the ELV.Kwf
into Delphi\Bin\Delphi.Hdx file.
Redistributing COMCTL32.DLL:
Microsoft used to have a really nasty redistribution policy about
COMCTL32.DLL: To redistribute it, you have to distribute Internet Explorer
with your app. Well, they've finally unpuckered a little bit (probably
because enough people griped long and loud enough (like Ron Burk in his
Windows Developer's Journal editorials and mail responses, THANKS RON!).
Anyhoo, here are links where you can find official redistribution information,
which is much more acceptable than it used to be:
http://www.microsoft.com/msdownload/ieplatform/ie/comctrlx86.asp
There are links for the files themselves, as well as for Readme and End User
License Agreement files.
Notes & Credits:
* This component uses several types defined in the COMMCTRL unit when it can.
If you add an event handler and then receive a compiler error about an
unknown type, you likely need to add COMMCTRL to your unit's uses clause.
* For the full documentation on all the new list view stuff as implemented in
the latest COMCTL32.DLL, have a look at Microsoft's documentation at:
http://www.microsoft.com/msdn/sdk/inetsdk/help/itt/CommCtls/ListView/ListView.htm#ch_listview
Also, you can find information on all the updates to COMCTL32.DLL at:
http://www.microsoft.com/msdn/sdk/inetsdk/help/itt/CommCtls/CommCtls.htm#book_cc
* TestVM is a very good demonstration of virtual mode. It was created by
and is redistributed here by permission of John Newln. I have made only
small modifications for compatibility with the new 3.00 version.
* The owner drawn header stuff is based on work sent to me by Rafal Smotrzyk
<rsmotrzyk@mikroplan.com.pl>. Many thanks to him. He has included many
other new features, but I got it at the time when I was trying to get this
version out of beta. Because of that, I'm not incorporating the rest until
after v3.00 is released as non-beta. I'll then work his stuff into the next
version.
* The owner drawing and column images were originally implemented by Remi
Sellem (RemiS@chemware.co.uk) and Mike Lindre (no address). I only
reworked them a little, integrated them into this component, and made a
few changes to use the new Delphi 3 collection editor for ColumnsFormat and
fixed a few bugs. The original property editor (ExtColEd.pas) for this is
provided for Delphi 2 users, but is not required at all for Delphi 3 usage.
* There are some serious limitations that I did not realize when I first
released the virtual mode feature. If you are not using virtual mode
(VirtualMode set to TRUE) then you need not be concerned. These problems
only affect virutal mode. The problem is that since items are not stored
by the list view, but rather provided as needed by an event handler, the
Items property does not reflect the actual items in the list. In fact,
it is always empty. Items.Count will return the proper number of items,
but anything trying to use Items[x] will never get any valid data. This
affects several things, such as automatic drag and drop (DragMode =
dmAutomatic), the Selected property and more. This is because the
implementation of TListView uses the Items property extensively. I have
tried to provide for this as best I can through methods like
TdfsExtListView.ELV_GetNextItem that can be used in place of critical
functions that no longer work because they rely on the Items property. I
suggest that you NOT use virtual mode unless you completely understand all
of the issues that may arise from using it.
UPDATE: As of v3.60, this issue should be resolved if you use Delphi or
C++Builder versions 4.0 or higher. Previous versions still have the same
limitations.
Known Issues:
* OnGetImageIndex can give very strange results if you don't know how to use
it. If there is an index already assigned to the item, you should not
change it here. This will result in the index being asked for again, and
that could lead to an infinite loop (albeit one where messages are still
being processed, so you aren't locked up) where all the items just get
painted over and over. Instead, the intended use is to delay assigning an
image index to the item until it is really needed (the item becomes visible
in the list, i.e. the user scrolls down and some new items become visible).
This can speed things up when you are dealing with large lists, and/or when
the process of getting the image index is time consuming (getting the system
image index of a file type, for example). So, when a new item is created,
you simply assign -1 to it's ImageIndex and then when the item becomes
visible, the OnGetImageIndex event is fired and you provide the real index:
if Item.ImageIndex = -1 then
Item.ImageIndex := CalculateRealImageIndex;
* When using the NoColumnResize property, the area right next to a column
divider can not be clicked on (and have it do anything). This area is
where Windows would normal turn the cursor into the splitter cursor and
start the resizing process. You can't use it to click since clicking there
didn't do anything before except start the resize process. We don't allow
that, so nothing happens. No way I can figure to get Windows to think it's
in a normal clicking region. I guarantee you'll hear about this from your
users. :(
* C++Builder 3 users: You must install only the registration unit
(ELV_Reg.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.
* Default owner drawing will not work when running on a NT 3.51 system. I
use DrawTextEx() to do the drawing, and that function is only a stub in
NT 3.51. I use DrawTextEx because I need the DT_END_ELLIPSIS flag. My
best suggestion at this point is to not use default drawing if your app
needs to run on an NT 3.51 machine, i.e. draw it yourself in OnDrawItem or
OnDrawSubItem.
* Default owner drawing will not work with virtual mode. By definition, data
is not stored in the control when virtual mode is enabled. So, there is no
way the control can know what to paint for you in owner draw mode. Owner
drawing will work correctly, but you have to do the drawing via the
OnDrawItem and/or OnDrawSubItem events.
* Default owner drawing will not work with with re-ordered headers
(ExtendedStyle contains lvxHeaderDragDrop).
* If you have both an OnDrawItem and an OnDrawSubItem event handler when in
VirtualMode, you will have to set DefaultDrawing to TRUE in the OnDrawItem
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -