Entwickler-Ecke

Internet / Netzwerk - Problem mit Formular ausfüllen


CABALxx - Mi 21.12.05 12:07
Titel: Problem mit Formular ausfüllen
Hallo Leute

Ich versuche gerade wieder einen Quizbot für einen Chat zu entwickeln, das ist mir bei einem anderen Chat auch mal recht gut gelungen, diesmal gibts jedoch massive Probleme wo ich hin kuck.

In nem anderen Thread wurde mir schon excellent geholfen, um aus dem Chat alle Quellcodes zu kriegen, das ging mit den functionen die ich vorher benutzt habe nämlich nicht mehr.

Jetzt hab ich wieder ein Problem:

Das Chat Formular lässt sich nicht ausfüllen. Sonst ging das immer ganz gut mit


Delphi-Quelltext
1:
2:
WebBrowser1.OleObject.Document.Frames.item('info').Document.Forms.item(0).Elements.item('message').value :='Richtige Antwort - ' + my_array2[t];
WebBrowser1.OleObject.document.Frames.item('info').Document.Forms.item(0).submit;



Aber bei diesem Chat funktioniert auch das nicht mehr.

Also hab ich mir von swissdelphiCenter folgenden Code zum ausfüllen von HTML Formularen geholt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
function FillForm(WebBrowser: TWebBrowser; FieldName: string; Value: string): Boolean; 
var 
  i, j: Integer; 
  FormItem: Variant; 
begin 
  Result := False; 
  //no form on document 
  if WebBrowser.OleObject.Document.all.tags('FORM').Length = 0 then 
  begin 
    Exit; 
  end
  //count forms on document 
  for I := 0 to WebBrowser.OleObject.Document.forms.Length - 1 do 
  begin 
    FormItem := WebBrowser.OleObject.Document.forms.Item(I); 
    for j := 0 to FormItem.Length - 1 do 
    begin 
      try 
        //when the fieldname is found, try to fill out 
        if FormItem.Item(j).Name = FieldName then 
        begin 
          FormItem.Item(j).Value := Value; 
          Result := True; 
        end
      except 
        Exit; 
      end
    end
  end
end;


der funktioniert bei Seiten ohne Frames auch wunderbar, nur da könnte man den weniger komplizierten Code nehmen den ich als erstes gepostet hab. Für Seiten mit Frames funktioniert der nicht, besonders nicht für den Chat, mit dem ich arbeite. Ich hab dann versucht, den Code umzuschreiben auf Frames:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
function TForm1.FillForm(WebBrowser: TWebBrowser; FieldName: string; Value: string): Boolean;
var
  i, j: Integer;
  FormItem: Variant;
  x : string;
begin
x:= Edit1.Text;
 
  for I := 0 to WebBrowser.OleObject.Document.Frames.item(x).Document.forms.Length - 1 do
  begin
    FormItem := WebBrowser.OleObject.Document.Frames.item(x).Document.forms.Item(I);
    for j := 0 to FormItem.Length - 1 do
    begin
      try 
        //when the fieldname is found, try to fill out
        if FormItem.Item(j).Name = FieldName then 
        begin
          FormItem.Item(j).Value := Value;
          Result := True;
        end
      except
        Exit;
      end;
    end;
  end;
end;



Hat aber nicht wirklich funktioniert, gibt mir ne Fehlermeldung aus bei


Quelltext
1:
for I := 0 to WebBrowser.OleObject.Document.Frames.item(x).Document.forms.Length - 1 do                    



Ich vermute es liegt am Frame name, der ist mir allerdings bekannt.

Weiss vll. jemand einen besseren Weg, um das Formular auszufüllen? Dabei ist wichtig, das keine eizelnen Frames extra geladen ( also praktisch die Seite neu geladen wird ) werden, weil lädt man irgendetwas neu, dann fliegt man aus dem Chat und die UID ändert sich wieder.

Bin dankbar für alle Ratschläge

MfG

CABALxx


Lannes - Mi 21.12.05 21:37

Hallo,

Wenn Du die Variable x so einbaust, bekommst Du den Fehler:

Delphi-Quelltext
1:
2:
3:
4:
var x : String;
//...
x := Edit1.Text; 
for I := 0 to WebBrowser.OleObject.Document.Frames.item(x).Document.forms.Length - 1 do

:arrow: Da hilft Dir ein Trick,
ich hab es zuerst nicht geglaubt :shock:, aber es funktioniert:

Delphi-Quelltext
1:
2:
3:
4:
var x : String;
//...
x := Edit1.Text; 
for I := 0 to WebBrowser.OleObject.Document.Frames.item(''+x+'').Document.forms.Length - 1 do


Es gibt auch noch diese andere Möglichkeit über das DOM-Objekt all auf Frames zuzugreifen:

Delphi-Quelltext
1:
2:
3:
4:
var sName : String;
//...  
  sName := WebBrowser1.OleObject.Document.all.tags('FRAME').Item(4).Name;
  Memo1.Lines.Add('Anzahl Forms: '+IntToStr(WebBrowser1.OleObject.Document.Frames.item(''+sName+'').Document.forms.Length));


Zum Nachlesen weiterer Infos kann ich das empfehlen:
SELFHTML: JavaScript/DOM/Objektreferenz [http://de.selfhtml.org/javascript/objekte/all.htm]

Ps.: Wann hast Du das letztemal Deine PN's gelesen?


CABALxx - Do 22.12.05 21:21

Hallo

Ich hab das grad mal probiert mit


Quelltext
1:
WebBrowser.OleObject.Document.Frames.item(''+x+'').Document.forms.Length - 1 do                    



und das funktioniert tatsächlich, auch wenns irgendwo doch schon schwer nachvollziehbar ist.

Danke dir schon zum zweiten mal vielmals.

Deine Lösungen funktionieren immer tadellos. Kennst dich gut aus mit Internetanwendungen von Delphi :D :D :D

Dank dir Lannes, normal häng ich an so eine Problem nimmer etwas länger :D .

PS: wegen der PN sry
ich krieg so wenige das ich eigentlich nie nach kucke. Tut mir leid.

Die Implementierung des Chats ist auch kein Problem mehr, ich geh über http://chat.rapidchat.de rein und geb einfach die passende ID ein.

Also nochmals big thx
jetzt sollte dem Quizbot nichts mehr im Wege stehen. Hoffe ich :) :)