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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> THandle :), HWND и HDC разница какая? 
V
    Опции темы
Teleport
Дата 11.12.2008, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я вот никак не пойму с этими типами данных:
THandle, HWND, HDC. Handle - насколько я понимаю - это дескриптор окна(integer) По этому дескриптору можно найти любое окно.  Если не прав поправьте.
Какая разница между этими типами?? 
Так вот, пример:
Код

procedure TForm1.Button1Click(Sender: TObject);
var

hd: HWND;
han: hdc;
des: THandle;
begin

  hd:= Button1.Handle;
  han:= Button1.Handle;
  des:= Button1.Handle;

Label2.Caption:=  IntToStr(han);
Label3.Caption:=  IntToStr(des);
Label4.Caption:=  IntToStr(hd);

end;



Все эти переменные - вроде разных типов и могут приравниваться к одному и тому же Button1.Handle. 
Для каких целей какой тип использовать?


--------------------
user posted image
user posted image 
PM MAIL   Вверх
Poseidon
Дата 11.12.2008, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



В принципе это одно и тоже и сводится к LongWord. Разница в использовании. В справки же все есть.

Цитата
THandle is a 32-bit value that uniquely identifies a resource.


Цитата
Use HWND for Windows API calls that require a window handle. Use HWND instead of the Handle property when working with TWebBrowser controls.




--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Teleport
Дата 11.12.2008, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



т.е.  THandle и hdc - я использую просто в приложениях своих. А HWND - когда работаю со средствами TWebBrowser. Так?


--------------------
user posted image
user posted image 
PM MAIL   Вверх
Rrader
  Дата 11.12.2008, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


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

Репутация: 18
Всего: 191



Когда используешь WinAPI, смотри, какие типы параметров использует та или иная функция, и используй их.  В Delphi особой разницы нет, что писать (главное размер соблюдать, работать-то оно будет smile ), но тогда смысловая нагрузка типов теряется.

Эти типы из win32k.sys:

HWND - Window Handle - для оконных API
HDC - Device Context Handle - для GDI API

Просто числа (дескриптор - краткий описатель), скрывающие тонкую структуру соответственно таблиц Windowing и GDI smile 

THandle - это уже тип Delphi, с API не связан.

Это сообщение отредактировал(а) Rrader - 11.12.2008, 14:57


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
CodeMonkey
Дата 11.12.2008, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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 секунды
Цитата(Rrader @  11.12.2008,  14:54 Найти цитируемый пост)
THandle - это уже тип Delphi, с API не связан.

Да ну. C TButton.Handle: HWND не спутали?
CloseHandle.

Это сообщение отредактировал(а) CodeMonkey - 11.12.2008, 14:58


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Teleport
Дата 11.12.2008, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



начинает проясняться smile
Спасибо за разъяснение smile

Это сообщение отредактировал(а) Teleport - 11.12.2008, 15:39


--------------------
user posted image
user posted image 
PM MAIL   Вверх
Rrader
  Дата 11.12.2008, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


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

Репутация: 18
Всего: 191



Цитата(CodeMonkey @  11.12.2008,  20:56 Найти цитируемый пост)
Да ну. C TButton.Handle: HWND не спутали?

Не спутал. Но, прощу прощения, выразился не свосем корректно. smile  Я имею в виду, что THandle искусственный (префикс T дельфийский), и не в полной мере отражает тип HANDLE (я бы его по-другому дефинировал).



--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
THandle
Дата 11.12.2008, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



 smile 

Интересно знать, что значил бы смайлик после "THandle" в названии темы?

Цитата(Rrader @  11.12.2008,  15:47 Найти цитируемый пост)
 Я имею в виду, что THandle искусственный (префикс T дельфийский), и не в полной мере отражает тип HANDLE (я бы его по-другому дефинировал).


А как? И по каким причинам он не в полной мере отражает? smile Просто интересно стало, за что меня не любят ;)
PM   Вверх
Rrader
  Дата 11.12.2008, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


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

Репутация: 18
Всего: 191



Цитата(THandle @  11.12.2008,  22:30 Найти цитируемый пост)
Просто интересно стало, за что меня не любят ;)

Шутник smile 

Мои ночные кошмары таковы:

THandle так назван, чтобы не было конфликта со свойством Handle. По мне он должен быть явно объявлен через LongWord (type LongWord) и иметь название HANDLE (а свойство Handle переименовать). Но это уже, видимо, невозможно.

Добавлено через 35 секунд
 smile 


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
CodeMonkey
Дата 12.12.2008, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(Rrader @  11.12.2008,  15:47 Найти цитируемый пост)
Я имею в виду, что THandle искусственный (префикс T дельфийский), и не в полной мере отражает тип HANDLE (я бы его по-другому дефинировал).

Хорошее замечание. Действительно, типу THandle следовало бы называться HANDLE, также как и HDC, HWND и HMODULE. Но в целях упрощения кода для него сделали исключение.
Вообще в Delphi принято вводить "Delphi-псевдонимы" для типов системы. Например, есть у Windows такой тип: _EXCEPTION_RECORD. Но на Паскале его написание смотрится ужасно. Поэтому в Delphi вводится для него псевдоним: TExceptionRecord = _EXCEPTION_RECORD;. TExceptionRecord - это уже совсем Паскаль. Другой пример - _RTL_CRITICAL_SECTION и TRTLCriticalSection. Она и та же сущность, но с разными стилями именования типа.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Teleport
Дата 12.12.2008, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



2 THandle - смайлик? А меня просто лыба растянула в момени набора темы smile, зная что есть такой добрый челорвек на форуме - Thandle smile
И вот в вашем обсуждении я черпаю важную информацию smile Спасибо smile


--------------------
user posted image
user posted image 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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