Из Excel в Dbgrid через Clipboard

Тема в разделе "Delphi - СОМ", создана пользователем mahsus, 6 окт 2007.

  1. mahsus

    mahsus Гость

    Доброе время суток!
    Задача в том, чтобы вставить скопированное из Excel содержимое в DBGrid, т.е. раскидать по ячейкам. Метода типа PasteFromClipboard нет, так что прийдется раскидывать самому. Данные, скопированные в Excel (возьмем для примера 4 ячейки по 2 в каждой строке, сохраняются в буфере в таком виде:
    Код (Text):
    '78'#9'56'#$D#$A'67'#9'94'#$D#$A
    Копирую данные из буфера в строку, но как отделить из строки (определить) сам переход на следующую ячейку или на след. строку? Как определять #9 и #$D#$A ?!
    P.S. Если существует более простой вариант, буду признателен за информацию.
     
  2. Silver Wind

    Silver Wind Гость

    Вообщето этот вопрос к COM никакого отношения не имеет.

    Итак, для начала нам необходимо перехватить момент когда юзверь производит вставку инфы в наш Grid:
    1. Кладем на форму ActionList (или юзаем готовый)
    2. Открываем окно его редактирования (дабклик)
    3. Верхняя левая кнопка на панели инструментов - жмем на стрелочку вниз у нее и выбираем "New standart action..."
    4. В появившемся окне выбираем TEditPaste
    5. У нас появился Action, который и отловит необходимое действие.
    6. Кидаем на форму PopupMenu и добавляем новый пункт с нашим Action-ом
    7. Присваиваем нашему Grid-у это PopupMenu
    8. Пишем обработчик для Action:
    Код (Text):
    procedure TForm1.EditPaste1Execute(Sender: TObject);
    var Buf,s:string; i,i9,i1310:integer; StartCol:integer;
    begin
    Clipboard.Open;
    Buf:=Clipboard.AsText+#9;
    Clipboard.Close;
    StartCol:=StringGrid1.Col;
    while Length(Buf)>2 do
    begin
    i9:=Pos(#9,Buf);
    i1310:=Pos(#13#10,Buf);
    i:=min(i9,i1310);
    if max(i9,i1310)=0 then break;
    s:=Copy(Buf,1,i-1);
    StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]:=s;
    if i=i9 then StringGrid1.Col:=StringGrid1.Col+1;
    if i=i1310 then begin StringGrid1.Row:=StringGrid1.Row+1; StringGrid1.Col:=StartCol; end;
    Delete(Buf,1,i);
    if (Length(Buf)>1) and (Buf[1]=#10) then Delete(Buf,1,1);
    end;
    Обрати внимание:
    1. это я сделал для StringGrid-а (принцип тот же), в DBGride придется оперировать с колонками и строками по другому
    2. я не проверял выход за границы таблицы - если попытаться провести вставку близко к нижнему или правому краю - поймаешь исключение
    3. если на форме несколько Grid-ов надо дополнительно определять с каким из них мы работаем

    В общем ключевые моменты я тебе накидал - дальше думай сам.
     
Загрузка...

Поделиться этой страницей