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

Вниз

drag&drop   Найти похожие ветки 

 
студент   (2010-06-10 03:39) [0]

Всех с добрым утром, всем приятного рабочего настроения!

 Столкнулся с такой вот проблемой - тащу из снаружи текст, как написано тут: http://www.delphisources.ru/pages/faq/base/dnd_from_other_app.html все работает... почти работает - если отпустить кнопку мыши на TRichEdit нифига не работает и процедура Drop не отрабатывает. В RichEdit просто добавляется переносимый текст. Собственно, в RichEdit и  так само все переносится, ничего делать не надо, но мне нужно отследить вставку текста(когда он дропится из внешнего приложения) в этот компонент. И чтобы текст в объекте был только перенесенный. А еще, из, скажем, Word текст вырезается, из SQL Server Management Studio же - копируется, нужно, чтобы работал второй вариант всегда - это можно проконтролировать? Как это сделать? Предположу, что нужно залезть в механизм переноса, реализованный в RichEdit. Да/не?
 Подскажите, плиз. Или где прочесть про це можно(желательно, конкретно где, а не msdn.com)? Или код в студию - пряников не обещаю, но там вам зачтется.


 
KilkennyCat ©   (2010-06-10 09:29) [1]


> но мне нужно отследить вставку текста(когда он дропится
> из внешнего приложения) в этот компонент

onDragOver
onEndDrag


 
KilkennyCat ©   (2010-06-10 09:32) [2]

http://www.delphimaster.ru/articles/dragndrop/index.html


 
студент   (2010-06-10 10:08) [3]


> KilkennyCat ©   (10.06.10 09:29) [1]

да, забыл сразу сказать - не отрабатывают эти события


 
Плохиш ©   (2010-06-10 11:15) [4]


> И чтобы текст в объекте был только перенесенный.

DROPEFFECT_MOVE

> студент   (10.06.10 10:08) [3]
>
>
> > KilkennyCat ©   (10.06.10 09:29) [1]
>
> да, забыл сразу сказать - не отрабатывают эти события

Что тут можно сказать, тебе не повезло, ты допустил ошибку в 17й строке.


 
студент   (2010-06-10 11:50) [5]


> Плохиш ©   (10.06.10 11:15) [4]

изволь:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls, ActiveX, ShlObj, ComObj;

type
 TForm1 = class(TForm, IDropTarget)
   redt1: TRichEdit;
   procedure redt1DragOver(Sender, Source: TObject; X, Y: Integer;
     State: TDragState; var Accept: Boolean);
   procedure redt1DragDrop(Sender, Source: TObject; X, Y: Integer);
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   function DragEnter(const dataObj: IDataObject;
                       grfKeyState: Longint;
                       pt: TPoint;
                       var dwEffect: Longint): HResult; stdcall;
    function DragOver(grfKeyState: Longint;
                      pt: TPoint;
                      var dwEffect: Longint): HResult; stdcall;
    function DragLeave: HResult; stdcall;
    function Drop(const dataObj: IDataObject;
                  grfKeyState: Longint; pt: TPoint;
                  var dwEffect: Longint): HResult; stdcall;
  function _AddRef: Integer; stdcall;
   function _Release: Integer; stdcall;

 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

uses ShellAPI;

{$R *.dfm}

procedure TForm1.redt1DragOver(Sender, Source: TObject; X, Y: Integer;
 State: TDragState; var Accept: Boolean);
begin
 Accept := True;
end;

procedure TForm1.redt1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
 ShowMessage("Well, if bad guys said...");
end;

function TForm1._AddRef: Integer;
begin
 Result := 1;
end;

function TForm1._Release: Integer;
begin
 Result := 1;
end;

function TForm1.DragEnter(const dataObj: IDataObject; grfKeyState: Integer;
 pt: TPoint; var dwEffect: Integer): HResult;
begin
 dwEffect := DROPEFFECT_MOVE;
 Result := S_OK;
end;

function TForm1.DragLeave: HResult;
begin
 Result := S_OK;
end;

function TForm1.DragOver(grfKeyState: Integer; pt: TPoint;
 var dwEffect: Integer): HResult;
begin
 dwEffect := DROPEFFECT_MOVE;
 Result := S_OK;
end;

function TForm1.Drop(const dataObj: IDataObject; grfKeyState: Integer;
 pt: TPoint; var dwEffect: Integer): HResult;
var
 aFmtEtc: TFORMATETC;
 aStgMed: TSTGMEDIUM;
 pData: PChar;
begin
 if (dataObj = nil) then
   raise Exception.Create("IDataObject-Pointer is not valid!");
 with aFmtEtc do
 begin
   cfFormat := CF_TEXT;
   ptd := nil;
   dwAspect := DVASPECT_CONTENT;
   lindex := -1;
   tymed := TYMED_HGLOBAL;
 end;
 OleCheck(dataObj.GetData(aFmtEtc, aStgMed));
 try
   pData := GlobalLock(aStgMed.hGlobal);
   redt1.Text := pData;
 finally
   GlobalUnlock(aStgMed.hGlobal);
   ReleaseStgMedium(aStgMed);
 end;
 Result := S_OK;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 OleInitialize(nil);
 OleCheck(RegisterDragDrop(Handle, Self));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 RevokeDragDrop(Handle);
 OleUninitialize;
end;

end.


 
студент   (2010-06-10 11:53) [6]


> студент   (10.06.10 11:50) [5]

так вот, процедура Drop работает при отпускании кнопки мыши на любых компонентах, кроме RichEdit, а OnDragDrop и OnDragOver вообще чхать на перенос из внешнего приложения.


 
KilkennyCat ©   (2010-06-10 12:38) [7]

http://msdn.microsoft.com/en-us/library/bb776905%28v=VS.85%29.aspx
#
# When the target is finished with the data object, it returns from IDropTarget::Drop. The system returns the source"s DoDragDrop call to notify the source that the data transfer is complete.


 
студент   (2010-06-10 13:37) [8]


> KilkennyCat ©   (10.06.10 12:38) [7]


да, но на TRichEdit не работает.


 
QAZ   (2010-06-10 14:10) [9]


> а OnDragDrop и OnDragOver вообще чхать на перенос из внешнего
> приложения.

они задуманы для внутренего драгдропа в делфи ,и к винде не имеют отношения вобще
это для тасканий итемов в списках,кнопок, панелей на форме и тд

> А еще, из, скажем, Word текст вырезается, из SQL Server
> Management Studio же - копируется, нужно, чтобы работал
> второй вариант всегда - это можно проконтролировать?

а dwEffect := DROPEFFECT_MOVE; тебя на мысли не на водит?


 
студент   (2010-06-10 15:10) [10]


> QAZ   (10.06.10 14:10) [9]

изначально был "..._COPY". С этим-то теперь ясно - почему RichEdit не отзывается на Drop?


 
Anatoly Podgoretsky ©   (2010-06-10 15:27) [11]

> QAZ  (10.06.2010 14:10:09)  [9]

А для внешнего есть интерфейcы iDrop


 
QAZ   (2010-06-10 15:54) [12]


> почему RichEdit не отзывается на Drop?

ну у тебя IDropTarget прицеплен к форме
а ричьедит вполне самостоятельный виндовый контрол который сам обрабатывает оледрагдроп
возможно нужно докапаца до IRichEditOleCallback


 
Плохиш ©   (2010-06-10 16:28) [13]


> студент   (10.06.10 11:50) [5]
>
>
> > Плохиш ©   (10.06.10 11:15) [4]
>
> изволь:

Мне свои глаза дороже.

PS.
http://www.swissdelphicenter.ch/de/showcode.php?id=1627
Заменил там мемо на ричедит и озвученных проблем не обнаружил.


 
студент   (2010-06-10 18:11) [14]


> Плохиш ©   (10.06.10 16:28) [13]

будь добр, вставь в TForm1.Drop строку ShowMessage("Крутые пацаны никада не ошибаются"); и отпусти мышь над richedit


> QAZ   (10.06.10 15:54) [12]


> ну у тебя IDropTarget прицеплен к форме

да эт понятно


> а ричьедит вполне самостоятельный виндовый контрол который
> сам обрабатывает оледрагдроп

да, предполагаю, что так


> возможно нужно докапаца до IRichEditOleCallback

ща поищу, что за хрень


 
QAZ   (2010-06-10 19:33) [15]

а ты используй рич не из делфи,а импортируй его активХ
и все нужные методы\события\свойства будут наружу


 
студент   (2010-06-10 20:30) [16]


> QAZ   (10.06.10 19:33) [15]

да не, я уж поковыряюсь:)

Всем пасиба за ответы и советы.


 
KilkennyCat ©   (2010-06-10 20:50) [17]


> QAZ   (10.06.10 19:33) [15]

а разве не одна малина?
в итоге один хрен будет.

возможно, упростится решение, если использовать сторонний компонент, вот только бесплатного хорошего я не встречал.


 
QAZ   (2010-06-10 20:56) [18]


> да не

чо не
дельфя егоже(активх) юзает только со своими обертками для подержки наследования и прочей лабуды
а в голом активх там прям будут события onOLECompleteDrag,onOLEDragDrop,onOLEDragOver,onOLEStartDrag
хотяб попробуй хуже не будет


 
студент   (2010-06-10 21:14) [19]


> QAZ   (10.06.10 20:56) [18]


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

это я знаю, мне поковыряться интересно



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

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

Наверх




Память: 0.52 MB
Время: 0.009 c
3-1244113042
ganda
2009-06-04 14:57
2010.09.05
Работа функцией UDF при вставки записи в Таблицу


4-1239652712
Unlocker
2009-04-13 23:58
2010.09.05
Запуск под админом


15-1276189342
turbouser
2010-06-10 21:02
2010.09.05
Купил монитор :(


15-1276195781
AKE
2010-06-10 22:49
2010.09.05
Где можно найти какой-нибудь исходный код


15-1276098991
KilkennyCat
2010-06-09 19:56
2010.09.05
Наши компоненты.