Autor Beitrag
Matthias
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 121



BeitragVerfasst: Di 11.03.03 15:54 
Sollen z.B. Edit Felder in einem Web-Formular ausgefüllt werden, ist es notwendig auf die ActiveX Schnittstelle des Webbrowser zu zugreifen. Die hier vorgestellte Unit stellt als Beispiele das Lesen und Schreiben von Editfeldern, das Lesen und Schreiben von Check Boxen, sowie das Betätigen von Buttons vor.

Die Routinen funktionieren auch, wenn eine Seite aus mehreren Frames besteht. Allerding mit einer Einschränkung: Kommt ein Feldname in mehreren Frames vor, wird immer der aus dem ersten Frame verwendet. Dies kann insbesondere beim "submit" - Button vorkommen. Es sollte allerdings kein Problem sein für diesen Fall die Routinen zu anzupassen.
ausblenden volle Höhe 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:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
unit WbCtrl;

interface

uses Windows, Classes, Forms, ShDocVw, WinInet, ActiveX;

function WbEnumFields(WebBrowser: TWebBrowser; SL: TStrings): Boolean;
function WbSetEditField(WebBrowser: TWebBrowser; FieldName: string; Value: string): Boolean;
function WbGetEditField(WebBrowser: TWebBrowser; FieldName: stringvar Value: string): Boolean;
function WbSetCheckBoxField(WebBrowser: TWebBrowser; FieldName: string; Checked: boolean): Boolean;
function WbGetCheckBoxField(WebBrowser: TWebBrowser; FieldName: stringvar Checked: boolean): Boolean;
function WbBtnClick(WebBrowser: TWebBrowser; FieldName: string): Boolean;

implementation

// Lese alle Feldnamen aus
// Übergabe:
// Webbroweser: Webbrowser, der die aktuelle Seite enthält
// Sl         : Die Stringlist zu der alle Feldnamen hinzugefügt werden sollen
// Result     : true  -> Feld existiert
//            : false -> Feld existiert nicht
//                       oder kein Dokument geladen
function WbEnumFields(WebBrowser: TWebBrowser; SL: TStrings): Boolean;
var
  i, j: Integer;
  FormItem: Variant;
begin
  Result := True;
  //Hat das Dokument Forms? (Frames)
  if WebBrowser.OleObject.Document.all.tags('FORM').Length = 0 then
  begin
    Result := False;
    Exit;
  end;
  //Bearbeite alle Frames
  for I := 0 to WebBrowser.OleObject.Document.forms.Length - 1 do
  begin
    FormItem := WebBrowser.OleObject.Document.forms.Item(I);
    // Bearbeite alle Felder eines Frames
    for j := 0 to FormItem.Length - 1 do
    begin
      try
        SL.Add(FormItem.Item(j).Name);
      except
        Result := False;
        Exit;
      end;
    end;
  end;
end;

// Durchsuche alle Formulare im Webbrowser nach dem Feldnamen
// Übergabe:
// Webbroweser: Webbrowser, der die aktuelle Seite enthält
// FieldName  : Name des gesuchten Felds
// Rückgabe
// Field      : Field.x : Frame Nummer
//            : Fielf.y : Feld Nummer im Frame
// Result     : true  -> Feld existiert
//            : false -> Feld existiert nicht
//                       oder kein Dokument geladen
function WbFindField(WebBrowser: TWebBrowser; FieldName: stringvar Field: TPoint): boolean;
var
  i, j: Integer;
  FormItem: Variant;
begin
  Result := False;
  //Hat das Dokument Forms? (Frames)
  if WebBrowser.OleObject.Document.all.tags('FORM').Length = 0 then
  begin
    Exit;
  end;
  //Bearbeite alle Frames
  for I := 0 to WebBrowser.OleObject.Document.forms.Length - 1 do
  begin
    FormItem := WebBrowser.OleObject.Document.forms.Item(I);
    // Bearbeite alle Felder eines Frames
    for j := 0 to FormItem.Length - 1 do
    begin
      try
        // Feldname wurde gefunden
        // gebe ihn zurück und ende
        if FormItem.Item(j).Name = FieldName then
        begin
          Field.x := i;          // Position speichern
          Field.Y := j;
          Result := True;
          exit;
        end;
      except
        Exit;
      end;
    end;
  end;
end;

// Trage Text in ein Editfeld ein
// Übergabe:
// Webbroweser: Webbrowser, der die aktuelle Seite enthält
// FieldName  : Name des gesuchten Felds
// Rückgabe
// Value      : Der Text, der in das Feld hinein soll
// Result     : true  -> kein Fehler
//            : false -> Feld existiert nicht
//                       oder kein Dokument geladen
function WbSetEditField(WebBrowser: TWebBrowser; FieldName: string; Value: string): Boolean;
var
  Field: TPoint;
begin
  // Position des Felds holen
  if not WbFindField(WebBrowser, FieldName, Field) then
  begin
    Result := false;  // Feld existiert nicht
    exit;             // Ende
  end;
  try
    // Feld füllen
    WebBrowser.OleObject.Document.forms.Item(Field.x).Item(Field.y).Value := Value;
    Result := True;
  except
    Result := false;
    Exit;
  end;
end;

// Lese Text aus einem Editfeld
// Übergabe:
// Webbroweser: Webbrowser, der die aktuelle Seite enthält
// FieldName  : Name des gesuchten Felds
// Rückgabe
// Value      : Text, der im Feld steht
// Result     : true  -> kein Fehler
//            : false -> Feld existiert nicht
//                       oder kein Dokument geladen
function WbGetEditField(WebBrowser: TWebBrowser; FieldName: stringvar Value: string): Boolean;
var
  Field: TPoint;
begin
  // Position des Felds holen
  if not WbFindField(WebBrowser, FieldName, Field) then
  begin
    Result := false;  // Feld existiert nicht
    exit;             // Ende
  end;
  try
    // Feld lesen
    Value := WebBrowser.OleObject.Document.forms.Item(Field.x).Item(Field.y).Value;
    Result := True;
  except
    Result := false;
    Exit;
  end;
end;

// Setze eine Checkbox
// Übergabe:
// Webbroweser: Webbrowser, der die aktuelle Seite enthält
// FieldName  : Name des gesuchten Felds
// Rückgabe
// Checked    : Zustand
// Result     : true  -> kein Fehler
//            : false -> Feld existiert nicht
//                       oder kein Dokument geladen
function WbSetCheckBoxField(WebBrowser: TWebBrowser; FieldName: string; Checked: boolean): Boolean;
var
  Field: TPoint;
begin
  // Position des Felds holen
  if not WbFindField(WebBrowser, FieldName, Field) then
  begin
    Result := false;  // Feld existiert nicht
    exit;             // Ende
  end;
  try
    // CheckBox setzen
    WebBrowser.OleObject.Document.forms.Item(Field.x).Item(Field.y).Checked := Checked;
    Result := True;
  except
    Result := false;
    Exit;
  end;
end;

// Lese eine Checkbox
// Übergabe:
// Webbroweser: Webbrowser, der die aktuelle Seite enthält
// FieldName  : Name des gesuchten Felds
// Rückgabe
// Checked    : Zustand
// Result     : true  -> kein Fehler
//            : false -> Feld existiert nicht
//                       oder kein Dokument geladen
function WbGetCheckBoxField(WebBrowser: TWebBrowser; FieldName: stringvar Checked: boolean): Boolean;
var
  Field: TPoint;
begin
  // Position des Felds holen
  if not WbFindField(WebBrowser, FieldName, Field) then
  begin
    Result := false;  // Feld existiert nicht
    exit;             // Ende
  end;
  try
    // CheckBox setzen
    Checked := WebBrowser.OleObject.Document.forms.Item(Field.x).Item(Field.y).Checked;
    Result := True;
  except
    Result := false;
    Exit;
  end;
end;

// Click einen Button
// Übergabe:
// Webbroweser: Webbrowser, der die aktuelle Seite enthält
// FieldName  : Name des Button
// Rückgabe
// Result     : true  -> kein Fehler
//            : false -> Feld existiert nicht
//                       oder kein Dokument geladen
function WbBtnClick(WebBrowser: TWebBrowser; FieldName: string): Boolean;
var
  Field: TPoint;
begin
  // Position des Felds holen
  if not WbFindField(WebBrowser, FieldName, Field) then
  begin
    Result := false;  // Feld existiert nicht
    exit;             // Ende
  end;
  try
    // CheckBox setzen
    WebBrowser.OleObject.Document.forms.Item(Field.x).Item(Field.y).Click;
    Result := True;
  except
    Result := false;
    Exit;
  end;
end;

end.


Mit
ausblenden Delphi-Quelltext
1:
WbEnumFields(WebBrowser1, ListBox1.Items);					

können alle Felder eine Seite gelesen werde.

Mit
ausblenden Delphi-Quelltext
1:
WbSetEditField(WebBrowser1, 'name''Matthias');					

kann z.B. ein Editfeld gefüllt werden.

:wave:
Matthias