Форум: "Начинающим";
Текущий архив: 2010.11.07;
Скачать: [xml.tar.bz2];
ВнизDrag&Drop Найти похожие ветки
← →
kukuikar © (2010-08-12 10:54) [0]На форме есть несколько TEdit, перетаскиваю в них текстовые файлы. В TEdit должен отобразиться полный путь+имя файла.
в FormCreate tcnm nfrfz inerfDragAcceptFiles(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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.003 c