C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
ListView и OLE, Кто-нибудь знает как?
rturbo
Отправлено: 26.05.2004, 13:13


Не зарегистрирован







Люди подскажите как сделать:

Есть ListView в виде репорта (ну чисто таблички без иконок)
нужно всю инфу из него скопировать в буфер обмена (Cntrl+С) и вставить (Cntrl+V) например в текстовый файл в виндах.

Заранее благодарен.
Gedeon
Отправлено: 26.05.2004, 15:44


Ветеран

Группа: Модератор
Сообщений: 1742



Создайте TStringList, в него вносите строки, последовательно пробегая по узлам ListView, затем его текст в буфер и все.
rturbo
Отправлено: 26.05.2004, 16:36


Не зарегистрирован







Это впринципе понятно, может я не так выразился
в двух словах:
Мне надо данные из ListView скопировать в буффер обмена Windows для последующей вставки в Exсel;

Из программы в Exсel, нет проблем, но мне нужно через буффер обмена.

Отредактировано rturbo — 26/05/2004, 17:41
Gedeon
Отправлено: 26.05.2004, 16:45


Ветеран

Группа: Модератор
Сообщений: 1742



Все что могу сказать ищите в сторону WideFormatBuf, а вот в каком формате хранятся данные в буфере для эксель затрудняюсь ответить.
MDM
Отправлено: 27.05.2004, 11:19


Не зарегистрирован







QUOTE (rturbo @ 26/05/2004, 17:38)
но мне нужно через буффер обмена.

Тогда причем здесь OLE?
Gedeon
Отправлено: 27.05.2004, 11:38


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (MDM @ 27/05/2004, 12:21)
QUOTE (rturbo @ 26/05/2004, 17:38)
но мне нужно через буффер обмена.

Тогда причем здесь OLE?

Да, действительно, ole тут нипричем, разве только напрямую из билдэра в эксель, а потом оттуда скопировать в буфер. biggrin.gif
Guest
Отправлено: 27.05.2004, 13:59


Не зарегистрирован







QUOTE (rturbo @ 26/05/2004, 17:38)
Это впринципе понятно, может я не так выразился
в двух словах:
Мне надо данные из ListView скопировать в буффер обмена Windows для последующей вставки в Exсel;

Из программы в Exсel, нет проблем, но мне нужно через буффер обмена.

//где-то наверху...
#include
#include
#include
#include
//
...
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TStringList* data = new TStringList();
TListItem* ListItem;
String line;
//первая строка — шапка таблицы...
line = ListView1->Columns->Items[0]->Caption;
for (int i = 1; i < ListView1->Columns->Count; i++)
line = line + "\t" + ListView1->Columns->Items[i]->Caption;
data->Add(line);
//далее добавляем строки в которых слова разделены Tab-ом, Excel — поймет...
for (int j = 0; j < ListView1->Items->Count; j++) {
ListItem = ListView1->Items->Item[j];
line = ListItem->Caption;
for (int k = 0; k < ListItem->SubItems->Count; k++) {
line = line + "\t" + ListItem->SubItems->Strings[k];
}
data->Add(line);
}
//в Clipboard...
Clipboard()->AsText = data->Text;
//нафиг TStringList...
delete data;
//вставим в Excel...
XL = CreateOleObject("Excel.Application.8");
XL.OlePropertySet("Visible", true);
v0 = XL.OlePropertyGet("Workbooks");
v0.OleProcedure("Add");
v1 = v0.OlePropertyGet("Item", 1).OlePropertyGet("Worksheets").OlePropertyGet("Item", 1);
v1.OlePropertyGet("Range", "E2:E2").OleProcedure("Select"); //например начиная с этой ячейки...
v1.OleProcedure("Paste");
XL.OlePropertySet("DisplayAlerts",false);
XL.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs", ChangeFileExt(Application->ExeName, ".xls"));
XL.OleProcedure("Quit");
}
//---------------------------------------------------------------------------
MDM
Отправлено: 27.05.2004, 14:07


Не зарегистрирован







Предъидущий пост Я заслал, извиняюсь забыл подписаться.
Gedeon
Отправлено: 27.05.2004, 15:05


Ветеран

Группа: Модератор
Сообщений: 1742



2rturbo
MDM привел вам полностью рабочее решение, но таким методом будет достаточно медленно, если быстродействие критично, все же разбирайтесь с форматом буфера. Кстати попробовал скопировать кусок таблицы и вставить его в текстовик все достаточно просто символы разделены знаками табуляции, возможно еще что то есть, но это уже не проблема, читайте такой файл посимвольно, все увидите.
Guest
Отправлено: 28.05.2004, 08:57


Не зарегистрирован







QUOTE (Gedeon @ 27/05/2004, 16:07)
таким методом будет достаточно медленно

10x10000 — 6 сек (Celeron 800, 128 RAM). По крайней мере приведенный выше код можно (а может нужно) еще заточить...
Gedeon — сделаешь быстрее, сообщи.

За наводку на идею персональное спасибо 2rturbo! Раньше сам вставлял "поячеечно" это были тормоза. Сейчас буду делать через Clipboard().

Вернуться в Вопросы программирования в C++Builder