![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 1 Всего: 6 |
я вот никак не пойму с этими типами данных:
THandle, HWND, HDC. Handle - насколько я понимаю - это дескриптор окна(integer) По этому дескриптору можно найти любое окно. Если не прав поправьте. Какая разница между этими типами?? Так вот, пример:
Все эти переменные - вроде разных типов и могут приравниваться к одному и тому же Button1.Handle. Для каких целей какой тип использовать? |
|||
|
||||
| Poseidon |
|
||||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 9 Всего: 133 |
В принципе это одно и тоже и сводится к LongWord. Разница в использовании. В справки же все есть.
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
||||
|
|||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 1 Всего: 6 |
т.е. THandle и hdc - я использую просто в приложениях своих. А HWND - когда работаю со средствами TWebBrowser. Так?
|
|||
|
||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 18 Всего: 191 |
Когда используешь WinAPI, смотри, какие типы параметров использует та или иная функция, и используй их. В Delphi особой разницы нет, что писать (главное размер соблюдать, работать-то оно будет
Эти типы из win32k.sys: HWND - Window Handle - для оконных API HDC - Device Context Handle - для GDI API Просто числа (дескриптор - краткий описатель), скрывающие тонкую структуру соответственно таблиц Windowing и GDI THandle - это уже тип Delphi, с API не связан. Это сообщение отредактировал(а) Rrader - 11.12.2008, 14:57 |
|||
|
||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
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 не спутали? CloseHandle. Это сообщение отредактировал(а) CodeMonkey - 11.12.2008, 14:58 -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 1 Всего: 6 |
начинает проясняться
Спасибо за разъяснение Это сообщение отредактировал(а) Teleport - 11.12.2008, 15:39 |
|||
|
||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 18 Всего: 191 |
Не спутал. Но, прощу прощения, выразился не свосем корректно. |
|||
|
||||
| THandle |
|
|||
![]() Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 50 Всего: 372 |
Интересно знать, что значил бы смайлик после "THandle" в названии темы?
А как? И по каким причинам он не в полной мере отражает? |
|||
|
||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 18 Всего: 191 |
Шутник Мои ночные кошмары таковы: THandle так назван, чтобы не было конфликта со свойством Handle. По мне он должен быть явно объявлен через LongWord (type LongWord) и иметь название HANDLE (а свойство Handle переименовать). Но это уже, видимо, невозможно. Добавлено через 35 секунд |
|||
|
||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Хорошее замечание. Действительно, типу THandle следовало бы называться HANDLE, также как и HDC, HWND и HMODULE. Но в целях упрощения кода для него сделали исключение. Вообще в Delphi принято вводить "Delphi-псевдонимы" для типов системы. Например, есть у Windows такой тип: _EXCEPTION_RECORD. Но на Паскале его написание смотрится ужасно. Поэтому в Delphi вводится для него псевдоним: TExceptionRecord = _EXCEPTION_RECORD;. TExceptionRecord - это уже совсем Паскаль. Другой пример - _RTL_CRITICAL_SECTION и TRTLCriticalSection. Она и та же сущность, но с разными стилями именования типа. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| Teleport |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 5.7.2008 Где: Прибалтика Репутация: 1 Всего: 6 |
2 THandle - смайлик? А меня просто лыба растянула в момени набора темы
И вот в вашем обсуждении я черпаю важную информацию |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |