Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2016, 04:29   #1
Rec0il
Пользователь
 
Регистрация: 16.03.2013
Сообщений: 69
Вопрос Drag & Drop появление окна, как это делает винда.

Доброе время суток.

Допустим есть аимп, прикрепленный к правому краю экрана. Он исчезает когда тыкаешь мышкой мимо формы аимпа, при подведении курсора к правому краю экрана, появляется маленькая кнопка, при нажатии на нее появляется сам аимп.

Так вот, если взять любой файл, перетащить его на эту самуюу маленькую кнопку, то аимп появится. Как мне сделать тоже самое для своей программы?

В программе уже есть drag&drop, вопрос конкретно в том, как заставить появлятся форму, когда на какой либо элемент,например Panel1 наведена мышка с ярлыком.

Думаю я понятно объяснил, если же нет, попробуйте взять любой файл, перетащить курсор в значек браузера(предварительно свернутого) в таскбаре, браузер развернется...

Спасибо заранее.

Последний раз редактировалось Rec0il; 17.01.2016 в 04:31.
Rec0il вне форума Ответить с цитированием
Старый 17.01.2016, 10:40   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

то есть, тебе надо знать, тащит ли юзер в данный момент мышой файлы или просто гоняет лысого впустую?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 17.01.2016, 10:49   #3
Rec0il
Пользователь
 
Регистрация: 16.03.2013
Сообщений: 69
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
то есть, тебе надо знать, тащит ли юзер в данный момент мышой файлы или просто гоняет лысого впустую?
Да.
Программа скрыта от юзера в левой части экрана, и выпирает только полоса в 1 пиксель компонента Panel (при этом у формы Borderstyle=bsnone). Хочу сделать так, если юзер тянет файл на ту самую полоску, что бы программа приняла left:=0;, дабы дать возможность закинуть на форму файл.

Последний раз редактировалось Rec0il; 17.01.2016 в 10:56.
Rec0il вне форума Ответить с цитированием
Старый 17.01.2016, 13:07   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

что-то типа такого?



Накидал за 15 минут, лёжа под одеялом.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 17.01.2016, 13:16   #5
Rec0il
Пользователь
 
Регистрация: 16.03.2013
Сообщений: 69
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
что-то типа такого?
Накидал за 15 минут, лёжа под одеялом.
да-да! именно это.
Так как ты это сделал?

Последний раз редактировалось Rec0il; 17.01.2016 в 13:24.
Rec0il вне форума Ответить с цитированием
Старый 17.01.2016, 13:26   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
да-да! именно это.
Так как ты это сделал?
как-то так:
Код:
unit ufMain;

interface

uses
  //============================== Модули проекта ==============================
  //========================= Модули проекта с формами =========================
  //=============================== Левые модули ===============================
  //=================== Системные модули, добавленные вручную ==================
  ShellApi,
  //=================== Модули, добавленные IDE автоматически ==================
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.AppEvnts;

type
  TFormMain = class(TForm)
    PanelDrop: TPanel;
    ListBox: TListBox;
    Timer: TTimer;
    AppEvents: TApplicationEvents;
    procedure TimerTimer(Sender: TObject);
    procedure FormDeactivate(Sender: TObject);
  private
    FAppearTopLeft: TPoint;
    procedure WmDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
    function DropUnderCursor: Boolean;
    procedure Appear;
    procedure Disappear;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

var
  FormMain: TFormMain;

implementation

{$R *.dfm}

procedure SetAllwaysOnTop(AForm: TForm; const AOnTop: Boolean);
var
  hWndInsertAfter: HWND;
begin
  if AOnTop
    then hWndInsertAfter:= HWND_TOPMOST
    else hWndInsertAfter:= HWND_NOTOPMOST;

  with AForm do
    SetWindowPos(Handle,
                 hWndInsertAfter,
                 Left, Top, Width, Height,
                 SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
end;

{ TFormMain }

procedure TFormMain.Appear;
begin
  Self.SetBounds(FAppearTopLeft.X, FAppearTopLeft.Y, Width, Height);
  Application.BringToFront();
end;

constructor TFormMain.Create(AOwner: TComponent);
begin
  inherited;
  DragAcceptFiles(Handle, True);

  Left:= 0;
  FAppearTopLeft:= Self.BoundsRect.TopLeft;
  SetAllwaysOnTop(Self, true);
end;

destructor TFormMain.Destroy;
begin
  DragAcceptFiles(Handle, False);
  inherited;
end;

procedure TFormMain.Disappear;
begin
  FAppearTopLeft:= Self.BoundsRect.TopLeft;
  Self.Left:= -Self.Width + 6;
end;

function TFormMain.DropUnderCursor: Boolean;
begin
  Result:= PanelDrop.Handle = WindowFromPoint(Mouse.CursorPos);
end;

procedure TFormMain.FormDeactivate(Sender: TObject);
begin
  Disappear();
end;

procedure TFormMain.TimerTimer(Sender: TObject);
begin
  if DropUnderCursor()
    then begin
           PanelDrop.Caption:= Format('files: %d',[Listbox.Count]);
           Appear();
         end
    else PanelDrop.Caption:= 'кидай';
end;

procedure TFormMain.WmDropFiles(var Msg: TWMDropFiles);
var
   HF: THandle;
   Buffer: array[0..511] of Char;
   Index, Count: Integer;
begin
  HF:= Msg.Drop;
  try
    Count:= DragQueryFile(HF, $FFFFFFFF, nil, 0);

    for Index:= 0 to Count - 1 do
      begin
        DragQueryFile(HF, Index, Buffer, SizeOf(Buffer));
        ListBox.Items.Add(string(Buffer))
      end;
  finally
    DragFinish(HF);
    PanelDrop.Caption:= Format('files: %d',[Listbox.Count]);
  end;
end;

end.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 17.01.2016, 13:29   #7
Rec0il
Пользователь
 
Регистрация: 16.03.2013
Сообщений: 69
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
как-то так:
Спасибо большое!
Пойду доделывать прогу)
Rec0il вне форума Ответить с цитированием
Старый 17.01.2016, 13:40   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Спасибо большое!
Гастроном - вооооон там!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Появление формы при drag & drop Rec0il Общие вопросы Delphi 4 01.11.2015 02:25
Drag & Drop как использовать? Lyubimov C++ Builder 1 15.04.2011 10:42
Drag & Drop как использовать? Lyubimov C++ Builder 0 15.04.2011 10:30
Drag&Drop, изображение рядом с курсором (как в проводнике). restarterx Общие вопросы Delphi 3 15.02.2011 16:48
Нужна помощь (Drag-And-Drop & Drag-Abd-Dock)) Arkuz Общие вопросы Delphi 1 18.04.2009 00:15