Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Wieder einmal: Felder im WebBrowser ausfüllen (https://www.delphipraxis.net/188102-wieder-einmal-felder-im-webbrowser-ausfuellen.html)

Rued 31. Jan 2016 14:35

Wieder einmal: Felder im WebBrowser ausfüllen
 
Hallo!

Man kennt die Zeile für das Ausfüllen von Formularfeldern im WebBrowser:

Code:
WebBrowser1.OleObject.document.forms.item(0).elements.item('FELDNAME').value := Edit1.Text
Ist es möglich, den Namen der elements.item im Formular abzufragen? So etwas wie Findcomponent oder if ...name = 'FELDNAME' then

Was bei mir nicht funktioniert ist die Namensabfrage über:

Code:
  FormItem: Variant;
begin

...
   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                                          
        if FormItem.Item(j).Name = 'FELDNAME' then ...
Agiere ich "blind", funktioniert es:
Code:
for b := 0 to WebBrowser.OleObject.Document.all.tags('FORM').Length -1 do
         WebBrowser.OleObject.document.forms.item(b).elements.item('FELDNAME').value := 'Wert';
Geht es nicht eleganter?

Gruß

Rüd

ScharfeMietze 31. Jan 2016 14:46

AW: Wieder einmal: Felder im WebBrowser ausfüllen
 
Delphi-Quellcode:
for I := 0 to wb.OleObject.Document.forms.Length - 1 do begin
    FormItem := wb.OleObject.Document.forms.Item(I);
    for j := 0 to FormItem.Length - 1 do begin
     memo1.lines.Add(FormItem.Item(j).Name);
    end;
aber wenn du den feldnamen doch kennst,
Delphi-Quellcode:
Edit1.Text:= WebBrowser1.OleObject.document.forms.item(0).elements.item('FELDNAME').value
würde das auch gehen.

Was genau willst du den tun?

Gruß

Rued 31. Jan 2016 16:23

AW: Wieder einmal: Felder im WebBrowser ausfüllen
 
Zitat:

Zitat von ScharfeMietze (Beitrag 1328877)
...
Was genau willst du denn tun?

Gruß

Ich will ein Formularfeld im Webbrowser mit bekanntem Namen ausfüllen, ohne eine Schleife durchlaufen zu müssen.

Gruß

Rüd

ScharfeMietze 31. Jan 2016 18:49

AW: Wieder einmal: Felder im WebBrowser ausfüllen
 
Delphi-Quellcode:
WebBrowser1.OleObject.document.forms.item(0).elements.item('FELDNAME').value := Edit1.Text
tut doch genau das.

Falls in das Edit mit Copy&Paste eingefügt wird und ungewollte Leerzeicheichen mit drin sind.
Delphi-Quellcode:
WebBrowser1.OleObject.document.forms.item(0).elements.item('FELDNAME').value := Trim(Edit1.Text)
Du musst nur das 'FELDNAME' durch 'DenrealenNamendesFeldes' ersetzen.

Es sein das die .forms.item() nicht 0 ist.
Testen kann man das so
Delphi-Quellcode:
  try
   for I := 0 to 20 do
    begin
     WebBrowser1.OleObject.document.forms.item(I).elements.item('DenrichtigenNamendesFeldes').value:=Trim(Edit1.Text);
     ShowMessage(IntToStr(I));
    end;
  except
  end; // try
Gruß
SM;)

Rued 31. Jan 2016 20:48

AW: Wieder einmal: Felder im WebBrowser ausfüllen
 
Zitat:

Zitat von ScharfeMietze (Beitrag 1328895)
Delphi-Quellcode:
WebBrowser1.OleObject.document.forms.item(0).elements.item('FELDNAME').value := Edit1.Text
tut doch genau das.

Falls in das Edit mit Copy&Paste eingefügt wird und ungewollte Leerzeicheichen mit drin sind.
Delphi-Quellcode:
WebBrowser1.OleObject.document.forms.item(0).elements.item('FELDNAME').value := Trim(Edit1.Text)
Du musst nur das 'FELDNAME' durch 'DenrealenNamendesFeldes' ersetzen.

Es sein das die .forms.item() nicht 0 ist.
Testen kann man das so
Delphi-Quellcode:
  try
   for I := 0 to 20 do
    begin
     WebBrowser1.OleObject.document.forms.item(I).elements.item('DenrichtigenNamendesFeldes').value:=Trim(Edit1.Text);
     ShowMessage(IntToStr(I));
    end;
  except
  end; // try
Gruß
SM;)


Das ist genau die Lösung, die ich in meinem Ursprungs-Beitrag als "blind" bezeichne, da ich über eine Schleife operiere, die testet und den Wert somit nicht zielgerichtet setzt. Ich fragte nach einer eleganteren Lösung. Wenn es die nicht gibt, dann kann ich meinen Code halt nicht optimieren.

Gruß

Rüd

ScharfeMietze 31. Jan 2016 21:26

AW: Wieder einmal: Felder im WebBrowser ausfüllen
 
Du bekommst doch in der Message den Wert den du statt I einsetzen kannst um dann die Schleife wegzulassen.

Wahlweise kannst du auch statt dem Integer den 'Formnamen' eingeben.

Delphi-Quellcode:
embdwb1.OleObject.document.forms.item('vbform').elements.item('message').value := Value;
Delphi-Quellcode:
embdwb1.OleObject.Document.GetElementByID('Feldname').value := Value;
Kannst du auch testen.

Wenn du auf Embedded WB wechselst hast du z.B. FillForm, in dem du nur noch den Namen und die Message einträgst. Es gibt da schon einige Wege nach Rom.

Gruß
SM;)



Ps:
Delphi-Quellcode:
try                                        
        if FormItem.Item(j).Name = 'FELDNAME' then ...
Wenn ich das richtig sehe vergleichst du dort die FormNamen mit dem Feldnamen. Das sollte auch so nicht funktionieren.

Rued 1. Feb 2016 15:14

AW: Wieder einmal: Felder im WebBrowser ausfüllen
 
Zitat:

Zitat von ScharfeMietze (Beitrag 1328902)
Du bekommst doch in der Message den Wert den du statt I einsetzen kannst um dann die Schleife wegzulassen.

Wahlweise kannst du auch statt dem Integer den 'Formnamen' eingeben.

Delphi-Quellcode:
embdwb1.OleObject.document.forms.item('vbform').elements.item('message').value := Value;
Delphi-Quellcode:
embdwb1.OleObject.Document.GetElementByID('Feldname').value := Value;
Kannst du auch testen.

Wenn du auf Embedded WB wechselst hast du z.B. FillForm, in dem du nur noch den Namen und die Message einträgst. Es gibt da schon einige Wege nach Rom.

Gruß
SM;)

Also geht es nur über die Schleife...
Den Embedded habe ich lange Zeit eingebaut, wollte jetzt die "Fremd"-Komponenten `mal reduzieren.

Zitat:

Zitat von ScharfeMietze (Beitrag 1328902)
Ps:
Delphi-Quellcode:
try                                        
        if FormItem.Item(j).Name = 'FELDNAME' then ...
Wenn ich das richtig sehe vergleichst du dort die FormNamen mit dem Feldnamen. Das sollte auch so nicht funktionieren.

Da wirst Du wohl recht haben, hatte ich hier gefunden.

Gruß

Rüd

ScharfeMietze 1. Feb 2016 15:30

AW: Wieder einmal: Felder im WebBrowser ausfüllen
 
Normalerweise solltest du keine Schleife brauchen.

Du nimmst dir einen Button zum Testen mit
Delphi-Quellcode:
  try
   for I := 0 to 20 do
    begin
     WebBrowser1.OleObject.document.forms.item(I).elements.item('DenrichtigenNamendesFeldes').value:=Trim(Edit1.Text);
     ShowMessage(IntToStr(I));
    end;
  except
  end; // try
Wenn eine Message aufgeht mit einer Zahl, nimmst du dir einen weiteren Button und trägst einfach,
Delphi-Quellcode:
procedure Tfrm1.btn1Click(Sender: TObject);
begin
WebBrowser1.OleObject.document.forms.item('DieZahlausderMessage').elements.item('DenrichtigenNamendesFeldes').value:=Trim(Edit1.Text);
end;
ein.

Rued 1. Feb 2016 15:56

AW: Wieder einmal: Felder im WebBrowser ausfüllen
 
Zitat:

Zitat von ScharfeMietze (Beitrag 1328984)
Normalerweise solltest du keine Schleife brauchen.

Du nimmst dir einen Button zum Testen mit
Delphi-Quellcode:
  try
   for I := 0 to 20 do
    begin
     WebBrowser1.OleObject.document.forms.item(I).elements.item('DenrichtigenNamendesFeldes').value:=Trim(Edit1.Text);
     ShowMessage(IntToStr(I));
    end;
  except
  end; // try
Wenn eine Message aufgeht mit einer Zahl, nimmst du dir einen weiteren Button und trägst einfach,
Delphi-Quellcode:
procedure Tfrm1.btn1Click(Sender: TObject);
begin
WebBrowser1.OleObject.document.forms.item('DieZahlausderMessage').elements.item('DenrichtigenNamendesFeldes').value:=Trim(Edit1.Text);
end;
ein.

Ich habe das schon verstanden. Aber zum "Testen" brauchst Du sehr wohl eine Schleife und ich suchte nach einer Möglichkeit, die bspw. der parent-Eigenschaft oder Ähnlichem entspricht. Also ohne Test, ohne try and error.

Hintergrund ist, dass ich eine Vielzahl verschiedener Formulare habe. Aber ich mache es jetzt mit der Test-try-and-error-Schleife.

Danke Dir!

Gruß

Rüd

ScharfeMietze 1. Feb 2016 16:20

AW: Wieder einmal: Felder im WebBrowser ausfüllen
 
Es ist schwierig dir bei ungenauen Angaben zu helfen!!
Zitat:

Ich will ein Formularfeld im Webbrowser mit bekanntem Namen ausfüllen, ohne eine Schleife durchlaufen zu müssen.
nun sagst du
Zitat:

Hintergrund ist, dass ich eine Vielzahl verschiedener Formulare habe.
Daher wären mehr Details von Vorteil. Da man natürlich auch wenn die Formulare bekannt sind was tun kann.

Delphi-Quellcode:
embdwb1.OleObject.Document.GetElementByID('Feldname').value := trim(edit1.text);
mal probiert?

Rued 2. Feb 2016 11:04

AW: Wieder einmal: Felder im WebBrowser ausfüllen
 
Zitat:

Zitat von ScharfeMietze (Beitrag 1328995)
Es ist schwierig dir bei ungenauen Angaben zu helfen!!
Zitat:

Ich will ein Formularfeld im Webbrowser mit bekanntem Namen ausfüllen, ohne eine Schleife durchlaufen zu müssen.
nun sagst du
Zitat:

Hintergrund ist, dass ich eine Vielzahl verschiedener Formulare habe.
Daher wären mehr Details von Vorteil. Da man natürlich auch wenn die Formulare bekannt sind was tun kann.

Ich denke nicht, dass ich da einen Widerspruch formuliert habe, da die Lösung, die bei einem Formular funktioniert, auch bei anderen funktioniert, die sich lediglich durch unterschiedlich bezeichnete Feldnamen unterscheiden. Zum Beispiel nennt das eine das Eingabefeld für den Namen "Name", das andere Formular nennt es "Zuname". Wenn ich weiß, wie ich im Formular 1 das Feld "Name" anspreche, weiß ich, wie ich - im gleich aufgebauten - Formular 2 das Feld "Zuname" anspreche.
Zitat:

Zitat von ScharfeMietze (Beitrag 1328995)
Delphi-Quellcode:
embdwb1.OleObject.Document.GetElementByID('Feldname').value := trim(edit1.text);
mal probiert?

Das "GetElementByID" klang so verlockend nach dem Gesuchten (s. o. Findcomponent), dass ich jetzt mein Programm doch auf den EmbeddedWB umgebaut habe. Leider ohne Erfolg, erhalte die Fehlermeldung "Ungültige Variantenoperation".

Gruß

Rüd

p80286 2. Feb 2016 11:38

AW: Wieder einmal: Felder im WebBrowser ausfüllen
 
Zitat:

Zitat von Rued (Beitrag 1329057)
Das "GetElementByID" klang so verlockend nach dem Gesuchten (s. o. Findcomponent), dass ich jetzt mein Programm doch auf den EmbeddedWB umgebaut habe. Leider ohne Erfolg, erhalte die Fehlermeldung "Ungültige Variantenoperation".

Gibt es auch einen Sourcecode, der in Bezug zu dieser Meldung steht?

Gruß
K-H

Rued 2. Feb 2016 12:03

AW: Wieder einmal: Felder im WebBrowser ausfüllen
 
Zitat:

Zitat von p80286 (Beitrag 1329064)
Zitat:

Zitat von Rued (Beitrag 1329057)
Das "GetElementByID" klang so verlockend nach dem Gesuchten (s. o. Findcomponent), dass ich jetzt mein Programm doch auf den EmbeddedWB umgebaut habe. Leider ohne Erfolg, erhalte die Fehlermeldung "Ungültige Variantenoperation".

Gibt es auch einen Sourcecode, der in Bezug zu dieser Meldung steht?

Gruß
K-H

Ja, gibt es:
Code:
a := PC1.ActivePage.Tag;
fr := TFrame(Findcomponent('FrBrow'+inttostr(a)));
Bro:= TEmbeddedWB(fr.Findcomponent('Web1'));
Bro.OleObject.Document.GetElementByID('Name').value := 'Meyer';
Gruß

Rüd

nahpets 2. Feb 2016 12:35

AW: Wieder einmal: Felder im WebBrowser ausfüllen
 
Naja,

wenn
Delphi-Quellcode:
Bro.OleObject.Document.GetElementByID('Name').value
nicht gefunden wird, dann knallt es bei der Zuweisung.

Warum es nicht gefunden wird, kannst Du hier http://www.w3schools.com/jsref/met_d...lementbyid.asp nachvollziehen.

ID <> Name

Wenn Du ein Formularfeld über den Namen suchst, dann solltest Du es über den Namen suchen: http://www.w3schools.com/jsref/met_d...entsbyname.asp

Ggfls. solltest Du vor der Zuweisung eines Werte auch prüfen, ob das Feld gefunden wurde.

Rued 2. Feb 2016 12:53

AW: Wieder einmal: Felder im WebBrowser ausfüllen
 
Zitat:

Zitat von nahpets (Beitrag 1329072)
...

Ggfls. solltest Du vor der Zuweisung eines Werte auch prüfen, ob das Feld gefunden wurde.

Peinlicher Fehler meinerseits. Habe Groß- und Kleinschreibung missachtet. Wenn ich nach 'NAME' suche, klappt es!

Ich danke Euch!

Gruß

Rüd


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz