Форум: "Начинающим";
Текущий архив: 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