Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.08.2009, 13:14
San4ooo San4ooo вне форума
Прохожий
 
Регистрация: 25.08.2009
Сообщения: 6
Репутация: 10
Радость Коипрование из буфера в Stringgrid массив строк

Всем привет
Приятного времени суток
Ситуация такая. А скопировал из Экселя группу ячеек. И хочу вставить в что-то типа таблицы в Delphi(например, Stringgrid) так чтобы заменилось столько ячеек, сколько я выделил в Excel и с того места, который я выделил в Stringgrid.
Вопрос - есть ли такие компоненты чтобы сделать эту работу удобнее и проще?
или
Вообще как это можно реализовать?
Ответить с цитированием
  #2  
Старый 28.08.2009, 16:56
Аватар для pesi
pesi pesi вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 275
Репутация: 43
По умолчанию

вот это вставляет в сетку додедай как нужно тебе...
в
Код:
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  
Старый 28.08.2009, 18:08
Аватар для Rokuell
Rokuell Rokuell вне форума
Активный
 
Регистрация: 27.12.2006
Адрес: Псков
Сообщения: 274
Версия Delphi: Delphi 7
Репутация: 497
Сообщение

При копировании содержимого таблицы 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
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:21.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter