![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 создаст хендл
вовсе нет. хэндл окну выдается в момент создания.