Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Drag and Drop 
:(
    Опции темы
RA
Дата 7.8.2003, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



Нужно бросить на компонент ListVew Файлы и получить их пути. Как ?
PM   Вверх
stab
Дата 7.8.2003, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



надо реализовать интерфейс IDropTarget и зарегить его с помощью RegisterDragDrop, затем получать имена файлов при Drop. Я обычно делаю так:

Код

unit Unit1;

interface

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

type
 TForm1 = class(TForm, IDropTarget)
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   function DragEnter(const dataObj: IDataObject; grfKeyState: Longint;
     pt: TPoint; var dwEffect: Longint): HResult; stdcall;
   function IDropTarget.DragOver = DragOver2;
   function DragOver2(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;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

function TForm1.DragEnter(const dataObj: IDataObject; grfKeyState: Integer;
 pt: TPoint; var dwEffect: Integer): HResult;
var
 f: FORMATETC;
begin
 ZeroMemory(@f, SizeOf(f));
 f.cfFormat := CF_HDROP;
 f.lindex := -1;
 f.tymed := TYMED_HGLOBAL;
 if dataObj.QueryGetData(f) = S_OK then begin
   dwEffect := DROPEFFECT_COPY;
   Result := S_OK;
 end
 else
   Result := E_ABORT;
end;

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

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

function TForm1.Drop(const dataObj: IDataObject; grfKeyState: Integer;
 pt: TPoint; var dwEffect: Integer): HResult;
var
 f: FORMATETC;
 m: STGMEDIUM;
 i, cnt: Integer;
 fn: array[1..MAX_PATH] of Char;
begin
 ZeroMemory(@f, SizeOf(f));
 f.cfFormat := CF_HDROP;
 f.lindex := -1;
 f.tymed := TYMED_HGLOBAL;
 if dataObj.GetData(f, m) = S_OK then begin

   cnt := DragQueryFile(m.hGlobal, $FFFFFFFF, nil, 0);

   for i := 0 to cnt - 1 do begin
     DragQueryFile(m.hGlobal, i, @fn, MAX_PATH);
     ShowMessage(PChar(@fn));
   end;

   if m.unkForRelease <> nil then
     IUnknown(m.unkForRelease)._Release;

 end;
 Result := S_OK;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 RegisterDragDrop(Handle, Self as IDropTarget);
end;

initialization
 OleInitialize(nil);

finalization
OleUninitialize;

end.



--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
RA
Дата 7.8.2003, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



Вот с этим трабл:

procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterDragDrop(Handle, Self as IDropTarget);
end;


[Error] Operator not applicable to this operand type

PM   Вверх
stab
Дата 7.8.2003, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



RAdmin, стрянно... какая у тебя версия дельфей?


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
p0s0l
Дата 7.8.2003, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Бывает такое, что какой-нибудь класс/интерфейс прописан в нескольких юнитах... Тогда такое могут написать. Было у меня эта же проблема с IPersistFile (прописан в ActiveX и Ole2).



--------------------
С уважением, г-н Посол.
PM   Вверх
RA
Дата 8.8.2003, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



У меня 5 а у тебя как я вижу либо 6 либо 7
PM   Вверх
RA
Дата 8.8.2003, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



А это может быть из-за unit'a variants ? *(я его выкинул, ибо в D5 таких нема)
PM   Вверх
stab
Дата 8.8.2003, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



да, у мя 6 и 7 и там и там работает. Variants скорее всего сдесь ни при чем.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
p0s0l
Дата 8.8.2003, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Опять я - посмотри: IDropTarget есть и в модуле ActiveX и в Ole2... Тебе надо юзать тот что из ActiveX.
Попробуй на всякий случай так:
Код
RegisterDragDrop(Handle, Self as ActiveX.IDropTarget);


У меня, правда, D7, поэтому может тут ерунду говорю... Извиняюсь за назойливость...


--------------------
С уважением, г-н Посол.
PM   Вверх
RA
Дата 8.8.2003, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



Всё понятно для D5 надо так RegisterDragDrop(Handle, Self) и всё.
PM   Вверх
pascal
Дата 9.8.2003, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 16.7.2003
Где: Россия - Уфа

Репутация: нет
Всего: 1



Цитата(RAdmin @ 8.8.2003, 19:47)
Всё понятно для D5 надо так RegisterDragDrop(Handle, Self) и всё.

Это ко всем версиям подходит, а тот длинный способ перехватывает не тока файлы но и всё что попало...
PM MAIL WWW ICQ   Вверх
pascal
Дата 9.8.2003, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 16.7.2003
Где: Россия - Уфа

Репутация: нет
Всего: 1



Немного недоделано, но всёже работает
Код
{##########################################################}
{#                                                        #}
{#  Component: TMJOLE (ver. 1.0.1)                        #}
{#  Copyright: MJ Soft 2002 (Russia) FreeWare             #}
{#                                                        #}
{#  Компонент: TMJOLE (версия 1.0.1)                      #}
{#  Написано: MJ Soft 2002 (Россия, г.Уфа)                #}
{#  Распространение: Бесплатно                            #}
{#                                                        #}
{#  http://pascal.dax.ru/delphi/components/                #}
{#  e-mail: [email protected] ([email protected])                #}
{#                                                        #}
{##########################################################}

unit MJOLE;

interface

uses
 Windows, Messages, SysUtils, Classes, Controls, Graphics, ActiveX;

type
 TOleDragObject = class;

 TDragType = (dtCopy, dtMove, dtLink, dtNone);

 TDragEvent = procedure(Sender: TObject; State: TDragState;
   Source: TOleDragObject; Shift: TShiftState; X, Y: Integer;
   var DragType: TDragType) of object;

 TDropEvent = procedure(Sender: TObject; Source: TOleDragObject;
   Shift: TShiftState; X, Y: Integer; var DragType: TDragType) of object;

 TDragContent = (edcText, edcBitmap, edcMetafile, edcFileList, edcOther);

 TMJOLE = class(TComponent, IUnknown, IDropTarget)
 private
   FDragOwner: TWinControl;
   FDragOwnerHandle: THandle;
   FActive: Boolean;
   FNActive: Boolean;
   FOnDrag: TDragEvent;
   FOnDrop: TDropEvent;
   FDragObj: TOleDragObject;
   procedure SetDragOwner(const Value: TWinControl);
   function GetAboutStr: String;
   function GetCopyrightStr: String;
   procedure SetActive(const Value: Boolean);
   procedure Run;
   procedure Stop;
 protected
   procedure Notification(AComponent: TComponent;
     Operation: TOperation); override;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
 published
   property About: String read GetAboutStr;
   property Copyright: String read GetCopyrightStr;
   property DragOwner: TWinControl read FDragOwner write SetDragOwner;
   property Active: Boolean read FActive write SetActive;
   property OnDrag: TDragEvent read FOnDrag write FOnDrag;
   property OnDrop: TDropEvent read FOnDrop write FOnDrop;
   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;
 end;

 TOleDragObject = class(TDragObject)
 private
   DataObj: IDataObject;
   FDataFormats: TStringList;
   FKeys: Longint;
 protected
   function GetText: String;
   function GetDragContent: TDragContent;
   function GetFileList: String;
   function GetBitmap: TBitmap;
   function GetStream(Format: Integer): TMemoryStream;
   function GethGlobal(Format: Integer): THandle;
 public
   constructor Create; virtual;
   destructor Destroy; override;
   function HasDataFormat(Format: Integer): Boolean;
   function DataObject: IDataObject;
   function AsText(Format: String): String; overload;
   function AsText(Format: Word): String; overload;
   property Keys: Longint read FKeys;
   property DataFormats: TStringList read FDataFormats;
   property Text: String read GetText;
   property FileList: String read GetFileList;
   property Bitmap: TBitmap read GetBitmap;
   property Stream[Format: Integer]: TMemoryStream read GetStream;
   property hGlobal[Format: Integer]: THandle read GethGlobal;
   property Content: TDragContent read GetDragContent;
 end;

procedure Register;

implementation

type
 PDropFiles = ^TDropFiles;
 TDropFiles = record
   pfiles: DWORD;
   pt: TPOINT;
   fNC: BOOL;
   fWide: BOOL;
 end;

procedure Register;
begin
 RegisterComponents('MJ', [TMJOLE]);
end;

function GetFormatName(AFormat: Integer): String;
const
 FormatNames: array[1..16] of String = ('TEXT', 'BITMAP', 'METAFILEPICT',
   'SYLK', 'DIF', 'TIFF', 'OEMTEXT', 'DIB', 'PALETTE', 'PENDATA', 'RIFF',
   'WAVE', 'UNICODETEXT', 'ENHMETAFILE', 'HDROP', 'LOCALE');
begin
 if (AFormat>=1) and (AFormat<=16) then
    Result := FormatNames[AFormat]
 else
 begin
   SetLength(Result, 128);
   SetLength(Result, GetClipboardFormatName(AFormat, PChar(Result), 128));
 end;
end;

{ TMJOLE }

constructor TMJOLE.Create(AOwner: TComponent);
begin
 inherited;
 FActive := False;
 FNActive := False;
 if AOwner is TWinControl then
   FDragOwner := TWinControl(AOwner);
end;

destructor TMJOLE.Destroy;
begin
 if FActive then
   Stop;
 inherited;
end;

function TMJOLE.GetAboutStr: String;
begin
 Result := 'Component TMJOLE';
end;

function TMJOLE.GetCopyrightStr: String;
begin
 Result := '2002 MJ Soft';
end;

function TMJOLE.DragEnter(const DataObj: IDataObject; grfKeyState: Integer;
 pt: TPoint; var dwEffect: Integer): HResult;
var
 FormatEtc: IEnumFormatEtc;
 Fmt: TFormatEtc;
 Shift: TShiftState;
 DragEffect: TDragType;
begin
 FDragObj := TOleDragObject.Create;
 FDragObj.DataObj := DataObj;
 FDragObj.FDataFormats.Clear;
 if DataObj.EnumFormatEtc(DATADIR_GET, FormatEtc)=S_OK then
   while FormatEtc.Next(1, Fmt, nil) = S_OK do
     FDragObj.FDataFormats.AddObject(GetFormatName(Fmt.cfFormat), TObject(Fmt.cfFormat));
 FDragObj.FKeys := grfKeyState;
 Shift := [];
 if (MK_LBUTTON and grfKeyState<>0) then Shift := [ssLeft];
 if (MK_RBUTTON and grfKeyState<>0) then Shift := Shift + [ssRight];
 if (MK_MBUTTON and grfKeyState<>0) then Shift := Shift + [ssMiddle];
 if (MK_CONTROL and grfKeyState<>0) then Shift := Shift + [ssCtrl];
 if (MK_SHIFT and grfKeyState <> 0) then Shift := Shift + [ssShift];
 if ($20 and grfKeyState<>0) then Shift := Shift+[ssAlt];
 DragEffect := dtNone;
 pt := FDragOwner.ScreenToClient(pt);
 if Assigned(FOnDrag) then FOnDrag(Self, dsDragEnter, FDragObj, Shift, pt.X, pt.Y, DragEffect);
 case DragEffect of
   dtCopy: dwEffect := DROPEFFECT_COPY;
   dtMove: dwEffect := DROPEFFECT_MOVE;
   dtLink: dwEffect := DROPEFFECT_LINK;
   dtNone: dwEffect := DROPEFFECT_NONE;
 end;
 Result := S_OK;
end;

function TMJOLE.DragLeave: HResult;
var
 DragEffect: TDragType;
begin
 DragEffect := dtNone;
 if Assigned(FOnDrag) then FOnDrag(Self, dsDragLeave, FDragObj, [], -1, -1, DragEffect);
 if Assigned(FDragObj) then
 begin
   FdragObj.Free;
   FdragObj := nil;
 end;
 Result := S_OK;
end;

function TMJOLE.DragOver(grfKeyState: Integer; pt: TPoint;
 var dwEffect: Integer): HResult;
var
 Shift: TShiftState;
 DragEffect: TDragType;
begin
 Shift := [];
 if (MK_LBUTTON and grfKeyState<>0) then Shift := [ssLeft];
 if (MK_RBUTTON and grfKeyState<>0) then Shift := Shift + [ssRight];
 if (MK_MBUTTON and grfKeyState<>0) then Shift := Shift + [ssMiddle];
 if (MK_CONTROL and grfKeyState<>0) then Shift := Shift + [ssCtrl];
 if (MK_SHIFT and grfKeyState<>0) then Shift := Shift + [ssShift];
 if ($20 and grfKeyState<>0) then Shift := Shift + [ssAlt];
 DragEffect := dtNone;
 pt := FDragOwner.ScreenToClient(pt);
 if Assigned(FOnDrag) then FOnDrag(Self, dsDragMove, FDragObj, Shift, pt.X, pt.Y, DragEffect);
 case DragEffect of
   dtCopy: dwEffect := DROPEFFECT_COPY;
   dtMove: dwEffect := DROPEFFECT_MOVE;
   dtLink: dwEffect := DROPEFFECT_LINK;
 else
   dwEffect := DROPEFFECT_NONE;
 end;
 Result := S_OK;
end;

function TMJOLE.Drop(const DataObj: IDataObject; grfKeyState: Integer;
 pt: TPoint; var dwEffect: Integer): HResult;
var
 Shift: TShiftState;
 DragEffect: TDragType;
begin
 Shift := [];
 if (MK_LBUTTON and grfKeyState<>0) then Shift := [ssLeft];
 if (MK_RBUTTON and grfKeyState<>0) then Shift := Shift + [ssRight];
 if (MK_MBUTTON and grfKeyState<>0) then Shift := Shift + [ssMiddle];
 if (MK_CONTROL and grfKeyState<>0) then Shift := Shift + [ssCtrl];
 if (MK_SHIFT and grfKeyState<>0) then Shift := Shift + [ssShift];
 if ($20 and grfKeyState<>0) then Shift := Shift + [ssAlt];
 DragEffect := dtNone;
 pt := FDragOwner.ScreenToClient(pt);
 if Assigned(FOnDrop) then FOnDrop(Self, FDragObj, Shift, pt.X, pt.Y, DragEffect);
 case DragEffect of
   dtCopy: dwEffect := DROPEFFECT_COPY;
   dtMove: dwEffect := DROPEFFECT_MOVE;
   dtLink: dwEffect := DROPEFFECT_LINK;
   dtNone: dwEffect := DROPEFFECT_NONE;
 end;
 if Assigned(FDragObj) then
 begin
   FDragObj.Free;
   FDragObj := nil;
 end;
 Result := S_OK;
end;

procedure TMJOLE.SetActive(const Value: Boolean);
begin
 if (FActive=Value) then
   Exit;
 if  (FDragOwner=nil) and (Value=True) then
 begin
   FNActive := True;
   Exit;
 end;
 FNActive := False;
 FActive := Value;
 if not(csDesigning in ComponentState) then
   if Value then
     Run
   else
     Stop;
end;

procedure TMJOLE.SetDragOwner(const Value: TWinControl);
var
 RActive: Boolean;
begin
 if FDragOwner=Value then
   Exit;
 RActive := FActive;
 Active := False;
 FDragOwner := Value;
 if RActive or FNActive then
   Active := True;
 if Value<>nil then
   Value.FreeNotification(Self)
end;

procedure TMJOLE.Notification(AComponent: TComponent;
 Operation: TOperation);
begin
 inherited;
 if (Operation=opRemove) and (AComponent=FDragOwner) then
   DragOwner := nil;
end;

procedure TMJOLE.Run;
var
 HRes: HResult;
 Obj: IDropTarget;
begin
 FDragOwnerHandle := FDragOwner.Handle;
 if not GetInterface(IUnknown, Obj) then
   raise Exception.Create('GetInterface failed');
 HRes := RegisterDragDrop(FDragOwnerHandle, Obj as IDropTarget);
 case HRes of
   S_OK, DRAGDROP_E_ALREADYREGISTERED:;
   DRAGDROP_E_INVALIDHWND: raise Exception.Create('RegisterDragDrop вернула ошибку, неверный дескриптор окна');
   E_OUTOFMEMORY: raise Exception.Create('RegisterDragDrop вернула ошибку, система не выделила память');
   E_INVALIDARG: raise Exception.Create('RegisterDragDrop вернула ошибку, невеные аргумента');
   CO_E_NOTINITIALIZED: raise Exception.Create('RegisterDragDrop вернула ошибку, coInitialize had not been called');
 else
   raise Exception.Create('RegisterDragDrop вернула ошибку, неизвестная ошибка с кодом ' + IntToStr(HRes and $7FFFFFFF));
 end;
end;

procedure TMJOLE.Stop;
begin
 RevokeDragDrop(FDragOwnerHandle);
end;

{ TOleDragObject }

function TOleDragObject.AsText(Format: String): String;
var
 Fmt: TFormatEtc;
 EFE: IEnumFORMATETC;
 FMTCount: Longint;
 MDM: TStgMedium;
 PCh: PChar;
begin
 Result := '';
 FillChar(FMT, SizeOf(FMT), 0);
 DataObj.EnumFormatEtc(DATADIR_GET, EFE);
 EFE.Reset;
 repeat
   FMTCount := 0;
   EFE.Next(1, FMT, @FMTCount);
 until (GetFormatName(FMT.cfFormat)=Format) or (FMTCount=0);
 if GetFormatName(FMT.cfFormat)<>Format then
   Exit;
 FMT.tymed := TYMED_HGLOBAL;
 FMT.lindex := -1;
 if DataObj.GetData(FMT, MDM)=S_OK then
 try
   if MDM.tymed=TYMED_HGLOBAL then
   begin
     PCh := GlobalLock(MDM.hGlobal);
     Result := StrPas(PCh);
     GlobalUnlock(MDM.hGlobal);
   end;
 finally
   if Assigned(MDM.unkForRelease) then
     Iunknown(MDM.unkForRelease)._Release;
 end;
end;

function TOleDragObject.AsText(Format: Word): String;
var
 Fmt: TFormatEtc;
 EFE: IEnumFORMATETC;
 FMTCount: Longint;
 MDM: TStgMedium;
 PCh: PChar;
begin
 Result := '';
 FillChar(FMT, SizeOf(FMT), 0);
 DataObj.EnumFormatEtc(DATADIR_GET, EFE);
 EFE.Reset;
 repeat
   FMTCount := 0;
   EFE.Next(1, FMT, @FMTCount);
 until (FMT.cfFormat=Format) or (FMTCount=0);
 if FMT.cfFormat<>Format then
   Exit;
 FMT.tymed := TYMED_HGLOBAL;
 FMT.lindex := -1;
 if DataObj.GetData(FMT, MDM)=S_OK then
 try
   if MDM.tymed=TYMED_HGLOBAL then
   begin
     PCh := GlobalLock(MDM.hGlobal);
     Result := StrPas(PCh);
     GlobalUnlock(MDM.hGlobal);
   end;
 finally
   if Assigned(MDM.unkForRelease) then
     Iunknown(MDM.unkForRelease)._Release;
 end;
end;

constructor TOleDragObject.Create;
begin
 inherited;
 FDataFormats := TStringList.Create;
end;

function TOleDragObject.DataObject: IDataObject;
begin
 Result := DataObj;
end;

destructor TOleDragObject.Destroy;
begin
 FDataFormats.Free;
 inherited;
end;

function TOleDragObject.GetBitmap: TBitmap;
var
 mdm: TStgMedium;
 fmt: TFormatEtc;
 Pict: TBitmap;
 Data: THandle;
 Palette: HPALETTE;
 EnumFormatEtc: IEnumFormatEtc;
begin
 Result := nil;
 if not (Assigned(DataObj) and HasDataFormat(CF_BITMAP)) then Exit;
 if DataObj.EnumFormatEtc(DATADIR_GET, EnumFormatEtc)<>S_OK then Exit;
 Pict := TBitmap.Create;
 EnumFormatEtc.Reset;
 while EnumFormatEtc.Next(1, fmt, nil)=S_OK do
 begin
   if fmt.cfFormat=CF_BITMAP then
   begin
     try
       if (DataObj.GetData(fmt, mdm)<>S_OK) or (mdm.tymed<>TYMED_GDI) then
       begin
         Pict.Free;
         Exit;
       end;
       Data := mdm.hBitmap;
     finally
       if Assigned(mdm.unkForRelease) then
         Iunknown(mdm.unkForRelease)._Release;
     end;
     if mdm.tymed<>TYMED_GDI then
     begin
       Pict.Free;
       Exit;
     end;
     EnumFormatEtc.Reset;
     Palette := 0;
     FillChar(fmt, SizeOf(fmt), 0);
     try
       Pict.LoadFromClipboardFormat(CF_BITMAP, Data, Palette);
       Result := Pict;
     except
     end;
     Exit;
   end;
 end;
 Pict.Free;
end;

function TOleDragObject.GetDragContent: TDragContent;
begin
 if HasDataFormat(CF_ENHMETAFILE) then
   Result := edcMetaFile
 else if HasDataFormat(CF_METAFILEPICT) then
   Result := edcMetaFile
 else if HasDataFormat(CF_BITMAP) then
   Result := edcBitmap
 else if HasDataFormat(CF_HDROP) then
   Result := edcFileList
 else if HasDataFormat(CF_TEXT) then
   Result := edcText
 else
   Result := edcOther;
end;

function TOleDragObject.GetFileList: String;
var
 mdm: TStgMedium;
 pz: pchar;
 pdf: PDropFiles;
 fmt: TFormatEtc;
 s: string;
begin
 Result := '';
 if (not Assigned(DataObj)) or (not HasDataFormat(CF_HDROP)) then Exit;
 FillChar(fmt, SizeOf(fmt), 0);
 fmt.cfFormat := CF_HDROP;
 fmt.tymed := TYMED_HGLOBAL;
 fmt.lindex := -1;
 if DataObj.GetData(fmt, mdm)<>S_OK then Exit;
 try
   if mdm.tymed=TYMED_HGLOBAL then
   begin
     pdf := GlobalLock(mdm.hGlobal);
     pz := PChar(pdf);
     Inc(pz, pdf^.pfiles);
     if not (pdf.fWide) then
       while (pz[0]<>#0) do
       begin
         Result := Result+String(pz)+#13#10;
         Inc(pz, 1+StrLen(pz));
       end
     else
       while (pz[0] <> #0) do
       begin
         s := WideCharToString(PWideChar(pz));
         Result := Result+s+#13#10;
         Inc(pz, Length(s)*2+2);
       end;
     GlobalUnlock(mdm.HGlobal);
   end;
 finally
   if Assigned(mdm.unkForRelease) then
     IUnknown(mdm.unkForRelease)._Release;
 end;
end;

function TOleDragObject.GethGlobal(Format: Integer): THandle;
var
 mdm: TStgMedium;
 fmt: TFormatEtc;
begin
 Result := THandle(-1);
 if (not Assigned(DataObj)) or (not HasDataFormat(Format)) then Exit;
 FillChar(fmt, SizeOf(fmt), 0);
 fmt.cfFormat := Format;
 fmt.tymed := TYMED_HGLOBAL;
 fmt.lindex := -1;
 if DataObj.GetData(fmt, mdm)<>S_OK then Exit;
 if mdm.tymed=TYMED_HGLOBAL then
   Result := mdm.hGlobal;
 if Assigned(mdm.unkForRelease) then
   IUnknown(mdm.unkForRelease)._Release;
end;

function TOleDragObject.GetStream(Format: Integer): TMemoryStream;
var
 mdm: TStgMedium;
 pdf: Pointer;
 sdf: DWORD;
 fmt: TFormatEtc;
 S: TMemoryStream;
begin
 Result := nil;
 if (not Assigned(DataObj)) or (not HasDataFormat(Format)) then Exit;
 FillChar(fmt, SizeOf(fmt), 0);
 fmt.cfFormat := Format;
 fmt.tymed := TYMED_HGLOBAL;
 fmt.lindex := -1;
 if DataObj.GetData(fmt, mdm)<>S_OK then Exit;
 try
   if mdm.tymed=TYMED_HGLOBAL then
   begin
     pdf := GlobalLock(mdm.hGlobal);
     sdf := GlobalSize(mdm.hGlobal);
     try
       S := TMemoryStream.Create;
       try
         S.Size := sdf;
         Move(pdf^, S.Memory^, sdf);
         Result := S;
       except
         S.Free;
       end;
     finally
       GlobalUnlock(mdm.HGlobal);
     end;
   end;
 finally
   if Assigned(mdm.unkForRelease) then
     IUnknown(mdm.unkForRelease)._Release;
 end;
end;

function TOleDragObject.GetText: String;
var
 FMT: TFormatEtc;
 EFE: IEnumFORMATETC;
 FMTCount: Longint;
 MDM: TStgMedium;
 PCh: PChar;
begin
 Result := '';
 FillChar(FMT, SizeOf(FMT), 0);
 DataObj.EnumFormatEtc(DATADIR_GET, EFE);
 EFE.Reset;
 repeat
   FMTCount := 0;
   EFE.Next(1, FMT, @FMTCount);
 until (FMT.cfFormat=CF_TEXT) or (FMTCount=0);
 if FMT.cfFormat<>CF_TEXT then
   Exit;
 FMT.tymed := TYMED_HGLOBAL;
 FMT.lindex := -1;
 if DataObj.GetData(FMT, MDM)=S_OK then
 try
   if (FMT.cfFormat=CF_TEXT) and (MDM.tymed=TYMED_HGLOBAL) then
   begin
     PCh := GlobalLock(MDM.hGlobal);
     Result := StrPas(PCh);
     GlobalUnlock(MDM.hGlobal);
   end;
 finally
   if Assigned(MDM.unkForRelease) then
     Iunknown(MDM.unkForRelease)._Release;
 end;
end;

function TOleDragObject.HasDataFormat(Format: Integer): Boolean;
var
 FMT: TFormatEtc;
 EFE: IEnumFORMATETC;
 FMTCount: Longint;
begin
 if not Assigned(DataObj) then
 begin
   Result := False;
   Exit;
 end;
 FillChar(FMT, SizeOf(FMT), 0);
 DataObj.EnumFormatEtc(DATADIR_GET, EFE);
 EFE.Reset;
 repeat
   FMTCount := 0;
   if EFE.Next(1, FMT, @FMTCount)<>S_OK then Break;
 until (FMT.cfFormat=Format) or (FMTCount=0);
 Result := (FMT.cfFormat=Format);
end;

initialization
 OleInitialize(nil);

finalization
 OleUninitialize;

end.


Это сообщение отредактировал(а) pascal - 9.8.2003, 17:04
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0594 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.