最近同仁要求在PDM系統增加一個功能,對業務洽辦單的單身資料可以一次性選取'組別'欄的有相同值的資料,例如凡'組別'為A1者選取,不然使用眼力+左手壓鍵盤Shift鍵+右手按壓滑鼠,一筆一筆佳選,實在費勁超沒效率。
程式完成了,但想若此功能不僅限’組別’欄而對任何欄位都一體適用豈不更佳,於是完成之。

函數的程式碼
// 檢查可否執行函數 dbg_multi_sel...()
bool can_do_dbg_multi_sel(TDBGrid *dg, bool show_msg)
{
if(dg->Options.Contains(dgRowSelect) == true ||
dg->Options.Contains(dgMultiSelect)== false
){
if(show_msg==true){
msg("此資料表單(DBGrid)的Options之dgRowSelect須為false 及 dgMultiSelect須為true才可執行\n\n ("+(String)__FUNC__+")");
}
return false;
}
else
return true;
}
//---------------------------------------------------------------------------
// 全選DBGrid的資料列
void dbg_multi_sel_all(TDBGrid *dg, int limited_qty) //limited_qty:限制qu的筆數, 若大於此則不執行複選, 0則全不選
{
TDataSet *qu=dg->DataSource->DataSet;
if(can_do_dbg_multi_sel(dg,true)==false){
return;
}
else if(limited_qty<0){
msg("函數參數limited_qty必須>=0\n\n ("+(String)__FUNC__+")");
return;
}
else if(limited_qty!=0 && limited_qty<qu->RecordCount){
msg("此資料表單(DBGrid)的資料量 "+(String)qu->RecordCount+" 超過限制數量 "+(String)limited_qty+", 不可執行\n\n ("+(String)__FUNC__+")");
return;
}
else{
for(qu->First();!qu->Eof;qu->Next()){
if(limited_qty==0) //清除全部
dg->SelectedRows->CurrentRowSelected=false;
else //選取全部
dg->SelectedRows->CurrentRowSelected=true;
}
}
}
// 複選DBGrid的資料列
void dbg_multi_sel(TDBGrid *dg, bool append)
{
if(can_do_dbg_multi_sel(dg,true)==false){
return;
}
TBookmark bk;
TDataSet *qu=dg->DataSource->DataSet;
String fld_name = dg->SelectedField->FieldName;
String fld_value = dg->SelectedField->Text.Trim();
for(qu->First();!qu->Eof;qu->Next()){
if(qu->FieldByName(fld_name)->Text.Trim()==fld_value){
dg->SelectedRows->CurrentRowSelected=true;
bk=qu->GetBookmark();
}
else{
if(append==false) //不累加
dg->SelectedRows->CurrentRowSelected=false;
}
}
qu->GotoBookmark(bk);
qu->FreeBookmark(bk);
}
//---------------------------------------------------------------------------
PopnpMenu按鈕的程式碼:
void __fastcall TForm_Req::N21Click(TObject *Sender)
{
// 全選, 限制若資料超過300筆則不執行
TDBGrid *dbg=((TDBGrid *)ActiveControl);
if(can_do_dbg_multi_sel(dbg, true)==true){
dbg_multi_sel_all(dbg, 300);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm_Req::N38Click(TObject *Sender)
{
//複選(累加)
TDBGrid *dbg=((TDBGrid *)ActiveControl);
if(can_do_dbg_multi_sel(dbg, true)==true){
dbg_multi_sel(dbg, true);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm_Req::N39Click(TObject *Sender)
{
//複選(重新)
TDBGrid *dbg=((TDBGrid *)ActiveControl);
if(can_do_dbg_multi_sel(dbg, true)==true){
dbg_multi_sel(dbg, false);
}
}
//---------------------------------------------------------------------------