Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30

Поместить html - код в TCppWebBrowser ( XE3 )

23.12.2012, 16:14. Показов 3516. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Иногда необходимо подгрузить html (например полученный с помощью IdHTTP) в TCppWebBrowser для просмотра

Такой код работал в RAD2009 :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
 CppWebBrowser1->Silent = true;  // не показываем ошибки сценария
 CppWebBrowser1->Navigate(L"about:blank"); //  чистая страница
}
//------------------------------------------------------------------------------
void __fastcall ToBrowser(String HTMLText, TCppWebBrowser * WB)
{
TMemoryStream *MS = new TMemoryStream;
TStringList *SL= new TStringList;
IPersistStreamInit *PS;
 
SL->Text = HTMLText;
SL->SaveToStream(MS);
 
MS->Position= 0;
 
TStreamAdapter *SA = new TStreamAdapter(MS,soReference);
 
if (SUCCEEDED(WB->Document->QueryInterface(IID_IPersistStreamInit,(void **)&PS)))
        PS->Load(*SA);
 
 
delete MS,PS,SL;
}
//--------------------------------------------------------------------------------------------
// Использование :
String Content;
ToBrowser(Content,CppWebBrowser1);
//--------------------------------------------------------------------------------------------
Но в XE3
C++
1
    PS->Load(*SA); /* !!! */
[bcc32 Error] Unit1.cpp(34): E2034 Cannot convert 'TStreamAdapter' to 'IStream *'
Full parser context
Unit1.cpp(21): parsing: void _fastcall ToBrowser(UnicodeString,TCppWebBrowser *)
[bcc32 Error] Unit1.cpp(34): E2342 Type mismatch in parameter 'pStm' (wanted 'IStream *', got 'TStreamAdapter')
Full parser context
Unit1.cpp(21): parsing: void _fastcall ToBrowser(UnicodeString,TCppWebBrowser *)
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.12.2012, 16:14
Ответы с готовыми решениями:

Как поместить Html код в string
Мне нужно поместить в string = ""; Вот это <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> ...

Как поместить в переменную код html и php?
Здравствуйте, Подскажите пожалуйста как поместить вот этот код: <p align="left" class='post_comment'>Add comment:...

Delphi XE3 и RAD Studio XE3 в чем отличие?
скачал с сайта Ссылка удалена модератором.] Embarcadero RAD Studio XE3, а у меня после установки два ярлыка Delphi XE3 и RAD Studio XE3...

11
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33187 / 21484 / 8232
Регистрация: 22.10.2011
Сообщений: 36,863
Записей в блоге: 12
23.12.2012, 16:22
C++
1
2
3
4
5
// TStreamAdapter *SA = new TStreamAdapter(MS,soReference);
_di_IStream SA(*(new TStreamAdapter(MS, soReference)));
 
if (SUCCEEDED(WB->Document->QueryInterface(IID_IPersistStreamInit,(void **)&PS)))
        PS->Load(SA);
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.12.2012, 18:01  [ТС]
Понятно только тут вроде утечка, как тут правильно ресурсы освободить ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//------------------------------------------------------------------------------
void __fastcall ToBrowser(String HTMLText, TCppWebBrowser * WB)
{
TMemoryStream *MS = new TMemoryStream;
TStringList *SL= new TStringList;
IPersistStreamInit *PS;
 
SL->Text = HTMLText;
SL->SaveToStream(MS);
 
MS->Position= 0;
 
//TStreamAdapter *SA = new TStreamAdapter(MS,soReference);
 
_di_IStream SA(*(new TStreamAdapter(MS, soReference)));
 
if (SUCCEEDED(WB->Document->QueryInterface(IID_IPersistStreamInit,(void **)&PS)))
    PS->Load(SA);
 
 
delete MS,SL;// PS;
}
//---------------------------------------------------------------------------
Добавлено через 2 минуты
TStreamAdapter приводится к _di_IStream ... а значит будет утечка при освобождении не так ли ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33187 / 21484 / 8232
Регистрация: 22.10.2011
Сообщений: 36,863
Записей в блоге: 12
23.12.2012, 18:53
Цитата Сообщение от Avazart Посмотреть сообщение
а значит будет утечка при освобождении не так ли ?
Нет, не будет. _di_IStream позаботится об этом. Единственное что надо добавить - это PS->Release(), или (лучше) обернуть его в TComInterface:

C++
1
2
3
    TComInterface<IPersistStreamInit> PS;
    OleCheck(WB->Document->QueryInterface(IID_IPersistStreamInit, (LPVOID*)&PS));
    PS->Load(SA);
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.12.2012, 18:55  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
_di_IStream позаботится об этом.
Как ? он о нем ничего не знает ...или я ошибаюсь ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33187 / 21484 / 8232
Регистрация: 22.10.2011
Сообщений: 36,863
Записей в блоге: 12
23.12.2012, 19:00
_di_IStream это что? Интерфейс. Значит, имеет счетчик ссылок. Не забывай об этом.
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.12.2012, 19:05  [ТС]
Чет не понимаю ...
_di_IStream принимает в конструктор TStreamAdapter как параметр ...
И вижу два пути как он может с ним работать первый - копировать его, второй брать его во владения.
При первом варианте - думаю понятно в чем ошибка - мы не удаляем TStreamAdapter.
Во втором -все не ясно так как не понятно как он работает с ним и освобождает ли...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33187 / 21484 / 8232
Регистрация: 22.10.2011
Сообщений: 36,863
Записей в блоге: 12
23.12.2012, 20:17
_di_IStream - это DECLARE_DINTERFACE_TYPE(IStream), где
C++
1
2
3
4
5
#if !defined(DECLARE_DINTERFACE_TYPE)
#define DECLARE_DINTERFACE_TYPE(iface) \
        interface iface;               \
        typedef System::DelphiInterface< iface >  _di_ ## iface;
#endif  // DECLARE_DINTERFACE_TYPE
, то есть, обычная обертка. Дальше. Создали TStreamAdapter, и при конструировании из него объекта типа _di_IStream просто вызывается его operator _di_IStream(), который возвращает интерфейс:
C++
1
2
3
4
5
6
7
8
class PASCALIMPLEMENTATION TStreamAdapter // ...
 
    operator _di_IStream()
    {
        _di_IStream intf;
        GetInterface(intf);
        return intf;
    }
. А теперь - вопрос: как ты думаешь, DelphiInterface<> в состоянии определить через reference counter, когда объект станет ненужным, и удалить его? Вполне...
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.12.2012, 21:44  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    __fastcall ~DelphiInterface<T>()
    {
          if (intf != 0)
          {
#if !defined(NO_DI_DISAMBIGUATE_RELEASE)
            // Disambiguate cases where intf has a Release(...) member
            static_cast<IUnknown*>(intf)->Release();
#else
            intf->Release();
#endif
            intf = 0;
          }
    }
Ну я говорю про сам объект TStreamAdapter который динамически создается, при чем тут подсчет ссылок...
В деструкторе в упор не вижу его удаления...

Добавлено через 16 минут

Я про то что может должно быть как то так:
C++
1
2
3
4
5
6
7
8
9
10
TStreamAdapter* SA = new TStreamAdapter(MS, soReference);
 
_di_IStream IS(*SA);
 
if (SUCCEEDED(WB->Document->QueryInterface(IID_IPersistStreamInit,(LPVOID*)&PS)))
    PS->Load(IS);
 
delete MS;
delete SL;
delete SA; //   TStreamAdapter  !!!!
Добавлено через 10 минут


Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
constructor TStreamAdapter.Create(Stream: TStream;
  Ownership: TStreamOwnership);
begin
  inherited Create;
  FStream := Stream;
  FOwnership := Ownership;
end;
 
destructor TStreamAdapter.Destroy;
begin
  if FOwnership = soOwned then
  begin
    FStream.Free;
    FStream := nil;
  end;
  inherited Destroy;
end;
Адаптер не имеет собственных объектов по сути а лишь берет во владение TStream. ( TMemoryStream )

Добавлено через 6 минут
TStreamAdapter содержит в себе три поля
C++
1
2
3
4
5
private:
    TStream* FStream;
    TStreamOwnership FOwnership;
private:
    void *__IStream;    /* IStream */
FStream указывает на тот же объект что и MS ( и мы его удаляем через MS )
__IStream как я понял освобождает DelphiInterface по подсчету ссылок...

Ну ведь в вызове деструктора TStreamAdapter не отпадает необходимость так как есть еще поле TStreamOwnership

Добавлено через 17 минут
Да и вообще как можно без вызова деструктора TStreamAdapter ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33187 / 21484 / 8232
Регистрация: 22.10.2011
Сообщений: 36,863
Записей в блоге: 12
23.12.2012, 21:53
Avazart, понимаешь, в чем дело... Для начала - что такое TStreamAdapter: System.Classes.TStreamAdapter
TStreamAdapter implements the IStream interface on a TStream object.
Интерфейс, понимаешь? Интерфейсы не освобождаются насильно, они делают это самостоятельно, когда придет время.

Твой приведенный выше код будет вылетать с "Нелегальной операцией над указателем". Можешь проверить...

А, да. Вот еще: System.Classes.TStreamAdapter.Destroy:
Most applications do not need to explicitly free the TStreamAdapter instance. Instead, it is freed automatically when its reference count drops to 0.
У тебя что, какое-то исключение? Ты прямо обязан разрушить этот объект во что бы то ни стало именно тогда, когда тебе захотелось?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.12.2012, 22:13  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Интерфейс, понимаешь?
Да какая разница как его называть? по сути это всего лишь класс, а значит вызов его деструктора обязателен в явной или неявной форме. В данном случае он создается динамически а значит должен удалятся явно через delete
иначе утечка...

Добавлено через 1 минуту
Цитата Сообщение от UI Посмотреть сообщение
Интерфейсы не освобождаются насильно, они делают это самостоятельно, когда придет время.
Ну вообще то тут не намека о самостоятельно уничтожении...
Время придет только когда ОС почистит за процессом ( не факт конечно )

Добавлено через 2 минуты
Цитата Сообщение от UI Посмотреть сообщение
Твой приведенный выше код будет вылетать с "Нелегальной операцией над указателем". Можешь проверить...
Конечно по тому как есть общий ресурс удаляемый адаптером

Добавлено через 7 минут
Цитата Сообщение от UI Посмотреть сообщение
У тебя что, какое-то исключение? Ты прямо обязан разрушить этот объект во что бы то ни стало именно тогда, когда тебе захотелось?
Ну так исключения подобного рода не всегда выскакивают "сразу".

Добавлено через 4 минуты
Это все равно что
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class TMy
{
    int i;
};
//---------------------------------------------------------------------------
int main()
{
TMy*  my = new TMy;
/* И забываем вызвать delete  my; */
 
return 0;
}
//---------------------------------------------------------------------------
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.05.2013, 17:03  [ТС]
И все же, как правильно загружать строки в CppWebBrowser ?

Код :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
CppWebBrowser1->Silent = true;
CppWebBrowser1->Navigate(L"about:blank");
Memo1->Lines->LoadFromFile("C:\\Users\\fujitsu\\Desktop\\1.html");
}
//------------------------------------------------------------------------------
void __fastcall ToBrowser(String HTMLText, TCppWebBrowser * WB)
{
TMemoryStream *MS = new TMemoryStream;
TStringList *SL= new TStringList;
 
SL->Text = HTMLText;
SL->SaveToStream(MS);
MS->Position= 0;
 
_di_IStream SA(*(new TStreamAdapter(MS, soReference)));
 
TComInterface<IPersistStreamInit> PS;
OleCheck(WB->Document->QueryInterface(IID_IPersistStreamInit, (LPVOID*)&PS));
PS->Load(SA);
 
delete MS,SL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 ToBrowser(Memo1->Text,CppWebBrowser1);
}
//---------------------------------------------------------------------------
Что ту не так ?

Включаем CodeGuard и видим утечку :
Миниатюры
Поместить html - код в TCppWebBrowser ( XE3 )  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.05.2013, 17:03
Помогаю со студенческими работами здесь

В файл HTML записан HTML код с выполнением скрипта. Сформировать новое окно из этого HTML кода (c php)
php используется для взятия переменной с сервера, поэтому требуется php переменная. Сейчас я поместил файлы в один каталог, просто для...

Embarcadero XE3 печатает код поверх старого
С недавнего времени Embarcadero XE3 начал печатать сверху старого кода. Подскажите, в чем может быть причина?

Как поместить данные JS в таблицу HTML
Подскажите пожалуйста, облазила уже все. Вот допустим у меня есть файл имя.html и в нем есть пустая таблица ячеек по типу: ...

Как правильно поместить php в html тег
Добрый день всем! При создании корзины для магазина на phр столкнулся с такой проблемой. Создал функции в php для корзины, и после...

Поместить html-страницы внутрь исполняемого файла
Здравствуйте, на форме есть WebBrowser. Нужно было открыть локальные html файлы. Использовал такой код: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru