Autor Beitrag
susi_777
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Do 08.02.07 08:01 
Hallo,

ich habe unter www.delphi-library.d...r+arbeiten_8482.html eine Unit gefunden mit der sich Felder im Webbrowser füllen lassen.
Leider gibt es die Einschränkung:
Zitat:
Kommt ein Feldname in mehreren Frames vor, wird immer der aus dem ersten Frame verwendet. Es sollte allerdings kein Problem sein für diesen Fall die Routinen zu anzupassen.


Und genau das ist für meine Bedürfnisse nicht zweckmäßig. Es sollte so sein, dass der Wert des mehrfach vorkommenden Feldnamens in allen Frames gesetzt wird.
Und genau bei der Aufhebung dieser Einschränkung beiße ich mir die Zähne aus.

Ich vermute, die Anpassung muss in der WbSetEditField vorgenommen werden.
Nur wie?
Mein Versuch war dieser:
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:
// 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;
  I, j : integer;
  FormItem: Variant;
begin

  //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
            // 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;
  end;
end;


Aber leider brachte das keine Änderung.
Wie und wo muss ich ansetzen, damit ein Feld in allen Forms ersetzt wird?
Schönen Gruß
Susi
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 08.02.07 10:48 
ausblenden Delphi-Quelltext
1:
WebBrowser.OleObject.Document.frames(0).Document.forms...					

So solltest du auf den ersten Frame zugreifen können.

Hier was dazu:
www.codeguru.com/for...wthread.php?t=307192

// EDIT:
Der Fehler bei deinem Versuch ist, dass du beim ersten "Nichtfund" aus der gsnzen Prozedur rausgehst:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
            // Position des Felds holen  
            if not WbFindField(WebBrowser, FieldName, Field) then  
              begin  
              Result := false;  // Feld existiert nicht  
              exit;             // Ende  
              end;

Es soll doch aber weitergesucht werden!
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
            // Position des Felds holen  
            if not WbFindField(WebBrowser, FieldName, Field) then  
              begin  
                Continue;         // nächster Schleifendurchlauf
              end
              else
                Result := True;
susi_777 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Do 08.02.07 20:08 
Hallo,

ich danke Dir schon mal - wieder - für Deine Unterstützung.
Nach der Umsetzung mit Deinem Tipp sieht das bei mir so aus:

ausblenden 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 WbSetEditField(WebBrowser: TWebBrowser; FieldName: string; Value: string): Boolean;  
var  
  Field: TPoint;
  I, j : integer;
  FormItem: Variant;
begin

  //Bearbeite alle Frames

  for I := 0 to WebBrowser.OleObject.Document.frames.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
             // Position des Felds holen    
            if not WbFindField(WebBrowser, FieldName, Field) then    
              begin
                Continue;         // nächster Schleifendurchlauf
              end  
              else  
                WebBrowser.OleObject.Document.forms.Item(Field.x).Item(Field.y).Value := Value;
                Result := True;
    end;
  end;
end;


Leider habe ich es wohl nicht richtig umgesetzt. Das Ergebnis ist nun:

In Webseiten mit nur einem Frame wird jetzt das Feld gar nicht gesetzt, und in Webseiten mit 2 Frames wird das Feld wieder nur im 1. Frame gesetzt. Das Feld im 2. Frame bleibt leider wieder leer.
Was habe ich falsch gemacht oder anders wie muss die Schleife richtig aufgebaut werden?
susi_777 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Mi 21.02.07 17:35 
Sorry, aber ich muss das jetzt mal *pushen*, denn ich hänge immer noch an diesem Problem.
Kann wirklich keiner helfen?

Gruß
Susi