2008. május 15., csütörtök

Copy selected data from a TStringGrid to the clipboard


Problem/Question/Abstract:

I have various TStringGrid objects within my application and I want to allow the user to copy selected data to the clipboard for insertion into other programs such as Excel.

Answer:

Solve 1:

var
  S: string;
  i, k: Integer;
begin
  S := EmptyStr;
  with StringGrid1 do
  begin
    for i := FixedRows to RowCount - 1 do
    begin
      for k := FixedCols to ColCount - 1 do
      begin
        if k > FixedCols then
          S := S + #9;
        S := S + Cells[k, i];
      end;
      S := S + #13#10;
    end;
  end;
  Clipboard.AsText := S;

This generates a string in which columns are separated by Tab characters and rows by CR/LF linebreaks. Most spreadsheets are able to paste this into cells correctly.

Same for the selection in a grid:

S := '';
with grid do
  for i := Selection.Top to Selection.Bottom do
  begin
    for k := Selection.Left to Selection.Right do
    begin
      S := S + Cells[k, i];
      if k <> Selection.Right then
        S := S + #9;
    end;
    S := S + #13#10;
  end;
Clipboard.AsText := S;


Solve 2:

Here is how you can copy a selection.

uses
  ClipBrd;

procedure CopyGridSelectionToClipBoard(Grid: TStringGrid; Selection: TGridRect);
const
  TAB = Chr(VK_TAB);
  CR = #13;
var
  r, c: integer;
  S: string;
begin
  S := '';
  for r := Selection.Top to Selection.Bottom do
  begin
    for c := Selection.Left to Selection.Right do
    begin
      S := S + Grid.Cells[c, r];
      if c < Selection.Right then
        S := S + TAB;
    end;
    if r < Selection.Bottom then
      S := S + CR;
  end;
  ClipBoard.SetTextBuf(PChar(S));
end;

Pasting would be the reverse. An idea would be to get the text from the clipboard and assign it to a TStringList. This way you'll know how many rows you have.

var
  F: TStringList;
begin
  F := TStringList.Create;
  F.Text := Clipboard.AsText;
  F.Free;
end;

You'll still need to parse each row to get the columns.

By the way, you can use the text you copied with the above procedure to paste into Excel. Excel knows how to parse it if you use the TAB to delimit columns.

Nincsenek megjegyzések:

Megjegyzés küldése