Einzelnen Beitrag anzeigen

Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#9

AW: Drag & Drop in TWebBrowser funtioniert nicht

  Alt 17. Mär 2014, 14:18
Hallo,

Zitat:
[...] Beim Drag auf eine textarea stürzt das Programm mit einer Exception ab [...]
Tut mir leid, das war mein Fehler: Wenn Du was auf eine Textarea ziehst, dann ist das natürliche ein IHTMLTextAreaElement und kein IHTMLInputElement - und dann scheppert es bei der Zuweisung FDropTarget := i .

Zitat:
Das zweite Problem entsteht weil ich nicht nur ein Label verschieben will, sondern mehrere (nacheinander). Ich hatte gehofft, es würde ausreichen wenn ich die Label einfach alle nacheinander unter [...] eintrage aber dann wird nur der jeweils letzte Eintrag berücksichtig [...]
Naja, das ist schon klar, oder?

Zitat:
Mein Lösungsversuch war eine if-Weiche einzubauen und dabei abzufagen auf welches Label beim Verschieben aktuell geklickt wird [...]
Der Eventhandler DragDrop hat auch einen Parameter Source, den man auswerten kann.

Der Code dem angepasst sieht so aus:
Delphi-Quellcode:
  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    procedure WebBrowser1DragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure WebBrowser1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
  private
    { Private-Deklarationen }
    FDropTarget : IDispatch; // <--- Aufpassen!
  public
    { Public-Deklarationen }
  end;

procedure TForm1.WebBrowser1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  i : IHTMLInputElement;
  t : IHTMLTextAreaElement;
begin
  if Assigned (FDropTarget) then
     begin
       if Succeeded (FDropTarget.QueryInterface (IHTMLTextAreaElement, t)) then
         t.value := TLabel (Source).Caption
       else
         if Succeeded (FDropTarget.QueryInterface (IHTMLInputElement, i)) then
           i.value := TLabel (Source).Caption;

       FDropTarget := nil
     end
end;

procedure TForm1.WebBrowser1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
var
  d : IHTMLDocument2;
  e : IHtmlElement;
  i : IHTMLInputElement;
  s, t : string;
begin
  FDropTarget := nil;
  if (Source is TLabel) and Assigned (WebBrowser1.Document) then
    begin
     d := WebBrowser1.Document as IHTMLDocument2;
     e := d.elementFromPoint (X, Y);
     if Assigned (e) then
       begin
         s := LowerCase (e.tagName);
         if (s = 'input') or (s = 'textarea') then
           begin
             if s = 'textareathen
               FDropTarget := e
             else
               begin
                 i := e as IHTMLInputElement;
                 t := LowerCase (i.type_);
                 if (t = 'text') or (t = 'password') then
                   FDropTarget := e
               end
           end
       end
    end;

  Accept := Assigned (FDropTarget)
end;
Vielleicht hilft 's weiter.

Gruß
Volker Zeller
  Mit Zitat antworten Zitat