(РЕШЕНО 100%) Загнал себя в тупик с HTML (((
Модератор: Модераторы
(РЕШЕНО 100%) Загнал себя в тупик с HTML (((
Думаю, возможно ли решение следующей задачи.
Есть в формате html форма некоего документа, в котором есть поля ввода и чекбоксы. Я сначала подумал было выводить html через компонент из пакета HtmlViewer, но две глобальные пробемы сразу вылезли:
1) пакет нормально не скомилировался на обновленной версии паскаля и лазаруса, ну ладно, закомментил пару строк, поменял имя константы, вроде все собралось.
2) обычный html отображается, с элементами форм - нет, хотя в описании заявлено, что поддерживается.
3) большая проблема - как потом получить то, что пользователь ввел в поля то, и состояние чекбоксов???
Идея была в том, что пользователь видит шаблон заявления так, как он будет выглядеть при печати, вставляя недостающую информацию, удобно же, потом бы готовое заявление на основе этого же html файла собиралось, в определенных местах по тексту метки заменялись бы тем, что пользователь ввел, и готовый текст улетал бы в браузер/редактор/принтер...
Чувствую, зря я сразу не стал делать своего слона в вебе)))
Есть в формате html форма некоего документа, в котором есть поля ввода и чекбоксы. Я сначала подумал было выводить html через компонент из пакета HtmlViewer, но две глобальные пробемы сразу вылезли:
1) пакет нормально не скомилировался на обновленной версии паскаля и лазаруса, ну ладно, закомментил пару строк, поменял имя константы, вроде все собралось.
2) обычный html отображается, с элементами форм - нет, хотя в описании заявлено, что поддерживается.
3) большая проблема - как потом получить то, что пользователь ввел в поля то, и состояние чекбоксов???
Идея была в том, что пользователь видит шаблон заявления так, как он будет выглядеть при печати, вставляя недостающую информацию, удобно же, потом бы готовое заявление на основе этого же html файла собиралось, в определенных местах по тексту метки заменялись бы тем, что пользователь ввел, и готовый текст улетал бы в браузер/редактор/принтер...
Чувствую, зря я сразу не стал делать своего слона в вебе)))
Последний раз редактировалось java73 25.03.2017 15:55:43, всего редактировалось 3 раза.
А может форму не в HTML а в GUI создать? Обработать событие. И пусть потом генерится все что вам угодно.
Геморрой то себе своими руками за свое время и свои деньги зачем создавать?
Геморрой то себе своими руками за свое время и свои деньги зачем создавать?
Вот хотел красивее и нагляднее.
Форма тогда будет с панелью и кучей вкладок тогда, потому что документ на нескольких страницах. Ладно, придумаю.
Форма тогда будет с панелью и кучей вкладок тогда, потому что документ на нескольких страницах. Ладно, придумаю.
Все заявленное можно сделать на HtmlViewer, он же на паскале написан.
sts писал(а):Все заявленное можно сделать на HtmlViewer, он же на паскале написан.
Я именно о нем я начал тему)
не принимает файлы с элементами формы, + как потом от него получить данные, введенные в формы?
откуда качали? демки смотрели? OnFormSubmit назначали? там же все есть
Для начала попробуйте пересобрать пакет в транковом фп и лаз.
Добавлено спустя 8 минут 12 секунд:
При запуске проекта, который просто в событии OnFormShow запускает HTMLViewer.LoadFromFile('11.html'), выдается ошибка EListError cannot use find on unsorted list
в строке №4030 файла readhtml.pas
Добавлено спустя 2 минуты 9 секунд:
Вот мой файл html, весьма прост
Добавлено спустя 8 минут 12 секунд:
При запуске проекта, который просто в событии OnFormShow запускает HTMLViewer.LoadFromFile('11.html'), выдается ошибка EListError cannot use find on unsorted list
в строке №4030 файла readhtml.pas
Добавлено спустя 2 минуты 9 секунд:
Вот мой файл html, весьма прост
1 Может я чего-то не понял но почему бы просто не вызвать браузер ?
2 Есть еще такая полузабытая штука как OLE(не уверен в возможности использовать OLE для html но если это возможно то почему бы и нет ... )...
3 Можно запрятать в ДЛЛ что-то из дельфи или например быстро накатать свой "микро модуль" на одну форму на hiasm где есть рабочий компонент WebBrowser
Вот скрины моего старого при старого проекта видион ...


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


Зы
Опа а это еще круче Создаем веб браузер в Lazarus (не пугайся заголовка там просто используются готовые компоненты )
и еще https://devlaz.ru/chromium-in-lazarus/
Как бы на скринах ваш файл. Всё в жтк. Компонент стал (точнее он давно стоит) без правок. Брал с гит.
Правда ipro не сразу понял что от него хотят. Шапка как бы отсутствует.
Если уж хотите нечто подобное сделать то советую ipro. Ну и хтмл должен соответствовать возможностям компонента.
Правда ipro не сразу понял что от него хотят. Шапка как бы отсутствует.
Если уж хотите нечто подобное сделать то советую ipro. Ну и хтмл должен соответствовать возможностям компонента.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Скрины просто для показа возможностей элемента WebBrowser(использует браузер по умолчанию IE ) из ХайАсма и это не "мой файл" а реальный поиск ... в прочем не важно ... я просто подумал, что если нужно просто организовать разовый просмотр в окне то не зачем огород городить ... А потом нашел ссылки на более продвинутый метод ...
При запуске проекта, который просто в событии OnFormShow
а если так подгружать:
Код: Выделить всё
var
fs : TFileStream;
begin
fs := TFileStream.Create('11.html', fmOpenRead);
HtmlViewer1.LoadFromStream(fs);
FreeAndNil(fs);
п.с.
браузер, шмаузер. Не хилый велик для простенького отображения и маленького шаманства. Особенно chromium - этот велик для этого проекта слишком уж перебор.
Я уже имел неосторожность использовать chromium и geckoport, пытаюсь вот от них уйти.
Через IPro неверно отображается html.
Через поток попробую сейчас.
Я вот тоже до обновления на 1.7 собирал пакет с htmlview, потом обновился, а пакет собираться перестал. Константу переименовал одну, закомментил строку в initialization, чтоб хоть как-то собралось. Собралось, демка из пакета работает, чистый html без форм отображается, с формами - нет. Ошибку, которая выскакивает, выше написал.
Никакие оле и длл мне не подходят, проект кроссплатформенный.
Добавлено спустя 2 минуты 52 секунды:
мне стоило сразу интерфейс к БД пилить в вебе, но пришлось бы резко и очень глубоко изучить или пхп (что не особо хочется), или питон (чем теперь и занимаюсь). Но проект нужен был позарез, поэтому запилил на том, что хорошо знал, ну или хотя бы мог понять, как сделать и где найти ответы и примеры.
Добавлено спустя 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 вроде разобрался:
только придется переименовывать все время const Action, оно конфликтует с таким же идентификатором из модуля Forms
Добавлено спустя 1 час 30 минут 6 секунд:
Re: (РЕШЕНО 50%) Загнал себя в тупик с HTML (((
Кажется, я вижу свет в конце туннеля:
Добавлено спустя 25 минут 58 секунд:
Re: (РЕШЕНО 50%) Загнал себя в тупик с HTML (((
Кароче,
- меняет, к примеру, все чекбоксы на включенные)) переделал пример из документации к THtmlViewer.
Вопрос решен, как я понимаю.
Через 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.
Вопрос решен, как я понимаю.
Мои вопросы решены, может кому пригодится.
Чтение из полей форм я осуществлял через HtmlViiewer.FormControlList. Имя берется из свойства Name, а значение чуть сложнее, написал функцию, посмотрите код. У FortmControlList есть свойство Value, но оно не работает, или еще что-то сделать надо, не разобрался. Также можно получить в событии OnFormSubmit всё в едином стринглисте, в формате Имя=Значение
Чтение из полей форм я осуществлял через 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;
Заодно все, кто использует HTMLView добавьте в деструктор FObjects.Free
у меня это 1004 строка файла htmlview.pas
Иначе утечки памяти.
И не используйте submit кнопки на формах)), через них тоже утечки.
у меня это 1004 строка файла htmlview.pas
Иначе утечки памяти.
И не используйте submit кнопки на формах)), через них тоже утечки.
