Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
perceptrona
Зарегистрирован: 22.07.2003 Сообщения: 13 Откуда: Минск
|
Добавлено: Вт Июл 22 2003 14:08 Заголовок сообщения: преобразование hwnd к типу Tpoint |
|
|
Есть функция: function DisplayContextMenu(const Directory: string; Items: TStringList; Parent: DFS_HWND; Pos: TPoint; ShowRename: boolean; var RenameSelected: boolean): boolean; overload; Мне нужно эту функцию вызвать с параметрами DisplayContextMenu(directory,fselectedfiles, handle, p,False,b); где directory:string, p: Tpoint; b: boolean; fselectedfiles:TStringList
а вот handle объявлен у меня как тип Thandle
Проблема в том, что я не могу преобразовать Thandle handle к типу Tpoint
В функциях API порылся и нашёл тока функцию обратного преобразования: HWND WindowFromPoint ( POINT Point ); Как преобразовать тип Thandle к типу Tpoint? |
|
Вернуться к началу |
|
|
Aist++ Гость
|
Добавлено: Вт Июл 22 2003 14:29 Заголовок сообщения: Упс! Да это претендент на премию нобеля вопрос задал, не меньше! |
|
|
Я, фигею, дорогая редакция! Как ты, о великий и мудрый программный гений, собираешся преобразовать дескриптор окна (THandle) в координаты точки (TPoint)? Вот это тупняк! А WindowFromPoint - это не преобразование точки в дескриптор, а функция, которая возвращает дескриптор окна, находящегося в заданной точке экрана! К тому же, насколько я понял, проблема с преобразованием типа THandle в DFS_HWND, а не THandle в TPoint!!! И что это за функция такая DisplayContextMenu? И что за тип DFS_HWND? Напиши, попробунм разобраться! А пока, совет напоследок. Попробуй написать так: DisplayContextMenu(directory, fselectedfiles, DFS_HWND(handle), p, False, b); |
|
Вернуться к началу |
|
|
perceptrona
Зарегистрирован: 22.07.2003 Сообщения: 13 Откуда: Минск
|
Добавлено: Вт Июл 22 2003 14:42 Заголовок сообщения: Re: Упс! Да это претендент на премию нобеля вопрос задал, не меньше! |
|
|
type DFS_HWND = {$IFDEF DFS_DELPHI} HWND {$ELSE} pointer {$ENDIF};
а DFS_Delphi определено как {$DEFINE DELPHI_FREE_STUFF} {$IFDEF VER140} {$DEFINE DFS_COMPILER_6} {$DEFINE DFS_DELPHI} {$DEFINE DFS_DELPHI_6} {$ENDIF} {$IFDEF VER130} {$DEFINE DFS_COMPILER_5} {$IFDEF BCB} {$DEFINE DFS_CPPB} {$DEFINE DFS_CPPB_5} {$ELSE} {$DEFINE DFS_DELPHI} {$DEFINE DFS_DELPHI_5} {$ENDIF} {$ENDIF} и т.д. |
|
Вернуться к началу |
|
|
Aist++ Гость
|
Добавлено: Вт Июл 22 2003 14:48 Заголовок сообщения: Re: Упс! Да это претендент на премию нобеля вопрос задал, не меньше! |
|
|
Как я и написал: DisplayContextMenu(directory, fselectedfiles, DFS_HWND(handle), p, False, b); Теоретически, это должно работать. Или не работает? А что за функция такая DisplayContextMenu? |
|
Вернуться к началу |
|
|
perceptrona
Зарегистрирован: 22.07.2003 Сообщения: 13 Откуда: Минск
|
Добавлено: Вт Июл 22 2003 14:48 Заголовок сообщения: Re: Упс! Да это претендент на премию нобеля вопрос задал, не меньше! |
|
|
function DisplayContextMenu(const Directory: string; Items: TStringList; Parent: DFS_HWND; Pos: TPoint; ShowRename: boolean; var RenameSelected: boolean): boolean; overload; begin g_ShowRename := ShowRename; Result := InvokeListInterfaceElement(Directory, Items, HWND(Parent), Pos, icContextMenu, ''); RenameSelected := g_RenameSelected; end; |
|
Вернуться к началу |
|
|
Aist++ Гость
|
Добавлено: Вт Июл 22 2003 14:51 Заголовок сообщения: Так работает или нет? |
|
|
Как я и написал: DisplayContextMenu(directory, fselectedfiles, DFS_HWND(handle), p, False, b); Теоретически, это должно работать. Или не работает? |
|
Вернуться к началу |
|
|
perceptrona
Зарегистрирован: 22.07.2003 Сообщения: 13 Откуда: Минск
|
Добавлено: Вт Июл 22 2003 14:53 Заголовок сообщения: Re: Упс! Да это претендент на премию нобеля вопрос задал, не меньше! |
|
|
В строке где написано: DisplayContextMenu(filename,Pointer(handle),p,Fal se,b); Компилятор грит, что Incopatibles types TPOINT и HWND |
|
Вернуться к началу |
|
|
perceptrona
Зарегистрирован: 22.07.2003 Сообщения: 13 Откуда: Минск
|
Добавлено: Вт Июл 22 2003 14:54 Заголовок сообщения: Re: Упс! Да это претендент на премию нобеля вопрос задал, не меньше! |
|
|
Я ошибся - не DisplayContextMenu(filename,Pointer(handle),p,False,b); а DisplayContextMenu(filename,DFS_HWND(handle),p,False,b); |
|
Вернуться к началу |
|
|
Aist++ Гость
|
Добавлено: Вт Июл 22 2003 14:58 Заголовок сообщения: Кинь сюда часть исходника |
|
|
Кинь сюда часть исходника, точнее процедуру где вызываешь DisplayContextMenu - я попробую разобраться. |
|
Вернуться к началу |
|
|
perceptrona
Зарегистрирован: 22.07.2003 Сообщения: 13 Откуда: Минск
|
Добавлено: Вт Июл 22 2003 15:04 Заголовок сообщения: Re: Кинь сюда часть исходника |
|
|
procedure TMFileExplorer.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var p :tpoint; n :tlistitem; b: Boolean; begin inherited; if (button=mbright) and fcontextmenu then begin n:=getitemat(x,y); if assigned(n) then begin if pos(n.subitems[4],selectedfilenames)=0 then selected:=nil; selected:=n; click; getcursorpos(p); b:=False; if selectedcount>1 then begin getselectedfilenames; DisplayContextMenu(directory,fselectedfiles,TPOINT(handle), p,False, b); end else DisplayContextMenu(filename,DFS_HWND(handle),p,False,b); end; end; end; |
|
Вернуться к началу |
|
|
perceptrona
Зарегистрирован: 22.07.2003 Сообщения: 13 Откуда: Минск
|
Добавлено: Вт Июл 22 2003 15:06 Заголовок сообщения: Re: Кинь сюда часть исходника |
|
|
{$IFDEF DFS_COMPILER_4_UP}
function DisplayContextMenu(const Filename: string; Parent: DFS_HWND; Pos: TPoint; ShowRename: boolean; var RenameSelected: boolean): boolean; var Dummy: PItemIDList; begin Dummy := NIL; g_ShowRename := ShowRename; Result := InvokeInterfaceElement(Filename, NIL, Dummy, 0, icContextMenu, '', HWND(Parent), Pos, 1); RenameSelected := g_RenameSelected; end;
function DisplayContextMenu(const Directory: string; Items: TStringList; Parent: DFS_HWND; Pos: TPoint; ShowRename: boolean; var RenameSelected: boolean): boolean; overload; begin g_ShowRename := ShowRename; Result := InvokeListInterfaceElement(Directory, Items, HWND(Parent), Pos, icContextMenu, ''); RenameSelected := g_RenameSelected; end;
function DisplayContextMenu(AParent: IShellFolder; var APIDL: PItemIDList; Attr: ULONG; Parent: DFS_HWND; Pos: TPoint; PidlCount: integer; ShowRename: boolean; var RenameSelected: boolean): boolean; begin g_ShowRename := ShowRename; Result := InvokeInterfaceElement('', AParent, APIDL, Attr, icContextMenu, '', HWND(Parent), Pos, PidlCount); RenameSelected := g_RenameSelected; end;
{$ELSE}
function DisplayContextMenu(const Filename: string; Parent: DFS_HWND; Pos: TPoint; ShowRename: boolean; var RenameSelected: boolean): boolean; var Dummy: PItemIDList; begin g_ShowRename := ShowRename; Dummy := NIL; Result := InvokeInterfaceElement(Filename, NIL, Dummy, 0, icContextMenu, '', HWND(Parent), Pos, 1); RenameSelected := g_RenameSelected; end;
function DisplayContextMenuList(const Directory: string; Items: TStringList; Parent: DFS_HWND; Pos: TPoint; ShowRename: boolean; var RenameSelected: boolean): boolean; begin g_ShowRename := ShowRename; Result := InvokeListInterfaceElement(Directory, Items, HWND(Parent), Pos, icContextMenu, ''); RenameSelected := g_RenameSelected; end;
function DisplayContextMenuPIDL(AParent: IShellFolder; var APIDL: PItemIDList; Attr: ULONG; Parent: DFS_HWND; Pos: TPoint; PidlCount: integer; ShowRename: boolean; var RenameSelected: boolean): boolean; begin g_ShowRename := ShowRename; Result := InvokeInterfaceElement('', AParent, APIDL, Attr, icContextMenu, '', HWND(Parent), Pos, PidlCount); RenameSelected := g_RenameSelected; end; {$ENDIF} |
|
Вернуться к началу |
|
|
Aist++ Гость
|
Добавлено: Вт Июл 22 2003 15:16 Заголовок сообщения: Re: Кинь сюда часть исходника |
|
|
Ты DisplayContextMenu вызываешь два раза, но!.. При первом вызове у неё 6 параметров, а при втором - 5! Почему то у меня такое чувство, что ты последнем случае пропустил параметр Items |
|
Вернуться к началу |
|
|
perceptrona
Зарегистрирован: 22.07.2003 Сообщения: 13 Откуда: Минск
|
Добавлено: Вт Июл 22 2003 15:30 Заголовок сообщения: Re: Кинь сюда часть исходника |
|
|
Вызывать то я её вызываю 2 раза, но и функций DisplayContextMenu у меня 3: вот прототипы: function DisplayContextMenu(const Filename: string; Parent: DFS_HWND; Pos: TPoint; ShowRename: boolean; var RenameSelected: boolean): boolean; overload;
function DisplayContextMenu(const Directory: string; Items: TStringList; Parent: DFS_HWND; Pos: TPoint; ShowRename: boolean; var RenameSelected: boolean): boolean; overload;
function DisplayContextMenu(AParent: IShellFolder; var APIDL: PItemIDList; Attr: ULONG; Parent: DFS_HWND; Pos: TPoint; PidlCount: integer; ShowRename: boolean; var RenameSelected: boolean): boolean; overload;
так что ничего я не пропустил. Сравни у них число параметров. Компилятор сам знает какую из них вызвать... |
|
Вернуться к началу |
|
|
perceptrona
Зарегистрирован: 22.07.2003 Сообщения: 13 Откуда: Минск
|
Добавлено: Вт Июл 22 2003 15:33 Заголовок сообщения: Re: Кинь сюда часть исходника |
|
|
они же все перегруженные (overload;)!!! |
|
Вернуться к началу |
|
|
perceptrona
Зарегистрирован: 22.07.2003 Сообщения: 13 Откуда: Минск
|
Добавлено: Вт Июл 22 2003 15:33 Заголовок сообщения: Re: Кинь сюда часть исходника |
|
|
они же все перегруженные (overload;)!!! Куда смотрит школа... ? |
|
Вернуться к началу |
|
|
perceptrona
Зарегистрирован: 22.07.2003 Сообщения: 13 Откуда: Минск
|
Добавлено: Вт Июл 22 2003 15:37 Заголовок сообщения: Re: Кинь сюда часть исходника |
|
|
Вообще-то это я пытаюсь компонент MiteC File Explorer под Delphi7 заточить. и в описании к этим всем функциям DisplayContextMenu сказано: //------------------------------------------------ ------------------------------ // DisplayContextMenu displays the right click menu for the given file or // directory and processes the item selected, if any. Parent is the window // handle for the owning window of any error messages that may need to be // displayed by the system, MyForm.Handle is generally fine. Pos is the X, Y // position to display the menu at given in screen (absolute) coordinates. //-------------------------------------------- ---------------------------------- |
|
Вернуться к началу |
|
|
|