Announcement

Collapse
No announcement yet.

Web-Formular mit Delphi-Anwendung ausfüllen lassen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Web-Formular mit Delphi-Anwendung ausfüllen lassen

    Hallo,

    ich arbeite jetzt bei einer Internetagentur als Suchmaschinenoptimierer.
    Wir haben ein Content Management System mit Adressmodul (Web-Formular).

    Ich möchte mit Delphi 5 eine Anwendung schreiben, die unter Vorgabe eines bestimmten Textes, dass Web-Flormular automatisch ausfüllt.

    Nachfolgend der Code von dem Programmfenster, welches die Auswahl des Zielfensters regelt:
    Code:
    procedure TTask.LstFensterClick(Sender: TObject);
    begin
      anwendung := LstFenster.Items[LstFenster.itemindex];
      WindowHandlesave := strtoint(TempList.strings[LstFenster.itemindex]);
    end;
    
    procedure TTask.FormShow(Sender: TObject);
    begin
      TempList := TStringList.create;
      LstFenster.Clear;
      EnumWindows(@EnumWindProc,0);
    end;
    
    procedure TTask.BtnCancelClick(Sender: TObject);
    begin
      canclose1 := true;
      close;
    end;
    
    procedure TTask.btnokClick(Sender: TObject);
    var
    i : integer;
    begin
        i := LstFenster.ItemIndex;
        if i  <> -1 then begin
        WindowHandlesave := StrToInt(TempList[i]);
        close;
        end else begin
        raise exception.create('Es wurde kein Fenster ausgewählt');
        end;
    end;
    
    procedure TTask.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      TempList.destroy;
    end;
    Das ist die Prozedur die das Formular ausfüllen soll:

    Code:
    procedure TFrmMain.TextSenden;
    
    (*
      function ForceForegroundWindow(hWnd: THandle): BOOL;
      var
        hCurWnd: THandle;
      begin
        hCurWnd := GetForegroundWindow;
        AttachThreadInput(GetWindowThreadProcessId(hCurWnd, nil),
                          GetCurrentThreadId, True);
        Result := SetForegroundWindow(hWnd);
        AttachThreadInput(GetWindowThreadProcessId(hCurWnd, nil),
                          GetCurrentThreadId, False);
      end;
    *)
    
    function ForceForegroundWindow(hwnd: THandle): Boolean;
    const
      SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
      SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
    var
      ForegroundThreadID: DWORD;
      ThisThreadID: DWORD;
      timeout: DWORD;
    begin
      if IsIconic(hwnd) then ShowWindow(hwnd, SW_RESTORE);
    
      if GetForegroundWindow = hwnd then Result := True
      else
      begin
        // Windows 98/2000 doesn't want to foreground a window when some other
        // window has keyboard focus
    
        if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4)) or
          ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and
          ((Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and
          (Win32MinorVersion > 0)))) then
        begin
          // Code from Karl E. Peterson, www.mvps.org/vb/sample.htm
          // Converted to Delphi by Ray Lischner
          // Published in The Delphi Magazine 55, page 16
    
          Result := False;
          ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow, nil);
          ThisThreadID := GetWindowThreadPRocessId(hwnd, nil);
          if AttachThreadInput(ThisThreadID, ForegroundThreadID, True) then
          begin
            BringWindowToTop(hwnd); // IE 5.5 related hack
            SetForegroundWindow(hwnd);
            AttachThreadInput(ThisThreadID, ForegroundThreadID, False);
            Result := (GetForegroundWindow = hwnd);
          end;
          if not Result then
          begin
            // Code by Daniel P. Stasinski
            SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0);
            SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0),
              SPIF_SENDCHANGE);
            BringWindowToTop(hwnd); // IE 5.5 related hack
            SetForegroundWindow(hWnd);
            SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(timeout), SPIF_SENDCHANGE);
          end;
        end
        else
        begin
          BringWindowToTop(hwnd); // IE 5.5 related hack
          SetForegroundWindow(hwnd);
        end;
    
        Result := (GetForegroundWindow = hwnd);
      end;
    end; { ForceForegroundWindow }
    
    
    
    
    
    
    var
    text1,vZeile,Restort : string;
    z,k: integer;
    begin
      Restort := '';
      vZeile := '';
      text1 := MmoText.lines[0];
      if length(text1) = 0 then text1 := '                    ';
      if text1[1] = ' ' then system.delete(text1,1,1);
      if length(text1) < 7 then text1 := text1 + '                ';
    
      ForceForegroundWindow(WindowHandlesave);
    
      //For-Schleife durchläuft Memofeld und sendet den Inhalt zeilenweise an ein Web-Formular
      For z := 0 to MmoText.lines.count-1 do
        begin
    
        vZeile := MmoText.lines[z];
        vZeile := StringReplace(vZeile,'+49','0',[]);
    
        if z+1 = StrToInt(CbxPlZ.Text) then
          begin
          //Wenn in der Zeile 2 Elemente mit Leerzeilen getrennt sind, dann PLZ und Ort
          if strelementcount(vZeile, ' ') >= 1 then
             begin
             SendKeys(pchar(strnelement(vZeile,' ',1)),true);
             sendkeys('{TAB}' ,true);
             Restort :=  Loeschestring(vZeile,strnelement(vZeile,' ',1));
             //ShowMessage(Restort);
             SendKeys(pchar(Restort),true);
             sendkeys('{TAB}' ,true);
             Continue;
             end;
          end;
    
        //Inhalt der Adresszeile ins Eingabefeld schreiben
        SendKeys(pchar(vZeile),true);
    
        //Per Tabulatortaste ins nächste Eingabefeld
        sendkeys('{TAB}' ,true);
    
        //Karte überspringen
        if z = 7 then
          begin
          for k := 0 to strtoint(cbxkarte.text) do  sendkeys('{TAB}' ,true);
          end;
        end;
    
         application.bringtofront;
         ForceForegroundWindow(application.handle);
    end;
    Unter Windows 7 (mein Laptop) tut das ding perfekt.
    Unter Vista und XP nicht.


    nicht funktionieren bedeutet bei dem einen PC, dass der Text gar nicht im Adressmodul(=Formular) landet.

    Beim anderen PC füllt er die Eingabefelder korrekt aus, bis eine google-maps karte kommt und danach landen die texte nicht mehr in den richtigen Eingabefeldern.

    Wer hat eine Idee wie ich das Problem löse?


    Herzliche Grüße


    Markus Lemcke

  • #2
    Wer hat eine Idee wie ich das Problem löse?
    In dem du schaust, warum die Felder nicht mehr ausgefüllt werden. Wahrscheinlich werden die Browser der anderen Betriebssysteme die Seite leicht anders rendern, so das deine ganzen impl. Annahmen nicht mehr zutreffen. Oder es gelten andere Einstellungen bezüglich der TAB.

    Die Vorgehensweise das Fenster zu holen und TAB- und Tastaturdrücke zu simulieren halte ich für falsch. Das führt zu den geschliderten Problemen. Besser wäre, die Seite mit einem Request holen, Daten auszufüllen und ein Response zu senden. Das wäre sauber.
    Christian

    Comment


    • #3
      Hi Christian,

      vielen Dank für Deine Antwort.
      Habe zum letzten mal vor ca. 5 Jahren mit Delphi programmiert. Habe keine Ahnung wie das mit dem Request umgesetzt wird.

      Hast Du paar Codezeilen zu beginn?

      Comment


      • #4
        Nein habe keine Codezeilen für Delphi
        Christian

        Comment

        Working...
        X