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

Вниз

Drag&Drop   Найти похожие ветки 

 
kukuikar ©   (2010-08-12 10:54) [0]

На форме есть несколько TEdit, перетаскиваю в них текстовые файлы. В TEdit должен отобразиться полный путь+имя файла.
в FormCreate tcnm nfrfz inerf
DragAcceptFiles(Edit1.Handle, true);

Процедура обрабатывающая Drag&Frop здесь


procedure TForm1.MWMDropFiles(var Msg: TWMDropFiles);
var
 CFileName: array[0..MAX_PATH] of Char;
begin
try

if DragQueryFile(Msg.Drop, 0, CFileName, MAX_PATH) > 0 then
 begin
   Edit1.Text := CFileName;
  Msg.Result := 0;
end;

finally
  DragFinish(Msg.Drop);
end;

end;


В данном виде в TEDIT не появляется путь+имя к файлу. Почему не понятно.

и еще, как мне определить каокй именно TEDit принял на себя файл?


 
Дмитрий С ©   (2010-08-12 11:23) [1]

Сообщение нужно ловить едитом, а не формой, т.к. ты его регистрируешь "DragAcceptFiles(Edit1.Handle, true)", имхо.


 
Сергей М. ©   (2010-08-12 11:26) [2]


> Почему не понятно


Потому что сообщение WM_DROPFILES отправляется системой окну контрола, который ты указал в DragAcceptFiles, а именно Edit1.
А ловишь это сообщение ты почему-то у формы, а не у Edit1

> как мне определить каокй именно TEDit принял на себя файл

Структура TWMDropFiles в поле Drop содержит хэндл окна контрола-приемника, которому адресовано сообщение WM_DROPFILES.
Ссылку на VCL-контрол, ассоциированный с этим окном, можно получить с пом. FindControl()


 
kukuikar ©   (2010-08-12 11:37) [3]


> А ловишь это сообщение ты почему-то у формы, а не у Edit1

не понимаю, где ловлю формой, а как удитом словить?


 
Сергей М. ©   (2010-08-12 11:41) [4]


> не понимаю, где ловлю формой


procedure TForm1.MWMDropFiles(var Msg: TWMDropFiles);


> как удитом словить


Обработчик Application.OnMessage получает управление при получении любых сообщений любым окнам, созданным основным потоком VCL-приложения.
В нем и лови.


 
kukuikar ©   (2010-08-12 12:54) [5]

Сделаю так

procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
var
 HF: THandle;
 s: array [0..1023] of char;
 i, FileCount: integer;
 p: TPoint;
 Comp: TLabeledEdit;
begin
 HF := Msg.Drop;
 DragQueryFile(HF, 0, s, sizeof(s));
 DragQueryPoint(HF, p);

 for i := 0 to ComponentCount - 1 do
   begin
   if Components[i] is TLabeledEdit then
     begin
     Comp := Components[i] as TLabeledEdit;
     if PtInRect(Comp.BoundsRect, p) then
       Comp.Text := ExtractFileName(s);
     end;
   end;

 DragFinish(HF);
end;


 
Сергей М. ©   (2010-08-12 13:53) [6]

ЭХто называется сходить в гости к соседу по Жмеринке через Китай)


 
kukuikar ©   (2010-08-12 14:16) [7]

Сергей М. ©   (12.08.10 13:53) [6]
на другое мозга не хватает


 
Дмитрий С ©   (2010-08-12 14:27) [8]

Как вариант, можно использовать такой прикол:


unit Unit5;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, shellapi;

type
 TEdit = class(StdCtrls.TEdit)
   private
     procedure WM_DropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
 end;

 TForm5 = class(TForm)
   Edit1: TEdit;
   Edit2: TEdit;
   procedure Button1Click(Sender: TObject);
   procedure FormShow(Sender: TObject);
 private
 public
 end;

var
 Form5: TForm5;

implementation

{$R *.dfm}

procedure TForm5.Button1Click(Sender: TObject);
begin

end;

{ TEdit }

procedure TEdit.WM_DropFiles(var Msg: TWMDropFiles);
var
 CFileName: array[0..MAX_PATH] of Char;
begin
 try
   if DragQueryFile(Msg.Drop, 0, CFileName, MAX_PATH) > 0 then
   begin
     Text := CFileName;
     Msg.Result := 0;
   end;
 finally
   DragFinish(Msg.Drop);
 end;
end;

procedure TForm5.FormShow(Sender: TObject);
begin
 DragAcceptFiles(Edit1.Handle, True);
 DragAcceptFiles(Edit2.Handle, True);
end;

end.


В Delphi 2010 работает. Надеюсь мне мастера уши не оторвут за такие примеры :)


 
Anatoly Podgoretsky ©   (2010-08-12 16:03) [9]

> kukuikar  (12.08.2010 14:16:07)  [7]

Ну займись тем, на что хватает.


 
kukuikar ©   (2010-08-13 13:15) [10]

Anatoly Podgoretsky ©   (12.08.10 16:03) [9]
оооо... узнаю старожил форума. пройти мимо не Ваше кредо, нужно пнуть.
а то уже испугался, что гнобить человека который много менее опытен и много меньше знает, уже перестали на этом форуме.


 
Сергей М. ©   (2010-08-13 13:36) [11]


> kukuikar ©   (13.08.10 13:15) [10]


Ты лучше скажи, чего и где у тебя не хватает, чтобы воспользоваться рекомендацией по обработке сообщений драг-дропа прямо в событии Application.OnMessage ..


 
kukuikar ©   (2010-08-13 13:52) [12]

Сергей М. ©   (13.08.10 13:36) [11]
Ну не знаю я как обработать Application.OnMessage. И вообще не знаю как работать с обработкой сообщений, не понимаю и не знаю механихмов работы.

Я не программист. Но передо мной иногда стоят задачи которые я не могу решить без дельфи. Моя область - это проектирование и расчет железобетонных конструкций, программы Revit, Robot, AutoCAD, ЛИРА, СКАД, МИКРОФЕ, MIDAS и .т.п. Я уверен что многие из здесь присутствующих не слышали о таких. Но мне надо перегнать один текстовый файл из одного формата в другой, в основном парсинг и математика. А другого пути как через Дельфи я не вижу перед собой.

А Drag&Drop это просто примочка, украшательство, упрощение ввода исходных данных. Не более, то же самое я делаю и через диалоги.

Я же и не прошу написать мне готовый код, потому что это  не правильно, и не жду что мне кто-то напишет.

Просто буду делать так как получается, хоть это и не правильно и пусть меня загнобят.

Я спросил - мне ответили, я нашел другое решение проблемы своей, пусть неправильное, но я его нашел.

Думаю что тему можно закрыть.



Страницы: 1 вся ветка

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

Наверх




Память: 0.5 MB
Время: 0.02 c
15-1280385192
Demo
2010-07-29 10:33
2010.11.07
Oracle и Импорт дамп файла


6-1228900755
WeTeR
2008-12-10 12:19
2010.11.07
отправить изображение по сети


8-1207586026
NaRuTo
2008-04-07 20:33
2010.11.07
FadeOut в DirectX


2-1281693337
Михаил
2010-08-13 13:55
2010.11.07
[Error] Unit2.pas(43): Type of expression must be BOOLEAN


15-1280428521
Riply
2010-07-29 22:35
2010.11.07
Детектирование исполнителя путем поверхносного анализа :)