kotompazb писал(а):Там все очень упрощенно. Эвента там всего четыре: OnDragBegin, OnDragEnd, OnDragGetFileList, OnDragGetStringData.
Понятно. Там только DataSource реализован, а DropTarget нет.
Предлагаю, сделать правильным путём, а не обходным! Займёт чуток больше времени, но в итоге дложно красиво получиться.
Добавлено спустя 3 часа 4 минуты:вот "NativeDropTarget" компонент. Как использовать (после установки в Lazarus, доступен в закладке "System").
1) Положить на форму
2) Назначить "Control" (тот контрол в который файлы складываются)
3) Назначать OnDragAction - что делать при DragEnter, DragOver
4) Назначить OnDrop - что делать при дропе.
События OnDragAction и OnDrop имеют одинаковые параметры
* Sender: TObject; - (ссылка на TNativeDropTarget)
* Data: TNativeDataSource; - объект, которые показывает, что "притащили"
* X, Y: Integer; - коордианты мышки (относительно контрола)
* AShiftState: TShiftState; - состояние клавиатуры + мышки
* var AAction: TNativeDropAction - какое действие нужно соверщить при drop-е. (в завимисомти от Action-а поменяется и курсор). Возможные значения:
** ndaNodrop - файлы не принимаются
** ndaCopy - файлы "будут скопированы"
** ndaMove - файлы "будут перенесены"
** ndaLink - файлам "создаться линк"
В DragAction ешё дополнительно есть
* ADragAction: TDragState; - DragEnter, DragMove и DragLeave. Состояние добавлено параметром, вместо того чтобы плодить три метода.
У объекта Data есть два метода
* GetType() которые вернёт тип данных - либо dsFile (если файлы) либо dsOther (если что-то нещё)
* GetFiles() - получить список файлов.
Пример использования
- Код: Выделить всё
procedure TForm1.NativeDropTarget1DragAction(Sender: TObject;
Data: TNativeDataSource; ADragAction: TDragState; X, Y: Integer;
AShiftState: TShiftState; var AAction: TNativeDropAction);
begin
if Data.GetType=dsFiles then
AAction:=ndaCopy
else
AAction:=ndaNodrop;
end;
procedure TForm1.NativeDropTarget1Drop(Sender: TObject;
Data: TNativeDataSource; X, Y: Integer; AShiftState: TShiftState;
var AAction: TNativeDropAction);
var
st: TStringList;
begin
st:=TStringList.Create;
try
Data.GetFiles(st);
Memo1.Lines.Assign(st);
finally
st.Free;
end
end;
Работаем только под винду.
У вас нет необходимых прав для просмотра вложений в этом сообщении.