Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вставка из буфера в БД MS Access

375
11 мая 2007 года
dominator
199 / / 16.10.2003
Нужно организовать запись данных в буфер обмена из грида.
Делаю это. Разделяю поля табом, в конец каждого поля добавляю признак конца строки (#10).
 
Код:
for i := 0 to nRecordsCount - 1 do begin
      for j := 0 to nFieldsCount - 1 do begin        
         sResultString := sResultString + VarToStr(DataModule_Main.DataSource_Main.DataSet.Fields[j].Value) + #9;
              end;
      sResultString := sResultString + #10;
      DataModule_Main.DataSource_Main.DataSet.Next;
   end;

Теперь пробую вставить в Excel - все нормально - данные вставляются так как надо. Пробуем сделать то же самое с MS Access. Вставляет только первую строку.
Если скопировать в свою очередь те же данные из Excel-я и попробовать вставить в Access - все ок.
Как сделать так, чтобы данные из буфера без проблем вставлялись в Access? В каком виде они должны быть?
25K
12 мая 2007 года
Cерый
10 / / 18.02.2007
Попробуйте добавить перед #10 символ #13:
sResultString := sResultString + #13 + #10;

Предлагаю посмотреть, в каких форматах Excel отправляет данные в буфер обмена.

procedure TForm1.Button1Click(Sender: TObject);
var
buf: array [0..60] of Char;
n: Integer;
fmt: Word;
name: String[30];
begin
Memo1.lines.Clear;
for n := 0 to Clipboard.FormatCount-1 do begin
fmt := Clipboard.Formats[n];
if GetclipboardFormatName( fmt, buf, Pred(Sizeof(buf))) <> 0 then begin
Memo1.Lines.Add('('+IntToStr(fmt)+') ' + 'Формат: ' + StrPas( buf ));
Memo1.Lines.Add('==================================================');
Memo1.Lines.Add(GetDataFormat(fmt));
Memo1.Lines.Add('--------------------------------------------------');
end else begin
case fmt of
1: name := 'CF_TEXT';
2: name := 'CF_BITMAP';
3: name := 'CF_METAFILEPICT';
4: name := 'CF_SYLK';
5: name := 'CF_DIF';
6: name := 'CF_TIFF';
7: name := 'CF_OEMTEXT';
8: name := 'CF_DIB';
9: name := 'CF_PALETTE';
10: name := 'CF_PENDATA';
11: name := 'CF_RIFF';
12: name := 'CF_WAVE';
13: name := 'CF_UNICODETEXT';
14: name := 'CF_ENHMETAFILE';
15: name := 'CF_HDROP (Win 95)';
16: name := 'CF_LOCALE (Win 95)';
17: name := 'CF_MAX (Win 95)';
$0080: name := 'CF_OWNERDISPLAY';
$0081: name := 'CF_DSPTEXT';
$0082: name := 'CF_DSPBITMAP';
$0083: name := 'CF_DSPMETAFILEPICT';
$008E: name := 'CF_DSPENHMETAFILE';
$0200..$02FF: name := 'частный формат';
$0300..$03FF: name := 'Объект GDI';
else // case
name := 'неизвестный формат';
end; // case
Memo1.Lines.Add('Формат Windows: ' + name);
Memo1.Lines.Add('==================================================');
if fmt<>0 then
Memo1.Lines.Add(GetDataFormat(fmt));
Memo1.Lines.Add('--------------------------------------------------');
end;
end;
end;

function GetDataFormat(Format: Word): string;
var
Data: THandle;
begin
OpenClipboard(Form1.Handle);
Data:= GetClipboardData(Format);
if Data <> 0 then begin
if Format = CF_UNICODETEXT then
result:= WideCharToString(PWideChar(GlobalLock(Data)))
else
result:= PChar(GlobalLock(Data));
end else
result:= '';
if Data <> 0 then GlobalUnlock(Data);
CloseClipboard;
end;

Не уверен, что описанная Вами операция вставки удовлетворительно работает. В любом случае эту задачу можно решить несколькими путями, по крайней мере, в зависимости от уровня абстракции поиска решения.
Например, при вставке в мой потомок Grid'а выполняется несколько тестов содержимого буфера обмена:
на прямоугольность, на содержание объединенных ячеек, тест кратности вставки, тест достаточности строк / столбцов, на соответствие типам данных полей, на изменение порядка сортировки, и еще кое-какие. Сходные проблемы, как Вы понимаете, решали люди из MicroSoft.
375
14 мая 2007 года
dominator
199 / / 16.10.2003
Спасибо, попробую разобраться
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог