1 (изменено: stir, 2012-10-11 20:22:55)

Тема: JS+HTA:форма в цикле JS=?

Подскажите в коде HTA в цикле можно ли внедрить форму для считывания данных вводимых пользователем?
Ум неясен по причине болезни - сильно не пинайте, вот примерный антишедевр накидал...
Задача: автоматизировать расчет центра тяжести вагона, кол-во грузов от 1 до n различной массы и высотой.
Решение:
для упрощения кода спрашиваем кол-во мест у пользователя,
далее организовываем в цикле считывание информации - массу груза и высоту центра тяжести каждого из грузов,
далее заносим данные в массивы и производим окончательный расчет.
выводим пользователю картинку (хотя можно и сразу при начале работы программы) и расчетные данные.
Особеннности: расчет приближенный в виду размещения груза в линию, гна самом деле возможны отклонения - т.е. грузы могут в продольном сечениии платформы иногда накладываться на линии, но такой вариант крайне редок, поэтому считаем, что груз распологается последовательно в одном направлении.

примерный код хта:

<HTML>
<HEAD> 
<TITLE>Программа расчета центра тяжести вагона</TITLE>
<HTA:APPLICATION ID="PKOHTA"   APPLICATIONNAME="pko1HTA"   BORDER=””  CAPTION="yes"  ICON="pko1.ico"
SHOWINTASKBAR="no"  SINGLEINSTANCE="yes"  SYSMENU="yes"  WINDOWSTATE="normal" >
<script src="funktions1.js" type="text/javascript"></script>
</HEAD>
<BODY BGCOLOR="ButtonFace" SCROLL="auto">
<BR>
расчетная программа:
<BR>

<form name="r01">
Введите кол-во мест (число от 1 до 100 включительно)
&nbsp;&nbsp;&nbsp;&nbsp;
<input type=text name="n1" value="до 3 цифр" maxlength=3 onchange="validate(this, 1, 100)">
<br>
<input type=button name="Reset" value="Сбросить" OnClick='javascript:reset ()'>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<input type=button name="go" value="Начать расчет" OnClick='javascript:text=r1 ("n1")'>
</form>

</BODY>
</HTML>

примерный код с ошибками js:

//----------------------------------------------------------------------------- 0 -----------------------
// функция проверки по введенному числу
function validate(obj, low, high) {
    var error1='';
if ((obj.value < low) || (obj.value > high))
{alert("Введено недопустимое значение!"); window.error1='0';}
else {window.error1='1';}
return error1;
}

//основная программа расчета
function r1 (n1) {
    //alert("проводим расчет т.к. error1=" + error1);
    if (error1==0)
    {alert("error1. programm end")}
    else {
        var m1=document.forms["r01"].n1.value;
        //alert("кол-во мест = "+m1);
        var q = hg = hc = new Array();
        //введем через форму и цикл данные в массивы;
        var i=0; do 
        {
            var name1 = 'loads'+i;
form_loads (name1);
q[i]=a1; hg[i]=a2; hc[i]=a3;// данные из формы;

        }
        while (i < m1);
        //расчет
        //вывод данных

    }

}



function form_loads (name1) {
var t1= "<form name=name1>";
var t2= "Введите массу груза, кг (число от 1 до 10000000 включительно)&nbsp;&nbsp;&nbsp;&nbsp;";
var t3= "<input type=text name="a1" value="до 8 цифр" maxlength=8 onchange="validate(this, 1, 10000000)"><br>";
var t4= "Введите высоту загрузки груза, мм (число от 1 до 10000000 включительно)&nbsp;&nbsp;&nbsp;&nbsp;";
var t5= "<input type=text name="a2" value="до 8 цифр" maxlength=8 onchange="validate(this, 1, 10000000)"><br>";
var t6= "<input type=button name="Reset" value="Сбросить" OnClick='javascript:reset ()'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
var t7= "<input type=button name="go" value="далее" OnClick='javascript:text= ("a1";"a2")'></form>";
    document.write(t1+t2+t3+t4+t5+t6+t7);
    window.a1=document.forms["name1"].a1.value;
    window.a2=document.forms["name1"].a2.value;
}

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

Любители построили Ковчег, а профессионалы - Титаник.

2

Re: JS+HTA:форма в цикле JS=?

stir пишет:

сильно не пинайте, вот примерный антишедевр накидал...

Хочется несильно, но пиннуть, простите:
- в процессе представления создается впечатление...что кто-то "криво" нарисовал и завещал Вам с наилучшими пожеланиями
- изложите, пожалуйста, сколько вешать в граммах..., пытался, честно

3

Re: JS+HTA:форма в цикле JS=?

stir пишет:

спрашиваем кол-во мест у пользователя

не обязательно.

Форма может выглядеть например так:
1. кнопка добавления новых полей ввода
2. кнопка очистки формы
3. кнопка - расчета

кнопка 1 добавляет новую пару полей для ввода массы и "размера" тела (в кавычках, потому что не понятно что это "центр масс" или высота тела)
кнопка 2 удаляет все предыдущие введенные поля для ввода массы и "размера"
кнопка 3 собирает все введенные данные для масс и "размеров" тел и производит вычисления.

Правильно?

( 2 * b ) || ! ( 2 * b )

4 (изменено: shiz, 2012-10-12 13:43:17)

Re: JS+HTA:форма в цикле JS=?

Извиняюсь, слабо понял, что надо.

stir пишет:

далее организовываем в цикле считывание информации - массу груза и высоту центра тяжести каждого из грузов…

Откуда считываем, из вводимых пользоваиелем данных в форме? Т. е. в цикле ожидаем события onsubmit формы? По-моему, так не получится - всё зависнет, надо суметь обойтись без цикла. Или при каждой итерации выводить форму в отдельном модальном окне методом window.showModalDialog.

stir пишет:
function r1 (n1) {
    ...
        var m1=document.forms["r01"].n1.value;

-- вероятно, имелось в виду:

var m1=document.forms["r01"][n1].value;
Забыл пароль и потерял e-mail.

5 (изменено: stir, 2012-10-16 13:25:26)

Re: JS+HTA:форма в цикле JS=?

Извините, что не писал долгое время - выписывался с больничного...

shiz, а есть пример с использованием window.showModalDialog? не использовал еще ни разу такое...

Rumata, и если к примеру добавить кнопку добавления новых полей ввода, как организовать снова ее вызов для еще добавления полей или ее можно бесконечно нажимать вначале (например перед первой формой) всех выводимых форм? Как насчет уникальности имен форм...?
Дело в том, что вопрос один и тот же задаем пользователю - ввести в два поля формы данные и столько раз их вводить на сколько грузомест он ведет расчет изначально по плану.
Например, надо разместить такое на платформе вагона - 1.груз массой 1000 кг и высотой от пола 1 м, а второй еще 5000 кг и высотой от пола вагона 1,5 м. Эти данные мы должны запросить у пользователя и ввести в массив, а после нажатия кнопки РАСЧЕТ произвести математические действия по известной формуле (ее не привожу) и вывести результат на экран и сохранить в файл дополнительно (это не проблемма).

Попробую еще инет порыть...

Еще идея посетила меня - сделать окно разделенным пополам, чтобы второе можно было очищать и запрашивать снова данные по одной и тойже форме... незнаю можно ли вообще это реализовать...

Любители построили Ковчег, а профессионалы - Титаник.

6 (изменено: Rumata, 2012-10-16 20:17:05)

Re: JS+HTA:форма в цикле JS=?

stir пишет:

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

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

stir пишет:

Еще идея посетила меня - сделать окно разделенным пополам, чтобы второе можно было очищать и запрашивать снова данные по одной и тойже форме... незнаю можно ли вообще это реализовать...

Можно, но это сложно. В плане поддержки и интуитивности интерфейса.

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


<html>
<head>
</head>
<body>

<form id="calc">
<div>Result: <input type="text" id="calc-result" readonly="readonly" /></div>
<input type="button" id="calcButton" value="Посчитать!" />
<input type="button" id="moreButton" value=" + " /><br />

<div><input value="Mass" type="text" readonly="readonly" /><input value="Height" type="text" readonly="readonly" ></div>

<div id="calc-frame"></div>

<input type="button" id="clearButton" value="Очистить" />
</form>
<script type="text/javascript">

// Основная функция вычисляет нечто и возвращает его.
//
// Входные данные:
// masses	массив масс тел
// heights	массив "размеров" тел
//
// Выходные данные:
// результат вычисления
function calculate(masses, heights)
{
	var m = 'Masses: ' + masses.length + ': ' + masses;
	var h = 'Heights: ' + heights.length + ': ' + heights;

	alert(m + '\n' + h);

	return 
};

// Функция проверки корректности ввода массы тела
//
// Входные данные:
// value	проверяемое значение
//
// Выходные данные:
// true  - если данные корректны
// false - если данные некорректны
function massValidator(value)
{
	return true;
};

// Функция проверки корректности ввода размера тела
//
// Входные данные:
// value	проверяемое значение
//
// Выходные данные:
// true  - если данные корректны
// false - если данные некорректны
function heightValidator(value)
{
	return true;
};

var calc = document.getElementById('calc');
var calcFrame = document.getElementById('calc-frame');
var calcResult = document.getElementById('calc-result');

// очищает результат предыдущих вычислений
function clearResult()
{
	calcResult.value = '';
};

// удаление всех строк
function removeAllRows()
{
	var rows = calcFrame.getElementsByTagName('div');
	while ( rows.length ) {
		calcFrame.removeChild(calcFrame.lastChild);
	}
};

// добавить новую строку
function appendInput(row, className)
{
	var input = document.createElement('input');
	input.type = 'text';
	input.className = className;
	row.appendChild(input);
};

// добавить новую строку пар входных данных
function addRow()
{
	var row = document.createElement('div');

	appendInput(row, 'mass');
	appendInput(row, 'height');

	calcFrame.appendChild(row);
};

// обработчик на кнопку moreButton для добавления новой строки
document.getElementById('moreButton').onclick = function()
{
	addRow();
};

// обработчик на кнопку clearButton:
// 1. удалить все строки
// Очистить строку результата
document.getElementById('clearButton').onclick = function()
{
	removeAllRows();
	clearResult();
};

// обработчик на кнопку clacButton для выполнения вычислени1
// функция формирует два массива masses и heights
// затем передает их в функцию, производящую вычисления
document.getElementById('calcButton').onclick = function()
{
	// Вспомогательная функция проверки ввода данных
	// Если строка не пустая и введенные данные корректны, то она возвращает true
	// иначе соодщает о некорректности данных и устанавливает фокус на данное поле ввода
	function validate(input, validator)
	{
		if ( input.value != '' && validator(input.value) ) {
			return true;
		}
		alert('Неверные данные!');
		input.focus();
	};

	// массив масс
	var masses = [];
	// массив "размеров"
	var heights = [];

	// коллекция всех строк ввода
	var inputs = calcFrame.getElementsByTagName('input');
	for (var i = 0; i < inputs.length; i++) {
		// заполняем массив масс
		if ( inputs[i].className == 'mass' ) {
			if ( ! validate(inputs[i], massValidator) ) {
				return;
			}
			masses.push(inputs[i].value);
		}
		// заполняем массив "размеров"
		if ( inputs[i].className == 'height' ) {
			if ( ! validate(inputs[i], heightValidator) ) {
				return;
			}
			heights.push(inputs[i].value);
		}
	}

	// Возможно, что никакие данные еще не введены
	if ( masses.length == 0 || heights.length == 0 ) {
		alert('Нет данных!');
		return;
	}

	// Здесь мы уверены, что все введенные данные корректны
	// что-то вычисляем и куда-то сохраняем
	var result = calculate(masses, heights);
	calcResult.value = result;
};

</script>

</body>
</html>
( 2 * b ) || ! ( 2 * b )

7

Re: JS+HTA:форма в цикле JS=?

Благодарю, Rumata, я и не мог предположить, что код такой большой получается!

Думаю к Новому Году выложу рабочие коды минипрограмм по расчетам для конструкторов...сейчас внеплановая аттестация грозит...никак не дают поработать и довести все до ума, .

Любители построили Ковчег, а профессионалы - Титаник.

8

Re: JS+HTA:форма в цикле JS=?

stir пишет:

код такой большой получается

На самом деле это небольшой код. Просто я его привел развернуто: с комментариями, отдельные действия вывел в отдельные функции. Там надо еще добавить немного полезного кода: сами вычисления, определить две функции валидации входных данных (отдельно массы и "размера", или высоты). Код существенно увеличится, когда будет добавлено оформление, дополнительные возможности.

( 2 * b ) || ! ( 2 * b )

9

Re: JS+HTA:форма в цикле JS=?

Спасибо,  Rumata.
Просто изначально я планировал через цикл данные в массив загнать и тут же подсчитать, и расчитывал изначально на 8-10 строк примерно, .
Конечно это не сложный код и небольшой по сравнению с другими задачами.. .

Любители построили Ковчег, а профессионалы - Титаник.

10 (изменено: stir, 2012-11-14 10:21:37)

Re: JS+HTA:форма в цикле JS=?

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

Использовал для сборки этого hta кода прогу:
SciTE
Версия 2.22 .87Ru
    Nov  1 2010 09:47:26
http://scite.net.ru
На базе SciTE 2.22 Автор: Neil Hodgson.
December 1998-October 2010.
http://www.scintilla.org
Lua scripting language by TeCGraf, PUC-Rio
    http://www.lua.org
    Сборка Ru-Board


<html>
<head>
<TITLE>Программа расчета центра тяжести вагона</TITLE>
<HTA:APPLICATION ID="PKOHTA"   APPLICATIONNAME="pko1HTA"   BORDER=””  CAPTION="yes"  ICON="pko1.ico"
SHOWINTASKBAR="no"  SINGLEINSTANCE="yes"  SYSMENU="yes"  WINDOWSTATE="normal" >
</head>
<BODY BGCOLOR="ButtonFace" SCROLL="auto">
 
<form id="calc">
<input type="button" id="moreButton" value="Добавить строку" />
<input type="button" id="clearButton" value="Очистить ВСЁ" />
<br />
<div><input value="Колонка масс, кг" type="text" readonly="readonly" /><input value="Колонка высот, м" type="text" readonly="readonly" ></div>
<br>
<div id="calc-frame"></div>
Константы:<br><br>
Масса вагона = 35000 кг<br>
Н=1,286 м<br><br>
Выберете Нцтв:<br>
<INPUT type="radio" id="constant" value="1.478" checked="checked"> Нцтв=1,478 м<BR>
<INPUT type="radio" id="constant" value="1.18"> Нцтв=1,18 м<BR>
<br>
<input type="button" id="calcButton" value="Расчитать!" />
<div>Результат расчета: <input type="text" id="calc-result" readonly="readonly" /></div>
</form>


<script type="text/javascript">
 
// Основная функция вычисляет нечто и возвращает его.
//
// Входные данные:
// masses    массив масс тел
// heights    массив "размеров" тел
//
// Выходные данные:
// результат вычисления
function calculate(masses, heights, vibor)
{
    var m = 'Masses: ' + masses.length + ': ' + masses;
    var h = 'Heights: ' + heights.length + ': ' + heights;
 
    alert(m + '\n' + h);
    var mmax = masses.length ;
    var hmax = heights.length ;
    var qm = 35000;
    var hq = 1.286 ;//
    var hz = vibor ;//
        alert('hz=vibor= '+ hz);
    var hh = [] ;//massiv высот центров тяжести каждого груза
    for (var j = 0; j < hmax; j++) 
    {hh[j]=(heights[j]/2+hq); }
    alert('Расчитали высоты центров тяжести каждого груза, '+' hh: ' + hh);
    
    var h_all=s_all=q_all= 0 ;
    for (var k = 0; k < hmax; k++) 
    {s_all=s_all+heights[k]*hh[k]; q_all=q_all+masses[k];}
    h_all=(s_all/q_all); 
    alert("Расчитали высоту общего центра тяжести груза, м, "+' h_all= ' + h_all);
    //расчитаем высоту общего центра тяжести вагона с грузом, м
    var h_zto=(q_all*h_all+hz*qm)/(q_all+qm);
    alert("Расчитали высоту общего центра тяжести вагона с грузом, м, "+' h_zto= ' + h_zto);
    
    return h_zto
};
 
// Функция проверки корректности ввода массы тела
//
// Входные данные:
// value    проверяемое значение
//
// Выходные данные:
// true  - если данные корректны
// false - если данные некорректны
function massValidator(value)
{
    return true;
};
 
// Функция проверки корректности ввода размера тела
//
// Входные данные:
// value    проверяемое значение
//
// Выходные данные:
// true  - если данные корректны
// false - если данные некорректны
function heightValidator(value)
{
    return true;
};
 
var calc = document.getElementById('calc');
var calcFrame = document.getElementById('calc-frame');
var calcResult = document.getElementById('calc-result');
 
// очищает результат предыдущих вычислений
function clearResult()
{
    calcResult.value = '';
};
 
// удаление всех строк
function removeAllRows()
{
    var rows = calcFrame.getElementsByTagName('div');
    while ( rows.length ) {
        calcFrame.removeChild(calcFrame.lastChild);
    }
};
 
// добавить новую строку
function appendInput(row, className)
{
    var input = document.createElement('input');
    input.type = 'text';
    input.className = className;
    row.appendChild(input);
};
 
// добавить новую строку пар входных данных
function addRow()
{
    var row = document.createElement('div');
 
    appendInput(row, 'mass');
    appendInput(row, 'height');
 
    calcFrame.appendChild(row);
};
 
// обработчик на кнопку moreButton для добавления новой строки
document.getElementById('moreButton').onclick = function()
{
    addRow();
};
 
// обработчик на кнопку clearButton:
// 1. удалить все строки
// и Очистить строку результата
document.getElementById('clearButton').onclick = function()
{
    removeAllRows();
    clearResult();
};
 
// обработчик на кнопку clacButton для выполнения вычислени1
// функция формирует два массива masses и heights
// затем передает их в функцию, производящую вычисления
document.getElementById('calcButton').onclick = function()
{
    // Вспомогательная функция проверки ввода данных
    // Если строка не пустая и введенные данные корректны, то она возвращает true
    // иначе соодщает о некорректности данных и устанавливает фокус на данное поле ввода
    function validate(input, validator)
    {
        if ( input.value != '' && validator(input.value) ) {
            return true;
        }
        alert('Неверные данные!');
        input.focus();
    };
 
    // массив масс
    var masses = [];
    // массив "размеров"
    var heights = [];
 
    // коллекция всех строк ввода
    var inputs = calcFrame.getElementsByTagName('input');
    for (var i = 0; i < inputs.length; i++) {
        // заполняем массив масс
        if ( inputs[i].className == 'mass' ) {
            if ( ! validate(inputs[i], massValidator) ) {
                return;
            }
            masses.push(inputs[i].value);
        }
        // заполняем массив "размеров"
        if ( inputs[i].className == 'height' ) {
            if ( ! validate(inputs[i], heightValidator) ) {
                return;
            }
            heights.push(inputs[i].value);
        }
    }
 
    // Возможно, что никакие данные еще не введены
    if ( masses.length == 0 || heights.length == 0 ) {
        alert('Нет данных!');
        return;
    }
 
    // Здесь мы уверены, что все введенные данные корректны
    // что-то вычисляем и куда-то сохраняем
    var vibor = document.getElementById('constant').value;
    var result = calculate(masses, heights, vibor);
    calcResult.value = result;
};
 
</script>
 
</body>
</html>

Rumata, очень прошу выслать свои координаты с ФИО - хочу вписать вас в соавторы проги, т.к. иначе это было бы..сами знаете как по отношению к вам.

Любители построили Ковчег, а профессионалы - Титаник.

11

Re: JS+HTA:форма в цикле JS=?

в радиокнопках  отсутствует атрибут name

<INPUT type="radio" name="my"  id="constant" value="1.478" checked> Нцтв=1,478 м<BR>
<INPUT type="radio" name="my"  id="constant" value="1.18"> Нцтв=1,18 м<BR>

доступ

var group=getElementsByAttribute(document,"input","name","my")
var type="0"
for (var j in group)
{
if (group[j].checked)
{
type=group[j].value
break
}
}

function getElementsByAttribute(oElm, strTagName, strAttributeName, strAttributeValue){
	var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	var oAttributeValue = (typeof strAttributeValue != "undefined")? new RegExp("(^|\\s)" + strAttributeValue + "(\\s|$)") : null;
	var oCurrent;
	var oAttribute;
	for(var i=0; i<arrElements.length; i++){
		oCurrent = arrElements[i];
		oAttribute = oCurrent.getAttribute && oCurrent.getAttribute(strAttributeName);
		if(typeof oAttribute == "string" && oAttribute.length > 0){
			if(typeof strAttributeValue == "undefined" || (oAttributeValue && oAttributeValue.test(oAttribute))){
				arrReturnElements.push(oCurrent);
			}
		}
	}
	return arrReturnElements;
}

12 (изменено: Rumata, 2012-11-14 12:33:21)

Re: JS+HTA:форма в цикле JS=?

stir пишет:

не работают радиокнопки

badik пишет:

в радиокнопках  отсутствует атрибут name

А также... Атрибут id используется для однозначной идентификации элемента, поэтому хранит только уникальное значение.

Вам стоит переписать пример, например:

<INPUT type="radio" name="constants" value="1.478" checked="checked"> Нцтв=1,478 м<BR>
<INPUT type="radio" name="constants" value="1.18"> Нцтв=1,18 м<BR>
    var constants = document.getElementsByName('constants');
    var vibor;
    for (var i = 0; i < constants.length; i++) {
        if ( constants[i].checked ) {
            vibor = constants[i].value;
            break;
        }
    }
stir пишет:

вписать вас в соавторы проги

Да ладно Здесь еще много места для исправлений, потому что это еще черновик в первом приближении.

( 2 * b ) || ! ( 2 * b )

13 (изменено: stir, 2012-11-14 13:19:32)

Re: JS+HTA:форма в цикле JS=?

Спасибо за консультацию с примерами, я ни разу еще радиокнопки не использовал - просто не требовалось в жизни, .
ЯваСкрипт как всегда порадовал" своей неразумностью в этом случае - для присвоения значения необходимо прибегнуть к циклу, хотя все просто - имя одно, мышь указала выбор, можно было бы уже не мучиться и изъять выбранное значение... т.е. можно было бы обойтись простой записью - vibor = constants.value или vibor = checked.constants.value . Ну как всегда.. все усложнено, ...

Любители построили Ковчег, а профессионалы - Титаник.

14 (изменено: Rumata, 2012-11-15 06:50:40)

Re: JS+HTA:форма в цикле JS=?

stir пишет:

ЯваСкрипт как всегда порадовал" своей неразумностью

На самом деле все разумно, и это не проблема разумности/неразумности языка: просто Вы смотрите со стороны требуемого результата, а не со стороны источника данных. На самом же деле на странице два отдельных элемента, две радиокнопки, каждая со своими значением и состоянием (checked). Одно имя задействовано для того, чтобы передать только значение выбранной кнопки. В DOM нет механизма получения значения выбранной элемента из группы одноименных элементов. Но это, еще раз, не проблема языка.

( 2 * b ) || ! ( 2 * b )