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 = 'textarea' then
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ß