![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#3
|
||||
|
||||
![]() При копировании содержимого таблицы Excel в буфер обмена, она сохраняется в довольно простом формате: ячейки одной строки разделены символом табуляции (код - 9), а строки разделены сочетанием двух символов - возврата каретки (CR: код - 13) и перевода строки (LF: код 10).
Причём завершается это опять же сочетанием CRLF. Зная это, сделать разбор строки из буфера не составит труда. На примере StringGrid данные будут добавляться по нажатию Ctrl+V начиная с выделенной ячейки Код:
procedure TForm1.StringGrid1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Shift = [ssCtrl]) and (Key = Ord('V')) then InsertCells; end; Вот несколько вариантов процедуры InsertCells : Вариант 1: Самый простой, без проверок выхода за границы таблицы Код:
uses ClipBrd; procedure TForm1.InsertCells; var s:string; i,col,row,left,top,from:integer; begin s := Clipboard.AsText; left := StringGrid1.Selection.Left; top := StringGrid1.Selection.Top; from := 1; col := left; row := top; for i:=1 to Length(s) do case Ord(s[i]) of 9: begin StringGrid1.Cells[col,row] := Copy(s,from,i-from); from := i+1; Inc(col); end; 10: begin from := i+1; col := left; Inc(row); end; 13: StringGrid1.Cells[col,row] := Copy(s,from,i-from); end; end; Вариант 2: Если данные не влезают в таблицу, то просто обрезаются Код:
uses ClipBrd,StrUtils; procedure TForm1.InsertCells; var s:string; i,col,row,left,top,from,len:integer; begin s := Clipboard.AsText; len := Length(s); left := StringGrid1.Selection.Left; top := StringGrid1.Selection.Top; from := 1; col := left; row := top; i := 1; while (i <= len) do begin case Ord(s[i]) of 9: begin StringGrid1.Cells[col,row] := Copy(s,from,i-from); from := i+1; Inc(col); if col = StringGrid1.ColCount then begin // Пропускаем оставшиеся в текущей строке ячейки i := PosEx(#10,s,i); from := i; Continue; end; end; 10: begin from := i+1; col := left; Inc(row); if row = StringGrid1.RowCount then Break; end; 13: StringGrid1.Cells[col,row] := Copy(s,from,i-from); end; Inc(i); end; end; Вариант 3: Если данные не влезают в таблицу, то количество строк или столбцов таблицы увеличивается Код:
uses ClipBrd; procedure TForm1.InsertCells; var s:string; i,col,row,left,top,from,len:integer; begin s := Clipboard.AsText; len := Length(s); left := StringGrid1.Selection.Left; top := StringGrid1.Selection.Top; from := 1; col := left; row := top; for i:=1 to Length(s) do case Ord(s[i]) of 9: begin StringGrid1.Cells[col,row] := Copy(s,from,i-from); from := i+1; Inc(col); if col = StringGrid1.ColCount then StringGrid1.ColCount := StringGrid1.ColCount + 1; end; 10: begin from := i+1; col := left; Inc(row); if (row = StringGrid1.RowCount) and (i<>len) then StringGrid1.RowCount := StringGrid1.RowCount + 1; end; 13: StringGrid1.Cells[col,row] := Copy(s,from,i-from); end; end; Велик и могуч наш Object Pascal ! ICQ: 357-591-887 |