1.cxgrid中没有现成的方法可以拷贝、粘贴。如果要做的话,可以创建一个动态数组,把要拷贝的数据写到数组中,粘贴时,逐行写入 拷贝代码如下:Private中设置selRows:Variant; procedure TForm1.btn1Click(Sender: TObject); var i,j,SelCount,ColCount: Integer;begin SelCount:=grdView1.Controller.SelectedRowCount; ColCount:=grdView1.DataController.ItemCount; selRows:=VarArrayCreate([ColCount-1,SelCount-1],varVariant); for i :=0 to SelCount-1 do begin for j := 0 to ColCount-1 do begin selRows[j,i]:=grdView1.Controller.SelectedRows[i].Values[j]; end; end; end;粘贴时反方向写过去,写数据集还是直接写到控件中,看楼主需要。2.Excel文件的粘贴原理一样,如果是通过Office打开的话,要解析剪贴板很麻烦。变通起来倒也不难,使用Dev的SpreadSheet打开文件,别的操作等同于cxgrid,所不同的是取每个Cell的值,例子中都有详细的描述,好象需要GetCellObject之类的函数,楼主可以到Hlp文件中搜一下,或者找个例子。
在网上找到这个代码,不过编译不通过//1:哈哈!我写过一个现成的函数,直接调用就可以了! procedure CopySelectRow(TheGrid: TDBGrid); var i : integer; j : integer; Rtf : TRichEdit; sline : string; : integer; begin := TheGrid.DataSource.DataSet.RecNo ; Rtf := TRichEdit.Create(Application); Rtf.visible := false; Rtf.parent := TheGrid.Parent ; Rtf.clear; sline:=''; try with TheGrid.DataSource.DataSet do begin for i:=0 to FieldCount-1 do if not SpecFieldName(Fields[i].FieldName) then sline := sline fields[i].Displaylabel #9; Rtf.Lines.Add(sline); for i:=0 to (TheGrid.SelectedRows.Count -1) do begin GotoBook(pointer(TheGrid.SelectedRows[i])); sline:=''; for j:=0 to FieldCount-1 do if not SpecFieldName(Fields[j].FieldName) then sline:=sline Fields[j].asstring #9; Rtf.lines.Add(sline); end; end; except Abort; end; Rtf.SelectAll; Rtf.CopyToClipboard; Rtf.Free; Rtf:= nil; TheGrid.DataSource.DataSet.RecNo:= ; end; //以上代码是复制到剪贴版;下面调用这个函数并导出到EXCEL的代码: CopySelectRow(yourGrid); try ExcelApp := CreateOleObject('Excel.Application'); except showmessage('出错'); end; ExcelApp.WorkBooks.Add; ExcelApp.WorkSheets[1].Activate; ExcelApp.ActiveSheet.Paste; ExcelApp.visible:= True; //2:{ 功能描述:把DBGrid输出到Excel表格(支持多Sheet) 调用格式:CopyDbDataToExcel([DBGrid1, DBGrid2]); } procedure CopyDbDataToExcel(Args: array of const); var iCount, jCount: Integer; XLApp: Variant; Sheet: Variant; I: Integer; begin Screen.Cursor := crHourGlass; if not VarIsEmpty(XLApp) then begin XLApp.DisplayAlerts := False; XLApp.Quit; VarClear(XLApp); end; try XLApp := CreateOleObject('Excel.Application'); except Screen.Cursor := crDefault; Exit; end; XLApp.WorkBooks.Add; XLApp.SheetsInNewWorkbook := High(Args) 1; for I := Low(Args) to High(Args) do begin XLApp.WorkBooks[1].WorkSheets[I 1].Name := TDBGrid(Args[I].VObject).Name; Sheet := XLApp.Workbooks[1].WorkSheets[TDBGrid(Args[I].VObject).Name];if not TDBGrid(Args[I].VObject).DataSource.DataSet.Active then begin Screen.Cursor := crDefault; Exit; end; TDBGrid(Args[I].VObject).DataSource.DataSet.first; for iCount := 0 to TDBGrid(Args[I].VObject).Columns.Count - 1 do Sheet.Cells[1, iCount 1] :=TDBGrid(Args[I].VObject).Columns.Items[iCount].Title.Caption;jCount := 1; while not TDBGrid(Args[I].VObject).DataSource.DataSet.Eof do begin for iCount := 0 to TDBGrid(Args[I].VObject).Columns.Count - 1 do Sheet.Cells[jCount 1, iCount 1] :=TDBGrid(Args[I].VObject).Columns.Items[iCount].Field.AsString;Inc(jCount); TDBGrid(Args[I].VObject).DataSource.DataSet.Next; end; end; XlApp.Visible := True; Screen.Cursor := crDefault; end;这个SpecFieldName应该是自定义函数吧?那位有心的朋友解释一下!
拷贝代码如下:Private中设置selRows:Variant;
procedure TForm1.btn1Click(Sender: TObject);
var
i,j,SelCount,ColCount: Integer;begin
SelCount:=grdView1.Controller.SelectedRowCount;
ColCount:=grdView1.DataController.ItemCount;
selRows:=VarArrayCreate([ColCount-1,SelCount-1],varVariant);
for i :=0 to SelCount-1 do
begin
for j := 0 to ColCount-1 do
begin
selRows[j,i]:=grdView1.Controller.SelectedRows[i].Values[j];
end;
end;
end;粘贴时反方向写过去,写数据集还是直接写到控件中,看楼主需要。2.Excel文件的粘贴原理一样,如果是通过Office打开的话,要解析剪贴板很麻烦。变通起来倒也不难,使用Dev的SpreadSheet打开文件,别的操作等同于cxgrid,所不同的是取每个Cell的值,例子中都有详细的描述,好象需要GetCellObject之类的函数,楼主可以到Hlp文件中搜一下,或者找个例子。
2、复制
procedure TForm1.cxButton1Click(Sender: TObject);
var
p1,p2:integer;
p3:string;
begin
p1:=cxGrid5DBTableView1.Controller.FocusedRowIndex;
p2:=cxGrid5DBTableView1.Controller.FocusedColumnIndex;
p3:=cxGrid5DBTableView1.DataController.Values[p1,p2];
showmessage(inttostr(p1)+','+inttostr(p2)+','+p3);
clipboard.AsText:=p3;
3.粘贴
procedure TForm1.cxButton1Click(Sender: TObject);
begin
keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), 0, 0);
keybd_event(ord('C'), MapVirtualKey(ord('C'), 0), 0, 0);
keybd_event(ord('C'), MapVirtualKey(ord('C'), 0), KEYEVENTF_KEYUP, 0);
keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), KEYEVENTF_KEYUP,0);
end;
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) http://feiyun0112.cnblogs.com/
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) http://feiyun0112.cnblogs.com/
这个不是 Ctrl+C 吗
cxgrid自带这个功能?能说说如何使用么?
procedure CopySelectRow(TheGrid: TDBGrid);
var
i : integer;
j : integer;
Rtf : TRichEdit;
sline : string;
: integer;
begin
:= TheGrid.DataSource.DataSet.RecNo ;
Rtf := TRichEdit.Create(Application);
Rtf.visible := false;
Rtf.parent := TheGrid.Parent ;
Rtf.clear;
sline:='';
try
with TheGrid.DataSource.DataSet do
begin
for i:=0 to FieldCount-1 do
if not SpecFieldName(Fields[i].FieldName) then
sline := sline fields[i].Displaylabel #9;
Rtf.Lines.Add(sline);
for i:=0 to (TheGrid.SelectedRows.Count -1) do
begin
GotoBook(pointer(TheGrid.SelectedRows[i]));
sline:='';
for j:=0 to FieldCount-1 do
if not SpecFieldName(Fields[j].FieldName) then
sline:=sline Fields[j].asstring #9;
Rtf.lines.Add(sline);
end;
end;
except
Abort;
end;
Rtf.SelectAll;
Rtf.CopyToClipboard;
Rtf.Free;
Rtf:= nil;
TheGrid.DataSource.DataSet.RecNo:= ;
end;
//以上代码是复制到剪贴版;下面调用这个函数并导出到EXCEL的代码:
CopySelectRow(yourGrid);
try
ExcelApp := CreateOleObject('Excel.Application');
except
showmessage('出错');
end;
ExcelApp.WorkBooks.Add;
ExcelApp.WorkSheets[1].Activate;
ExcelApp.ActiveSheet.Paste;
ExcelApp.visible:= True;
//2:{
功能描述:把DBGrid输出到Excel表格(支持多Sheet)
调用格式:CopyDbDataToExcel([DBGrid1, DBGrid2]);
}
procedure CopyDbDataToExcel(Args: array of const);
var
iCount, jCount: Integer;
XLApp: Variant;
Sheet: Variant;
I: Integer;
begin
Screen.Cursor := crHourGlass;
if not VarIsEmpty(XLApp) then
begin
XLApp.DisplayAlerts := False;
XLApp.Quit;
VarClear(XLApp);
end;
try
XLApp := CreateOleObject('Excel.Application');
except
Screen.Cursor := crDefault;
Exit;
end;
XLApp.WorkBooks.Add;
XLApp.SheetsInNewWorkbook := High(Args) 1;
for I := Low(Args) to High(Args) do
begin
XLApp.WorkBooks[1].WorkSheets[I 1].Name :=
TDBGrid(Args[I].VObject).Name;
Sheet :=
XLApp.Workbooks[1].WorkSheets[TDBGrid(Args[I].VObject).Name];if not TDBGrid(Args[I].VObject).DataSource.DataSet.Active then
begin
Screen.Cursor := crDefault;
Exit;
end;
TDBGrid(Args[I].VObject).DataSource.DataSet.first;
for iCount := 0 to TDBGrid(Args[I].VObject).Columns.Count - 1 do
Sheet.Cells[1, iCount 1] :=TDBGrid(Args[I].VObject).Columns.Items[iCount].Title.Caption;jCount := 1;
while not TDBGrid(Args[I].VObject).DataSource.DataSet.Eof do
begin
for iCount := 0 to TDBGrid(Args[I].VObject).Columns.Count - 1
do
Sheet.Cells[jCount 1, iCount 1] :=TDBGrid(Args[I].VObject).Columns.Items[iCount].Field.AsString;Inc(jCount);
TDBGrid(Args[I].VObject).DataSource.DataSet.Next;
end;
end;
XlApp.Visible := True;
Screen.Cursor := crDefault;
end;这个SpecFieldName应该是自定义函数吧?那位有心的朋友解释一下!