⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 0,1410,21743,00.html

📁 C++builder学习资料C++builder
💻 HTML
📖 第 1 页 / 共 2 页
字号:
  <b>bool</b> path_set;

  TNotifyEvent FOnChangeFile;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000AA"><i>//Change event</i></font>

  TDirectoryThread *thrd;&nbsp;&nbsp;&nbsp;&nbsp;<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 &lt;vcl.h&gt;</font>

<font color="202020">#pragma hdrstop</font>



<font color="202020">#include &quot;ActiveListBox.h&quot;</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">&quot;&quot;</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-&gt;Terminate();

}

<font color="#0000AA"><i>//---------------------------------------------------------------------------</i></font>

<b>void</b> <b>__fastcall</b> TActiveListBox::SetPath(String path)

{

  FPath = path;

  PopulateFileList();

  thrd-&gt;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-&gt;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-&gt;Clear();

  <b>if</b> (FPath == <font color="#0000FF">&quot;&quot;</font>) <b>return</b>;

  FindFirst(FPath+<font color="#0000FF">&quot;*.*&quot;</font>,faAnyFile,sr);

  <b>do</b> {

    Items-&gt;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">&quot;Samples&quot;</font>, classes, 0);

  }

}

<font color="#0000AA"><i>//---------------------------------------------------------------------------</i></font>

<b>__fastcall</b> TDirectoryThread::TDirectoryThread(TActiveListBox *ctrl)

  : TThread(true)

{

  control = ctrl;

  path = <font color="#0000FF">&quot;&quot;</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-&gt;Restart();

    <b>throw</b> Exception(<font color="#0000FF">&quot;couldn't start&quot;</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 &amp;&amp; (hNotify != INVALID_HANDLE_VALUE))

  {

    <font color="#0000AA"><i>//while we're still timed out...</i></font>

    <b>while</b> (to &amp;&amp; !Suspended &amp;&amp; !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">&quot;couldn't make handle&quot;</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-&gt;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 + -