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 тут нипричем, разве только напрямую из билдэра в эксель, а потом оттуда скопировать в буфер.
|
|
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(). |
|