📄 0,1410,21743,00.html
字号:
<b>bool</b> path_set;
TNotifyEvent FOnChangeFile; <font color="#0000AA"><i>//Change event</i></font>
TDirectoryThread *thrd; <font color="#0000AA"><i>//Monitoring thread</i></font>
AnsiString FPath;
<b>void</b> <b>__fastcall</b> SetPath(String path);
<b>void</b> <b>__fastcall</b> PopulateFileList();
<b>protected</b>:
<b>public</b>:
<b>__fastcall</b> TActiveListBox(TComponent* Owner);
<b>__fastcall</b> ~TActiveListBox();
<b>void</b> <b>__fastcall</b> UpdateNotify();
<b>void</b> <b>__fastcall</b> Restart();
<b>__published</b>:
<b>__property</b> AnsiString MonitorPath = {read=FPath,write=SetPath};
<b>__property</b> TNotifyEvent OnDirectoryChange = {read=FOnChangeFile,write=FOnChangeFile};
};
<font color="#0000AA"><i>//---------------------------------------------------------------------------</i></font>
<font color="202020">#endif</font></pre>
</td></tr>
</table>
<br>
<table width=100% border=1 style="font-family: "Courier New", Courier, monospace;font-size: 80%;" cellpadding="0" cellspacing=0>
<tr bgcolor=blue><td><font face="Arial" color=white>ActiveListBox.cpp</font></td></tr>
<tr><td>
<pre>
<font color="#0000AA"><i>//---------------------------------------------------------------------------</i></font>
<font color="202020">#include <vcl.h></font>
<font color="202020">#pragma hdrstop</font>
<font color="202020">#include "ActiveListBox.h"</font>
<font color="202020">#pragma package(smart_init)</font>
<font color="#0000AA"><i>//---------------------------------------------------------------------------</i></font>
<font color="#0000AA"><i>// ValidCtrCheck is used to assure that the components created do not have</i></font>
<font color="#0000AA"><i>// any pure virtual functions.</i></font>
<font color="#0000AA"><i>//</i></font>
static <b>inline</b> <b>void</b> ValidCtrCheck(TActiveListBox *)
{
<b>new</b> TActiveListBox(NULL);
}
<font color="#0000AA"><i>//---------------------------------------------------------------------------</i></font>
<b>__fastcall</b> TActiveListBox::TActiveListBox(TComponent* Owner)
: TListBox(Owner)
{
path_set=<b>false</b>; <font color="#0000AA"><i>//boolean to check if path has been set</i></font>
FPath=<font color="#0000FF">""</font>;
FOnChangeFile=NULL;
thrd = <b>new</b> TDirectoryThread(<b>this</b>); <font color="#0000AA"><i>//create thread</i></font>
}
<font color="#0000AA"><i>//---------------------------------------------------------------------------</i></font>
<b>__fastcall</b> TActiveListBox::~TActiveListBox()
{
thrd->Terminate();
}
<font color="#0000AA"><i>//---------------------------------------------------------------------------</i></font>
<b>void</b> <b>__fastcall</b> TActiveListBox::SetPath(String path)
{
FPath = path;
PopulateFileList();
thrd->SetMonitorPath(FPath);
<b>if</b> (!path_set) <font color="#0000AA"><i>//if the path hasn't been set yet...</i></font>
{
path_set=true;
thrd->Resume(); <font color="#0000AA"><i>//start the thread</i></font>
}
}
<font color="#0000AA"><i>//---------------------------------------------------------------------------</i></font>
<b>void</b> <b>__fastcall</b> TActiveListBox::UpdateNotify() <font color="#0000AA"><i>//notify the listbox of changes</i></font>
{
PopulateFileList();
<b>if</b> (FOnChangeFile)
FOnChangeFile(<b>this</b>);
}
<font color="#0000AA"><i>//---------------------------------------------------------------------------</i></font>
<b>void</b> <b>__fastcall</b> TActiveListBox::PopulateFileList() <font color="#0000AA"><i>//fill list box w/ files</i></font>
{
TSearchRec sr;
Items->Clear();
<b>if</b> (FPath == <font color="#0000FF">""</font>) <b>return</b>;
FindFirst(FPath+<font color="#0000FF">"*.*"</font>,faAnyFile,sr);
<b>do</b> {
Items->Add(sr.Name);
} <b>while</b> (!FindNext(sr));
FindClose(sr);
}
<font color="#0000AA"><i>//---------------------------------------------------------------------------</i></font>
<b>void</b> <b>__fastcall</b> TActiveListBox::Restart()
{
path_set=<b>false</b>;
thrd = <b>new</b> TDirectoryThread(<b>this</b>);
}
<font color="#0000AA"><i>//---------------------------------------------------------------------------</i></font>
<b>namespace</b> Activelistbox
{
<b>void</b> <b>__fastcall</b> PACKAGE <b>Register</b>()
{
TComponentClass classes[1] = {<b>__classid</b>(TActiveListBox)};
RegisterComponents(<font color="#0000FF">"Samples"</font>, classes, 0);
}
}
<font color="#0000AA"><i>//---------------------------------------------------------------------------</i></font>
<b>__fastcall</b> TDirectoryThread::TDirectoryThread(TActiveListBox *ctrl)
: TThread(true)
{
control = ctrl;
path = <font color="#0000FF">""</font>;
FreeOnTerminate = true;
OnTerminate = ThreadFinish;
hNotify = INVALID_HANDLE_VALUE;
}
<font color="#0000AA"><i>//---------------------------------------------------------------------------</i></font>
<b>void</b> <b>__fastcall</b> TDirectoryThread::Execute()
{
<b>if</b> (path.IsEmpty() || (hNotify == INVALID_HANDLE_VALUE))
{
control->Restart();
<b>throw</b> Exception(<font color="#0000FF">"couldn't start"</font>);
}
<b>bool</b> to=true; <font color="#0000AA"><i>//time-out check</i></font>
<font color="#0000AA"><i>//while we're still going...</i></font>
<b>while</b> (!Terminated && (hNotify != INVALID_HANDLE_VALUE))
{
<font color="#0000AA"><i>//while we're still timed out...</i></font>
<b>while</b> (to && !Suspended && !Terminated)
{
<b>unsigned</b> <b>long</b> stat = WaitForSingleObject(hNotify,2000);
<font color="#0000AA"><i>//our call to WaitForSingleObject has a 2 second timeout to avoid thread-lock</i></font>
<b>if</b> (stat == WAIT_OBJECT_0) <font color="#0000AA"><i>//if it got signalled</i></font>
{
to=true;
Synchronize(Update()); <font color="#0000AA"><i>//update list box</i></font>
<font color="#0000AA"><i>//use Synchronize to keep it thread-safe</i></font>
<b>if</b> (!FindNextChangeNotification(hNotify)) <font color="#0000AA"><i>//renew the handle</i></font>
{
to=<b>false</b>;
<b>break</b>;
}
}
<b>else</b> <b>if</b> (stat == WAIT_TIMEOUT) <font color="#0000AA"><i>//just keep going</i></font>
to=true;
<b>else</b> {
to=<b>false</b>;
<b>break</b>;
}
}
}
}
<font color="#0000AA"><i>//---------------------------------------------------------------------------</i></font>
<b>void</b> <b>__fastcall</b> TDirectoryThread::SetMonitorPath(String Path)
{
<b>if</b> (path != Path)
{
path = Path;
<b>if</b> (hNotify != INVALID_HANDLE_VALUE) <font color="#0000AA"><i>//close our old handle</i></font>
FindCloseChangeNotification(hNotify);
hNotify = FindFirstChangeNotification(path.c_str(),<b>false</b>,dwFlags);
<font color="#0000AA"><i>//get the handle to the event object</i></font>
<b>if</b> (hNotify == INVALID_HANDLE_VALUE)
<b>throw</b> Exception(<font color="#0000FF">"couldn't make handle"</font>);
}
}
<font color="#0000AA"><i>//---------------------------------------------------------------------------</i></font>
<b>void</b> <b>__fastcall</b> TDirectoryThread::ThreadFinish(TObject *Sender)
{
FindCloseChangeNotification(hNotify); <font color="#0000AA"><i>//cleanup</i></font>
}
<font color="#0000AA"><i>//---------------------------------------------------------------------------</i></font>
<b>void</b> <b>__fastcall</b> TDirectoryThread::Update()
{
control->UpdateNotify();
}
</pre>
</td></tr>
</table>
<br>
<a href="#top" style="text-decoration: none;">Back to top</a>
</td></tr>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -