Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Handle + ReadOnly


vecna ©   (2005-11-21 18:39:00) 

На самом деле я не уверен, просто наткнулся на такой код...

в StdCtrls.pas есть вот такая процедура:


procedure TCustomEdit.SetReadOnly(Value: Boolean);
begin
 if FReadOnly <> Value then
 begin
   FReadOnly := Value;
   if HandleAllocated then
     SendMessage(Handle, EM_SETREADONLY, Ord(Value), 0);
 end;
end;


Очень смущает проверка на HandleAllocated. Понятно, что Handle в дельфях может и не быть, и соответственно SendMessage не случится, но ведь обращение к Handle в самом SendMessage создаст хендл.
Простой пример, создаем Edit на второй (неактивной) закладке PageControl'a. Судя по всему (чесслово не проверял), в момент TForm.FormShow, у Edit'a будет Handle = 0. Делаем ReadOnly=True, и событие не случится, хотя могло бы. Или случится? В чем я не прав?


Владислав   (2005-11-22 16:29:00) [1]


> Да ну?!


Ну да.


> вот это убедительно, спасибо.


Какой недоверчивый :о)


vecna   (2005-11-22 16:14:00) [2]

2 Владислав
> Ну может нет смысла создавать окно только для того, чтобы установить ReadOnly?...
Да ну?!

2 Игорь Шевченко
вот это убедительно, спасибо.


Игорь Шевченко   (2005-11-22 14:55:00) [3]

Свойство ReadOnly может устанавливаться при загрузке dfm, когда никаких окон не создано. Для этого и требуется проверка. Это же свойство используется при создании окна Windows-контрола Edit.


Владислав   (2005-11-22 14:49:00) [4]


> Не чувствую... я спрашиваю для чего так?


Ну может нет смысла создавать окно только для того, чтобы установить ReadOnly?...


vecna   (2005-11-22 14:26:00) [5]

2 Владислав
> Если окно не создано, сообщение отправляться не будет.
Не чувствую... я спрашиваю для чего так?

2 umbra
> а откуда именно из справки эта фраза?
F1 -> TWinControl,Handle


umbra   (2005-11-22 12:58:00) [6]

2 vecna ©   (21.11.05 21:01) [2]

а откуда именно из справки эта фраза?


Владислав   (2005-11-22 09:28:00) [7]


> При это нет проверки на INVALID_HANDLE_VALUE.


Казалось бы, при чем здесь создание окна???


Владислав   (2005-11-22 09:18:00) [8]


> Очень смущает проверка на HandleAllocated. Понятно, что
> Handle в дельфях может и не быть, и соответственно SendMessage
> не случится, но ведь обращение к Handle в самом SendMessage
> создаст хендл.


Переведем код на русский.
Если окно не создано, сообщение отправляться не будет. Почувствуйте разницу.


vecna   (2005-11-21 22:56:00) [9]

D6 + все известные мне сервис паки (пять штук!)...
в седьмой дельфи тоже самое.


tesseract   (2005-11-21 22:52:00) [10]

Мдя половина функция с двойной проверкой,  половина без. интересно зачем? При это нет проверки на INVALID_HANDLE_VALUE.


tesseract   (2005-11-21 22:45:00) [11]

Да реальный прикол - это единственная функция где идёт проверка на Handle Allocated. Скорее всего надо поставить ServicePack :-)


vecna   (2005-11-21 22:22:00) [12]

Причем тут декстоп?
при обращении к свойству Handle, создается тот самый Handle (см. TWinControl.GetHandle)


tesseract   (2005-11-21 22:13:00) [13]


> активна первая закладка, а едит на второй. Handle = 0 в
> чем можно убедится позвав HandleAllocated. Но с этим-то
> все ясно. Не ясно, нафига делать такую проверку в SetReadOnly

Как на фига ? чтобы случайно не послать сообщения окну с Handle=0!
Если не ошибаюсь  - Desktop.


vecna   (2005-11-21 22:10:00) [14]

2 tesseract
> А в момент когда она активна, что handle  у окон отсутствует?
естественно нет,
активна первая закладка, а едит на второй. Handle = 0 в чем можно убедится позвав HandleAllocated. Но с этим-то все ясно. Не ясно, нафига делать такую проверку в SetReadOnly


tesseract   (2005-11-21 22:03:00) [15]


> создаем Edit на второй (неактивной) закладке PageControl'a.

А в момент когда она активна, что handle  у окон отсутствует?


vecna   (2005-11-21 21:01:00) [16]

2 umbra
> вовсе нет. хэндл окну выдается в момент создания.
видимо, это не так, в противном случае нафига нужны
HandleNeeded, CreateHandle, HandleAllocated, проверки на что Handle создан и создание его если нет. И вот эта фраза из документации:

The underlying window does not exist until the first time the Handle property is referenced. When this occurs, the HandleNeeded method is called automatically.


umbra   (2005-11-21 20:21:00) [17]

Если эдит создан и при этом не случилось ошибок, то у него есть ненулевой хэндл, поскольку эдит - полноценное окно. Вообще класс TCustomEdit- обертка для text - стандартного контрола винды.


> но ведь обращение к Handle в самом SendMessage создаст хендл

вовсе нет. хэндл окну выдается в момент создания.


Наверх

Титульная страница Поиск, карта сайта Написать письмо