Помощник
Здравствуйте, гость ( Вход | Регистрация )
|
|
6:10:2007, 16:35
|
|
Новенький ![]() Группа: Программист Сообщений: 23 Регистрация: 6:10:2007 Пользователь №: 13 072 Специализация: программирование Репутация: 0
|
Доброе время суток!
Задача в том, чтобы вставить скопированное из Excel содержимое в DBGrid, т.е. раскидать по ячейкам. Метода типа PasteFromClipboard нет, так что прийдется раскидывать самому. Данные, скопированные в Excel (возьмем для примера 4 ячейки по 2 в каждой строке, сохраняются в буфере в таком виде: Код '78'#9'56'#$D#$A'67'#9'94'#$D#$A Копирую данные из буфера в строку, но как отделить из строки (определить) сам переход на следующую ячейку или на след. строку? Как определять #9 и #$D#$A ?! P.S. Если существует более простой вариант, буду признателен за информацию. |
|
Сообщение
#1
|
|
![]() |
|
|
6:10:2007, 18:38
|
|
Новенький ![]() Группа: Программист Сообщений: 99 Регистрация: 30:07:2007 Из: Витебск Пользователь №: 12 080 Специализация: программист Репутация: 6
|
Вообщето этот вопрос к COM никакого отношения не имеет.
Итак, для начала нам необходимо перехватить момент когда юзверь производит вставку инфы в наш Grid: 1. Кладем на форму ActionList (или юзаем готовый) 2. Открываем окно его редактирования (дабклик) 3. Верхняя левая кнопка на панели инструментов - жмем на стрелочку вниз у нее и выбираем "New standart action..." 4. В появившемся окне выбираем TEditPaste 5. У нас появился Action, который и отловит необходимое действие. 6. Кидаем на форму PopupMenu и добавляем новый пункт с нашим Action-ом 7. Присваиваем нашему Grid-у это PopupMenu 8. Пишем обработчик для Action: Код 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-ов надо дополнительно определять с каким из них мы работаем В общем ключевые моменты я тебе накидал - дальше думай сам. |
|
Сообщение
#2
|
|
![]() |
|
Текстовая версия | Сейчас: 17:05:2008 - 09:16 |