//辛苦半天才出来的东西就这样给你了! //不处理多行文本,图片等情况uses Clipbrd;function StrLeft(const mStr: string; mDelimiter: string): string; begin Result := Copy(mStr, 1, Pos(mDelimiter, mStr) - 1); end; { StrLeft }function ListCount(mList: string; mDelimiter: string = ','): Integer; var I, L: Integer; begin Result := 0; if mList = '' then Exit; L := Length(mList); I := Pos(mDelimiter, mList); while I > 0 do begin mList := Copy(mList, I + Length(mDelimiter), L); I := Pos(mDelimiter, mList); Inc(Result); end; Inc(Result); end; { ListCount }function ListValue(mList: string; mIndex: Integer; mDelimiter: string = ','): string; var I, L, K: Integer; begin L := Length(mList); I := Pos(mDelimiter, mList); K := 0; Result := ''; while (I > 0) and (K <> mIndex) do begin mList := Copy(mList, I + Length(mDelimiter), L); I := Pos(mDelimiter, mList); Inc(K); end; if K = mIndex then Result := StrLeft(mList + mDelimiter, mDelimiter); end; { ListValue }function DataSetToText(mDataSet: TDataSet; mFieldNames: string; mDelimiter: string = ';'): string; var vBook: string; S: string; I: Integer; begin Result := ''; mDataSet.DisableControls; vBook := mDataSet.Book; mDataSet.First; while not mDataSet.Eof do begin S := ''; for I := 0 to mDataSet.FieldList.Count - 1 do S := S + mDelimiter + mDataSet.FieldList[I].DisplayText; Delete(S, 1, 1); Result := Result + S + #13#10; mDataSet.Next; end; mDataSet.Book := vBook; mDataSet.EnableControls; end;function DBGridFields(mDBGrid: TDBGrid; mDelimiter: string = ';'): string; var I: Integer; begin Result := ''; for I := 0 to mDBGrid.Columns.Count - 1 do Result := Result + mDelimiter + mDBGrid.Columns[I].FieldName; Delete(Result, 1, Length(mDelimiter)); end; { DBGridFields }function GetDBGridValues(mDBGrid: TDBGrid): string; begin Result := DBGridFields(mDBGrid, #9) + #13#10 + DataSetToText(mDBGrid.DataSource.DataSet, DBGridFields(mDBGrid), #9); end; { GetDBGridValues }procedure SetDBGridValues(mDBGrid: TDBGrid; mText: string); var I, J, C: Integer; vFieldNames: string; vSelectedIndex: Integer; begin if mText = '' then Exit; vSelectedIndex := mDBGrid.SelectedIndex; with mDBGrid.DataSource, TStringList.Create do try Text := mText; vFieldNames := Strings[0]; C := ListCount(vFieldNames, #9); for I := 1 to Count - 1 do begin DataSet.Append; for J := 0 to C - 1 do if DataSet.FieldList.IndexOf(ListValue(vFieldNames, J, #9)) >= 0 then begin mDBGrid.SelectedField := DataSet.FieldByName(ListValue(vFieldNames, J, #9)); if mDBGrid.Columns[mDBGrid.SelectedIndex].FieldName = ListValue(vFieldNames, J, #9) then if not mDBGrid.Columns[mDBGrid.SelectedIndex].ReadOnly then DataSet[ListValue(vFieldNames, J, #9)] := ListValue(Strings[I], J, #9); end; DataSet.Post; end; finally Free; end; mDBGrid.SelectedIndex := vSelectedIndex; end; { SetDBGridValues }procedure TForm1.Button1Click(Sender: TObject); begin Clipboard.AsText := GetDBGridValues(DBGrid1); end;procedure TForm1.Button2Click(Sender: TObject); begin //清空数据 SetDBGridValues(DBGrid1, Clipboard.AsText); end;
要支持dxDBGrid还要自己改改 我一般不使用第三方控件
to zswang(伴水)(需要充充电): 你的代码并不符合我的要求,不过感谢你的参与,我自己已经解决这个问题了。给分。
用TStringList足够了!
参考其他DataSetToText、TextToDataSet
..up
//不处理多行文本,图片等情况uses
Clipbrd;function StrLeft(const mStr: string; mDelimiter: string): string;
begin
Result := Copy(mStr, 1, Pos(mDelimiter, mStr) - 1);
end; { StrLeft }function ListCount(mList: string; mDelimiter: string = ','): Integer;
var
I, L: Integer;
begin
Result := 0;
if mList = '' then Exit;
L := Length(mList);
I := Pos(mDelimiter, mList);
while I > 0 do begin
mList := Copy(mList, I + Length(mDelimiter), L);
I := Pos(mDelimiter, mList);
Inc(Result);
end;
Inc(Result);
end; { ListCount }function ListValue(mList: string; mIndex: Integer; mDelimiter: string = ','): string;
var
I, L, K: Integer;
begin
L := Length(mList);
I := Pos(mDelimiter, mList);
K := 0;
Result := '';
while (I > 0) and (K <> mIndex) do begin
mList := Copy(mList, I + Length(mDelimiter), L);
I := Pos(mDelimiter, mList);
Inc(K);
end;
if K = mIndex then Result := StrLeft(mList + mDelimiter, mDelimiter);
end; { ListValue }function DataSetToText(mDataSet: TDataSet; mFieldNames: string;
mDelimiter: string = ';'): string;
var
vBook: string;
S: string;
I: Integer;
begin
Result := '';
mDataSet.DisableControls;
vBook := mDataSet.Book;
mDataSet.First;
while not mDataSet.Eof do begin
S := '';
for I := 0 to mDataSet.FieldList.Count - 1 do
S := S + mDelimiter + mDataSet.FieldList[I].DisplayText;
Delete(S, 1, 1);
Result := Result + S + #13#10;
mDataSet.Next;
end;
mDataSet.Book := vBook;
mDataSet.EnableControls;
end;function DBGridFields(mDBGrid: TDBGrid; mDelimiter: string = ';'): string;
var
I: Integer;
begin
Result := '';
for I := 0 to mDBGrid.Columns.Count - 1 do
Result := Result + mDelimiter + mDBGrid.Columns[I].FieldName;
Delete(Result, 1, Length(mDelimiter));
end; { DBGridFields }function GetDBGridValues(mDBGrid: TDBGrid): string;
begin
Result := DBGridFields(mDBGrid, #9) + #13#10 +
DataSetToText(mDBGrid.DataSource.DataSet, DBGridFields(mDBGrid), #9);
end; { GetDBGridValues }procedure SetDBGridValues(mDBGrid: TDBGrid; mText: string);
var
I, J, C: Integer;
vFieldNames: string;
vSelectedIndex: Integer;
begin
if mText = '' then Exit;
vSelectedIndex := mDBGrid.SelectedIndex;
with mDBGrid.DataSource, TStringList.Create do try
Text := mText;
vFieldNames := Strings[0];
C := ListCount(vFieldNames, #9);
for I := 1 to Count - 1 do begin
DataSet.Append;
for J := 0 to C - 1 do
if DataSet.FieldList.IndexOf(ListValue(vFieldNames, J, #9)) >= 0 then begin
mDBGrid.SelectedField := DataSet.FieldByName(ListValue(vFieldNames, J, #9));
if mDBGrid.Columns[mDBGrid.SelectedIndex].FieldName = ListValue(vFieldNames, J, #9) then
if not mDBGrid.Columns[mDBGrid.SelectedIndex].ReadOnly then
DataSet[ListValue(vFieldNames, J, #9)] := ListValue(Strings[I], J, #9);
end;
DataSet.Post;
end;
finally
Free;
end;
mDBGrid.SelectedIndex := vSelectedIndex;
end; { SetDBGridValues }procedure TForm1.Button1Click(Sender: TObject);
begin
Clipboard.AsText := GetDBGridValues(DBGrid1);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
//清空数据
SetDBGridValues(DBGrid1, Clipboard.AsText);
end;
我一般不使用第三方控件
你的代码并不符合我的要求,不过感谢你的参与,我自己已经解决这个问题了。给分。