Консультация № 140907
28.07.2008, 17:26
0.00 руб.
0 12 1
Помогите решить задачу.
Задача в следующем:
есть веб форма с поля для заполнения и есть select такого рода:
<SELECT class=input_submit name="home"> <OPTION value=0
selected>Выбор страны</OPTION> <OPTION value=Украина(+3)>Украина (+3)</OPTION>
<OPTION value=Россия(+7)>Россия (+7)</OPTION>
<OPTION value=США(+039)>США(+039)</OPTION>
</SELECT>
Вопрос......
Как мне в combobox добавить все (OPTION value)
а при выборе в комбобоксе определенной страны, на сайте менялось тоже.

Обсуждение

Неизвестный
28.07.2008, 17:45
общий
P.s. использую twebbrowser
давно
Мастер-Эксперт
425
4118
28.07.2008, 18:08
общий
Oneboyfriend
Сначала расскажите, как Ваша программа связана с сайтом, на котором должно "меняться тоже"...
И под combobox Вы имеете в виду компонент Дельфи TComboBox?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
28.07.2008, 19:10
общий
как связано это не важно, вы мне дайте ответ если знаете, а по поводу компонента sir Henry будте внимательны (Рассылка: / КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi)
Неизвестный
28.07.2008, 19:40
общий
Правильно ли я понимаю?:
Вы хотите создать форму (TForm), на которой будет размещен TComboBox. Далее Вы скачиваете web-страницу (заходите на сайт), обрабатываете ее и заполняете список значений установленного на форму TComboBox. После того, как пользователь нажмет на кнопку ОК, выбранное значение отправляется на сайт (методом Get или Post).
Неизвестный
28.07.2008, 20:29
общий
нет, через twebbrowser я открываю некую страницу, там есть поле (selelct) c выбором страны, так вот эти страны мне нужно программно поместить в combobox
вот как я делал, но у меня все береться
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var iDoc:IHtmlDocument2;
i:integer;
iDisp: IDispatch;
iColl:IHTMLElementCollection;
iOpt:IHTMLOptionElement;

begin
WebBrowser1.ControlInterface.Document.QueryInterface(IHtmlDocument2,iDoc);
IDisp:=iDoc.all.tags('OPTION'); - если пишу (option value) то пусто, как мне эти value взять
if assigned(IDisp) then begin
IDisp.QueryInterface(IHTMLElementCollection,iColl);
if assigned(iColl) then begin
for i:=1 to iColl.Get_length do begin
iDisp:=iColl.item(pred(i),1);
iDisp.QueryInterface(IHTMLOptionElement,iOpt);
if Assigned(iOPT) then
begin
oper.Items.Add(iOpt.value);
end;
end;
end;
end;
end;


тоесть, в oper.itemindex должны быть города, а у меня получаеться, сначало 2 нуля и все города дублируются почемуто( тоесть, Украина, Украина,Россия,Росиия), помоги пожалуйста.
Посмотрите вопрос (весь select) , первое value =0
Вообщем мне надо (option value) поместить в combobox.item.add
давно
Мастер-Эксперт
425
4118
29.07.2008, 05:48
общий
Oneboyfriend
Чтобы знать, что Вам ответить, сначала нужно понять вопрос, согласитесь?
К сожалению Ваша формулировка непонятна и свидетельство тому - не только я не понимаю, но и другие эксперты.
Так что Ваше замечание о невнимательности некорректно.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
29.07.2008, 13:12
общий
и что не понятного в вопросе? это просто говоря называеться не знаем и всё, самый первый вопрос поставлен корретно, и все понятно там что и для чего
Неизвестный
29.07.2008, 20:15
общий
Странно, но Ваш код у меня нормально работает. Поэтому могу предположить, что проблема в самом HTML файле (странице).
Попробуйте заменить код вот на такой:
Код:
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
iDoc: IHtmlDocument2;
i, j: integer;
iDisp: IDispatch;
iColl: IHTMLElementCollection;
iSel: IHTMLSelectElement;
iOpt: IHTMLOptionElement;
hr: HRESULT;

begin
oper.clear;

hr:= WebBrowser1.ControlInterface.Document.QueryInterface(IHtmlDocument2,
iDoc);

if Failed(hr) then
Exit;

iDisp:= iDoc.all.tags('SELECT');

if not assigned(iDisp) then
Exit;

hr:= iDisp.QueryInterface(IHTMLElementCollection, iColl);

if Failed(hr) then
Exit;

for i:= 1 to iColl.length do
begin
iDisp:= iColl.item(Pred(i), Pred(i));
hr:= iDisp.QueryInterface(IHTMLSelectElement, iSel);

if (not Failed(hr)) and (iSel.name = 'home') then
begin
for j:= 1 to iSel.length do
begin
iDisp:= iSel.item(Pred(j), Pred(j));
hr:= iDisp.QueryInterface(IHTMLOptionElement, iOpt);

if not Failed(hr) then
oper.Items.Add(iOpt.value);
end;

Break;
end;
end;
end;
Неизвестный
30.07.2008, 12:51
общий
Спасибо Denisss но всеровно таже проблема все странны дублируются, а (oper.clear - не доступна операция).
Denisss посмотрите пожалуйста самы первый вопрос на форму select там первый (optionvalue =0) от тоже добавляется в combobox и тоже дублируется, а вместо 0 должно быть (Выбор страны)
Denisss может проблема в том, что идет два одинаковых имени( <OPTION value=Украина(+3)>Украина (+3)</OPTION>) поэтому и дублируется. Если смотреть как Html страницу то получаеться


Метка элемента Значение

Выбор страны 0
Украина Украина
Россия Россия
Получаеться мне надо (Метка элемента), а у меня в combobox и (метка) и (значение) заноситься.
Denisss пожалуйста разберитесь, потому что я пока в таких делах слаб, а очень нужно это сделать, это единственная проблема моя, с input, textarea,submit я разобрался.
Заранее благодарень за помощь и ответы
Неизвестный
30.07.2008, 18:57
общий
Цитата: 220374
oper.clear - не доступна операция

Странно, вроде это стандартный метод класса TComboBox. Вместо нее можно использовать:
Код:
oper.Items.Clear;


Также рекомендую Вам внимательнее просмотреть обработчики событий используемого компонента TWebBrowser - возможно Вы где-то еще делаете обработку, что добавляет дубликаты в список.
Неизвестный
30.07.2008, 23:30
общий
Denisss спасибо большое, когда oper.item.clear то все нормально не дублируеться но (0) всеровно вместо Выбор города, да не важно это, спасибо.
Помоги организовать вот такую функцию:
oper.itemindex:=iOpt.value; - я так понял здесь нужно организовать не (value) а (selected)? но как я не знаю.
писал так iopt.selected:=oper.itemindex; - пишет Incompatible type String
тоесть то что мы сделали надо наоборот, чтобы при выборе в combobox выбиралось и на сайте в select
Неизвестный
31.07.2008, 19:57
общий
это ответ

Здравствуйте, [b]Oneboyfriend[/b]!

Пример находится в приложении. oper - объект класса TComboBox.

Если в тексте страницы имеется не один элемент с именем (name) 'home', то придется усложнить код:
1. С помощью iDoc.all.tags('SELECT') получаете коллекцию (iColl: IHTMLElementCollection) элементов с тэгом SELECT;
2. Перебираете элементы коллекции (IHTMLSelectElement), пока не найдете элемент с именем 'home' (он и будет сохранен в переменной iSel).

Удачи!

Приложение:
// Событие WebBrowser1.OnDocumentComplete
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
i: Integer;
iDoc: IHtmlDocument2;
iSel: IHTMLSelectElement;
iOpt: IHTMLOptionElement;
begin
// Очищаем список
oper.Items.Clear;

if Failed(WebBrowser1.ControlInterface.Document.QueryInterface(IHtmlDocument2,
iDoc))
then
Exit;

// Находим элемент SELECT с именем home
if Supports(iDoc.all.item('home', 0), IHTMLSelectElement, iSel) then
begin
// Перебираем пункты OPTION
for i:= 1 to iSel.length do
begin
if Supports(iSel.item(Pred(i), Pred(i)), IHTMLOptionElement, iOpt) then
// Заносим элемент в список
oper.Items.Add(iOpt.text);
end;

// Устанавливаем индекс выделенного по умолчанию элемента
oper.ItemIndex:= iSel.selectedIndex;
end;
end;

// Событие oper.OnClick
procedure TForm1.operClick(Sender: TObject);
var
iDoc: IHtmlDocument2;
iSel: IHTMLSelectElement;
begin
if Failed(WebBrowser1.ControlInterface.Document.QueryInterface(IHtmlDocument2,
iDoc))
then
Exit;

// Ищем элемент SELECT с именем home
if Supports(iDoc.all.item('home', 0), IHTMLSelectElement, iSel) then
// Устанавливаем выбранный индекс
iSel.selectedIndex:= oper.ItemIndex;
end;
Форма ответа