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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2014, 15:55   #1
Rec0il
Пользователь
 
Регистрация: 16.03.2013
Сообщений: 69
По умолчанию помогите с кодом Drag&Drop

Ребята, помогите пожалуйста реализовать функцию Drag&Drop.

Есть панель с кнопками speedbutton.
В них по первому нажатию, гружу через опендиалог ярлык. при повторном нажатии уже открывается программа.
Делаю так:
Код:
var
  Form1: TForm1;
     S:string;
 
..... ....
 
procedure TForm1.sSpeedButton1Click(Sender: TObject);
 
var
   Icon : TIcon;
   Pch: array[0..256] of Char;
   IconIndex: Word;
begin
  if S='' then    
    begin
     if  sOpenDialog1.Execute then
    begin  
       S:=sOpenDialog1.FileName; 
          sSpeedButton1.Glyph:=nil;
         Icon:=TIcon.Create;
         StrPCopy(Pch,S);
         Icon.Handle:= ExtractAssociatedIcon(hInstance, Pch, IconIndex);
         sSpeedButton1.Glyph.Width:= Icon.Width;
         sSpeedButton1.Glyph.Height:= Icon.Height;
         sSpeedButton1.Glyph.Canvas.Draw(0, 0, Icon);
         Icon.Free;
    end;
        if S='' then               
        begin
               sSpeedButton1.Glyph:=nil;
          ShowMessage('Ничего не выбрано');
        end
        else

  
      end
      else
          begin
          sPanel1.Caption:=S;
          ShellExecute (Form1.Handle, nil, PChar(S), nil, nil, SW_RESTORE);
          end;
Каким образом на эти кнопки можно сделать функцию Drag&Drop?
Но что бы функция с опендиалогом осталась.

Подскажите пожалуйста.

Последний раз редактировалось Rec0il; 11.04.2014 в 15:57.
Rec0il вне форума Ответить с цитированием
Старый 11.04.2014, 17:02   #2
Dennis777
Форумчанин
 
Регистрация: 06.11.2009
Сообщений: 203
По умолчанию

а что вы перетаскивать будете?
Интересный проект по изучению английского:
Английский в формате путешествия по США
Dennis777 вне форума Ответить с цитированием
Старый 11.04.2014, 17:04   #3
Rec0il
Пользователь
 
Регистрация: 16.03.2013
Сообщений: 69
По умолчанию

Цитата:
Сообщение от Dennis777 Посмотреть сообщение
а что вы перетаскивать будете?
Ярлыки, на свою программу (в кнопку speedbutton)
Что-то типа панели быстрого запуска.
Rec0il вне форума Ответить с цитированием
Старый 11.04.2014, 17:13   #4
Dennis777
Форумчанин
 
Регистрация: 06.11.2009
Сообщений: 203
По умолчанию

Я не совсем понимаю что вы хотите,

но если примеры ярлыков у вас перед этим выводятся на форму (например, в имейджи), то в onMouseDown (имейджа), я бы писал:

Код:
if Button<>mbLeft then
move:=False else
begin
move:=True;
x0:=x;
y0:=y;
end;
в он MouseMove:
Код:
if move then
Image1.SetBounds(Image1.Left+x-x0Image1.Top+y-y0,Image1.width,Image1.height);
а в он MouseUp (по отпусканию имейджа) соответсвенно проводил бы проверку (находиться ли имейдж над кнопкой, и если да, то подгружал соответствующий глиф. Если нет - вернуть на исходное место.) и дописал: move:=false;

И объявите переменные:
move: boolean;
X0, Y0:integer;
Интересный проект по изучению английского:
Английский в формате путешествия по США
Dennis777 вне форума Ответить с цитированием
Старый 11.04.2014, 17:46   #5
Rec0il
Пользователь
 
Регистрация: 16.03.2013
Сообщений: 69
По умолчанию

Цитата:
Сообщение от Dennis777 Посмотреть сообщение
Я не совсем понимаю что вы хотите
Попробую более понятно пояснить свой первый пост)

У меня есть панель с кнопками speedbutton.
На кнопках код, который в первом посте.
По нажатию идет проверка переменной S, если она пуста, то открывается опендиалог и выберается какой либо файл. и переменной S присваивается путь к файлу. с помощью него я подгружаю иконку ярлыка в кнопку speedbutton. Вобщем панель быстрого запуска.

И, я бы хотел сделать так, что бы можно было с любого места (рабочий стол, папка...) перетаскивать ярлыки, себе на форму, в те самые кнопки (Speedbutton).

Допустим взял ярлык с рабочего стола, перетащил его в свою программу, в кнопку speedbutton, и в кнопке сразу появилась иконка ярлыка, и по нажатию открывается та программа, которую я перетащил)
По моему это называется Drag&Drop, если нет, прошу простить))
Rec0il вне форума Ответить с цитированием
Старый 11.04.2014, 17:55   #6
cotseec
Пользователь
 
Регистрация: 02.05.2012
Сообщений: 45
По умолчанию

агрегируйте IDropTarget либо в классе-интерцепторе кнопки или панели, на которой лежат кнопки или форме или опишите отдельный класс (все уже написано - можно найти даже компонент)
на закуску
Skype: cotseec
ICQ: 330-171-495
cotseec вне форума Ответить с цитированием
Старый 11.04.2014, 18:44   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

http://delphiworld.narod.ru/base/wm_dropfiles.html
Не?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.04.2014, 20:38   #8
Rec0il
Пользователь
 
Регистрация: 16.03.2013
Сообщений: 69
По умолчанию

Спасибо мужики!!!
Разобрался, понял как делать Drag&Drop ))
Но у меня к вам еще 1 вопрос, на эту же тему.
Перетягиваю ярлык на форму, в кнопке speedbutton появляется иконка, и по нажатию этой кнопки запускается прога. Всё именно так как я хотел. Но как мне сделать добавление на вторую кнопку
На форме же будет несколько кнопок.

Я думаю, наверное надо проверять переменные, если они не пустые, то кидать на следующую кнопку...

Прошу, если Вас не затруднит, дополните мой код, или дайте внятный ответ, как это сделать.

Сейчас всё работает с одной кнопкой, вот так:
Код:
var
  Form1: TForm1;
  S:string;

......

procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
var
CFileName array[0..MAX_PATH] of Char;
Icon:TIcon;
Ici:Word;
begin
  If DragQueryFile(Msg.Drop, 0, CFileName, MAX_PATH)> 0 then
    begin

     S:=CFileName;
    sSpeedButton1.Glyph:=nil;
         Icon:=TIcon.Create;
         StrPCopy(CFileName,S);
         Icon.Handle:= ExtractAssociatedIcon(hInstance, CFileName, Ici);
         sSpeedButton1.Glyph.Width:= Icon.Width;
         sSpeedButton1.Glyph.Height:= Icon.Height;
         sSpeedButton1.Glyph.Canvas.Draw(0, 0, Icon);
         Icon.Free

       end

 end;
Rec0il вне форума Ответить с цитированием
Старый 11.04.2014, 20:52   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Мне кажется тут есть два варианта:
1) В этом обработчике проверять свободность кнопок.
Допустим при перетяжке будет такой код:
Код:
if sSpeedButton1.Glyph=nil then на него else
if sSpeedButton2.Glyph=nil then на него else
if sSpeedButton3.Glyph=nil then на него else
...
Тогда получишь перетяжку на кнопки по порядку их заполнения

2) Описать этот обработчик для своего класса кнопки, наследовав ее от стандартной кнопки
Код:
TSSpeedButton=class(TSSpeedButton)
 private
  WMDropFiles(var Msg: TWMDropFiles);
end;
тогда в обработчике можно использовать слово Self, которое укажет на какую кнопку ты тащишь.
Мне кажется второе лучше, поскольку может дать контроль на какую кнопку тащится.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.04.2014, 21:35   #10
Rec0il
Пользователь
 
Регистрация: 16.03.2013
Сообщений: 69
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Мне кажется тут есть два варианта:
1) В этом обработчике проверять свободность кнопок.
Допустим при перетяжке будет такой код:
Код:
if sSpeedButton1.Glyph=nil then на него else
if sSpeedButton2.Glyph=nil then на него else
if sSpeedButton3.Glyph=nil then на него else
...
Тогда получишь перетяжку на кнопки по порядку их заполнения

2) Описать этот обработчик для своего класса кнопки, наследовав ее от стандартной кнопки
Код:
TSSpeedButton=class(TSSpeedButton)
 private
  WMDropFiles(var Msg: TWMDropFiles);
end;
тогда в обработчике можно использовать слово Self, которое укажет на какую кнопку ты тащишь.
Мне кажется второе лучше, поскольку может дать контроль на какую кнопку тащится.
Первое мне ясно.
Второй вариант, я понял что ты имеешь в виду, да, он мне больше подойдет. Но в отличии от первого варианта, тут я не совсем понял, что мне вообще делать ?)) Стандартная кнопка ведь не сможет отоброжать иконку, или я что-то не так понял ?
Я новичок в этом, только начинаю познавать азы.
Если не трудно, можно более детально о втором варианте ?
Rec0il вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WinForms PictureBox VC++ Drag&Drop _Alerter_ Windows Forms 4 27.05.2011 10:38
Drag&Drop Guzal Qt и кроссплатформенное программирование С/С++ 0 12.04.2011 01:19
Нужна помощь (Drag-And-Drop & Drag-Abd-Dock)) Arkuz Общие вопросы Delphi 1 18.04.2009 00:15
Помогите, люди...Drag&Drop в С#-ной проге... homocogitum Общие вопросы .NET 3 02.05.2008 13:43
Drag&Drop shtuceron Общие вопросы Delphi 3 09.04.2008 19:04