Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.09.05;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.004 c
15-1276254260
novichek
2010-06-11 15:04
2010.09.05
SQL Microsoft.Jet.OLEDB.4.0? Access


15-1276201773
Юрий
2010-06-11 00:29
2010.09.05
С днем рождения ! 11 июня 2010 пятница


6-1225735095
Igor20
2008-11-03 20:58
2010.09.05
Как перенести Intraweb на apache?


2-1275945627
akosh12345
2010-06-08 01:20
2010.09.05
Удаление без рекурсии


15-1271944492
JohnKorsh
2010-04-22 17:54
2010.09.05
Все ли IP адреса равноправны ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский