![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Всем привет
Приятного времени суток Ситуация такая. А скопировал из Экселя группу ячеек. И хочу вставить в что-то типа таблицы в Delphi(например, Stringgrid) так чтобы заменилось столько ячеек, сколько я выделил в Excel и с того места, который я выделил в Stringgrid. Вопрос - есть ли такие компоненты чтобы сделать эту работу удобнее и проще? или Вообще как это можно реализовать? |
|
#2
|
||||
|
||||
|
вот это вставляет в сетку додедай как нужно тебе...
в Код:
uses Clipbrd; Код:
var
str, cell : TStringList;
i, u : integer;
begin
str := TStringList.create;
str.text :=ClipBoard.AsText;
cell := TStringList.create;
stringgrid1.RowCount:=1;
stringgrid1.ColCount:=1;
for i:=0 to str.Count-1 do
begin
stringgrid1.RowCount:=stringgrid1.RowCount+1;
cell.text := stringReplace(str[i], #9, #13#10, [rfReplaceAll]);
for u:=0 to cell.Count-1 do
begin
if stringgrid1.ColCount - 1 < u then stringgrid1.ColCount:=stringgrid1.ColCount+1;
stringgrid1.Cells[u, i] :=cell[u];
end;
end;
str.Free;
cell.Free;
stringgrid1.RowCount:=stringgrid1.RowCount-1;
end; |
|
#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; |