Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 187

Раздел: C++
/ вопрос закрыт /

Здравствуйте, эксперты!
Компонент Webbrowser. Открываю страницу. Выделяю текст мышкой. Щёлкаю правой клавишей по выделенному тексту, выбираю "Скопировать". Переключаюсь в другую программу - "Вставить". Буфер обмена пуст.
Как разрешить копирование из Webbrowser'а?
В инете куча информации по этому поводу, но всё, в основном, на дельфи. И потом - чаще идут вопросы о том, как скопировать ВЕСЬ текст, как скопировать html и т.п. Это не мой случай.
Использую BDS 2006.

Егор Вопрос закрыт (ответы не принимаются, мини-форум закрыт)

Вопрос задал: Егор (статус: 10-ый класс)
Вопрос отправлен: 15 сентября 2009, 11:37
Состояние вопроса: закрыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 21; последнее сообщение — 15 сентября 2009, 15:52; участников в обсуждении: 2.

Страницы: [1] [2] [Следующая »]

Вадим К

Вадим К (статус: Академик), 15 сентября 2009, 11:46 [#1]:

А в данном случае, если есть рабочий код, то в 99.9% его можно сходу переписать под C++ Builder.
Запрещает копирование не броузер скорее всего, а скрипты на странице. Проверьте, копируется ли этот текст, если открыть страницу просто в броузере (firefox, opera).
Галочка "подтверждения прочтения" - вселенское зло.
Егор

Егор (статус: 10-ый класс), 15 сентября 2009, 12:06 [#2]:

в данном случае имеем те самые 0,1%

на самом деле, когда идёт работа с приведением типов (as в дельфи) или множествами (in в дельфи), сам чёрт ногу сломит. далеко не всё можно в с++ сразу так сходу переделать
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Вадим К

Вадим К (статус: Академик), 15 сентября 2009, 12:20 [#3]:

Код в студию.
Множеств конечно в си нет. Но не надо забывать, что вебброузер точно написан на С/С++ и выше крыши они не прыгнут. Я думаю, что ошибаетесь и всё можно написать.
Галочка "подтверждения прочтения" - вселенское зло.
Егор

Егор (статус: 10-ый класс), 15 сентября 2009, 12:35 [#4]:

какой код?
создаём новый проект, кидаем на форму кнопку и webbrowser. в кнопку пишем:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
WebBrowser1->Navigate("http://yandex.ru");
}

запускаем, выделяем, копируем. не работает
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Егор

Егор (статус: 10-ый класс), 15 сентября 2009, 12:42 [#5]:

множеств в с++ нет. но есть классы, которые имитируют множества. тот же шрифт - курсив, полужирный и т.п.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Вадим К

Вадим К (статус: Академик), 15 сентября 2009, 12:45 [#6]:

Стоп. с любого сайта не работает? Это уже бага.
А вот ещё одно заблуждение. В Си множеств нет, а в Си++ есть. Правда не совсем в том виде, в котором привыкли видеть в делфи, но они там есть. Причем нескольких разновидностей.
Всегда надо быть осторожным, кода писать Си, а кода ещё два плюса дорисовать.
Галочка "подтверждения прочтения" - вселенское зло.
Егор

Егор (статус: 10-ый класс), 15 сентября 2009, 12:55 [#7]:

1. я нигде не писал про си - только с++
2. в СИНТАКСИСЕ с++ множеств нет. есть стандартные библиотеки, которые делают возможной работу с множествами.

не работает с любым сайтом. ЛЮБЫМ. чего бы тогда я стал такую тему писать? написал бы "не работает копирование с сайта ххх.уу".
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Вадим К

Вадим К (статус: Академик), 15 сентября 2009, 13:01 [#8]:

а стандартные библиотеки давно стали частью языка. Паскаль без библиотек может многое. Си/Си++ - ничего. даже "привет мир" вывести. Поэтому stl::set считается частью языка. Оно есть в стандарте. Всё, спор на эту тему закончен.

по теме броузера. с вопроса было не понятно. Я посчитал, что скорее всего говориться о сайте, который защищает "правую кнопку мыши" (да, есть ещё такие наивные вебмастеры, которые добавляют подобные скрипты, усложняя жизнь только обычным пользователям).
В делфи аналогичный код работает? обязательное условие - та же машина, та же операционная система, то же окружение.
Галочка "подтверждения прочтения" - вселенское зло.
Егор

Егор (статус: 10-ый класс), 15 сентября 2009, 13:13 [#9]:

нашёл код, который, типа, копирует выделенную часть из wb:

WebBrowser1.ExecWB(OLECMDID_COPY, OLECMDEXECOPT_PROMPTUSER);

всё хорошо?
сделал кнопку, в неё прописал этот код.

вот вам 99,9% - как ЭТО заставить работать в c++?
простая переделка вида

WebBrowser1->ExecWB(OLECMDID_COPY, OLECMDEXECOPT_PROMPTUSER);

не поможет - ругается

[C++ Error] uPrint.cpp(68): E2015 Ambiguity between 'OLECMDID_COPY' and 'Shdocvw::OLECMDID_COPY'

надо указать ещё область видимости:

wbReport->ExecWB(Shdocvw::OLECMDID_COPY, Shdocvw::OLECMDEXECOPT_PROMPTUSER);

работает? ага! счаз! в реальном проекте (у меня ещё и база данных подключена) после этой строчки база данных отваливается намертво. вплоть до перезагрузки приложения. копирования нет. вот так вот.
нужно подключать ещё две переменные (которые, кстати, совсем нафиг не нужны):

OleVariant a, b;
wbReport->ExecWB(Shdocvw::OLECMDID_COPY, Shdocvw::OLECMDEXECOPT_PROMPTUSER, a, b);

и, думаете, всё гуд? счаз! запускаем, выделяем, жмём кнопочку. и что мы видим?

"Попытка отменить конечное место переноса, которое не было зарегистрировано."

буфер не изменился.

зы. делаем то же в дельфи - аналогичная ошибка:
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EOleException with message 'Попытка отменить конечное место переноса, которое не было зарегистрировано'. Process stopped. Use Step or Run to continue.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Егор

Егор (статус: 10-ый класс), 15 сентября 2009, 13:14 [#10]:

это не бага, это фича :)
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Вадим К

Вадим К (статус: Академик), 15 сентября 2009, 13:23 [#11]:

Пожалуйста, не употребляйте бранных слов. У меня от них пропадает желание что то отвечать. не нужно брать пример с некоторых экспертов.
Так, а приведённый выше код, но в чистом проекте, без базы данных, работает?
по поводу строки
OleVariant a, b;
wbReport->ExecWB(Shdocvw::OLECMDID_COPY, Shdocvw::OLECMDEXECOPT_PROMPTUSER, a, b);
я бы тоже ругался. передете две неинициализированные переменные (а там может быть что угодно) и хотите, что бы оно работало? сейчас. уже. То что винт не отформатировался - просто повезло.
Если зайти на МСДН (а если взялись да С++ под Windows, то он должен быть настольной книгой!), то там можно найти пример с копированием. И там они рекомендуют строку вида
wbReport->ExecWB(Shdocvw::OLECMDID_COPY, Shdocvw::OLECMDEXECOPT_PROMPTUSER, 0, 0);
Возможно вместо нулей надо будет написать NULL, но это уже самостоятельно экспериментируйте (вообще то NULL равен 0, но иногда приведение типом сходит с ума...)
а может даже так надо будет написать
OleVariant a = NULL;
OleVariant b = NULL;
wbReport->ExecWB(Shdocvw::OLECMDID_COPY, Shdocvw::OLECMDEXECOPT_PROMPTUSER, a, b);
Галочка "подтверждения прочтения" - вселенское зло.
Егор

Егор (статус: 10-ый класс), 15 сентября 2009, 13:34 [#12]:

не работает.
"Попытка отменить конечное место переноса, которое не было зарегистрировано."

не важно, в моём проекте или в новом.

и дельфи также себя ведёт.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Вадим К

Вадим К (статус: Академик), 15 сентября 2009, 13:53 [#13]:

Дивно. будем-с дома пробовать. Я точно помню, что подобный код когда то в делфи запускал. Работало ведь.

вспомнил. была у меня такая ошибка. Возникала. если вначале вызвать Navigate и не дождавшись загрузки страницы, попробовать вызвать другие методы.
Лечилось вставкой код вида
While Webbrouser.Busy do begin Application.ProcessMessage; sleep(100); end;
перед вызовом функций копирования и так дальше.
Галочка "подтверждения прочтения" - вселенское зло.
Егор

Егор (статус: 10-ый класс), 15 сентября 2009, 14:08 [#14]:

вообще, в моём приложении документ маленький - пара килобайт, и притом файл локальный. загрузка мгновенная.

но попробовал, задержку сделал - не работает.

по webbrowser'у - если открывать яндекс, то в форму поиска можно вводить данные из буфера, можно удалять. а вот вырезание и копирование не работают.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Вадим К

Вадим К (статус: Академик), 15 сентября 2009, 14:16 [#15]:

Загрузка локальная, мгновенная - это большая ошибка. Это для вас, что 0.1с, что 0.01с одинаково, а для машины - далеко не так. А эксплорер имеет способность парсить документ очень долго. Есть еще одно предположение - накрученные ограничения в локальной безопасности броузера. Фаерфокс к примеру, не грузит картинку с винта, если страница указывает в интернет. Это конечно правильно с одной стороны, но в некоторых случаях может сводить с ума.

Рекомендую собрать маленькое тестовое приложение и попробовать на ещё нескольких компьютерах.
Ну а я дома сам поэксперементирую. Слишком уж простой случай, что бы оно не работало.
Галочка "подтверждения прочтения" - вселенское зло.
Егор

Егор (статус: 10-ый класс), 15 сентября 2009, 14:49 [#16]:

вадим, отказ от копирования обнаружился уже у клиента, на другой машине.

далее, поиск по инету показал, что такое поведение webbrowser'а - это нормально.

нашёл код на дельфи:
http://www.delphirus.com/modules.php?name=Pages&pa=showpage&pid=1521
сделал - работает. хотя я не понимаю, как и почему.

как теперь ЭТО переделать в с++?
где там 99,9%?
начнём сначала:

initialization
  OleInitialize(nil);
finalization
  OleUninitialize;

как это на cpp будет?
без этих строчек, приложение под дельфи, например, не даёт копировать.


по поводу "мгновенно" - я же не совсем тупой и понимаю, что не мгновенно.
но ведь разница есть между тем же яндексом или мсдн-ом и локальным документом в пару килобайт, котором пара таблиц да несколько тегов абзаца?
зачем меня поправлять в очевидных вещах и разводить флейм?

я сказал про локальный документ для того чтобы показать, что файл я формирую сам, в нём навороченностей, типа activx-ов, javascript'ов и прочего нет. просто текст.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Вадим К

Вадим К (статус: Академик), 15 сентября 2009, 15:00 [#17]:

по поводу "мгновенный". да пусть там хоть одна буква. Всё равно дольше будет исполняться, чем начнет выполняться следующая стрка за Navigate. вот в чем проблема.
Как переделать? да очень просто. поставьте строку OleInitialize(NULL); в любое место, которое выполняется до начала работы основного кода. Например первой строкой в OnFormCreate (не помню, как он точно в билдере называется). Соответсвенно вторую строку в деструктор формы (или в OnDestroy)
Данный код был бы оправдан, если броузер стоит другом треде или создается вручную. А так делфи добавляет необходимых юнитов, что бы все инициализировалось корректно.
Галочка "подтверждения прочтения" - вселенское зло.
Егор

Егор (статус: 10-ый класс), 15 сентября 2009, 15:32 [#18]:

Вадим, спасибо.
Да, как раз перед этим проверил - достаточно только связки OleInitialize/OleUninitialize;

Сейчас сделал в с++ - работает. :)
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Вадим К

Вадим К (статус: Академик), 15 сентября 2009, 15:35 [#19]:

Вот теперь осталось понять, почему оно раньше все таки не работало. Ну если конечно только код не вызывается с другого треда/формы в длл..
Галочка "подтверждения прочтения" - вселенское зло.
Егор

Егор (статус: 10-ый класс), 15 сентября 2009, 15:37 [#20]:

У меня несколько форм, можно ли эту связку засунуть в файл проекта? Перед конструкторами всех форм, а деинициализацию - перед закрытием программы? Или лучше для каждой из форм писать при показе/закрытии?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:59
Выполнено за 0.03 сек.