Форум: "Основная";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.075 c