Форум: "WinAPI";
Текущий архив: 2002.07.25;
Скачать: [xml.tar.bz2];
ВнизDrag&Drop. Опять. Найти похожие ветки
← →
artgamer (2002-05-19 15:41) [0]Послушайте, Мастера. Я уже задавал этот вопрос, но так и не получил на него вразумительного ответа. Поэтому спрашиваю ещё раз - как мне сделать Drag&Drop на какой-нибудь элемент формы - например на Panel или SpeedButton. Я тут рылся по FAQ на разных сайтах и нашёл такой-же вопрос на "Королевстве Delphi". Ответ следующий:"проседуру
procedure WMDROPFILES(var Message: TWMDROPFILES); message WM_DROPFILES;
нужно писать не в форме, а в наследнике TPanel для панели и т.д."
Или вот ещё Anatoly Podgoretsky пишет: " Это надо делать на уровне формы, а если при этом нужно определять что курсор находится над определенным элементом то получить кординаты мышки" А как это сделать?
Я понимаю, возможно мой вопрос (да и я сам) кажется тупым, но поверьте - я никогда не стал-бы отвлекать людей от дела, если-бы мог разобраться сам.
С уважением, Artgamer.
← →
Song (2002-05-19 17:09) [1]Дак Вы хотите сказать что WM_DROPFILES не срабатывает когда переносите файлы на форму приложения?
← →
~Sergius (2002-05-19 17:36) [2]Лови компонент. Разберешься как сделан. Не обессудь, полчаса ушло на все дело - но работает.
Хотя, вообще-то, ФАКов на эту тему уже столько есть, что можно было бы и так разобраться (тем более сам принцип очень прост) :-)
unit smDropFile;
interface
uses
Windows,
Messages,
SysUtils,
Classes,
Graphics,
Controls,
Forms,
Dialogs;
type
TOnFileDrop = procedure (var filename: string) of object;
TSmDropFile = class (TComponent)
private
FOldOnAppMessage: TMessageEvent;
FAcceptExtensions: TStrings;
FParent: TWinControl;
FAcceptAll: boolean;
FOnFileDrop: TOnFileDrop;
FOnWrongFileDrop: TOnFileDrop;
procedure SetAcceptExtensions (const Value: TStrings) ;
procedure OnAppMessage (var Msg: TMsg; var Handled: Boolean) ;
procedure SetAcceptAll (const Value: boolean) ;
procedure SetOnFileDrop (const Value: TOnFileDrop) ;
procedure SetOnWrongFileDrop (const Value: TOnFileDrop) ;
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create (AOwner: TComponent) ; override;
destructor Destroy;
published
{ Published declarations }
property AcceptExtensions: TStrings read FAcceptExtensions write SetAcceptExtensions;
property AcceptAll: boolean read FAcceptAll write SetAcceptAll;
property OnFileDrop: TOnFileDrop read FOnFileDrop write SetOnFileDrop;
property OnWrongFileDrop: TOnFileDrop read FOnWrongFileDrop write SetOnWrongFileDrop;
end;
procedure Register;
implementation
{$R SMDROPFILE.RES}
uses ShellAPI;
procedure Register;
begin
RegisterComponents ("skaminski", [TSmDropFile] ) ;
end;
{ TSmDropFile }
constructor TSmDropFile.Create (AOwner: TComponent) ;
begin
inherited Create (AOwner) ;
FAcceptExtensions := TStringList.Create;
FParent := nil;
if AOwner is TForm then
FParent := AOwner as TForm;
if csDesigning in ComponentState then
FAcceptAll := True;
DragAcceptFiles (FParent.Handle, True) ; // Разрешаем родительской форме принимать файлы
FOldOnAppMessage := Application.OnMessage; // Запомним старый обработчик!
Application.OnMessage := OnAppMessage; // принимаем на себя все сообщения Windows
end;
destructor TSmDropFile.Destroy;
begin
Application.OnMessage := FOldOnAppMessage;
FAcceptExtensions.Free;
inherited Destroy;
end;
procedure TSmDropFile.OnAppMessage (var Msg: TMsg; var Handled: Boolean) ;
var acfilename: array[0..255] of char;
s: string;
i: integer;
begin
if (Msg.message = WM_DROPFILES) and (Msg.hwnd = FParent.Handle) then
begin
Handled := True;
dragqueryfile (msg.wParam, 0, acfilename, 255) ;
if (FAcceptAll) or
(FAcceptExtensions.IndexOf (UpperCase (ExtractfileExt (acfilename) ) ) <> -1) then
begin
if Assigned (FOnFileDrop) then
begin
s := acfilename;
FOnFileDrop (s) ;
end;
end
else
if Assigned (FOnWrongFileDrop) then
begin
s := acfilename;
FOnWrongFileDrop (s) ;
end;
dragfinish (msg.wParam) ;
end
else
Handled := False; // пускай себе летит дальше...
end;
procedure TSmDropFile.SetAcceptAll (const Value: boolean) ;
begin
FAcceptAll := Value;
end;
procedure TSmDropFile.SetAcceptExtensions (const Value: TStrings) ;
var i: integer;
begin
for i := 0 to Value.Count do
begin
Value[i] := UpperCase (Value[i] ) ;
end;
FAcceptExtensions.Assign (Value) ;
end;
procedure TSmDropFile.SetOnFileDrop (const Value: TOnFileDrop) ;
begin
FOnFileDrop := Value;
end;
procedure TSmDropFile.SetOnWrongFileDrop (const Value: TOnFileDrop) ;
begin
FOnWrongFileDrop := Value;
end;
end.
← →
Lady BadnBadn (2002-05-19 18:02) [3]Пишите наследник и не забивайте себе голову
← →
artgamer (2002-05-19 18:16) [4]>Song
Дак Вы хотите сказать что WM_DROPFILES не срабатывает когда переносите файлы на форму приложения?
Нет, этого я не говорю. Когда я переношу файлы на форму приложения WM_DROPFILES работает, но когда я переношу файлы на панель, которая лежит на форме приложения - НИЧЕГО не происходит!
>Lady BadnBadn
Пишите наследник и не забивайте себе голову
А как?
← →
Song (2002-05-19 18:23) [5]В обработчике WM_DROPFILES считываете координаты мыши и сраниваете их с координатами SpeedButton (разброс на высоту и ширину кнопки оставьте). Если сравнение истинно значит перенос идёт на TSpeedButton. Вот это и имел ввиду Анатолий Подгорецкий.
← →
artgamer (2002-05-19 21:02) [6]>Song
Я, может, чего-то не понимаю, но как мне считывать координаты мыши с обработчика WM_DROPFILES, если этот WM_DROPFILES не вызывается?
← →
Song (2002-05-19 21:05) [7]Да с сообщения надо считать, а когда оно произойдёт. Считать координаты мыши - GetCursorPos()
← →
Song (2002-05-19 21:52) [8]Забыл "не" добавить между "Да" и "с" :))
← →
~Sergius (2002-05-20 03:53) [9]Казалось бы тему уже закрыли.
WM_DROPFILES отлавливает ФОРМА. В обработчике этого события определяем, как уже скзано координаты мышки. И по этим координатам определяем, над каким контролом курсор. ВСЕ!
← →
artgamer (2002-05-20 22:05) [10]Ох! Умучался я! "В обработчике события, в обработчике события". А я, может, не знаю, что это вообще такое. И как мне считать, когда произойдёт сообщение, если сообщение не приходит совсем? Ну ладно буду лазить по FMDrop из LMD tools и по примеру ~Sergius`а - авось разберусь, как эта шняга работает.
Но всё равно спасибо, что пытались помочь. Код ~Sergius`а мне подходит, но уж больно здоровый - у проги лимит в 9000 строк, а у меня уже 8700 и всё растёт :). В общем, тему действительно можно считать закрытой, и я ТОРЖЕСТВЕННО ОБЯЗУЮСЬ ЭТОТ ВОПРОС БОЛЬШЕ НЕ ПОДНИМАТЬ! Ещё раз спасибо - и спокойной ночи.
← →
Anatoly Podgoretsky (2002-05-20 22:17) [11]Я могу сказать, если сообщение не поступает, тогда его что то блокирует. При том это, что то постороннее, специально же проверял, бросал файлы на SpeedButton расположенный на панели, все в порядке, дело в чем то нестандартном.
← →
artgamer (2002-05-20 23:03) [12]>Anatoly Podgoretsky
Спасибо!
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.07.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c