Главная страница
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.062 c
14-1132684095
ANB
2005-11-22 21:28
2005.12.18
Выбираю технологию


10-1109556397
msgipss
2005-02-28 05:06
2005.12.18
Создание надстройки над Excell


4-1129313089
Zoom
2005-10-14 22:04
2005.12.18
Как прочитать блок памяти...


14-1132829263
Ермак
2005-11-24 13:47
2005.12.18
Паскаль и С++ - различные понимания свободы?


4-1129721314
Ден
2005-10-19 15:28
2005.12.18
WinApi Memory