"Droppen" in ein bestimmtes Control
"Droppen" in ein bestimmtes Control
Hallo,
wenn man die LCL mit -dEnableWMDropFiles neu kompiliert, dann kann man ja bekanntlich (unter Windows) Dateien vom Explorer/Total Commander auf die eigene Form "droppen".
Wenn ich versuche ein anderes Control als das Hauptformular als "Drop-Ziel" zu aktivieren, z. B. ein Edit-Feld mit DragAcceptFiles(Edit1.Handle, TRUE) dann friert mir der Sender (Explorer/Total Commander) ein.
Wie macht Ihr das?
Gruß, Bernd.
wenn man die LCL mit -dEnableWMDropFiles neu kompiliert, dann kann man ja bekanntlich (unter Windows) Dateien vom Explorer/Total Commander auf die eigene Form "droppen".
Wenn ich versuche ein anderes Control als das Hauptformular als "Drop-Ziel" zu aktivieren, z. B. ein Edit-Feld mit DragAcceptFiles(Edit1.Handle, TRUE) dann friert mir der Sender (Explorer/Total Commander) ein.
Wie macht Ihr das?
Gruß, Bernd.
Re: "Droppen" in ein bestimmtes Control
Weiss nicht. Ich hatte mal eine Demo in den Bugtracker gehängt, bevor das in die LCL eingebaut war:
http://bugs.freepascal.org/view.php?id=8976
Soviel ich weiss, ging das damals.
Kannst ja mal damit probieren. Die anderen Targets würde ich auschalten.
http://bugs.freepascal.org/view.php?id=8976
Soviel ich weiss, ging das damals.
Kannst ja mal damit probieren. Die anderen Targets würde ich auschalten.
Re: "Droppen" in ein bestimmtes Control
Theo,
Dein Originalprogramm funktioniert bei mir mit Lazarus 0.9.24 unter Windows. Wenn ich aber ein Edit-Feld platziere und Deine TMainForm.FormCreate folgendermaßen verändere:
Dann habe ich das gleiche Problem, daß der Sender einfriert.
Gruß, Bernd.
Dein Originalprogramm funktioniert bei mir mit Lazarus 0.9.24 unter Windows. Wenn ich aber ein Edit-Feld platziere und Deine TMainForm.FormCreate folgendermaßen verändere:
Code: Alles auswählen
procedure TMainForm.FormCreate(Sender: TObject);
begin
{
fDropPanel:=TDropPanel.Create(Self);
fDropPanel.Parent:=Self;
fDropPanel.Align:=AlClient;
fDropPanel.Caption:='Drop Here';
fDropPanel.HandleNeeded;
HandleNeeded;
DragAcceptFiles(fDropPanel.Handle, True);
}
Edit1.HandleNeeded;
HandleNeeded;
DragAcceptFiles(Edit1.Handle, True);
end;
Dann habe ich das gleiche Problem, daß der Sender einfriert.
Gruß, Bernd.
Aber tut dein Edit auch WM_DROPFILES handeln?
Mach's mal gleich wie mit TDropPanel, also
P.S. mir hat die Implementierung in der LCL nie gefallen.
Wer will schon die ganze Form zum FileDrop Target machen?
Doch eher nur ein Synedit oder ein Panel, aber das geht mit der LCL Lösung nicht.
Ich benutze immer die Lösung welche ich in den Bugtracker gehängt habe.
Mach's mal gleich wie mit TDropPanel, also
Code: Alles auswählen
TDropEdit=Class(TEdit)
protected
procedure WMDropFiles(var Message: TMessage); message LM_DROPFILES;
end;
P.S. mir hat die Implementierung in der LCL nie gefallen.
Wer will schon die ganze Form zum FileDrop Target machen?
Doch eher nur ein Synedit oder ein Panel, aber das geht mit der LCL Lösung nicht.
Ich benutze immer die Lösung welche ich in den Bugtracker gehängt habe.
theo hat geschrieben:Aber tut dein Edit auch WM_DROPFILES handeln?
das hatte es tatsächlich nicht. Das Phänomen ist aber immer noch da. In Deiner Unit habe ich eigentlich nur TDropPanel durch TDropEdit ersetzt:
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Messages, LMessages, StdCtrls, ExtCtrls
{$IFDEF WINDOWS}
, windows
{$ENDIF}
, Buttons;
type
TDropEdit=Class(TEdit)
protected
procedure WMDropFiles(var Message: TMessage); message LM_DROPFILES;
// procedure WMDropFiles(var Message: TMessage); message WM_DROPFILES; kein Unterschied.
end;
{ TMainForm }
TMainForm = class(TForm)
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ private declarations }
fDropEdit: TEdit;
public
{ public declarations }
end;
var
MainForm: TMainForm;
implementation
uses dropfiles;
procedure TMainForm.FormCreate(Sender: TObject);
begin
fDropEdit:=TDropEdit.Create(Self);
fDropEdit.Parent:=Self;
fDropEdit.HandleNeeded;
HandleNeeded;
DragAcceptFiles(fDropEdit.Handle, True);
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
if fDropEdit.HandleAllocated then DragAcceptFiles(fDropEdit.Handle, False);
end;
procedure TDropEdit.WMDropFiles(var Message: TMessage);
var
Strings: TStringList;
i: Integer;
begin
Strings := DroppedFiles(Message);
try
MainForm.ListBox1.Items.Assign(Strings);
finally
Strings.Free;
end;
end;
initialization
{$I unit1.lrs}
end.
Gruß, Bernd.
_Bernd hat geschrieben:Das Phänomen ist aber immer noch da.
Dann weiss ich's auch nicht. Musst halt ein bisschen debuggen.
Kommt die Message eigentlich an? Kommt sie vielleicht beim Parent an?
Mach mal noch bei der Form auch
procedure WMDropFiles(var Message: TMessage); message LM_DROPFILES;
und schau mal mit Showmessage oder writeln ob irgendwer die Msg kriegt.
Vielleicht geht auch das fDropEdit.Handle flöten beim Showen.
Mach den mal auf Mausklick oder OnShow: DragAcceptFiles(fDropEdit.Handle, True);
theo hat geschrieben:_Bernd hat geschrieben:Das Phänomen ist aber immer noch da.
Dann weiss ich's auch nicht. Musst halt ein bisschen debuggen.
Kommt die Message eigentlich an? Kommt sie vielleicht beim Parent an?
Mach mal noch bei der Form auch
procedure WMDropFiles(var Message: TMessage); message LM_DROPFILES;
und schau mal mit Showmessage oder writeln ob irgendwer die Msg kriegt.
Vielleicht geht auch das fDropEdit.Handle flöten beim Showen.
Mach den mal auf Mausklick oder OnShow: DragAcceptFiles(fDropEdit.Handle, True);
Danke erstmal für Deine Hinweise. Ich werde Sie berücksichtigen. Das Dumme ist nur, daß mir jetzt auch teilweise das gesamte System (Windows 98 ) komplett einfriert
Gruß, Bernd.
theo hat geschrieben:Wusste gar nicht, das Win98 ein System ist.
Dafür ist es aber anscheinend das einzige BS, welches mit Deinem Drag and Drop zurecht kommt. Unter Windows 2000 und XP erscheint zwar der Drop-Cursor, aber die gedroppte Datei wird ignoriert.. Die Baustelle wird mir jetzt doch eine Nummer zu groß
Gruß, Bernd.
_Bernd hat geschrieben:theo hat geschrieben:Wusste gar nicht, das Win98 ein System ist.
Dafür ist es aber anscheinend das einzige BS, welches mit Deinem Drag and Drop zurecht kommt. Unter Windows 2000 und XP erscheint zwar der Drop-Cursor, aber die gedroppte Datei wird ignoriert.. Die Baustelle wird mir jetzt doch eine Nummer zu groß
Gruß, Bernd.
Du hast recht. Habe es eben unter Win2k probiert und es geht nicht mehr.
Ich könnte schwören dass es vor der LCL Integration von Dropfiles funktioniert hat.
Wie ich schon sagte, fand ich die LCL-Integration von Dropfiles schon immer eine schlechte Idee und das hatte ich damals auch schon hier erwähnt:
http://bugs.freepascal.org/view.php?id=8976 siehe:
"I'm not sure if integrating file-drop into the LCL is a good idea at all."
Das ganze ist völlig halbbacken und richtet mehr Schaden an, als es Gutes stiftet.
Abgesehen davon ist die Windows Lösung mehr oder weniger eine reine WinAPI Geschichte, die gar nichts mit meinem Code (GTK zentriert) zu tun hat aber offenbar jetzt durch die LCL-integration verhindert wird.
Christian hat geschrieben:Kann es sein, das AllowDropFiles in euren Forms false ist ?
@Christian:Das wollen wir ja gerade nicht.
@_Bernd: Wenn du in der LCL den Krempel auskommentierst, geht's wieder.
in win32callback.inc :
ca. Zeile 1757: HandleDropFiles; auskommentieren, LCL neu bauen.
Dann geht's auch mit dem TEdit.