Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.25;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2002.07.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.01 c
7-81504
ses1
2002-05-03 21:36
2002.07.25
Объем памяти видеоадаптера???


3-81122
Evyshka
2002-07-02 17:00
2002.07.25
Индексы


1-81281
SergeyD
2002-07-15 14:34
2002.07.25
Потомок TImage


1-81229
Builder
2002-07-14 08:48
2002.07.25
Минимизация в трей вместо закрытия


3-81184
den-log
2002-07-04 16:10
2002.07.25
Необходимо создать таблицу MSAccess