Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.18;
Скачать: CL | DM;

Вниз

Handle + ReadOnly   Найти похожие ветки 

 
vecna ©   (2005-11-21 18:39) [0]

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

в 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, и событие не случится, хотя могло бы. Или случится? В чем я не прав?


 
umbra ©   (2005-11-21 20:21) [1]

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


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

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


 
vecna ©   (2005-11-21 21:01) [2]

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.


 
tesseract ©   (2005-11-21 22:03) [3]


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

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


 
vecna ©   (2005-11-21 22:10) [4]

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


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


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

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


 
vecna ©   (2005-11-21 22:22) [6]

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


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

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


 
tesseract ©   (2005-11-21 22:52) [8]

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


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

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


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


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


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


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


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


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


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

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

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


 
vecna ©   (2005-11-22 14:26) [13]

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

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


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


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


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


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

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


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

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

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


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


> Да ну?!


Ну да.


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


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



Страницы: 1 вся ветка

Текущий архив: 2005.12.18;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.047 c
4-1129834665
aha
2005-10-20 22:57
2005.12.18
Имею ик порт Tecram-210 и небольшой опыт работы через ком


14-1132834302
Sergey13
2005-11-24 15:11
2005.12.18
А чего интересного есть на WAP?


14-1132988411
Карелин Артем
2005-11-26 10:00
2005.12.18
Спам-фильтр в миранде по названию асечного клиента. Есть тако?


2-1133341058
solomon
2005-11-30 11:57
2005.12.18
Как в TWebBrowser е отключить загрузку картинок


2-1133616710
аматор
2005-12-03 16:31
2005.12.18
размер базы Жар птицы