C++ Builder 中對listview模擬複製某個單元格的內容

東北熊孩子發表於2016-07-29

實現listview的雙擊事件OnDblClick()新增如下程式碼:


方法一:

POINT ptt;
GetCursorPos(&ptt); //獲取螢幕相對座標
long nPos = ptt.x; //獲取X軸長度
if( lv2->SelCount <= 0 ){ return; } //如果點選listview空白處之間返回


int nIndex = 0;//索引
long nTotal = lv2->Left+pnl2->Width+3;//計算螢幕座標距離左邊的長度作為初始值


for(int i=0;i<lv2->Columns->Count;i++)
{
TListColumn *pCol = lv2->Column[i];
if( pCol->Width == 1 )//主要針對listview第一列是checkbox
{
nTotal+= pCol->Width;
continue;
}


if( nPos > nTotal )
{
nTotal+= 1;//每2個格子之間的寬度算1
nTotal+= pCol->Width;
if( nTotal >= nPos )
{
int nTemp = nTotal-pCol->Width;
if( nPos >= nTemp+1 && nPos <= nTotal )
{
nIndex = i;
}
else
{
nIndex = i-1;
}
break;
}
}
}


nIndex = nIndex-1; //減掉第一列listview第一列是給checkbox預留的所以要從第二列開始算起
if( nIndex == -1 ) { return; }


String strValue = "";
try
{
strValue = lv2->Items->operator[](lv2->Selected->Index)->SubItems->Strings[nIndex];
}catch(...)
{
strValue="";
}


方法二:

int nIndex = 0;
TPoint Pos = lv2->ScreenToClient(Mouse->CursorPos);
Pos.x += GetScrollPos(lv2->Handle, SB_HORZ);
for(int i=0; i<lv2->Columns->Count; i++)
{
Pos.x -= ListView_GetColumnWidth(lv2->Handle, i);
if (Pos.x < 0)
{
nIndex = i;
break;
        }
}


nIndex = nIndex-1; //減掉第一列listview第一列是給checkbox預留的所以要從第二列開始算起
if( nIndex == -1 ) { return; }


String strValue = "";
try
{
strValue = lv2->Items->operator[](lv2->Selected->Index)->SubItems->Strings[nIndex];
}catch(...)
{
strValue="";
}
Clipboard()->Clear();
Clipboard()->SetTextBuf(strValue.c_str());

最終將複製單元格的內容儲存到剪下板中,如果Clipboard報錯未定義,引入標頭檔案:#include <Vcl.Clipbrd.hpp>

lv2是listview控制元件的name。

相關文章