Как в webbriwser-е обновить конкретный фрейм, а не весь борузер?
Это опять Я! :)))))
У меня есть пару проблемок :)))) (как всегда)
Вопрос № 1!
Как в webbriwser-е обновить конкретный фрейм(например 2), а не весь борузер?
Только плизззз не надо вставлять недоделанный код, потому, что я СОВСЕМ тупой и в недоделанном или с ошибками разобраться не смогу....
Вопрос № 2!
У меня стоит процерурка изъятия ХТМЛ кода...
if (web1.Busy=false) and (Web1.ReadyState >= READYSTATE_COMPLETE) then
begin
richedit1.Text:='';
Frames:=Web1.OleObject.Document.Frames;
if Frames.Length=0 then
begin
richedit1.Text:='';
Document := Web1.Document as IHtmlDocument2;
if Document <> nil then
begin
richedit1.Text := (Document.all.Item(NULL, 0) as IHTMLElement).OuterHTML;
richedit2.Text := (Document.all.Item(NULL, 0) as IHTMLElement).innerTEXT;
zagr1:=true;
label1.Color:=cllime;
end;
end;
if Frames.Length>=2 then
begin
doc := web1.Document as IHTMLDocument2; // wb:TWebBrowser
frm_col := doc.Frames as IHTMLFramesCollection2;
if (frm_col.Length-1)>=2 then
for i:=0 to frm_col.Length-1 do
begin
index := OleVariant(i);
win := IUnknown(frm_col.item(index)) as IHTMLWindow2;
if (Assigned(win.document)) and ((frm_col.Length-1)=i) then
begin
Frames:=Web1.OleObject.Document.Frames;
richedit1.text:=Frames.item(2).document.body.innerHTML;
richedit2.text:=Frames.item(2).document.body.innerTEXT;
for j:=1 to richedit2.Lines.Count do
if (richedit2.Lines.Strings[j]='') or (richedit2.Lines.Strings[j]=' ')or (richedit2.Lines.Strings[j][1]=chr(10)) or (richedit2.Lines.Strings[j][1]=chr(13)) then richedit2.Lines.Delete(j);
zagr1:=true;
label1.Color:=cllime;
end;
end;
end;
end;
Так вот, один из фреймов, часто сам обновляется (по джаве или еще чему то...) Я заткнул этот фрейм процедуркой:
procedure TForm1.Web1BeforeNavigate2(Sender: TObject;
const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);
begin
if (CHATbool=true)and(pos('show',url)>0) then cancel:=true;
end;
Но есть проблема..... Когда я его затыкаю(обновление фрейма), то достаточно часто(как пропрет!!!!) событие (Web1.ReadyState >= READYSTATE_COMPLETE) по ходу не проперает..... И в итоге броузер не загружен до конца.... Как это исправить?
Вопрос № 3!
Как мне обротиться к выпадающему списку на страничке, на КОНКРЕТНОМ фрейме, получить у него все его итемсы, выбрать нужный мне?
Вот процедурка, которую мне подкинули..
procedure TForm1.GetOptions(SelectObject: IHTMLSelectElement);
var i: Integer;
OPT: IHTMLOptionElement;
begin
for i:=0 to SelectObject.length-1 do
begin
OPT := SelectObject.item(i,0) as IHTMLOptionElement;
Memo1.Lines.Add(OPT.value + ' ' + OPT.text);
end;
end;
Но я же предупреждал, что я тупой, как пробка...... (Обращение к конкретному фрейму не прошло, ругается на разные ошибки :( )
Добрые люди, помогите такому иупому, как пробка, человеку, который плохо разбирается в программирование, дописать эту процедурку (на буттон клик + мне нужен 2-й фрейм....)
WebBrowser1.OleObject.Document.Frames.Item(frm_idx).Document.execCommand('refresh');
где frm_idx - индекс фрейма, который обновить нужно
№2
а почему бы не сделать так.... навигация с последующим ожиданием загрузки....
WebBrowser1.Navigate(URL);
while WebBrowser1.ReadyState < READYSTATE_COMPLETE do Application.ProcessMessages;
№3
WebBrowser1.OleObject.Document.Frames.Item(frm_idx).Document.Forms.Item(form_idx).Item(el_idx).SelectedIndex := sel_idx;
где frm_idx - индекс фрейма
form_idx - индекс формы, на которой выпад. список
el_idx - индекс выпад. списка на форме
sel_idx - индекс элемента, который выделить нада
зы: проверь почту... я те пример скинул по этой теме рабочий...