Получить HTML-формы и поля строки в Delphi
У меня есть система, которая получает HTML через GET каждую 1 секунду, чтобы обновить системные данные в этом HTML может иметь 1-20 форм, нужно принимать все формы и собирать поля строки запроса каждой формы, у меня есть функция, которая делает это, проблема в том, что это занимает больше времени, чем получение серверного HTML, что не так с кодом? или как это сделать по другому?
procedure XThread.GetForms;
var
sTemp, xResF : String;
FormItem, v: Variant;
Field: Variant;
J, q, i, contCampos,
tmForm : Integer;
IDocForm : IHTMLDocument2;
begin
IDocForm := CreateComObject(Class_HTMLDOcument) as IHTMLDocument2;
v := VarArrayCreate([0, 0], VarVariant);
v[0] := strFormMAT; //string html
IDocForm.Write(PSafeArray(System.TVarData(v).VArray));
IDocForm.Close;
tmForm := (IDocForm.all.tags('FORM') as IHTMLElementCollection).Length;
SetLength(matFormsArray, 0); //matFormsArray = Global Array of Array
SetLength(matFormsArray, tmForm);
for q := 0 to tmForm -1 do
begin
SetLength(matFormsArray[q], 2);
FormItem := (IDocForm.all.tags('FORM') as IHTMLElementCollection).item(q, 0);
xResF := '';
sTemp := FormItem.Name;
contCampos := FormItem.Length;
for j := 0 to contCampos - 1 do
begin
Field := FormItem.Item(j);
xResF := xResF + Field.Name + '=' + Field.Value;
if j < FormItem.Length - 1 then
xResF := xResF + '&';
end;
matFormsArray[q, 0] := sTemp;
matFormsArray[q, 1] := xResF;
end;
end;
strFormMAT =
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
<form name="fprin" id="fprin">
<input type="hidden" name="field11" value="value11"></input>
<input type="hidden" name="field12" value="value12"></input>
<input type="hidden" name="field13" value="value13"></input>
</form>
<table>
<tr>
<td>Title</td>
<td>Title</td>
<td>Title</td>
<td>Title</td>
</tr>
<tr>
<td>Value</td>
<td>Value</td>
<td>Value</td>
<form name="xxx1" id="xxx1">
<td>Value</td>
<td>Value</td>
<input type="hidden" name="field11" value="value11"></input>
<input type="hidden" name="field12" value="value12"></input>
<input type="hidden" name="field13" value="value13"></input>
<input type="hidden" name="field14" value="value14"></input>
</form>
</tr>
<tr>
<td>Value</td>
<td>Value</td>
<td>Value</td>
<form name="xxx2" id="xxx2">
<td>Value</td>
<td>Value</td>
<input type="hidden" name="field21" value="value21"></input>
<input type="hidden" name="field22" value="value22"></input>
<input type="hidden" name="field23" value="value23"></input>
<input type="hidden" name="field24" value="value24"></input>
</form>
</tr>
<tr>
<td>Value</td>
<td>Value</td>
<td>Value</td>
<form name="xxx3" id="xxx3">
<td>Value</td>
<td>Value</td>
<input type="hidden" name="field31" value="value31"></input>
<input type="hidden" name="field32" value="value32"></input>
<input type="hidden" name="field33" value="value33"></input>
<input type="hidden" name="field34" value="value34"></input>
</form>
</tr>
<tr>
<td>Value</td>
<td>Value</td>
<td>Value</td>
<form name="xxx4" id="xxx4">
<td>Value</td>
<td>Value</td>
<input type="hidden" name="field41" value="value41"></input>
<input type="hidden" name="field42" value="value42"></input>
<input type="hidden" name="field43" value="value43"></input>
<input type="hidden" name="field44" value="value44"></input>
</form>
</tr>
<tr>
<td>Value</td>
<td>Value</td>
<td>Value</td>
<form name="xxx5" id="xxx5">
<td>Value</td>
<td>Value</td>
<input type="hidden" name="field51" value="value51"></input>
<input type="hidden" name="field52" value="value52"></input>
<input type="hidden" name="field53" value="value53"></input>
<input type="hidden" name="field54" value="value54"></input>
</form>
</tr>
<tr>
<td>Value</td>
<td>Value</td>
<td>Value</td>
<form name="xxx6" id="xxx6">
<td>Value</td>
<td>Value</td>
<input type="hidden" name="field61" value="value61"></input>
<input type="hidden" name="field62" value="value62"></input>
<input type="hidden" name="field63" value="value63"></input>
<input type="hidden" name="field64" value="value64"></input>
</form>
</tr>
</table>
</body>
</html>
Я делаю вызов процедуры в потоке, используя Synchronize(GetForms);
и даже потом вылетает и медленно.
моя проблема не в получении HTML, он уже запущен, проблема в том, чтобы извлечь формы HTML, эта процедура медленная
1 ответ
По твоему вопросу не совсем понятно, что ты пытаешься сделать, но похоже, что ты должен использовать другую технику, чем HTMLDocument с этим пользовательским HTML-кодом, загруженным для выполнения работы.
Если вам нужно вызвать определенный URL со строкой запроса, состоящей из полей и значений, вы должны посмотреть на TIdHTTP
или любой другой компонент для прямого или косвенного выполнения HTTP-вызова.