Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-81227
lensky
2002-07-14 12:31
2002.07.25
Функция вызывающая метод и ждущая событие


3-81176
Still Swamp
2002-06-24 17:11
2002.07.25
Service + MSSql


3-81135
Aleksandr
2002-07-02 15:53
2002.07.25
Аааа! Как заставить сессии не спрашивать логин и пароль?!


3-81194
DmitryN
2002-07-05 08:25
2002.07.25
SQLDMO not registered...????


1-81221
Yurko
2002-07-10 03:57
2002.07.25
ClipBoard





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский