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

Ваш аккаунт

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

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

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

Вывод картинки-TChart'а в HTML-страницу

463
12 мая 2005 года
waterman
178 / / 17.01.2003
Всем привет. На сайте есть файл chtest.html:
 
Код:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>test chart</title>
</head>
<body>
   
</body>
</html>

p.exe -- приложение, написанное на C++ Builder, в котором на Chart'e рисуется диаграмма (в разные моменты времени своя). Не пойму, как правильно составить HTTP-ответ. Вот кусок кода, который я написал, почитав доки и форумы в сети (Netto, Income и AssetsCost -- экземпляры TBarSeries):
Код:
Netto->Clear();
  Income->Clear();
  AssetsCost->Clear();

  Netto->AddXY(1, 2, "", clTeeColor);
  Income->AddXY(3, 4, "", clTeeColor);
  AssetsCost->AddXY(5, 6, "", clTeeColor);

  AnsiString FileName = "test.wmf";
  Chart->SaveToMetafile(FileName);

  printf("\nContent-type: image/wmf\n\n");

  int h = FileOpen(FileName, fmOpenRead | fmShareDenyWrite), fs;
  fs = FileSeek(h, 0, 2);// file size
  FileSeek(h, 0, 0);

  AnsiString str;
  str.SetLength(fs);

  FileRead(h, (void*)str.data(), fs);
  FileClose(h);

  printf(str.c_str());// по идее, это вывод в stdout

  DeleteFile(FileName);

При запросе браузеру отобразить chtest.html никакого результата не наблюдается. Может быть, HTTP-заголовок неправильный?
7.1K
12 мая 2005 года
miXme
44 / / 10.04.2005
Значит есть 2 идеи:

1. Надо переназначить STDOUT, по умолчанию, вроде, стоит "CON" - на экран консоли.

2. Можно попробывать не удалять файл сразу.
463
13 мая 2005 года
waterman
178 / / 17.01.2003
Цитата:
Originally posted by miXme
Значит есть 2 идеи:

1. Надо переназначить STDOUT, по умолчанию, вроде, стоит "CON" - на экран консоли.

2. Можно попробывать не удалять файл сразу.



1. Добавил

 
Код:
setvbuf(stdout, NULL, _IONBF, 0);

результат тот же.

2. Какая разница, сразу удалять файл или позже? Я ведь его прочитал и отправил в поток. То, что в потоке, с файлом уже никак не связано.
2.3K
13 мая 2005 года
ART-CODE
134 / / 15.11.2004
Иногда люди сами создают для себя дополнительные
трудности, а потом пытаются их героически преодолеть... :)

Что мешает сделать новое приложение CGI из готового шаблона Web Server Application,
выбрать при создании CGI stand-alone executable..

А если очень интересно как это работает - расковырять исходники.
И книжку купить хорошую...
463
13 мая 2005 года
waterman
178 / / 17.01.2003
Цитата:
Originally posted by ART-CODE

Что мешает сделать новое приложение CGI из готового шаблона Web Server Application,
выбрать при создании CGI stand-alone executable..

А если очень интересно как это работает - расковырять исходники.
И книжку купить хорошую...


Спасибо за наводку на CGI stand-alone executable. Только работа спорится почему-то лишь с content-type: text/html. HTML-страницы передать -- пожалуйста. А картинку не получается.

 
Код:
void __fastcall TWM::WMWebActionItemAction(TObject *Sender,
      TWebRequest *Request, TWebResponse *Response, bool &Handled)
{
  AnsiString FileName = CreateClassID()+".wmf";
  Form2->Chart1->SaveToMetafile(FileName);
  fs = new TFileStream(FileName, fmOpenRead | fmShareDenyWrite);
  Response->ContentType = "image/wmf";
  Response->ContentStream = fs;
  Response->SendResponse();
}

Не помогает. Все нипочем. Не возвращается картинка при запросе вроде [FONT=courier new] http://site/p.exe[/FONT]. А в тех же "хороших" книжках (которые и покупать-то не надо, в сети полным-полно; англоязычных -- точно) ВСЕ примеры построены на возврате браузеру text/html. Про остальные mime-типы написано что-то вроде "для остальных mime-типов код аналогичен" :)
2.3K
13 мая 2005 года
ART-CODE
134 / / 15.11.2004
в примере ИЗ КНИЖКИ
"Программирование для интернет в C++Builder 6"
А.В. Козлова
используется TMemoryStream, и перед
присвоением ContentStream = fs; выполняется
установка курсора потока в "0"

Может поможет...

 
Код:
TMemoryStream* fs=new TMemoryStream();
fs->LoadFromFile(FileName);
fs->Position=0;
Response->ContentType = "image/wmf";
Response->ContentStream = fs;
463
13 мая 2005 года
waterman
178 / / 17.01.2003
Цитата:
Originally posted by ART-CODE

Может поможет...

 
Код:
TMemoryStream* fs=new TMemoryStream();
fs->LoadFromFile(FileName);
fs->Position=0;
Response->ContentType = "image/wmf";
Response->ContentStream = fs;


Уже определенно лучше. Но при загрузке все той же страницы в браузер теперь вылезает сообщение: [FONT=courier new]Ошибка CGI Указанное приложение CGI не возвратило полный набор заголовков HTTP. Не возвращены заголовки:[/FONT]
и все. Это единственные символы на странице.

7.1K
15 мая 2005 года
miXme
44 / / 10.04.2005
Попробуй вот что.
В отладчике посмотри что вовращает str.c_str(). Если действительно есть в начале что-то вроде "JFIF", "GIF" или "Photoshop X.X" (признаки графического файла), то значит действительно надо колдовать с возвратом.

На твоем месте, я бы не был так уверен по поводу присутствия данных в потоке. Для операционной системы характерной чертой является свойство "подбирать" за завершившимися приложениями. А в твоем случае p.exe как раз завершилось! Пройдись дебаггером по своим мозгам (с) ;-)
463
16 мая 2005 года
waterman
178 / / 17.01.2003
Цитата:
Originally posted by waterman
Уже определенно лучше. Но при загрузке все той же страницы в браузер теперь вылезает сообщение: [FONT=courier new]Ошибка CGI Указанное приложение CGI не возвратило полный набор заголовков HTTP. Не возвращены заголовки:[/FONT]
и все. Это единственные символы на странице.


Глюки, по-видимому, были из-за того, что у меня в CGI-приложении была еще одна форма с чартом, которая создавалась автоматически в начале работы приложения. Когда я ее перенес в Available forms и создавал динамически при передаче диаграммы, все пошло гладко.

Код:
void __fastcall TWebModule1::WebModule1WebActionItem1Action(
      TObject *Sender, TWebRequest *Request, TWebResponse *Response,
      bool &Handled)
{
  Form2 = new TForm2(this);
  AnsiString FileName = CreateClassID() + ".wmf";
  Form2->Chart1->SaveToMetafile(FileName);

  TMemoryStream *ms = new TMemoryStream();
  ms->LoadFromFile(FileName);
  DeleteFile(FileName);
  ms->Position = 0;
  Response->ContentType = "image/wmf";
  Response->ContentStream = ms;
}

Всем большое спасибо за участие!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог