Форум программистов CODEBY.NET Хостинг в Беларуси — Active Technologies

Разработка бизнес сайтов

Нужны клиенты? Тогда сюда быстрее...
X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )




> Из Excel в Dbgrid через Clipboard, Excel DBGrid Clipboard
mahsus
Вставить ник
сообщение 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
 
Новая тема 
Ответов (1 - 1)
Silver Wind
Вставить ник
сообщение 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


Ответить  Новая тема 

 

RSS Текстовая версия Сейчас: 17:05:2008 - 09:16
с нами можно связаться по:
телефону: +375-(29)-632-60-67
e-mail:info@codeby.net