| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > THandle :), HWND и HDC разница какая? |
| Автор: Teleport 11.12.2008, 14:11 | ||
| я вот никак не пойму с этими типами данных: THandle, HWND, HDC. Handle - насколько я понимаю - это дескриптор окна(integer) По этому дескриптору можно найти любое окно. Если не прав поправьте. Какая разница между этими типами?? Так вот, пример:
Все эти переменные - вроде разных типов и могут приравниваться к одному и тому же Button1.Handle. Для каких целей какой тип использовать? |
| Автор: Poseidon 11.12.2008, 14:20 | ||||
В принципе это одно и тоже и сводится к LongWord. Разница в использовании. В справки же все есть.
|
| Автор: Teleport 11.12.2008, 14:36 |
| т.е. THandle и hdc - я использую просто в приложениях своих. А HWND - когда работаю со средствами TWebBrowser. Так? |
| Автор: Rrader 11.12.2008, 14:54 |
| Когда используешь WinAPI, смотри, какие типы параметров использует та или иная функция, и используй их. В Delphi особой разницы нет, что писать (главное размер соблюдать, работать-то оно будет Эти типы из win32k.sys: HWND - Window Handle - для оконных API HDC - Device Context Handle - для GDI API Просто числа (дескриптор - краткий описатель), скрывающие тонкую структуру соответственно таблиц Windowing и GDI THandle - это уже тип Delphi, с API не связан. |
| Автор: CodeMonkey 11.12.2008, 14:56 |
| Teleport, это всё - ровно один и тот же тип данных. А именно - просто четырёхбайтовое число. Вообще можно использовать любой тип. Но. С практической точки зрения имеет смысл использовать "подходящие по смыслу". Т.е. TButton.Handle имеет тип HWND (как я это узнал? Открыл справку! Иногда Ctrl+клик помогает). Несмотря на то, что это то же самое, что тип HDC, не рекомендуется использовать для этого HDC. Просто, чтобы не запутаться. С другой стороны, нужно понимать, что все эти типы - не более, чем описатели настоящих данных. Что-то типа указателя. Сами данные могут быть разных типов. Но описатель - это всегда просто число размером 4 байта. Указывая подходящий по смыслу тип, ты указываешь на тип ресурса, который описывает этот описатель. Например, пусть тебе дана переменная V: HWND. Что ты с ней сможешь сделать? В принципе, ты можешь сказать: "ага, этот описатель имеет тип HWND, значит, он, скорее всего, описывает окно. Т.е. я могу, например, передать V в SendMessage". Или: V: HDC. Ты скажешь: "ага, этот описатель контекста устройства. Тогда, наверное, я могу передать его в ReleaseDC". Да, поскольку все описатели - это один и тот же тип данных. Ты мог бы взять и в переменную V: HWND записать описатель контекста устройства, а вовсе не описатель окна. Да, это было бы полностью корректно (надеюсь, понятно, что описатель контекста устройства нельзя передать в SendMessage, в каком бы типе данных он ни хранился?). Но если бы ты или другой человек потом посмотрели бы код, увидели бы название HWND и, по-ошибке, передали бы в SendMessage. Вывод: использовать нужно тот тип, что возвращают конкретные функции и не смешивать типы данных без необходимости. Добавлено через 3 минуты и 43 секунды Да ну. C TButton.Handle: HWND не спутали? http://msdn.microsoft.com/en-us/library/ms724211(VS.85).aspx. |
| Автор: Teleport 11.12.2008, 15:02 |
| начинает проясняться Спасибо за разъяснение |
| Автор: Rrader 11.12.2008, 15:47 |
Не спутал. Но, прощу прощения, выразился не свосем корректно. |
| Автор: Rrader 11.12.2008, 16:47 |
Шутник Мои ночные кошмары таковы: THandle так назван, чтобы не было конфликта со свойством Handle. По мне он должен быть явно объявлен через LongWord (type LongWord) и иметь название HANDLE (а свойство Handle переименовать). Но это уже, видимо, невозможно. Добавлено через 35 секунд |
| Автор: CodeMonkey 12.12.2008, 10:21 | ||
Хорошее замечание. Действительно, типу THandle следовало бы называться HANDLE, также как и HDC, HWND и HMODULE. Но в целях упрощения кода для него сделали исключение. Вообще в Delphi принято вводить "Delphi-псевдонимы" для типов системы. Например, есть у Windows такой тип: _EXCEPTION_RECORD. Но на Паскале его написание смотрится ужасно. Поэтому в Delphi вводится для него псевдоним: TExceptionRecord = _EXCEPTION_RECORD;. TExceptionRecord - это уже совсем Паскаль. Другой пример - _RTL_CRITICAL_SECTION и TRTLCriticalSection. Она и та же сущность, но с разными стилями именования типа. |
| Автор: Teleport 12.12.2008, 21:08 |
| 2 THandle - смайлик? А меня просто лыба растянула в момени набора темы И вот в вашем обсуждении я черпаю важную информацию |