(РЕШЕНО 100%) Загнал себя в тупик с HTML (((

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

(РЕШЕНО 100%) Загнал себя в тупик с HTML (((

Сообщение java73 » 23.03.2017 14:17:26

Думаю, возможно ли решение следующей задачи.
Есть в формате html форма некоего документа, в котором есть поля ввода и чекбоксы. Я сначала подумал было выводить html через компонент из пакета HtmlViewer, но две глобальные пробемы сразу вылезли:
1) пакет нормально не скомилировался на обновленной версии паскаля и лазаруса, ну ладно, закомментил пару строк, поменял имя константы, вроде все собралось.
2) обычный html отображается, с элементами форм - нет, хотя в описании заявлено, что поддерживается.
3) большая проблема - как потом получить то, что пользователь ввел в поля то, и состояние чекбоксов???
Идея была в том, что пользователь видит шаблон заявления так, как он будет выглядеть при печати, вставляя недостающую информацию, удобно же, потом бы готовое заявление на основе этого же html файла собиралось, в определенных местах по тексту метки заменялись бы тем, что пользователь ввел, и готовый текст улетал бы в браузер/редактор/принтер...

Чувствую, зря я сразу не стал делать своего слона в вебе)))
Последний раз редактировалось java73 25.03.2017 16:55:43, всего редактировалось 3 раз(а).
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: Загнал себя в тупик с HTML (((

Сообщение vada » 23.03.2017 14:27:09

А может форму не в HTML а в GUI создать? Обработать событие. И пусть потом генерится все что вам угодно.
Геморрой то себе своими руками за свое время и свои деньги зачем создавать?
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Загнал себя в тупик с HTML (((

Сообщение java73 » 23.03.2017 14:39:08

Вот хотел красивее и нагляднее.
Форма тогда будет с панелью и кучей вкладок тогда, потому что документ на нескольких страницах. Ладно, придумаю.
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: Загнал себя в тупик с HTML (((

Сообщение sts » 23.03.2017 17:53:06

Все заявленное можно сделать на HtmlViewer, он же на паскале написан.
sts
постоялец
 
Сообщения: 406
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Загнал себя в тупик с HTML (((

Сообщение java73 » 23.03.2017 18:04:00

sts писал(а):Все заявленное можно сделать на HtmlViewer, он же на паскале написан.

Я именно о нем я начал тему)
не принимает файлы с элементами формы, + как потом от него получить данные, введенные в формы?
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: Загнал себя в тупик с HTML (((

Сообщение sts » 23.03.2017 18:13:25

откуда качали? демки смотрели? OnFormSubmit назначали? там же все есть
sts
постоялец
 
Сообщения: 406
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Загнал себя в тупик с HTML (((

Сообщение java73 » 23.03.2017 19:00:33

Для начала попробуйте пересобрать пакет в транковом фп и лаз.

Добавлено спустя 8 минут 12 секунд:
При запуске проекта, который просто в событии OnFormShow запускает HTMLViewer.LoadFromFile('11.html'), выдается ошибка EListError cannot use find on unsorted list
в строке №4030 файла readhtml.pas

Добавлено спустя 2 минуты 9 секунд:
Вот мой файл html, весьма прост
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: Загнал себя в тупик с HTML (((

Сообщение Alex2013 » 23.03.2017 20:23:54

1 Может я чего-то не понял но почему бы просто не вызвать браузер ?
2 Есть еще такая полузабытая штука как OLE(не уверен в возможности использовать OLE для html но если это возможно то почему бы и нет ... )...
3 Можно запрятать в ДЛЛ что-то из дельфи или например быстро накатать свой "микро модуль" на одну форму на hiasm где есть рабочий компонент WebBrowser
Вот скрины моего старого при старого проекта видион ...
Изображение
Изображение
Зы
Опа а это еще круче Создаем веб браузер в Lazarus (не пугайся заголовка там просто используются готовые компоненты )
и еще https://devlaz.ru/chromium-in-lazarus/
Alex2013
долгожитель
 
Сообщения: 2926
Зарегистрирован: 03.04.2013 11:59:44

Re: Загнал себя в тупик с HTML (((

Сообщение pupsik » 23.03.2017 22:26:50

Как бы на скринах ваш файл. Всё в жтк. Компонент стал (точнее он давно стоит) без правок. Брал с гит.
Правда ipro не сразу понял что от него хотят. Шапка как бы отсутствует.

Если уж хотите нечто подобное сделать то советую ipro. Ну и хтмл должен соответствовать возможностям компонента.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Загнал себя в тупик с HTML (((

Сообщение Alex2013 » 23.03.2017 23:20:09

Скрины просто для показа возможностей элемента WebBrowser(использует браузер по умолчанию IE ) из ХайАсма и это не "мой файл" а реальный поиск ... в прочем не важно ... я просто подумал, что если нужно просто организовать разовый просмотр в окне то не зачем огород городить ... А потом нашел ссылки на более продвинутый метод ...
Alex2013
долгожитель
 
Сообщения: 2926
Зарегистрирован: 03.04.2013 11:59:44

Re: Загнал себя в тупик с HTML (((

Сообщение pupsik » 23.03.2017 23:42:58

При запуске проекта, который просто в событии OnFormShow

а если так подгружать:
Код: Выделить всё
var
  fs : TFileStream;
begin
  fs := TFileStream.Create('11.html', fmOpenRead);
  HtmlViewer1.LoadFromStream(fs);
  FreeAndNil(fs);
?

п.с.
браузер, шмаузер. Не хилый велик для простенького отображения и маленького шаманства. Особенно chromium - этот велик для этого проекта слишком уж перебор.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Загнал себя в тупик с HTML (((

Сообщение java73 » 24.03.2017 09:17:31

Я уже имел неосторожность использовать chromium и geckoport, пытаюсь вот от них уйти.
Через IPro неверно отображается html.
Через поток попробую сейчас.
pupsik писал(а):pupsik » 23.03.2017 22:26:50

Я вот тоже до обновления на 1.7 собирал пакет с htmlview, потом обновился, а пакет собираться перестал. Константу переименовал одну, закомментил строку в initialization, чтоб хоть как-то собралось. Собралось, демка из пакета работает, чистый html без форм отображается, с формами - нет. Ошибку, которая выскакивает, выше написал.

Никакие оле и длл мне не подходят, проект кроссплатформенный.

Добавлено спустя 2 минуты 52 секунды:
Alex2013 писал(а):1 Может я чего-то не понял но почему бы просто не вызвать браузер ?


мне стоило сразу интерфейс к БД пилить в вебе, но пришлось бы резко и очень глубоко изучить или пхп (что не особо хочется), или питон (чем теперь и занимаюсь). Но проект нужен был позарез, поэтому запилил на том, что хорошо знал, ну или хотя бы мог понять, как сделать и где найти ответы и примеры.

Добавлено спустя 31 минуту 41 секунду:
Взял новый экземпляр пакета, ветка master. Собираю на чистую.
Ошибки при компиляции:
1. Htmlmisc.pas строка 164 TGCPResultsW = GCP_RESULTS;
переименовать константу надо, т.к. в новой версии файла struct.inc они уже есть в таких вариантах: GCPRESULTS; GCP_RESULTSA (тоже самое); GCP_RESULTSW. Я переименовал в GCPRESULTS
2. Строка 1255 htExpectsUTF8 := WidgetSet.LCLPlatform in [lpCarbon, lpQt, lpGTK2, lpWin32];
вызывает следующую ошибку: identifer not found lpCarbon, lpQt, lpGTK2, lpWin32
Хотя они очень даже found, в uses добавляем LCLPtalformDef
3. vwPrint файл, ошибка на строке 435, у обновленного класса TPrinterDevice нет больше свойства DevModeA, есть DevModeW, но я ту строку просто закомментил, т.к. с учетом директив компилятора она все равно не работает.

После пакет собирается.

Добавлено спустя 7 минут 41 секунду:
И ВОТ ТЕПЕРЬ РАБОТАЕТ!!!
Через поток открывается отлично, иногда при скроллинге текст пропадает, но потом восстанавливается.
Мне теперь как-то надо 1) при открытии передать в элементы форм (поля ввода и чекбоксы) значения по умолчанию, а шаблоне html сразу прописать не могу, они будут из БД браться
2) получить измененные пользователем значения для генерации итогового html'а

Добавлено спустя 56 минут 49 секунд:
По п. 2 вроде разобрался:
Код: Выделить всё
procedure TForm1.HTMLFormSubmit(Sender: TObject; const ActionF, Target, EncType,
  Method: ThtString; Results: ThtStringList);
begin
  Memo1.Lines.Text:=Results.Text;
end;

только придется переименовывать все время const Action, оно конфликтует с таким же идентификатором из модуля Forms

Добавлено спустя 1 час 30 минут 6 секунд:
Re: (РЕШЕНО 50%) Загнал себя в тупик с HTML (((
Кажется, я вижу свет в конце туннеля:

Код: Выделить всё
FormData Property

--------------------------------------------------------------------------------

Applies to
THtmlViewer component

Declaration
property FormData: TFreeList;

The FormData Property is used internally by THtmlViewer for storing and restoring HTML Form data in HTML documents. Users may also use this property for the same purpose or to read and/or modify Form data.

As read from THtmlViewer, the FormData consists of a list of TStringLists, one TStringList for each Form in the document. Each string in the TStringList consists of a Name, Value pair separated by an '=' sign:

<name>=<value>

where <name> is the Name attribute assigned to the form control and <value> is the value entered (or the default value if none has been entered).

When an assignment is made to FormData, the same format is used.


Добавлено спустя 25 минут 58 секунд:
Re: (РЕШЕНО 50%) Загнал себя в тупик с HTML (((
Кароче,

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  with HTML.FormControlList do
       for i:=0 to Count-1 do
           if TFormControlObj(Items[i]).TheControl is TCheckbox then
              TCheckbox(TFormControlObj(Items[i]).TheControl).Checked:=TRUE;
end;


- меняет, к примеру, все чекбоксы на включенные)) переделал пример из документации к THtmlViewer.

Вопрос решен, как я понимаю.
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: (РЕШЕНО 100%) Загнал себя в тупик с HTML (((

Сообщение java73 » 25.03.2017 16:59:59

Мои вопросы решены, может кому пригодится.
Чтение из полей форм я осуществлял через HtmlViiewer.FormControlList. Имя берется из свойства Name, а значение чуть сложнее, написал функцию, посмотрите код. У FortmControlList есть свойство Value, но оно не работает, или еще что-то сделать надо, не разобрался. Также можно получить в событии OnFormSubmit всё в едином стринглисте, в формате Имя=Значение
Код: Выделить всё
for i:=0 to HTML.FormControlList.Count-1 do begin
           if TFormControlObj(HTML.FormControlList.Items[i]).TheControl is TCheckbox then
              s_type:='bool'
           else s_type:='str';
           s_key:=HTML.FormControlList[i].Name;
           s_value:=GetValue(i);    // с этим чуть сложнее из-за html формы, но проще, чем парсить строку
           JParse.Add(s_key,s_type,s_value);
        end;

function TForm1.GetValue(const i: integer): string;
begin
  Result:='';
  if (TFormControlObj(HTML.FormControlList.Items[i]).TheControl is TCheckbox) and
     (TCheckbox(TFormControlObj(HTML.FormControlList.Items[i]).TheControl).Checked) then
     Result:='On';
  if (TFormControlObj(HTML.FormControlList.Items[i]).TheControl is TEdit) then
     Result:=TEdit(TFormControlObj(HTML.FormControlList.Items[i]).TheControl).Text;
  if (TFormControlObj(HTML.FormControlList.Items[i]).TheControl is TMemo) then
     Result:=TMemo(TFormControlObj(HTML.FormControlList.Items[i]).TheControl).Text;
end;
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: (РЕШЕНО 100%) Загнал себя в тупик с HTML (((

Сообщение java73 » 28.03.2017 10:30:22

Заодно все, кто использует HTMLView добавьте в деструктор FObjects.Free
у меня это 1004 строка файла htmlview.pas
Иначе утечки памяти.
И не используйте submit кнопки на формах)), через них тоже утечки.
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 25

Рейтинг@Mail.ru