unit Unit1;
{$mode objfpc}{$H+}
//{$modeswitch ADVANCEDRECORDS}
//{$modeswitch typehelpers}
//{$modeswitch multihelpers}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,
Qt4, qtwidgets;
type
{ TQtWidgetHelper }
TQtWidgetHelper = class helper for TQtWidget
public
function slotDropFiles(Sender: QObjectH; Event: QEventH): Boolean;
end;
{ TForm1 }
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormDropFiles(Sender: TObject; const FileNames: array of string);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.frm}
{ TQtWidgetHelper }
function TQtWidgetHelper.slotDropFiles(Sender: QObjectH; Event: QEventH
): Boolean;
var
MimeData: QMimeDataH;
QStrList: QStringListH;
ByteArr: QByteArrayH;
i: Integer;
WStr: WideString;
GotFiles: Boolean;
FilesList: TStrings;
Files: Array of String;
ParentForm: TCustomForm;
Url: QUrlH;
begin
Result := False;
WriteLn('TQtWidgetHelper.slotDropFiles ... ');
GotFiles := False;
MimeData := QDropEvent_mimeData(QDropEventH(Event));
QStrList := QStringList_create();
try
QMimeData_formats(MimeData, QStrList);
for i := QStringList_size(QStrList) - 1 downto 0 do
begin
QStringList_at(QStrList, @WStr, i);
GotFiles := (WStr = 'text/plain') or (WStr = 'text/uri-list');
if GotFiles then
break;
end;
finally
QStringList_destroy(QStrList);
end;
if not GotFiles then
exit;
ByteArr := QByteArray_create();
try
QMimeData_data(MimeData, ByteArr, @WStr);
if not QByteArray_isNull(ByteArr) then
begin
WStr := QByteArray_constData(ByteArr);
FilesList := TStringList.Create;
try
FilesList.Text := WStr{%H-};
if (FilesList.Count > 0) and
( (FilesList[FilesList.Count-1] = #0)
or
(FilesList[FilesList.Count-1] = '') ) then
SetLength(Files, FilesList.Count - 1)
else
SetLength(Files, FilesList.Count);
for i := 0 to High(Files) do
begin
WStr := FilesList{%H-}.Strings[i];
Url := QUrl_create(@WStr);
QUrl_toLocalFile(Url, @WStr);
Files[i] := {%H-}WStr;
QUrl_destroy(Url);
end;
finally
FilesList.Free;
end;
QDropEvent_setDropAction(QDropEventH(Event), QtCopyAction);
QDropEvent_acceptProposedAction(QDropEventH(Event));
Application.IntfDropFiles(Files);
if ClassType = TQtMainWindow then
TCustomForm(LCLObject).IntfDropFiles(Files)
else
begin
ParentForm := TCustomForm(LCLObject.IntfGetDropFilesTarget);
if ParentForm is TCustomForm then
ParentForm.IntfDropFiles(Files);
end;
Result := True;
end;
finally
QByteArray_destroy(ByteArr);
end;
end;
{ TForm1 }
procedure TForm1.FormDropFiles(Sender: TObject; const FileNames: array of string
);
begin
Memo1.Lines.AddStrings(FileNames);
end;
end.