"Droppen" in ein bestimmtes Control

_Bernd
Beiträge: 145
Registriert: Di 13. Feb 2007, 11:16

"Droppen" in ein bestimmtes Control

Beitrag von _Bernd »

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.

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: "Droppen" in ein bestimmtes Control

Beitrag von theo »

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.

_Bernd
Beiträge: 145
Registriert: Di 13. Feb 2007, 11:16

Re: "Droppen" in ein bestimmtes Control

Beitrag von _Bernd »

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:

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.

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Aber tut dein Edit auch WM_DROPFILES handeln?
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.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Man kann doch einfach im Ereignis abfragen obs ok ist.
Also

if not Edit1.Focused then exit;

dann erscheint der Drop Cursor natürlich weiterhin über der ganzen Form.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

_Bernd
Beiträge: 145
Registriert: Di 13. Feb 2007, 11:16

Beitrag von _Bernd »

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
Beiträge: 145
Registriert: Di 13. Feb 2007, 11:16

Beitrag von _Bernd »

Christian hat geschrieben:dann erscheint der Drop Cursor natürlich weiterhin über der ganzen Form.

das finde ich nicht so schön.

Gruß, Bernd.

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

_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);

_Bernd
Beiträge: 145
Registriert: Di 13. Feb 2007, 11:16

Beitrag von _Bernd »

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.

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

_Bernd hat geschrieben:Das Dumme ist nur, daß mir jetzt auch teilweise das gesamte System (Windows 98 ) komplett einfriert :-(


Wusste gar nicht, das Win98 ein System ist. :lol:

_Bernd
Beiträge: 145
Registriert: Di 13. Feb 2007, 11:16

Beitrag von _Bernd »

theo hat geschrieben:Wusste gar nicht, das Win98 ein System ist. :lol:

:-)
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.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Funktioniert bei mir im XP bestens.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

_Bernd hat geschrieben:
theo hat geschrieben:Wusste gar nicht, das Win98 ein System ist. :lol:

:-)
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
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Kann es sein, das AllowDropFiles in euren Forms false ist ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

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.

Antworten